
Exploit de prueba de concepto para CVE-2025-55182, una vulnerabilidad crítica de RCE en Next.js Server Actions. Explota la deserialización insegura en el protocolo React Flight para ejecutar comandos arbitrarios mediante la contaminación de prototipos y la evasión de sandbox.
Un script de prueba de concepto (PoC) para React2Shell (CVE-2025-55182), una vulnerabilidad crítica de ejecución remota de código (RCE) que afecta a aplicaciones Next.js que utilizan Server Actions.
[!WARNING] Aviso legal: Esta herramienta es solo para fines educativos y de pruebas autorizadas. No soy responsable de ningún uso indebido.
Este script explota una vulnerabilidad de deserialización insegura en el protocolo "Flight" de React Server Components. Permite a atacantes no autenticados ejecutar código JavaScript arbitrario en el servidor, lo que conduce a una ejecución remota de código (RCE) parcial.
require (global.require o mediante el constructor del módulo), asegurando que funcione en versiones modernas de Node.js (v14+).pip install -r requirements.txt
python3 react2shell.py -u <TARGET_URL> [-c <COMMAND>]
| Argumento | Descripción | Por defecto |
|---|---|---|
-u, --url | Requerido. La URL objetivo (p. ej., http://localhost:3000/). | N/A |
-c, --cmd | Opcional. El comando a ejecutar en el servidor. | id |
Comprobar la identidad del usuario:
python3 react2shell.py -u http://127.0.0.1:3000/
Listar el contenido del directorio:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "ls -la"
Leer un archivo sensible:
python3 react2shell.py -u http://127.0.0.1:3000/ -c "cat /etc/passwd"
El exploit aprovecha una cadena de Prototype Pollution y deserialización insegura dentro del manejo de Server Actions de Next.js para React Server Components (RSC).
Next-Action indica al servidor que procese una Server Action.then maliciosa ("$1:__proto__:then"). Esto engaña al manejador de solicitudes asíncronas del servidor para que trate el payload como un "Thenable" (objeto similar a una Promise)._response. El campo _prefix se usa normalmente para el buffer interno del stream, pero al manipularlo, podemos inyectar JavaScript crudo.require suele eliminarse del ámbito global para prevenir RCE. El script lo evita recorriendo la cadena de prototipos de process.mainModule:
var require = global.require || global.process.mainModule.constructor._load;
child_process y ejecutar comandos del sistema.execSync), y la salida se lanza como un objeto Error. Este error se serializa y se devuelve al cliente en el cuerpo de la respuesta HTTP, permitiéndonos ver la salida del comando.Esta herramienta fue desarrollada con la asistencia de Gemini 3 Pro.