27017,27018 - Pentesting MongoDB

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información básica

MongoDB es un sistema de gestión de bases de datos de código abierto que utiliza un modelo de base de datos orientado a documentos para manejar diversas formas de datos. Ofrece flexibilidad y escalabilidad para gestionar datos no estructurados o semiestructurados en aplicaciones como análisis de big data y gestión de contenido. Puerto por defecto: 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
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: "mongodb server information"
  • Buscar servidores mongodb totalmente abiertos: "mongodb server information" -"partially enabled"
  • Solo con auth parcialmente habilitada: "mongodb server information" "partially enabled"

Login

Por defecto, mongo no requiere contraseña.
Admin es una base de datos común en 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 creds.

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

Brute force

Revisa el archivo /opt/bitnami/mongodb/mongodb.conf para saber si se requieren 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

Mongo Objectid Predict

Ejemplo de aquí.

Mongo Object IDs son cadenas hexadecimales de 12 bytes:

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

Por ejemplo, así es como podemos diseccionar un Object ID 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 Process ID solo cambiará si el proceso de MongoDB se reinicia. El timestamp se actualizará cada segundo. El único reto al adivinar Object IDs incrementando simplemente el contador y los valores de timestamp, es el hecho de que MongoDB genera y asigna los Object IDs a nivel de sistema.

La herramienta https://github.com/andresriancho/mongo-objectid-predict, dado un Object ID inicial (puedes crear una cuenta y obtener un ID inicial), devuelve unos 1000 Object IDs probables que podrían haberse asignado a los siguientes objetos, así que solo necesitas bruteforcearlos.

Post

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

MongoBleed zlib Memory Disclosure (CVE-2025-14847)

Una divulgación de memoria no autenticada generalizada (“MongoBleed”) afecta a MongoDB 3.6–8.2 cuando el compresor de red zlib está habilitado. El encabezado OP_COMPRESSED confía en un uncompressedSize proporcionado por el atacante, por lo que el servidor asigna un buffer de ese tamaño y lo copia de vuelta en las respuestas aunque solo se haya proporcionado una carga comprimida mucho más pequeña. Los bytes extra son datos de heap no inicializados de otras conexiones, /proc, o la caché de WiredTiger. Los atacantes luego omiten el esperado terminador BSON \x00 de modo que el parser de MongoDB sigue escaneando ese buffer sobredimensionado hasta que encuentra un terminador, y la respuesta de error refleja tanto el documento malicioso como los bytes de heap escaneados pre-auth en TCP/27017.

Requisitos de exposición y comprobaciones rápidas

  • La versión del servidor debe estar dentro de los rangos vulnerables (3.6, 4.0, 4.2, 4.4.0–4.4.29, 5.0.0–5.0.31, 6.0.0–6.0.26, 7.0.0–7.0.27, 8.0.0–8.0.16, 8.2.0–8.2.2).
  • net.compression.compressors o networkMessageCompressors deben incluir zlib (por defecto en muchas compilaciones). Compruébalo desde el shell con:
db.adminCommand({getParameter: 1, networkMessageCompressors: 1})
  • El atacante solo necesita acceso de red al puerto de MongoDB. No se requiere autenticación.

Flujo de explotación y recolección

  1. Inicia el wire-protocol handshake anunciando compressors:["zlib"] para que la sesión use zlib.
  2. Envía tramas OP_COMPRESSED cuya uncompressedSize declarada es mucho mayor que la carga útil descomprimida real para forzar una asignación de heap sobredimensionada llena de datos antiguos.
  3. Construye el BSON embebido sin un \x00 final para que el parser avance más allá de los datos controlados por el atacante hacia el buffer sobredimensionado mientras busca un terminador.
  4. MongoDB emite un error que incluye el mensaje original más los bytes de heap que se escanearon, leaking memory. Repite con offsets/desplazamientos variables para agregar secretos (creds/API keys/session tokens), WiredTiger stats, y artefactos de /proc.

El PoC público automatiza los probing offsets y el carving de los fragmentos devueltos:

python3 mongobleed.py --host <target> --max-offset 50000 --output leaks.bin

Señal de ruido de detección (conexiones de alta frecuencia)

El ataque normalmente genera muchas peticiones de corta duración. Vigila picos de conexiones entrantes a mongod/mongod.exe. Ejemplo XQL hunt (>500 conexiones/min por IP remota, excluyendo por defecto los rangos RFC1918/loopback/link-local/mcast/broadcast/reserved):

Cortex XQL conexiones Mongo de alta velocidad ```sql // High-velocity inbound connections to mongod/mongod.exe (possible MongoBleed probing)

dataset = xdr_data | filter event_type = ENUM.NETWORK | filter lowercase(actor_process_image_name) in (“mongod”, “mongod.exe”) | filter action_network_is_server = true | filter action_remote_ip not in (null, “”) | filter incidr(action_remote_ip, “10.0.0.0/8”) != true and incidr(action_remote_ip, “192.168.0.0/16”) != true and incidr(action_remote_ip, “172.16.0.0/12”) != true and incidr(action_remote_ip, “127.0.0.0/8”) != true and incidr(action_remote_ip, “169.254.0.0/16”) != true and incidr(action_remote_ip, “224.0.0.0/4”) != true and incidr(action_remote_ip, “255.255.255.255/32”) != true and incidr(action_remote_ip, “198.18.0.0/15”) != true | filter action_network_session_duration <= 5000 | bin _time span = 1m | comp count(_time) as Counter by agent_hostname, action_remote_ip, _time | filter Counter >= 500

</details>


## Referencias

- [Unit 42 – Threat Brief: MongoDB Vulnerability (CVE-2025-14847)](https://unit42.paloaltonetworks.com/mongobleed-cve-2025-14847/)
- [Tenable – CVE-2025-14847 (MongoBleed): MongoDB Memory Leak Vulnerability Exploited in the Wild](https://www.tenable.com/blog/cve-2025-14847-mongobleed-mongodb-memory-leak-vulnerability-exploited-in-the-wild)
- [MongoDB Security Advisory SERVER-115508](https://jira.mongodb.org/browse/SERVER-115508)
- [Censys – MongoBleed Advisory](https://censys.com/advisory/cve-2025-14847)
- [MongoBleed PoC (joe-desimone/mongobleed)](https://github.com/joe-desimone/mongobleed)

---

> [!TIP]
> Aprende y practica Hacking en AWS:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Aprende y practica Hacking en GCP: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Aprende y practica Hacking en Azure: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Apoya a HackTricks</summary>
>
> - Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
> - **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos en** **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
>
> </details>