// 01
Reconocimiento
Mongod es una máquina Linux de dificultad Very Easy centrada en MongoDB y en el uso de su shell interactivo mongosh. El fallo es un clásico de bases de datos NoSQL expuestas: el servicio arranca sin control de acceso, de modo que cualquiera que alcance el puerto puede conectarse como usuario anónimo, enumerar todas las bases de datos y leer su contenido sin credenciales.
Empezamos identificando los servicios expuestos. El escaneo revela 2 puertos TCP abiertos; el que importa es el 27017, el puerto por defecto de MongoDB.
// EL PUERTO 27017
27017 es el puerto por defecto de MongoDB. Que aparezca abierto de cara a la red ya es sospechoso: si además el servicio no exige autenticación, la base de datos queda totalmente expuesta.
// 02
Preparar el cliente mongosh
MongoDB es una base de datos NoSQL: en vez de tablas, guarda la información en documentos tipo JSON/BSON. Para hablar con ella de forma interactiva se usa el cliente oficial mongosh. Como la máquina atacante no lo trae, lo descargamos de los servidores oficiales de MongoDB.
// 03
Conexión anónima a MongoDB
Con el binario listo, apuntamos al servicio remoto con --host y sin usuario ni contraseña, al puerto por defecto 27017:
// LA VULNERABILIDAD, CONFIRMADA POR EL PROPIO SERVIDOR
El banner de arranque lo dice literalmente: «Access control is not enabled for the
database» — lectura y escritura sin restricciones. Ya estamos dentro
del shell (test>) sin haber presentado ninguna credencial.
// 04
Enumeración y captura de la flag
Dentro de mongosh, listamos todas las bases de datos con
show dbs. Una destaca por su nombre:
sensitive_information.
Cambiamos a esa base de datos con use, listamos sus colecciones
con show collections y volcamos la colección
flag con db.flag.find():
// FLAG
1b6e6fb359e7c40241b6d431427ba6ea — leída directamente de la colección
flag en sensitive_information, sin credenciales ni escalada: toda la
máquina se resuelve explotando la ausencia de autenticación en MongoDB.
// LECCIÓN Y MITIGACIÓN
Dejar MongoDB sin control de acceso expone toda la base de datos a cualquiera
que alcance el 27017. La mitigación es habilitar autenticación
(security.authorization: enabled en mongod.conf, o arrancar con
--auth), crear usuarios con roles de mínimo privilegio en vez de depender del
acceso anónimo, no exponer el 27017 a Internet (firewall/VPC), cifrar el tráfico con TLS y
auditar los logs de conexión.
| VULNERABILIDAD | COMPONENTE | IMPACTO |
|---|---|---|
| Access control deshabilitado | MongoDB 3.6.8 · puerto 27017 | Conexión anónima: lectura/escritura sin credenciales |
| Datos sensibles sin proteger | DB sensitive_information · colección flag | Exfiltración directa del contenido con db.flag.find() |
| Servicio expuesto a la red | 27017 accesible sin firewall | Superficie de ataque alcanzable por cualquier cliente |
// 05
Referencia de Comandos
- -sC — scripts NSE por defecto
- -sV — detección de versión del servicio
- -p- — los 65 535 puertos TCP
- -T4 — plantilla de tiempo agresiva (más rápido)
- -x — extraer
- -z — descomprimir gzip
- -f — indica el archivo a procesar
- --host — IP o nombre del servidor
- --port — puerto (27017 por defecto)
- -u / -p — usuario / contraseña (aquí, innecesarios)
- show dbs — lista las bases de datos
- use <db> — selecciona una base de datos
- show collections — lista las colecciones
- db.<col>.find() — muestra todos los documentos
// 06
Glosario
show dbs, use o db.<col>.find().
--auth o security.authorization: enabled),
cualquiera que alcance el puerto se conecta como usuario anónimo con permisos
totales. Es la causa raíz de esta máquina.
_id único (ObjectId). Aquí, la colección flag
contenía un único documento con el campo flag.
mongod. Verlo abierto de cara a una red no
confiable es un indicador directo de MongoDB expuesto; combinado con la falta de
autenticación, equivale a dar acceso libre a todos los datos.
_id si no se especifica otro.