hacktricks/network-services-pentesting/27017-27018-mongodb.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

8.4 KiB

27017,27018 - Pentesting MongoDB

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

Sigue a HackenProof para aprender más sobre errores web3

🐞 Lee tutoriales de errores web3

🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores

💬 Participa en discusiones comunitarias

Información básica

MongoDB es un sistema de gestión de bases de datos (DBMS) de código abierto que utiliza un modelo de base de datos orientado a documentos que admite diversas formas de datos. (De aquí)

Puerto predeterminado: 27017, 27018

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

Enumeración

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

Algunos comandos de MongoDB:


  • show dbs: muestra las bases de datos disponibles.
  • use <db>: cambia a la base de datos especificada.
  • show collections: muestra las colecciones disponibles en la base de datos actual.
  • db.<collection>.find(): muestra todos los documentos de la colección especificada.
  • db.<collection>.find(<query>): muestra los documentos que coinciden con la consulta especificada.
  • db.<collection>.findOne(<query>): muestra el primer documento que coincide con la consulta especificada.
  • db.<collection>.insert(<document>): inserta un nuevo documento en la colección especificada.
  • db.<collection>.update(<query>, <update>): actualiza los documentos que coinciden con la consulta especificada.
  • db.<collection>.remove(<query>): elimina los documentos que coinciden con la consulta especificada.
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 los mongodb: "información del servidor mongodb"
  • Buscar servidores mongodb completamente abiertos: "información del servidor mongodb" -"parcialmente habilitado"
  • Solo habilitar parcialmente la autenticación: "información del servidor mongodb" "parcialmente habilitado"

Inicio de sesión

Por defecto, mongo no requiere contraseña.
Admin es una base de datos común de mongo.

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

El script de nmap: mongodb-brute comprobará si se necesitan credenciales.

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

Fuerza bruta

Busque dentro de /opt/bitnami/mongodb/mongodb.conf para saber si se necesitan credenciales:

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

Predicción de Mongo Objectid

Los IDs de objetos de Mongo son cadenas hexadecimales de 12 bytes:

Por ejemplo, así es como podemos descomponer un ID de objeto real devuelto por una aplicación: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 en decimal = viernes, 31 de julio de 2020 17:49:32
  2. 9fa6dc: Identificador de máquina
  3. 2500: ID de proceso
  4. 314019: Un contador incremental

De los elementos anteriores, el identificador de máquina permanecerá igual mientras la base de datos esté ejecutándose en la misma máquina física/virtual. El ID de proceso solo cambiará si se reinicia el proceso de MongoDB. La marca de tiempo se actualizará cada segundo. El único desafío para adivinar los IDs de objetos simplemente incrementando los valores de contador y marca de tiempo, es el hecho de que Mongo DB genera IDs de objetos y asigna IDs de objetos a nivel del sistema.

La herramienta https://github.com/andresriancho/mongo-objectid-predict, dada una ID de objeto de inicio (puede crear una cuenta y obtener una ID de inicio), devuelve alrededor de 1000 IDs de objeto probables que podrían haber sido asignados a los objetos siguientes, por lo que solo necesita hacer fuerza bruta.

Publicación

Si eres root, puedes modificar el archivo mongodb.conf para que no se necesiten credenciales (noauth = true) y iniciar sesión sin credenciales.

Sigue a HackenProof para aprender más sobre errores web3

🐞 Lee tutoriales de errores web3

🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores

💬 Participa en discusiones de la comunidad

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