27017,27018 - Pentesting MongoDB

Reading time: 4 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks

Informazioni di base

MongoDB è un sistema di gestione di database open source che utilizza un modello di database orientato ai documenti per gestire forme diverse di dati. Offre flessibilità e scalabilità per gestire dati non strutturati o semi-strutturati in applicazioni come l'analisi dei big data e la gestione dei contenuti. Porta predefinita: 27017, 27018

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

Enumerazione

Manuale

python
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

Alcuni comandi MongoDB:

bash
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

Automatico

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

Shodan

  • Tutti mongodb: "mongodb server information"
  • Cerca server mongodb completamente aperti: "mongodb server information" -"partially enabled"
  • Solo autenticazione parzialmente abilitata: "mongodb server information" "partially enabled"

Login

Per impostazione predefinita, mongo non richiede password.
Admin è un comune database mongo.

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

Lo script nmap: mongodb-brute verificherà se sono necessarie credenziali.

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

Brute force

Controlla dentro /opt/bitnami/mongodb/mongodb.conf per sapere se sono necessarie le credenziali:

bash
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

Previsione dell'Objectid di Mongo

Esempio da qui.

Gli ID Object di Mongo sono stringhe esadecimali di 12 byte:

http://techidiocy.com/_id-objectid-in-mongodb/

Ad esempio, ecco come possiamo analizzare un ID Object reale restituito da un'applicazione: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 in decimale = Venerdì, 31 Luglio 2020 17:49:32
  2. 9fa6dc: Identificatore della macchina
  3. 2500: ID del processo
  4. 314019: Un contatore incrementale

Dei suddetti elementi, l'identificatore della macchina rimarrà lo stesso finché il database sta eseguendo la stessa macchina fisica/virtuale. L'ID del processo cambierà solo se il processo MongoDB viene riavviato. Il timestamp verrà aggiornato ogni secondo. L'unica sfida nel prevedere gli ID Object semplicemente incrementando i valori del contatore e del timestamp, è il fatto che Mongo DB genera gli ID Object e assegna gli ID Object a livello di sistema.

Lo strumento https://github.com/andresriancho/mongo-objectid-predict, dato un ID Object di partenza (puoi creare un account e ottenere un ID di partenza), restituisce circa 1000 probabili ID Object che potrebbero essere stati assegnati ai prossimi oggetti, quindi devi solo forzarli.

Post

Se sei root puoi modificare il file mongodb.conf in modo che non siano necessarie credenziali (noauth = true) e accedere senza credenziali.


tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks