Mongod Machine

Machine name: Mongod

Address: https://app.hackthebox.com/starting-point

Introdução

Bancos de dados são coleções de informações organizadas que podem ser acessadas, gerenciadas e atualizadas com facilidade. Em muitos ambientes, sistemas de banco de dados são extremamente importantes porque fornecem informações relacionadas a transações de vendas, inventário de produtos, perfis de clientes e atividades de marketing.

Existem diferentes tipos de bancos de dados, sendo um deles o MongoDB, um banco de dados NoSQL orientado a documentos. É essencial entender como os dados são armazenados em diferentes tipos de bancos de dados e como podemos nos conectar a servidores de banco de dados remotos para recuperar as informações desejadas. Em um banco de dados NoSQL orientado a documentos, os dados são organizados em uma hierarquia com os seguintes níveis:

  • Bancos de dados: o nível mais alto de organização em uma instância do MongoDB.
  • Coleções: dentro dos bancos de dados, contêm os documentos.
  • Documentos: armazenam os dados reais, como strings, números, datas, etc., em um formato semelhante ao JSON.

Freqüentemente, ocorre de um servidor de banco de dados estar mal configurado para permitir login anônimo, o que pode ser explorado por um atacante para acessar informações sensíveis armazenadas no banco. O Mongod é uma máquina Linux que possui um servidor MongoDB em execução, permitindo login anônimo sem a necessidade de nome de usuário ou senha. Podemos nos conectar remotamente a esse servidor MongoDB utilizando a ferramenta de linha de comando mongosh para enumerar o banco de dados e recuperar a flag.

Enumeração

Começaremos escaneando o host remoto para identificar portas abertas e serviços em execução, utilizando o Nmap. Os seguintes parâmetros serão usados no escaneamento:

  • -p-: Escaneia todas as portas TCP, variando de 0 a 65535.
  • -sV: Tenta determinar a versão do serviço em execução em cada porta.
  • --min-rate: Especifica o número mínimo de pacotes que o Nmap deve enviar por segundo; ao aumentar o número, a velocidade do escaneamento também aumenta.

O escaneamento mostra que as seguintes portas estão abertas:

  • Porta 22: Executando o serviço SSH.
  • Porta 27017: Executando o servidor MongoDB.

O que é o MongoDB?

MongoDB é um banco de dados NoSQL orientado a documentos. Em vez de usar tabelas e linhas, como em bancos de dados relacionais tradicionais, o MongoDB utiliza coleções e documentos.

  • Cada banco de dados contém coleções, que por sua vez contêm documentos.
  • Cada documento é composto por pares chave-valor, que são a unidade básica de dados no MongoDB.
  • Uma única coleção pode conter múltiplos documentos, e eles não possuem esquema fixo (schema-less), o que significa que o tamanho e o conteúdo de cada documento podem variar entre si.

Para se conectar ao servidor MongoDB remoto em execução no alvo, será necessário instalar a ferramenta MongoDB Shell (mongosh). Em distribuições Linux baseadas em Debian (como Parrot, Kali e Ubuntu), isso pode ser feito baixando o seguinte arquivo tar:

curl -O https://downloads.mongodb.com/compass/mongosh-2.3.2-linux-x64.tgz

Em seguida, extraímos o conteúdo do arquivo tar utilizando a ferramenta tar:

tar xvf mongosh-2.3.2-linux-x64.tgz

Depois, navegamos até o diretório onde o binário do mongosh está localizado:

cd mongosh-2.3.2-linux-x64/bin

Agora podemos tentar nos conectar ao servidor MongoDB remoto como usuário anônimo:

./mongosh mongodb://{target_IP}:27017

Após executar este comando, conseguimos nos conectar com sucesso à instância MongoDB remota como um usuário anônimo. Para listar os bancos de dados disponíveis no servidor MongoDB, utilizamos o comando:

show dbs

Após listar os bancos de dados, podemos selecionar qualquer um deles usando o comando use para continuar a enumeração. Vamos enumerar o banco de dados que parece ser o mais interessante, ou seja, sensitive_information.

O comando seria:

use sensitive_information

Isso seleciona o banco de dados sensitive_information para que possamos continuar a explorar e descobrir mais sobre as coleções e documentos que ele contém.

Para listar as coleções armazenadas no banco de dados sensitive_information, utilizamos o seguinte comando:

show collections

Isso exibirá todas as coleções presentes no banco de dados selecionado, permitindo que você escolha uma para explorar mais a fundo.

Podemos ver que existe uma única coleção chamada flag. Para listar o conteúdo dos documentos presentes nesta coleção, utilizamos o comando db.collection.find(). Vamos substituir o nome da coleção flag no comando e também utilizar o pretty() para exibir a saída de forma mais legível.

O comando seria:

db.flag.find().pretty()

Parabéns! Você conseguiu recuperar com sucesso o valor da flag do banco de dados MongoDB.

Question 01: How many TCP ports are open on the machine?

Vamos inciar descobrindo as portas abertas e o que está em execução em cada uma delas.

nmap -sV -p- -T5 10.129.228.30

2

Question 02: Which service is running on port 27017 of the remote host?

MongoDB 3.6.8

Question 03: What type of database is MongoDB? (Choose: SQL or NoSQL)

NoSQL

Question 04: What is the command name for the Mongo shell that is installed with the mongodb-clients package?

mongosh

Question 05: What is the command used for listing all the databases present on the MongoDB server? (No need to include a trailing 😉

showdbs

Question 06: What is the command used for listing out the collections in a database? (No need to include a trailing 😉

show collections

Question 07: What is the command used for dumping the content of all the documents within the collection named flag in a format that is easy to read?

db.flag.find().pretty()

Question 08: Submit the flag

Primeiramente, vamos instalar a ferramenta mongosh:

curl -O https://downloads.mongodb.com/compass/mongosh-2.3.2-linux-x64.tgz

tar xvf mongosh-2.3.2-linux-x64.tgz

cd mongosh-2.3.2-linux-x64/bin

Agora precisamos nos conectar ao servidor com o comando abaixo:

./mongosh mongodb://10.129.228.30:27017

Então, pode ver todos os databases. Então, vamos escolher um:

use sensitive_information;

Agora, nós precisamos pesquisar em todas as collections que estão nesse database:

show collections;

Vamos listar o contúdo da collection chamada flag de uma forma legível:

db.flag.find().pretty();

1b6e6fb359e7c40241b6d431427ba6ea

Rolar para cima