hacktricks/network-services-pentesting/27017-27018-mongodb.md

14 KiB

27017,27018 - Pentesting MongoDB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

HackenProof é o lar de todas as recompensas por bugs de criptografia.

Seja recompensado sem atrasos
As recompensas do HackenProof são lançadas apenas quando seus clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.

Adquira experiência em pentesting web3
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.

Torne-se a lenda do hacker web3
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.

Cadastre-se no HackenProof comece a ganhar com seus hacks!

{% embed url="https://hackenproof.com/register" %}

Informações Básicas

O MongoDB é um sistema de gerenciamento de banco de dados (DBMS) de código aberto que utiliza um modelo de banco de dados orientado a documentos e suporta várias formas de dados. (De aqui)

Porta padrão: 27017, 27018

PORT      STATE SERVICE VERSION
27017/tcp open  mongodb MongoDB 2.6.9 2.6.9

Enumeração

Manual

A enumeração manual é um processo de coleta de informações sobre um serviço MongoDB. Isso pode ser feito usando comandos e ferramentas específicas para obter detalhes sobre a instância do MongoDB em execução.

Verificação de porta

A primeira etapa é verificar se a porta 27017 (padrão do MongoDB) está aberta. Isso pode ser feito usando a ferramenta nmap da seguinte maneira:

nmap -p 27017 <alvo>

Se a porta estiver aberta, isso indica que o serviço MongoDB está em execução.

Conexão ao MongoDB

Após verificar a porta, você pode tentar se conectar ao serviço MongoDB usando o cliente mongo:

mongo <alvo>:27017

Se a conexão for bem-sucedida, você será apresentado ao prompt do MongoDB.

Coleta de informações

Uma vez conectado ao MongoDB, você pode usar comandos específicos para coletar informações sobre a instância, como:

  • db.version(): exibe a versão do MongoDB em execução.
  • show dbs: lista os bancos de dados disponíveis.
  • use <nome_do_banco_de_dados>: seleciona um banco de dados específico.
  • show collections: lista as coleções disponíveis no banco de dados selecionado.
  • db.<nome_da_coleção>.find(): exibe os documentos na coleção selecionada.

Essas informações podem ser úteis para entender a estrutura e o conteúdo do banco de dados MongoDB.

Exploração de vulnerabilidades conhecidas

Além da enumeração manual, é importante verificar se a instância do MongoDB possui vulnerabilidades conhecidas. Isso pode ser feito usando ferramentas como o MongoDB Exploit Framework (https://github.com/peterjson/mongo-exploit) ou pesquisando por exploits específicos.

É importante lembrar que a exploração de vulnerabilidades sem permissão é ilegal e deve ser realizada apenas em um ambiente controlado e autorizado, como parte de um teste de penetração.

from pymongo import MongoClient
client = MongoClient(host, port, username=username, password=password)
client.server_info() #Basic info
#If you have admin access you can obtain more info
admin = client.admin
admin_info = admin.command("serverStatus")
cursor = client.list_databases()
for db in cursor:
print(db)
print(client[db["name"]].list_collection_names())
#If admin access, you could dump the database also

Alguns comandos do MongoDB:

# Show databases
# Mostrar bancos de dados
show databases

# Use a specific database
# Usar um banco de dados específico
use <database_name>

# Show collections in the current database
# Mostrar coleções no banco de dados atual
show collections

# Insert a document into a collection
# Inserir um documento em uma coleção
db.<collection_name>.insertOne({<document>})

# Find documents in a collection
# Encontrar documentos em uma coleção
db.<collection_name>.find({<query>})

# Update documents in a collection
# Atualizar documentos em uma coleção
db.<collection_name>.updateOne({<query>}, {<update>})

# Delete documents from a collection
# Excluir documentos de uma coleção
db.<collection_name>.deleteOne({<query>})

Note: Replace <database_name>, <collection_name>, <document>, <query>, and <update> with the appropriate values.

show dbs
use <db>
show collections
db.<collection>.find()  #Dump the collection
db.<collection>.count() #Number of records of the collection
db.current.find({"username":"admin"})  #Find in current db the username admin

Automático

O MongoDB é um banco de dados NoSQL popular que utiliza um modelo de armazenamento de documentos. Ele é amplamente utilizado em aplicações web e móveis devido à sua flexibilidade e escalabilidade. No entanto, como qualquer outro serviço de rede, o MongoDB também pode ser alvo de ataques.

Neste capítulo, discutiremos algumas técnicas de pentesting para identificar e explorar vulnerabilidades em instâncias do MongoDB. Vamos nos concentrar nas portas 27017 e 27018, que são as portas padrão para o serviço MongoDB.

Verificando a porta 27017

A primeira etapa é verificar se a porta 27017 está aberta em um determinado alvo. Podemos fazer isso usando ferramentas de varredura de portas, como o Nmap. O comando a seguir verifica se a porta 27017 está aberta em um determinado endereço IP:

nmap -p 27017 <endereço IP>

Se a porta estiver aberta, isso indica que o serviço MongoDB está em execução nesse endereço IP.

Enumeração de bancos de dados

Uma vez que tenhamos confirmado que o serviço MongoDB está em execução, podemos prosseguir com a enumeração dos bancos de dados disponíveis. Podemos usar a ferramenta mongo para se conectar ao serviço MongoDB e listar os bancos de dados:

mongo --host <endereço IP> --port 27017
show databases

Isso nos dará uma lista de todos os bancos de dados disponíveis no servidor MongoDB.

Enumeração de coleções

Após identificar os bancos de dados, podemos prosseguir com a enumeração das coleções dentro de cada banco de dados. Podemos usar o comando show collections para listar todas as coleções em um determinado banco de dados:

use <nome do banco de dados>
show collections

Isso nos dará uma lista de todas as coleções disponíveis no banco de dados selecionado.

Extraindo dados

Uma vez que tenhamos identificado as coleções de interesse, podemos extrair os dados dessas coleções. Podemos usar o comando db.<nome da coleção>.find() para listar todos os documentos em uma determinada coleção:

use <nome do banco de dados>
db.<nome da coleção>.find()

Isso nos dará todos os documentos presentes na coleção selecionada.

Explorando vulnerabilidades

Além da enumeração básica, também podemos explorar vulnerabilidades específicas do MongoDB, como a injeção de comandos. Essa técnica envolve a inserção de comandos maliciosos em consultas do MongoDB para obter acesso não autorizado ou executar ações indesejadas.

Existem várias ferramentas disponíveis para automatizar a exploração de vulnerabilidades no MongoDB, como o Metasploit Framework e o MongoSniff. Essas ferramentas podem ajudar a identificar e explorar vulnerabilidades conhecidas no serviço MongoDB.

No entanto, é importante lembrar que a exploração de vulnerabilidades em sistemas sem autorização é ilegal e antiético. Essas técnicas devem ser usadas apenas para fins de teste de penetração em sistemas autorizados.

nmap -sV --script "mongo* and default" -p 27017 <IP> #By default all the nmap mongo enumerate scripts are used

Shodan

  • Todos os mongodb: "informações do servidor mongodb"
  • Pesquisar por servidores mongodb totalmente abertos: "informações do servidor mongodb" -"parcialmente habilitado"
  • Apenas habilitar parcialmente a autenticação: "informações do servidor mongodb" "parcialmente habilitado"

Login

Por padrão, o mongo não requer senha.
Admin é um banco de dados comum do mongo.

mongo <HOST>
mongo <HOST>:<PORT>
mongo <HOST>:<PORT>/<DB>
mongo <database> -u <username> -p '<password>'

O script do nmap: mongodb-brute irá verificar se são necessárias credenciais.

nmap -n -sV --script mongodb-brute -p 27017 <ip>

Força bruta

Verifique dentro de /opt/bitnami/mongodb/mongodb.conf para saber se são necessárias credenciais:

grep "noauth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#" #Not needed
grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not needed

Previsão de Mongo Objectid

Os IDs de objeto do Mongo são strings hexadecimais de 12 bytes:

Por exemplo, aqui está como podemos analisar um ID de objeto real retornado por um aplicativo: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 em decimal = Sexta-feira, 31 de julho de 2020 17:49:32
  2. 9fa6dc: Identificador da máquina
  3. 2500: ID do processo
  4. 314019: Um contador incremental

Dos elementos acima, o identificador da máquina permanecerá o mesmo enquanto o banco de dados estiver executando na mesma máquina física/virtual. O ID do processo só mudará se o processo do MongoDB for reiniciado. O timestamp será atualizado a cada segundo. O único desafio em adivinhar os IDs de objeto simplesmente incrementando os valores do contador e do timestamp é o fato de que o Mongo DB gera IDs de objeto e atribui IDs de objeto em nível de sistema.

A ferramenta https://github.com/andresriancho/mongo-objectid-predict, dado um ID de objeto inicial (você pode criar uma conta e obter um ID inicial), retorna cerca de 1000 IDs de objeto prováveis que poderiam ter sido atribuídos aos próximos objetos, então você só precisa forçar a entrada.

Post

Se você é root, pode modificar o arquivo mongodb.conf para que não sejam necessárias credenciais (noauth = true) e fazer login sem credenciais.

HackenProof é o lar de todas as recompensas por bugs de criptografia.

Seja recompensado sem atrasos
As recompensas do HackenProof são lançadas apenas quando os clientes depositam o orçamento de recompensa. Você receberá a recompensa após a verificação do bug.

Adquira experiência em pentesting web3
Protocolos de blockchain e contratos inteligentes são a nova Internet! Domine a segurança web3 em seus dias de ascensão.

Torne-se a lenda do hacker web3
Ganhe pontos de reputação com cada bug verificado e conquiste o topo do leaderboard semanal.

Cadastre-se no HackenProof e comece a ganhar com seus hacks!

{% embed url="https://hackenproof.com/register" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥