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 usa um modelo de banco de dados orientado a documentos que 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 com o seguinte comando:

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 com o seguinte comando:

mongo <alvo>:27017

Se a conexão for bem-sucedida, você será apresentado ao prompt do MongoDB, onde poderá executar comandos e consultar o banco de dados.

Enumeração de informações

Uma vez conectado ao MongoDB, você pode usar comandos específicos para obter informações sobre o banco de dados e suas coleções. Alguns comandos úteis incluem:

  • show dbs: lista todos os bancos de dados disponíveis.
  • use <nome_do_banco_de_dados>: seleciona um banco de dados específico.
  • show collections: lista todas as coleções no banco de dados selecionado.
  • db.<nome_da_coleção>.find(): exibe todos os documentos em uma coleção específica.

Esses comandos podem ajudar a identificar informações sensíveis ou vulnerabilidades no banco de dados MongoDB durante a enumeração manual.

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
show dbs

# Switch to a specific database
use <database_name>

# Show collections in the current database
show collections

# Insert a document into a collection
db.<collection_name>.insertOne({<document>})

# Find documents in a collection
db.<collection_name>.find({<query>})

# Update documents in a collection
db.<collection_name>.updateOne({<query>}, {<update>})

# Delete documents from a collection
db.<collection_name>.deleteOne({<query>})

Observações:

  • Substitua <database_name> pelo nome do banco de dados desejado.
  • Substitua <collection_name> pelo nome da coleção desejada.
  • Substitua <document> pelo documento que deseja inserir.
  • Substitua <query> pela consulta que deseja realizar.
  • Substitua <update> pela atualização que deseja fazer.
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 padrão 27017 e 27018, que são comumente usadas para comunicação com o MongoDB.

Verificação de porta

Antes de iniciar um teste de penetração em um serviço MongoDB, é importante verificar se as portas 27017 e 27018 estão abertas. Isso pode ser feito usando ferramentas de varredura de portas, como o Nmap.

nmap -p 27017,27018 <alvo>

Se as portas estiverem abertas, isso indica que o serviço MongoDB está em execução e pode ser acessado.

Enumeração de bancos de dados

Uma vez que tenhamos acesso ao serviço MongoDB, a próxima etapa é enumerar os bancos de dados disponíveis. Isso pode ser feito usando o comando show dbs no shell do MongoDB.

mongo --host <alvo> --port 27017
> show dbs

Isso nos fornecerá uma lista de todos os bancos de dados presentes no servidor.

Enumeração de coleções

Após identificar os bancos de dados, podemos prosseguir para a enumeração das coleções dentro de cada banco de dados. Isso pode ser feito usando o comando show collections no shell do MongoDB.

mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> show collections

Isso nos fornecerá uma lista de todas as coleções presentes no banco de dados selecionado.

Extração de dados

Uma vez que tenhamos identificado as coleções, podemos extrair dados dessas coleções usando o comando find no shell do MongoDB.

mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> db.<coleção>.find()

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

Injeção de comandos

Além da extração de dados, também podemos explorar a possibilidade de injeção de comandos no MongoDB. Isso pode ser feito usando o operador $where no comando find.

mongo --host <alvo> --port 27017 --authenticationDatabase <banco_de_dados> -u <usuário> -p <senha>
> use <banco_de_dados>
> db.<coleção>.find({$where: "<comando>"})

Isso nos permitirá executar comandos arbitrários no servidor MongoDB.

Ataques de força bruta

Se tivermos credenciais de acesso limitadas, também podemos tentar realizar ataques de força bruta para obter acesso não autorizado ao serviço MongoDB. Isso pode ser feito usando ferramentas como o Hydra.

hydra -l <usuário> -P <wordlist> <alvo> mongodb

Isso tentará várias combinações de nomes de usuário e senhas da lista fornecida para obter acesso ao serviço MongoDB.

Conclusão

O MongoDB é um serviço popular que pode ser alvo de ataques se não for configurado corretamente. Neste capítulo, discutimos algumas técnicas de pentesting para identificar e explorar vulnerabilidades em instâncias do MongoDB. É importante lembrar que todas as técnicas discutidas devem ser realizadas apenas em sistemas autorizados e com o devido consentimento.

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 🎥