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 2f8b5ac43..d7cd66b62 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 @@ -4,14 +4,14 @@ ## Вступ -Electron поєднує локальний бекенд (з **NodeJS**) і фронтенд (**Chromium**), хоча йому бракує деяких механізмів безпеки сучасних браузерів. +Electron поєднує локальний бекенд (з **NodeJS**) та фронтенд (**Chromium**), хоча йому бракує деяких механізмів безпеки сучасних браузерів. -Зазвичай код Electron-застосунку можна знайти всередині `.asar` архіву; щоб отримати код, його потрібно екстрагувати: +Зазвичай код Electron-додатка можна знайти всередині `.asar` пакунку; щоб отримати код, потрібно його витягти: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -У вихідному коді Electron app, всередині файлу `packet.json`, вказано файл `main.js`, у якому встановлено налаштування безпеки. +У вихідному коді Electron-додатка, всередині `packet.json`, можна знайти вказаний файл `main.js`, де встановлено налаштування безпеки. ```json { "name": "standard-notes", @@ -20,11 +20,11 @@ npx asar extract-file app.asar main.js #Extract just a file Electron має 2 типи процесів: - Головний процес (має повний доступ до NodeJS) -- Рендер-процес (повинен мати обмежений доступ до NodeJS з міркувань безпеки) +- Рендерер (повинен мати обмежений доступ до NodeJS з міркувань безпеки) ![](<../../../images/image (182).png>) -**Рендер-процес** — це вікно браузера, яке завантажує файл: +A **рендерер** буде вікном браузера, що завантажує файл: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Налаштування **renderer process** можна **сконфігурувати** в **main process** у файлі main.js. Деякі конфігурації можуть **запобігти отриманню RCE** в Electron application або іншим вразливостям, якщо **налаштування правильно встановлені**. +Налаштування **renderer process** можна **сконфігурувати** в **main process** у файлі main.js. Деякі конфігурації можуть **запобігти отриманню RCE додатком Electron** або іншим вразливостям, якщо **налаштування встановлені правильно**. -Electron application **може отримувати доступ до пристрою** через Node APIs, хоча це можна налаштувати, щоб запобігти цьому: +Додаток Electron **може отримати доступ до пристрою** через Node APIs, хоча це можна налаштувати, щоб запобігти цьому: -- **`nodeIntegration`** - за замовчуванням `off`. Якщо увімкнено, дозволяє доступ до Node API з **renderer process**. -- **`contextIsolation`** - за замовчуванням `on`. Якщо `off`, main та renderer processes не ізольовані. +- **`nodeIntegration`** - за замовчуванням `off`. Якщо увімкнено, дозволяє доступ до node-функцій з renderer process. +- **`contextIsolation`** - за замовчуванням `on`. Якщо вимкнено, main та renderer процеси не ізольовані. - **`preload`** - порожній за замовчуванням. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - за замовчуванням `off`. Обмежує дії, які може виконувати NodeJS. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - за замовчуванням вимкнений. Обмежує дії, які може виконувати NodeJS. - Node Integration in Workers - **`nodeIntegrationInSubframes`** - за замовчуванням `off`. -- Якщо **`nodeIntegration`** **увімкнено**, це дозволяє використовувати **Node.js APIs** на веб-сторінках, які **завантажуються в iframes** всередині Electron application. -- Якщо **`nodeIntegration`** **відключено**, то preload-скрипти завантажуватимуться в iframe +- Якщо **`nodeIntegration`** **увімкнено**, це дозволить використовувати **Node.js APIs** на веб-сторінках, які **завантажуються в iframes** всередині Electron-додатку. +- Якщо **`nodeIntegration`** **вимкнено**, тоді preload-скрипти завантажуватимуться в iframe Example of configuration: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Кілька **RCE payloads** з [here](https://7as.es/electron/nodeIntegration_rce.txt): +Деякі **RCE payloads** з [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Перехоплення трафіку +### Захоплення трафіку -Змініть конфігурацію start-main і додайте використання proxy, наприклад: +Змініть конфігурацію start-main та додайте використання proxy, наприклад: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` ## Electron Local Code Injection -Якщо ви можете виконати локально Electron App, можливо, ви зможете змусити його виконувати довільний javascript code. Див. як у: +Якщо ви можете локально виконати Electron App, можливо, ви зможете змусити його виконувати довільний javascript код. Див. як у: {{#ref}} @@ -112,7 +112,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" /> ## RCE: XSS + nodeIntegration -Якщо **nodeIntegration** встановлено в **on**, JavaScript веб-сторінки може використовувати можливості Node.js просто викликом `require()`. Наприклад, спосіб запустити додаток calc у Windows такий: +Якщо **nodeIntegration** встановлено в **on**, JavaScript веб-сторінки може використовувати можливості Node.js просто викликом `require()`. Наприклад, спосіб запустити calc на Windows такий: ```html ``` -> [!NOTE] > **Якщо `contextIsolation` увімкнено, це не працюватиме** +> [!NOTE] > **Якщо `contextIsolation` увімкнено, це не спрацює** ## RCE: XSS + contextIsolation -The _**contextIsolation**_ introduces the **separated contexts between the web page scripts and the JavaScript Electron's internal code** so that the JavaScript execution of each code does not affect each. This is a necessary feature to eliminate the possibility of RCE. +The _**contextIsolation**_ вводить **розділені контексти між скриптами веб-сторінки та внутрішнім кодом Electron на JavaScript**, щоб виконання JavaScript одного коду не впливало на інше. Це необхідна функція для усунення можливості RCE. -If the contexts aren't isolated an attacker can: +Якщо контексти не ізольовані, атакуючий може: -1. Execute **arbitrary JavaScript in renderer** (XSS or navigation to external sites) -2. **Overwrite the built-in method** which is used in preload or Electron internal code to own function -3. **Trigger** the use of **overwritten function** +1. Виконати **arbitrary JavaScript in renderer** (XSS або навігацію на зовнішні сайти) +2. **Перезаписати вбудований метод**, який використовується в preload або внутрішньому коді Electron, щоб захопити функцію +3. **Спровокувати** використання **перезаписаної функції** 4. RCE? There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code: @@ -179,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md electron-contextisolation-rce-via-ipc.md {{#endref}} -### Обхід події click +### Обхід події кліку -If there are restrictions applied when you click a link you might be able to bypass them **doing a middle click** instead of a regular left click +Якщо при кліку по посиланню застосовано обмеження, ви можете їх обійти, **виконавши середній клік** замість звичайного лівого кліку ```javascript window.addEventListener('click', (e) => { ``` -## RCE через shell.openExternal +## RCE via shell.openExternal -Для детальнішої інформації про ці приклади див. [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) та [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) +Для отримання додаткової інформації про ці приклади перегляньте [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) та [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Під час розгортання Electron desktop application важливо переконатися у правильних налаштуваннях `nodeIntegration` та `contextIsolation`. Вважається, що **client-side remote code execution (RCE)**, спрямовані на preload scripts або нативний код Electron з main process, ефективно запобігаються при таких налаштуваннях. +Під час розгортання десктопного додатку Electron критично важливо правильно налаштувати `nodeIntegration` та `contextIsolation`. Встановлено, що **client-side remote code execution (RCE)**, спрямований на preload scripts або Electron's native code з main process, ефективно запобігається за наявності цих налаштувань. -Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують певні обробники подій, які є критичними для безпеки та функціональності додатку: +Коли користувач взаємодіє з посиланнями або відкриває нові вікна, спрацьовують певні event listeners, які критично важливі для безпеки та функціональності додатку: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -Ці обробники подій **перевизначаються десктопним додатком**, щоб реалізувати власну **бізнес-логіку**. Додаток визначає, чи має посилання відкриватися всередині програми чи у зовнішньому веб-браузері. Зазвичай це рішення приймається в функції `openInternally`. Якщо ця функція повертає `false`, це означає, що посилання має відкриватися зовнішньо з використанням функції `shell.openExternal`. +Ці слухачі **перевизначаються десктоп‑додатком**, щоб реалізувати його власну **бізнес‑логіку**. Додаток оцінює, чи слід відкривати перехідне посилання внутрішньо або у зовнішньому веб‑браузері. Це рішення зазвичай приймається через функцію `openInternally`. Якщо ця функція повертає `false`, це означає, що посилання слід відкрити зовні з використанням функції `shell.openExternal`. -**Here is a simplified 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 security best practices advise against accepting untrusted content with the `openExternal` function, as it could lead to RCE through various protocols. Операційні системи підтримують різні протоколи, які можуть спричинити RCE. Для детальних прикладів та подальшого пояснення цієї теми можна звернутися до [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), який містить приклади протоколів Windows, здатних експлуатувати цю вразливість. +Рекомендації щодо безпеки Electron JS застерігають від прийняття ненадійного контенту через функцію `openExternal`, оскільки це може призвести до RCE через різні протоколи. Операційні системи підтримують різні протоколи, які можуть спричинити RCE. Для детальних прикладів та додаткового пояснення з цієї теми можна звернутися до [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), який містить приклади протоколів Windows, здатних експлуатувати цю вразливість. -У macos функцію `openExternal` можна експлуатувати для виконання довільних команд, наприклад у `shell.openExternal('file:///System/Applications/Calculator.app')`. +У macos функцію `openExternal` можна експлуатувати для виконання довільних команд, наприклад `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Examples of Windows protocol exploits include:** +**Приклади експлуатації протоколів Windows включають:** ```html ``` -## RCE: webviewTag + вразливий preload IPC + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Цю вразливість можна знайти в **[цьому звіті](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Цю vuln можна знайти в **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -The **webviewTag** is a **застаріла функція** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the **preload context** like: +The **webviewTag** — це **застаріла функція**, яка дозволяє використовувати **NodeJS** у **renderer process**, її слід вимкнути, оскільки вона дозволяє завантажити скрипт у preload-контекст, наприклад: ```xml ``` -Отже, зловмисник, який зуміє завантажити довільну сторінку, може використати цей тег, щоб **завантажити довільний preload script**. +Отже, зловмисник, який зможе завантажити довільну сторінку, може використати цей тег, щоб **load an arbitrary preload script**. -Потім цей preload script використовували для виклику **вразливої IPC-служби (`skype-new-window`)**, яка викликала викликала **`shell.openExternal`** для отримання RCE: +Цей preload script потім використовували для виклику **vulnerable IPC service (`skype-new-window`)**, який викликав **`shell.openExternal`** для отримання RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -251,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Читання внутрішніх файлів: XSS + contextIsolation -**Вимкнення `contextIsolation` дозволяє використовувати теги ``**, аналогічно до `