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

7.6 KiB

27017,27018 - Pentesting MongoDB

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

Siga HackenProof para aprender mais sobre bugs web3

🐞 Leia tutoriais de bugs web3

🔔 Receba notificações sobre novos programas de recompensa por bugs

💬 Participe de discussões na comunidade

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ários tipos 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

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

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

Shodan

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

Login

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

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

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

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

Força bruta

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

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 objetos Mongo são strings hexadecimais de 12 bytes:

Por exemplo, aqui está como podemos dissecar 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 de 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 sendo executado na mesma máquina física/virtual. O ID do processo só mudará se o processo do MongoDB for reiniciado. O carimbo de data/hora será atualizado a cada segundo. O único desafio em adivinhar IDs de objetos simplesmente incrementando os valores do contador e do carimbo de data/hora, é o fato de que o Mongo DB gera IDs de objetos e atribui IDs de objetos em um nível do sistema.

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

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.

Siga HackenProof para aprender mais sobre bugs web3

🐞 Leia tutoriais de bugs web3

🔔 Receba notificações sobre novas recompensas por bugs

💬 Participe de discussões na comunidade

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