diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index c53270332..919ef9b53 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -1,30 +1,30 @@ -# Electron Desktop Apps +# Electron Desktop-Apps {{#include ../../../banners/hacktricks-training.md}} ## Einführung -Electron kombiniert ein lokales Backend (mit **NodeJS**) und ein Frontend (**Chromium**), obwohl es einige Sicherheitsmechanismen moderner Browser nicht bietet. +Electron kombiniert ein lokales Backend (mit **NodeJS**) und ein Frontend (**Chromium**), obwohl es einige der Sicherheitsmechanismen moderner Browser vermissen lässt. -In der Regel findet man den Code einer Electron-App innerhalb einer `.asar`-Anwendung; um den Code zu erhalten, muss man diese extrahieren: +Normalerweise findet man den Electron-App-Code innerhalb einer `.asar`-Anwendung; um den Code zu erhalten, muss man 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 finden Sie in der Datei `packet.json` die Angabe der `main.js`, in der security configs gesetzt sind. +Im Quellcode einer Electron-App findest du in `packet.json` die Angabe zur `main.js`, in der Sicherheitskonfigurationen festgelegt sind. ```json { "name": "standard-notes", "main": "./app/index.js", ``` -Electron hat 2 Prozessarten: +Electron hat 2 Prozesstypen: -- Main Process (hat vollständigen Zugriff auf NodeJS) -- Renderer Process (sollte aus Sicherheitsgründen eingeschränkten Zugriff auf NodeJS haben) +- Hauptprozess (hat vollständigen Zugriff auf NodeJS) +- Renderer-Prozess (sollte aus Sicherheitsgründen nur eingeschränkten Zugriff auf NodeJS haben) ![](<../../../images/image (182).png>) -Ein **renderer process** ist ein Browserfenster, das eine Datei lädt: +Ein **Renderer-Prozess** ist ein Browserfenster, das eine Datei lädt: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,20 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Einstellungen des **renderer process** können im **main process** innerhalb der main.js-Datei **konfiguriert** werden. Einige der Konfigurationen können verhindern, dass die Electron-Anwendung RCE oder andere Verwundbarkeiten erhält, wenn die **Einstellungen korrekt konfiguriert** sind. +Einstellungen des **Renderer-Prozesses** können im **Hauptprozess** in der Datei main.js **konfiguriert** werden. Einige dieser Konfigurationen können verhindern, dass die Electron-Anwendung RCE oder andere Schwachstellen erhält, wenn die **Einstellungen korrekt konfiguriert** sind. -Die Electron-Anwendung **kann auf das Gerät zugreifen** via Node apis, obwohl sie so konfiguriert werden kann, dass dies verhindert wird: +Die Electron-Anwendung **kann über Node-APIs auf das Gerät zugreifen**, obwohl dies so konfiguriert werden kann, dass es verhindert wird: -- **`nodeIntegration`** - is `off` by default. If on, allows to access node features from the renderer process. -- **`contextIsolation`** - is `on` by default. If off, main and renderer processes aren't isolated. +- **`nodeIntegration`** - ist `off` by default. If on, allows to access node features from the renderer process. +- **`contextIsolation`** - ist `on` by default. If off, main and renderer processes aren't isolated. - **`preload`** - empty by default. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - is off by default. It will restrict the actions NodeJS can perform. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ist off by default. It will restrict the actions NodeJS can perform. - Node Integration in Workers -- **`nodeIntegrationInSubframes`**- is `off` by default. +- **`nodeIntegrationInSubframes`**- ist `off` by default. - If **`nodeIntegration`** is **enabled**, this would allow the use of **Node.js APIs** in web pages that are **loaded in iframes** within an Electron application. - If **`nodeIntegration`** is **disabled**, then preloads will load in the iframe -Example of configuration: +Beispielkonfiguration: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Einige **RCE payloads** von [here](https://7as.es/electron/nodeIntegration_rce.txt): +Einige **RCE payloads** aus [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Netzwerkverkehr erfassen +### Datenverkehr erfassen Ändere die start-main-Konfiguration und füge die Verwendung eines Proxys wie folgt hinzu: ```javascript @@ -103,7 +103,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` ## Electron Local Code Injection -Wenn Sie eine Electron App lokal ausführen können, ist es möglich, dass Sie sie dazu bringen können, beliebigen javascript-Code auszuführen. Siehe dazu: +Wenn Sie eine Electron App lokal ausführen können, ist es möglich, dass Sie sie dazu bringen, beliebigen javascript-Code auszuführen. Siehe dazu in: {{#ref}} @@ -112,7 +112,7 @@ Wenn Sie eine Electron App lokal ausführen können, ist es möglich, dass Sie s ## RCE: XSS + nodeIntegration -Wenn die **nodeIntegration** auf **on** gesetzt ist, kann das JavaScript einer Webseite Node.js-Funktionen ganz einfach durch den Aufruf von `require()` verwenden. Zum Beispiel wird die calc-Anwendung unter Windows wie folgt ausgeführt: +Wenn die **nodeIntegration** auf **on** gesetzt ist, kann das JavaScript einer Webseite Node.js-Funktionen einfach durch Aufruf von `require()` verwenden. Zum Beispiel sieht die Ausführung der calc-Anwendung unter Windows so aus: ```html ``` -> [!NOTE] > **Wenn `contextIsolation` aktiviert ist, funktioniert das nicht** +> [!NOTE] > **If `contextIsolation` is on, this won't work** ## RCE: XSS + contextIsolation -Die _**contextIsolation**_ führt getrennte Kontexte zwischen den Skripten der Webseite und dem internen JavaScript-Code von Electron ein, sodass die JavaScript-Ausführung des einen Codes den anderen nicht beeinflusst. Dies ist eine notwendige Funktion, um die Möglichkeit von RCE auszuschließen. +Die _**contextIsolation**_ führt die **getrennten Kontexte zwischen den Skripten der Webseite und dem internen JavaScript-Code von Electron** ein, sodass die JavaScript-Ausführung des jeweiligen Codes einander nicht beeinflusst. Dies ist eine notwendige Funktion, um die Möglichkeit von RCE auszuschließen. Wenn die Kontexte nicht isoliert sind, kann ein Angreifer: -1. Führe **beliebiges JavaScript im renderer** aus (XSS oder Navigation zu externen Seiten) -2. **Überschreibe die eingebaute Methode**, die im preload- oder im internen Electron-Code verwendet wird, um Kontrolle zu erlangen -3. **Veranlasse** die Ausführung der **überschriebenen Funktion** +1. **Beliebigen JavaScript-Code im Renderer ausführen** (XSS oder Navigation zu externen Seiten) +2. **Eingebaute Methoden überschreiben**, die im preload oder im internen Electron-Code verwendet werden, um die Funktion zu übernehmen +3. **Auslösen** der Verwendung der **überschriebenen Funktion** 4. RCE? -Es gibt 2 Stellen, an denen eingebaute Methoden überschrieben werden können: Im preload-Code oder im internen Electron-Code: +There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: {{#ref}} @@ -179,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md electron-contextisolation-rce-via-ipc.md {{#endref}} -### Klick-Ereignis umgehen +### Click-Event umgehen -Wenn beim Klicken eines Links Einschränkungen gelten, kannst du diese möglicherweise umgehen, indem du **einen Mittelklick** statt eines normalen Linksklicks verwendest. +Wenn beim Klicken auf einen Link Beschränkungen angewendet werden, könntest du diese möglicherweise umgehen, indem du statt eines normalen linken Klicks **einen Mittelklick ausführst**. ```javascript window.addEventListener('click', (e) => { ``` ## RCE via 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/) +Weitere Informationen zu diesen Beispielen findest du unter [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/) -Beim Bereitstellen einer Electron-Desktop-Anwendung ist es entscheidend, die richtigen Einstellungen für `nodeIntegration` und `contextIsolation` vorzunehmen. Es ist etabliert, dass **client-side remote code execution (RCE)**, die auf preload scripts oder Electron's native code vom main process abzielt, mit diesen Einstellungen effektiv verhindert wird. +Beim Deployen einer Electron Desktop-Anwendung ist es entscheidend, die korrekten Einstellungen für `nodeIntegration` und `contextIsolation` vorzunehmen. Es ist etabliert, dass **client-side remote code execution (RCE)**, die auf preload scripts oder Electron's native code aus dem main process abzielt, mit diesen Einstellungen effektiv verhindert wird. -Wenn ein Benutzer mit Links interagiert oder neue Fenster öffnet, werden bestimmte Event-Listener ausgelöst, die für die Sicherheit und Funktionalität der Anwendung entscheidend sind: +Wenn ein Benutzer mit Links interagiert oder neue Fenster öffnet, werden bestimmte event listeners 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 aufgerufener Link intern oder in einem externen Webbrowser geöffnet werden soll. Diese Entscheidung wird typischerweise durch eine Funktion, `openInternally`, getroffen. Gibt diese Funktion `false` zurück, zeigt das an, dass der Link extern geöffnet werden soll, wobei die Funktion `shell.openExternal` verwendet wird. +Diese Listener werden von der Desktop-Anwendung **überschrieben**, um ihre eigene **Geschäftslogik** zu implementieren. Die Anwendung prüft, ob ein navigierter Link intern oder in einem externen Webbrowser geöffnet werden soll. Diese Entscheidung wird typischerweise durch eine Funktion, `openInternally`, getroffen. Wenn diese Funktion `false` zurückgibt, bedeutet das, dass der Link extern geöffnet werden soll, indem die Funktion `shell.openExternal` verwendet wird. -**Here is a simplified pseudocode:** +**Hier ist ein vereinfachter Pseudocode:** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Electron JS Sicherheits-Best-Practices raten davon ab, nicht vertrauenswürdige Inhalte mit der Funktion `openExternal` zu akzeptieren, da dies zu RCE über verschiedene Protokolle führen kann. Betriebssysteme unterstützen unterschiedliche Protokolle, die RCE auslösen könnten. Für ausführliche Beispiele und weiterführende Erklärungen zu diesem Thema kann auf [this resource](https://positive.security/blog/url-open-rce#windows-10-19042) verwiesen werden; sie enthält Windows-Protokoll-Beispiele, mit denen diese Schwachstelle ausgenutzt werden kann. +Electron JS Security-Best-Practices raten davon ab, nicht vertrauenswürdige Inhalte mit der Funktion `openExternal` zu akzeptieren, da dies zu RCE über verschiedene Protokolle führen kann. Betriebssysteme unterstützen unterschiedliche Protokolle, die RCE auslösen könnten. Für detaillierte Beispiele und weiterführende Erklärungen zu diesem Thema kann auf [this resource](https://positive.security/blog/url-open-rce#windows-10-19042) verwiesen werden, das Windows-Protokollbeispiele enthält, mit denen diese Verwundbarkeit ausgenutzt werden kann. In macos kann die Funktion `openExternal` ausgenutzt werden, um beliebige Befehle auszuführen, z. B. `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Examples of Windows protocol exploits include:** +**Beispiele für Windows-Protokoll-Exploits sind:** ```html ``` -## RCE: webviewTag + anfällige preload-IPC + shell.openExternal +## RCE: webviewTag + verwundbare preload IPC + shell.openExternal -Diese Schwachstelle findet sich in **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Diese Schwachstelle ist in **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)** zu finden. -Die **webviewTag** ist eine **veraltete Funktion**, die die Nutzung von **NodeJS** im **renderer process** erlaubt. Sie sollte deaktiviert werden, da sie das Laden eines Skripts im preload context ermöglicht, wie: +Die **webviewTag** ist eine **veraltete Funktion**, die die Verwendung von **NodeJS** im **renderer process** ermöglicht. Sie sollte deaktiviert werden, da dadurch ein Script im preload-Kontext geladen werden kann, z. B.: ```xml ``` -Daher konnte ein Angreifer, der es schafft, eine beliebige Seite zu laden, dieses Tag verwenden, um ein beliebiges **preload script** zu laden. +Daher könnte ein Angreifer, dem es gelingt, eine beliebige Seite zu laden, dieses Tag verwenden, um **ein beliebiges preload script zu laden**. -Dieses **preload script** wurde dann missbraucht, um einen **verwundbaren IPC-Dienst (`skype-new-window`)** aufzurufen, der **`shell.openExternal`** aufrief, um RCE zu erlangen: +Dieses preload script wurde dann ausgenutzt, um einen **verwundbaren IPC service (`skype-new-window`)** aufzurufen, der **`shell.openExternal`** aufrief, um RCE zu erlangen: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -251,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Interne Dateien lesen: XSS + contextIsolation -**Das Deaktivieren von `contextIsolation` ermöglicht die Verwendung von ``-Tags**, ähnlich wie `