
Script de detección para la explotación de MongoBleed
Herramienta de análisis offline de MongoDB para CVE-2025-14847 (MongoBleed)
Una herramienta independiente de línea de comandos para Linux que analiza datos de MongoDB para identificar una posible explotación de CVE-2025-14847 mediante múltiples módulos de detección.
MongoBleed (CVE-2025-14847) es una vulnerabilidad de divulgación de memoria en la descompresión zlib de MongoDB que permite a los atacantes extraer datos sensibles (credenciales, tokens de sesión, PII) directamente de la memoria del servidor sin autenticación.
Esta herramienta ayuda a los respondedores de incidentes a detectar intentos de explotación mediante múltiples fuentes de evidencia:
Analiza los registros JSON de MongoDB para detectar patrones de explotación:
| ID de evento | Tipo | Descripción |
|---|---|---|
| 22943 | Conexión aceptada | Se registra cuando un cliente se conecta |
| 51800 | Metadatos del cliente | Se registra cuando un cliente envía información de driver/aplicación |
Información clave: los drivers legítimos de MongoDB siempre envían metadatos del cliente. El exploit MongoBleed se conecta, extrae memoria y se desconecta, pero nunca envía metadatos.
Analiza instantáneas de db.serverStatus().asserts para detectar patrones inusuales en los contadores de asserts.user:
asserts.user con otros tipos de aserciones. Si las aserciones de usuario son desproporcionadamente altas (proporción ≥250x) o todos los demás tipos son cero, lo marca como sospechoso (confianza MEDIA)Nota: los contadores acumulativos pueden producir falsos positivos. Úselo en combinación con FTDC (módulo B2) para obtener los mejores resultados.
Analiza los archivos de captura de datos de diagnóstico de tiempo completo (FTDC) de MongoDB para detectar picos localizados en el tiempo en los contadores de aserciones. FTDC muestrea serverStatus periódicamente, lo que permite una sincronización precisa de posibles ataques.
jq: procesador JSONawk (se recomienda gawk)gzip: para soporte de registros comprimidospymongo: para decodificación de archivos FTDCssh, scp)# Dependencias del script de shell
# Debian/Ubuntu
apt-get install jq gawk gzip
# RHEL/CentOS/Fedora
dnf install jq gawk gzip
# macOS
brew install jq gawk
# Dependencias de Python (para decodificación FTDC)
pip install -r requirements.txt
# Clonar el repositorio
git clone https://github.com/your-org/mongobleed-detector.git
cd mongobleed-detector
# Hacer ejecutables los scripts
chmod +x mongobleed-detector.sh
chmod +x mongobleed-remote.py
chmod +x ftdc-decode.py
# Instalar dependencias de Python (opcional, para soporte FTDC)
pip install -r requirements.txt
Analice datos que se hayan recopilado manualmente de los hosts de MongoDB.
Recopile automáticamente datos de múltiples hosts mediante SSH y luego analícelos localmente.
Recopile datos de sus hosts de MongoDB y organícelos en esta estructura:
./collected-data/
├── logs/ # Registros JSON de MongoDB
│ ├── mongod.log
│ ├── mongod.log.1
│ └── mongod.log.2.gz
├── assert-counts/ # Instantáneas de serverStatus().asserts
│ ├── asserts-2025-01-01.json
│ └── asserts-2025-01-02.json
└── ftdc-files/ # Contenido de diagnostic.data de FTDC
├── metrics.2025-01-02T10-00-00Z-00000
└── metrics.interim
# Copiar desde el host remoto
scp user@mongohost:/var/log/mongodb/mongod.log* ./collected-data/logs/
Ejecute este comando en el host de MongoDB (requiere acceso a mongosh):
mongosh --quiet --eval 'JSON.stringify({
timestamp: new Date().toISOString(),
hostname: db.hostInfo().system.hostname,
asserts: db.serverStatus().asserts,
uptime: db.serverStatus().uptime
})' > asserts-$(date +%Y%m%d-%H%M%S).json
Copie el archivo JSON resultante a ./collected-data/assert-counts/.
Consejo: ejecute este comando varias veces (por ejemplo, cada hora) para establecer una línea base y detectar picos.
Los archivos FTDC se encuentran en:
<storage.dbPath>/diagnostic.data/ (comúnmente /var/lib/mongodb/diagnostic.data/)systemLog.path (p. ej., /var/log/mongodb/mongos.diagnostic.data/)# Copiar archivos FTDC (puede requerir sudo)
sudo cp /var/lib/mongodb/diagnostic.data/metrics.* ./collected-data/ftdc-files/
# Modo de autodescubrimiento: analiza todos los datos disponibles
./mongobleed-detector.sh --data-dir ./collected-data/
# Con umbrales personalizados
./mongobleed-detector.sh --data-dir ./collected-data/ \
-t 1440 \ # Ventana de retroceso de 24 horas
-c 50 \ # Umbral de conexión más bajo
--spike-threshold 50 # Umbral de pico más bajo
Para compatibilidad con versiones anteriores, aún puede analizar registros directamente:
# Escanear rutas predeterminadas
./mongobleed-detector.sh
# Escanear archivos de registro específicos
./mongobleed-detector.sh -p /path/to/logs/*.json
# Modo forense (analizar múltiples hosts)
./mongobleed-detector.sh --forensic-dir /evidence/
Recopile automáticamente datos de múltiples hosts y analícelos:
# Crear archivo de hosts
cat > hosts.txt << EOF
mongo-prod-01.example.com
mongo-prod-02.example.com
mongo-staging.example.com
EOF
# Recopilar y analizar
./mongobleed-remote.py --hosts-file hosts.txt --user admin --output-dir ./collected-data/
# Usar una clave SSH específica
./mongobleed-remote.py --hosts-file hosts.txt --user admin --key ~/.ssh/mongodb_key
# Ejecución en paralelo
./mongobleed-remote.py --hosts-file hosts.txt --user admin --parallel 10
# Omitir recopilación de FTDC (más rápido)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --skip-ftdc
# Solo recopilar, analizar más tarde
./mongobleed-remote.py --hosts-file hosts.txt --user admin --collect-only
# Pasar opciones SSH (p. ej., host de salto)
./mongobleed-remote.py --hosts-file hosts.txt --user admin \
-o "ProxyJump=bastion.example.com"
# Usar sudo para acceso a archivos privilegiados (los archivos FTDC suelen estar restringidos)
./mongobleed-remote.py --hosts-file hosts.txt --user admin --sudo
# Modo de depuración para solucionar problemas de conexión
./mongobleed-remote.py --hosts-file hosts.txt --user admin --debug
Nota sobre permisos de FTDC: los archivos FTDC en
/var/lib/mongodb/diagnostic.data/generalmente pertenecen al usuariomongodby no son legibles por usuarios normales. Si ve advertencias de "Problemas de permisos de FTDC", use la opción--sudo. Esto requiere que el usuario remoto tenga acceso sudo sin contraseña (NOPASSWD en sudoers).
| Código | Significado |
|---|---|
| 0 | No se encontraron hallazgos ALTOS o MEDIOS |
| 1 | Se detectaron hallazgos ALTOS o MEDIOS |
| 2 | Error (dependencias faltantes, sin datos, etc.) |
La herramienta proporciona un veredicto de confianza combinado basado en toda la evidencia disponible:
Para la correlación de registros (módulo A), las IP individuales se clasifican:
| Riesgo | Criterios |
|---|---|
| ALTO | Conexiones ≥ umbral, tasa de metadatos < 10 %, tasa de ráfaga ≥ 400/min |
INFO: Auto-discovery mode: analyzing ./collected-data/
INFO: Module A: Analyzing 3 log file(s)...
INFO: Module B1: Analyzing assert-counts...
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ MongoBleed (CVE-2025-14847) Detection Results ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
Module Status:
[✓] Module A (Log Correlation): 3 log file(s) found
[✓] Module B1 (Assert Counts): 4 snapshot(s) found
[−] Module B2 (FTDC Spikes): No FTDC files or decoder unavailable
Analysis Parameters:
Time Window: 4320 minutes
Connection Thresh: 100
Burst Rate Thresh: 400/min
Metadata Rate: 0.10
Spike Threshold: 100
User Ratio Thresh: 250x
Module A - Log Correlation Findings:
Risk SourceIP ConnCount MetaCount DiscCount MetaRate% BurstRate/m FirstSeen (UTC) LastSeen (UTC)
-------- ---------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------------------- ----------------------
HIGH 137.137.137.137 8172 0 8172 0.00% 490.32 2025-12-27T12:55:52Z 2025-12-27T13:12:32Z
Module B1 - Assert Counts Analysis:
Analyzed 4 snapshots from 2025-01-01T10:00:00Z to 2025-01-01T11:30:00Z
asserts.user: 100 -> 860 (delta: 760)
SPIKE DETECTED: 2025-01-01T10:30:00Z to 2025-01-01T11:00:00Z
Delta: +740 user asserts (110 -> 850)
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Combined Verdict:
MEDIUM CONFIDENCE - Investigation recommended
- Suspicious connection patterns but FTDC data unavailable for correlation
⚠ IMPORTANT: If exploitation is confirmed, patching alone is insufficient.
- Rotate all credentials that may have been exposed
- Review accessed data for sensitive information disclosure
- Check for lateral movement from affected systems
- Preserve logs for forensic analysis
Caveats:
- Connection metadata absence is PoC-specific and can be evaded
- Assertion counters are cumulative - false positives possible without baseline
- FTDC provides timing but not perfect attribution
- Patch + rotate secrets remains mandatory regardless of detection results
El repositorio incluye un conjunto de pruebas para validar el detector.
El directorio example-data/ contiene datos reales de una instancia de MongoDB 8.0.16 que fue atacada usando el PoC de MongoBleed:
example-data/
├── logs/ # Registros reales de MongoDB con patrones de ataque
│ ├── mongod.log
│ └── mongod.log.1.gz
├── assert-counts/ # Instantánea de serverStatus().asserts posterior al ataque
│ └── asserts-post-attack.json
└── ftdc-files/ # Archivos reales de datos de diagnóstico FTDC
└── metrics.*
Estos datos muestran:
./test/generate-test-logs.sh
Esto crea datos de prueba sintéticos adicionales con varios patrones:
./test/test-detector.sh
Salida esperada:
╔════════════════════════════════════════════════════════╗
║ MongoBleed Detector Test Suite ║
╚════════════════════════════════════════════════════════╝
Module A Tests (Log Correlation):
✓ PASS: Exit code is 1 (findings detected)
✓ PASS: Detected source IP 137.137.137.137
...
Module B1 Tests (Assert Counts):
✓ PASS: Shows Module B1 status
✓ PASS: Detected assert spike
...
Auto-Discovery Mode Tests:
✓ PASS: Shows Module A status
✓ PASS: Shows combined verdict
...
Results:
Passed: 24
Failed: 0
All tests passed!
⚠️ Limitaciones importantes
Detección específica del PoC: la detección de ausencia de metadatos se basa en el comportamiento conocido del PoC de MongoBleed. Un atacante sofisticado podría modificar el exploit para enviar metadatos falsos, aunque esto reduciría la velocidad de explotación.
Contadores acumulativos: asserts.user es acumulativo desde el reinicio de mongod. Sin instantáneas de línea base, los valores altos pueden ser normales en instancias de larga duración. Múltiples instantáneas a lo largo del tiempo mejoran significativamente la precisión.
Tiempo de FTDC: FTDC proporciona información de tiempo, pero no una atribución perfecta. Úselo junto con la correlación de registros para obtener los mejores resultados.
Retención de registros: solo se pueden analizar los registros que existen. Una rotación agresiva o la eliminación de registros por parte del atacante destruirá la evidencia.
Registro JSON requerido: MongoDB 4.4+ usa registros JSON de forma predeterminada. Los registros de texto heredados no son compatibles.
Decodificador FTDC: la decodificación de FTDC requiere Python 3 con pymongo. Sin esto, el módulo B2 no está disponible.
Acceso a mongosh: recopilar contadores de aserciones requiere mongosh con los permisos adecuados.
Si se confirman hallazgos ALTOS o MEDIOS:
La lógica de detección de esta herramienta se basa en la investigación de Eric Capuano y Tamir Zimerman:
Consulte el archivo LICENSE.
¡Las contribuciones son bienvenidas! Envíe problemas (issues) y solicitudes de extracción (pull requests).
Si prueba esta herramienta con datos de producción, agradeceremos especialmente comentarios sobre:
| 22944 | Conexión cerrada | Se registra cuando un cliente se desconecta |
| Tipo de datos | Origen | Destino |
|---|
| Registros | /var/log/mongodb/mongod.log* | <output-dir>/<hostname>/logs/ |
| Contadores de aserciones | comando mongosh | <output-dir>/<hostname>/assert-counts/ |
| Archivos FTDC | /var/lib/mongodb/diagnostic.data/metrics.* | <output-dir>/<hostname>/ftdc-files/ |
| Opción | Descripción | Predeterminado |
|---|
-d, --data-dir <ruta> | Directorio con datos recopilados (modo de autodescubrimiento) | - |
-p, --path <glob> | Ruta/glob de registro adicional (repetible) | - |
-t, --time <minutos> | Ventana de retroceso en minutos | 4320 (3 días) |
-c, --conn-threshold | Umbral de cantidad de conexiones | 100 |
-b, --burst-threshold | Umbral de tasa de ráfaga por minuto | 400 |
-m, --metadata-rate | Umbral de tasa de metadatos (0.0-1.0) | 0.10 |
--spike-threshold | Umbral de pico de aserciones | 100 |
--user-ratio-threshold | Proporción de aserciones de usuario/otras para detección de instantánea única | 250 |
--no-default-paths | Omitir rutas de registro predeterminadas | false |
--forensic-dir <ruta> | Analizar subdirectorios como hosts separados | - |
| Opción | Descripción | Predeterminado |
|---|
-H, --host <hostname> | Host remoto a escanear (repetible) | - |
-f, --hosts-file <archivo> | Archivo que contiene nombres de host (uno por línea) | - |
-u, --user <usuario> | Nombre de usuario SSH | Usuario actual |
-k, --key <archivo> | Archivo de clave privada SSH | ssh-agent |
-P, --port <puerto> | Puerto SSH | 22 |
-o, --ssh-options <opción> | Opciones SSH adicionales (repetible) | - |
--sudo | Usar sudo para acceso a archivos privilegiados (FTDC) | false |
-O, --output-dir <ruta> | Directorio para almacenar los datos recopilados | ./collected-data |
--log-path <ruta> | Ruta de registro remoto a recopilar (repetible) | Rutas estándar |
--ftdc-path <ruta> | Ruta del directorio FTDC remoto (repetible) | Rutas estándar |
--skip-logs | Omitir recopilación de registros | false |
--skip-asserts | Omitir recopilación de serverStatus().asserts | false |
--skip-ftdc | Omitir recopilación de archivos FTDC | false |
--collect-only | Solo recopilar datos, no ejecutar análisis | false |
-j, --parallel <n> | Número de conexiones paralelas | 5 |
--timeout <segundos> | Tiempo de espera de comandos SSH | 300 |
-d, --debug | Habilitar salida de depuración (mostrar comandos SSH) | false |
-q, --quiet | Suprimir mensajes de progreso | false |
| Confianza | Criterios | Interpretación |
|---|
| ALTA | Picos de FTDC detectados Y registros sospechosos en la misma ventana de tiempo | Fuerte indicador de explotación |
| MEDIA | Picos de FTDC O registros sospechosos (no correlacionados) | Se recomienda investigación |
| BAJA | Solo contadores de aserciones acumulativos sin picos | Anomalía detectada, evidencia débil |
| INFO | Sin hallazgos significativos | Actividad normal |
| Conexiones ≥ umbral, tasa de metadatos < 10 %, tasa de ráfaga < 400/min |
| BAJO | Conexiones ≥ umbral, tasa de metadatos ≥ 10 % |
| INFO | Conexiones < umbral |
| Versión | Vulnerable | Corregida en |
|---|
| 8.2.x | 8.2.0 - 8.2.2 | 8.2.3 |
| 8.0.x | 8.0.0 - 8.0.16 | 8.0.17 |
| 7.0.x | 7.0.0 - 7.0.27 | 7.0.28 |
| 6.0.x | 6.0.0 - 6.0.26 | 6.0.27 |
| 5.0.x | 5.0.0 - 5.0.31 | 5.0.32 |
| 4.4.x | 4.4.0 - 4.4.29 | 4.4.30 |
| 4.2.x | 4.2.0+ | Sin corrección |
| 4.0.x | 4.0.0+ | Sin corrección |
| 3.6.x | 3.6.0+ | Sin corrección |