# Electron Desktop Apps
Erlernen Sie AWS-Hacking von Null auf Held mithtARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
* Wenn Sie Ihr **Unternehmen in HackTricks beworben sehen möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merch**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github Repositories einreichen.
## Einführung
Electron kombiniert ein lokales Backend (mit **NodeJS**) und ein Frontend (**Chromium**), obwohl es einige Sicherheitsmechanismen moderner Browser vermissen lässt.
Normalerweise finden Sie den Code der Electron-App innerhalb einer `.asar`-Anwendung. Um den Code zu erhalten, müssen Sie ihn extrahieren:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
Im Quellcode einer Electron-App, in der Datei `packet.json`, finden Sie die Angabe der `main.js`-Datei, in der Sicherheitskonfigurationen festgelegt sind.
```json
{
"name": "standard-notes",
"main": "./app/index.js",
```
Electron hat 2 Prozesstypen:
* Hauptprozess (hat vollständigen Zugriff auf NodeJS)
* Renderer-Prozess (soll aus Sicherheitsgründen eingeschränkten Zugriff auf NodeJS haben)
![](<../../../.gitbook/assets/image (307) (5) (1).png>)
Ein **Renderer-Prozess** wird ein Browserfenster sein, das eine Datei lädt:
```javascript
const {BrowserWindow} = require('electron');
let win = new BrowserWindow();
//Open Renderer Process
win.loadURL(`file://path/to/index.html`);
```
Die Einstellungen des **Renderer-Prozesses** können im **Hauptprozess** in der main.js-Datei **konfiguriert** werden. Einige der Konfigurationen werden verhindern, dass die Electron-Anwendung RCE oder andere Sicherheitslücken aufweist, wenn die **Einstellungen korrekt konfiguriert sind**.
Die Electron-Anwendung **könnte auf das Gerät zugreifen** über Node-APIs, obwohl es so konfiguriert werden kann, dass es verhindert wird:
* **`nodeIntegration`** - ist standardmäßig `aus`. Wenn aktiviert, ermöglicht den Zugriff auf Node-Funktionen vom Renderer-Prozess aus.
* **`contextIsolation`** - ist standardmäßig `an`. Wenn deaktiviert, sind Haupt- und Renderer-Prozesse nicht isoliert.
* **`preload`** - standardmäßig leer.
* [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ist standardmäßig aus. Es beschränkt die Aktionen, die NodeJS ausführen kann.
* Node-Integration in Workers
* **`nodeIntegrationInSubframes`** - ist standardmäßig `aus`.
* Wenn **`nodeIntegration`** aktiviert ist, ermöglicht dies die Verwendung von **Node.js-APIs** in Webseiten, die in iframes innerhalb einer Electron-Anwendung geladen sind.
* Wenn **`nodeIntegration`** deaktiviert ist, werden Preloads im iframe geladen.
Beispielkonfiguration:
```javascript
const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};
```
Einige **RCE-Payloads** von [hier](https://7as.es/electron/nodeIntegration\_rce.txt):
```html
Example Payloads (Windows):
Example Payloads (Linux & MacOS):
```
### Erfassen von Datenverkehr
Ändern Sie die start-main-Konfiguration und fügen Sie die Verwendung eines Proxys hinzu, wie zum Beispiel:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Electron Lokale Code-Injektion
Wenn Sie lokal eine Electron-App ausführen können, ist es möglich, dass Sie sie dazu bringen können, beliebigen JavaScript-Code auszuführen. Überprüfen Sie, wie dies funktioniert:
{% content-ref url="../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md" %}
[macos-electron-applications-injection.md](../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
{% endcontent-ref %}
## RCE: XSS + nodeIntegration
Wenn die **nodeIntegration** auf **on** gesetzt ist, kann das JavaScript einer Webseite Node.js-Funktionen einfach verwenden, indem es `require()` aufruft. Zum Beispiel ist der Weg, um die Rechneranwendung unter Windows auszuführen:
```html
```
## RCE: preload
Das Skript, das in dieser Einstellung angegeben ist, wird **vor anderen Skripts im Renderer geladen**, daher hat es **uneingeschränkten Zugriff auf Node APIs**:
```javascript
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Daher kann das Skript Node-Funktionen auf Seiten exportieren:
{% code title="preload.js" %}
```javascript
typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};
```
{% endcode %}
{% code title="index.html" %}
```html
```
{% endcode %}
{% hint style="info" %}
**Wenn `contextIsolation` aktiviert ist, funktioniert dies nicht**
{% endhint %}
## RCE: XSS + contextIsolation
Das _**contextIsolation**_ führt die **getrennten Kontexte zwischen den Skripten der Webseite und dem internen JavaScript-Code von Electron** ein, sodass die JavaScript-Ausführung jedes Codes sich nicht gegenseitig beeinflusst. Dies ist eine notwendige Funktion, um die Möglichkeit von RCE zu eliminieren.
Wenn die Kontexte nicht isoliert sind, kann ein Angreifer:
1. **Beliebiges JavaScript im Renderer ausführen** (XSS oder Navigation zu externen Websites)
2. **Die integrierte Methode überschreiben**, die im Preload oder im internen Code von Electron verwendet wird, um eine eigene Funktion zu erstellen
3. **Das Auslösen** der Verwendung der **überschriebenen Funktion**
4. RCE?
Es gibt 2 Stellen, an denen integrierte Methoden überschrieben werden können: Im Preload-Code oder im internen Code von Electron:
{% content-ref url="electron-contextisolation-rce-via-preload-code.md" %}
[electron-contextisolation-rce-via-preload-code.md](electron-contextisolation-rce-via-preload-code.md)
{% endcontent-ref %}
{% content-ref url="electron-contextisolation-rce-via-electron-internal-code.md" %}
[electron-contextisolation-rce-via-electron-internal-code.md](electron-contextisolation-rce-via-electron-internal-code.md)
{% endcontent-ref %}
{% content-ref url="electron-contextisolation-rce-via-ipc.md" %}
[electron-contextisolation-rce-via-ipc.md](electron-contextisolation-rce-via-ipc.md)
{% endcontent-ref %}
### Bypass click event
Wenn Einschränkungen gelten, wenn Sie auf einen Link klicken, können Sie diese möglicherweise umgehen, indem Sie anstelle eines regulären Linksklicks **einen Mittelklick** ausführen.
```javascript
window.addEventListener('click', (e) => {
```
## RCE über shell.openExternal
Für weitere Informationen zu diesen Beispielen siehe [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) und [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Bei der Bereitstellung einer Electron-Desktopanwendung ist es entscheidend, die richtigen Einstellungen für `nodeIntegration` und `contextIsolation` sicherzustellen. Es wurde festgestellt, dass die **clientseitige Remote-Code-Ausführung (RCE)**, die auf Preload-Skripte oder den nativen Code von Electron aus dem Hauptprozess abzielt, effektiv verhindert wird, wenn diese Einstellungen vorhanden sind.
Wenn ein Benutzer mit Links interagiert oder neue Fenster öffnet, werden spezifische Ereignislistener ausgelöst, die für die Sicherheit und Funktionalität der Anwendung entscheidend sind:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Diese Listener werden von der Desktop-Anwendung **überschrieben**, um ihre eigene **Geschäftslogik** zu implementieren. Die Anwendung bewertet, ob ein navigierter Link intern oder in einem externen Webbrowser geöffnet werden soll. Diese Entscheidung wird in der Regel durch eine Funktion, `openInternally`, getroffen. Wenn diese Funktion `false` zurückgibt, zeigt dies an, dass der Link extern geöffnet werden soll, unter Verwendung der Funktion `shell.openExternal`.
**Hier ist ein vereinfachter Pseudocode:**
![https://miro.medium.com/max/1400/1\*iqX26DMEr9RF7nMC1ANMAA.png](<../../../.gitbook/assets/image (638) (2) (1) (1).png>)
![https://miro.medium.com/max/1400/1\*ZfgVwT3X1V\_UfjcKaAccag.png](<../../../.gitbook/assets/image (620).png>)
Die Sicherheitsbewährungen von Electron JS raten davon ab, nicht vertrauenswürdige Inhalte mit der Funktion `openExternal` zu akzeptieren, da dies zu RCE über verschiedene Protokolle führen könnte. Betriebssysteme unterstützen verschiedene Protokolle, die RCE auslösen könnten. Für detaillierte Beispiele und weitere Erklärungen zu diesem Thema kann man auf [diese Ressource](https://positive.security/blog/url-open-rce#windows-10-19042) verweisen, die Windows-Protokollbeispiele enthält, die diese Schwachstelle ausnutzen können.
**Beispiele für Windows-Protokollexploits sind:**
```html
```
## Lesen interner Dateien: XSS + contextIsolation
**Das Deaktivieren von `contextIsolation` ermöglicht die Verwendung von ``-Tags**, ähnlich wie `