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 4bce0cdc3..11af4de57 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 @@ -# Electron Desktop Apps +# Aplicações Desktop Electron {{#include ../../../banners/hacktricks-training.md}} ## Introdução -Electron combina um backend local (com **NodeJS**) e um frontend (**Chromium**), embora falte alguns dos mecanismos de segurança dos navegadores modernos. +Electron combina um backend local (com **NodeJS**) e um frontend (**Chromium**), embora lhe faltem alguns dos mecanismos de segurança dos navegadores modernos. -Normalmente, você pode encontrar o código do aplicativo electron dentro de uma aplicação `.asar`, para obter o código você precisa extraí-lo: +Normalmente poderá encontrar o código da aplicação Electron dentro de uma aplicação `.asar`; para obter o código é necessário extraí-lo: ```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 @@ No código-fonte de um aplicativo Electron, dentro de `packet.json`, você pode "name": "standard-notes", "main": "./app/index.js", ``` -O Electron tem 2 tipos de processos: +Electron tem 2 tipos de processo: -- Processo Principal (tem acesso completo ao NodeJS) -- Processo de Renderização (deve ter acesso restrito ao NodeJS por razões de segurança) +- Main Process (tem acesso completo ao NodeJS) +- Renderer Process (deve ter o acesso ao NodeJS restrito por motivos de segurança) ![](<../../../images/image (182).png>) -Um **processo de renderização** será uma janela do navegador carregando um arquivo: +Um **renderer process** será uma janela do navegador carregando um arquivo: ```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`) ``` -As configurações do **renderer process** podem ser **configuradas** no **main process** dentro do arquivo main.js. Algumas das configurações irão **prevenir que a aplicação Electron obtenha RCE** ou outras vulnerabilidades se as **configurações estiverem corretamente configuradas**. +As configurações do **renderer process** podem ser **configuradas** no **main process** dentro do arquivo main.js. Algumas dessas configurações irão **impedir que a Electron application obtenha RCE** ou outras vulnerabilidades se as **configurações estiverem corretas**. -A aplicação Electron **pode acessar o dispositivo** via APIs do Node, embora possa ser configurada para impedir isso: +A Electron application **pode acessar o dispositivo** via Node apis, embora possa ser configurada para impedir isso: -- **`nodeIntegration`** - está `desligado` por padrão. Se ativado, permite acessar recursos do Node a partir do renderer process. -- **`contextIsolation`** - está `ativado` por padrão. Se desligado, os processos principal e renderer não estão isolados. +- **`nodeIntegration`** - está `off` por padrão. Se ativado, permite acessar recursos do Node a partir do renderer process. +- **`contextIsolation`** - está `on` por padrão. Se `off`, os processos main e renderer não são isolados. - **`preload`** - vazio por padrão. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - está desligado por padrão. Isso restringirá as ações que o NodeJS pode realizar. -- Integração do Node em Workers -- **`nodeIntegrationInSubframes`** - está `desligado` por padrão. -- Se **`nodeIntegration`** estiver **ativado**, isso permitiria o uso de **APIs do Node.js** em páginas da web que estão **carregadas em iframes** dentro de uma aplicação Electron. -- Se **`nodeIntegration`** estiver **desativado**, então os preloads serão carregados no iframe. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - está `off` por padrão. Vai restringir as ações que o NodeJS pode executar. +- Node Integration in Workers +- **`nodeIntegrationInSubframes`** - está `off` por padrão. +- Se **`nodeIntegration`** estiver **enabled**, isso permitirá o uso das **Node.js APIs** em páginas web que são **carregadas em iframes** dentro de uma Electron application. +- Se **`nodeIntegration`** estiver **disabled**, então os preloads serão carregados no iframe Exemplo de configuração: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Alguns **RCE payloads** de [aqui](https://7as.es/electron/nodeIntegration_rce.txt): +Alguns **RCE payloads** de [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): src="x" onerror="alert(require('child_process').execSync('uname -a').toString());" /> ``` -### Captura de tráfego +### Capturar tráfego Modifique a configuração start-main e adicione o uso de um proxy como: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` -## Injeção de Código Local do Electron +## Electron Local Code Injection + +Se você conseguir executar localmente um Electron App é possível que você possa fazê-lo executar código javascript arbitrário. Check how in: -Se você puder executar localmente um aplicativo Electron, é possível que você consiga fazer com que ele execute código JavaScript arbitrário. Confira como em: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +112,7 @@ Se você puder executar localmente um aplicativo Electron, é possível que voc ## RCE: XSS + nodeIntegration -Se o **nodeIntegration** estiver definido como **on**, o JavaScript de uma página da web pode usar recursos do Node.js facilmente apenas chamando o `require()`. Por exemplo, a maneira de executar o aplicativo calc no Windows é: +Se o **nodeIntegration** estiver definido como **on**, o JavaScript de uma página web pode usar funcionalidades do Node.js facilmente apenas chamando `require()`. Por exemplo, a forma de executar o aplicativo calc no Windows é: ```html ``` -## RCE: webviewTag + preload IPC vulnerável + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Essa vulnerabilidade pode ser encontrada em **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Esta vuln pode ser encontrada em **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -O **webviewTag** é um **recurso obsoleto** que permite o uso de **NodeJS** no **processo de renderização**, que deve ser desativado, pois permite carregar um script dentro do contexto de preload como: +O **webviewTag** é um **recurso obsoleto** que permite o uso de **NodeJS** no **renderer process**, que deve ser desabilitado, pois permite carregar um script dentro do preload context como: ```xml ``` -Portanto, um atacante que conseguir carregar uma página arbitrária poderia usar essa tag para **carregar um script de pré-carregamento arbitrário**. +Portanto, um atacante que consiga carregar uma página arbitrária poderia usar essa tag para **carregar um preload script arbitrário**. -Esse script de pré-carregamento foi abusado para chamar um **serviço IPC vulnerável (`skype-new-window`)** que estava chamando **`shell.openExternal`** para obter RCE: +Esse preload script foi então abusado para chamar um **serviço IPC vulnerável (`skype-new-window`)** que chamava **`shell.openExternal`** para obter RCE: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -250,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## Leitura de Arquivos Internos: XSS + contextIsolation -**Desabilitar `contextIsolation` permite o uso de `` tags**, semelhante a `