* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
O Electron é **baseado no Chromium**, mas não é um navegador. Certos princípios e mecanismos de segurança implementados pelos navegadores modernos não estão presentes.\
Você pode ver o Electron como um aplicativo local de backend+frontend onde o **NodeJS** é o **backend** e o **Chromium** é o **frontend**.
No código-fonte de um aplicativo Electron, dentro de `packet.json`, você pode encontrar especificado o arquivo `main.js` onde as configurações de segurança são definidas.
As configurações do **processo de renderização** podem ser **configuradas** no **processo principal** dentro do arquivo main.js. Algumas das configurações irão **impedir que a aplicação Electron obtenha RCE** ou outras vulnerabilidades se as **configurações estiverem corretamente configuradas**.
A aplicação desktop pode ter acesso ao dispositivo do usuário por meio das APIs do Node. As duas seguintes configurações são responsáveis por fornecer mecanismos para **impedir que o JavaScript da aplicação tenha acesso direto ao dispositivo do usuário** e comandos de nível do sistema.
* **`nodeIntegration`** - está desativado por padrão. Se ativado, permite acessar recursos do Node a partir do processo de renderização.
* **`contextIsolation`** - está ativado por padrão. Se ativado, os processos principal e de renderização não estão isolados.
* **`preload`** - vazio por padrão.
* [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - está desativado por padrão. Ele restringirá as ações que o NodeJS pode executar.
* Integração do Node em Workers
* **`nodeIntegrationInSubframes`** - está desativado por padrão.
* Se a **`nodeIntegration`** estiver **habilitada**, isso permitiria o uso das **APIs do Node.js** em páginas da web que são **carregadas em iframes** dentro de uma aplicação Electron.
Se o **nodeIntegration** estiver definido como **on**, o JavaScript de uma página da web pode usar facilmente recursos do Node.js apenas chamando o `require()`. Por exemplo, a maneira de executar o aplicativo calc no Windows é:
Este repositório contém um exemplo de como uma vulnerabilidade de XSS pode ser explorada para obter RCE em aplicativos de desktop do Electron.
## Descrição
O Electron é um framework popular para criar aplicativos de desktop multiplataforma usando tecnologias web. No entanto, como muitos outros frameworks, o Electron é vulnerável a ataques de XSS (Cross-Site Scripting).
Neste exemplo, exploramos uma vulnerabilidade de XSS em um aplicativo de desktop do Electron para obter RCE (Remote Code Execution) no sistema de destino.
## Como reproduzir
1. Clone este repositório e navegue até o diretório `app`.
2. Execute `npm install` para instalar as dependências.
3. Execute `npm start` para iniciar o aplicativo.
4. Clique no botão "Open Window" para abrir uma nova janela.
5. Insira o seguinte payload no campo de entrada de texto e pressione Enter:
6. A calculadora do Windows deve ser aberta, indicando que o código foi executado com sucesso.
## Como funciona
O aplicativo de desktop do Electron usa o módulo `electron-remote` para permitir que o processo de renderização acesse objetos no processo principal. No entanto, o `electron-remote` não filtra adequadamente as entradas do usuário, permitindo que um atacante injete código malicioso no processo principal.
Neste exemplo, o payload injetado é um elemento `img` com um atributo `onerror` que executa o comando `calc.exe` usando o módulo `child_process` do Node.js. Quando o elemento `img` é carregado, o evento `onerror` é acionado, o que resulta na execução do código malicioso.
## Mitigação
Para mitigar essa vulnerabilidade, é necessário filtrar adequadamente as entradas do usuário e evitar o uso do módulo `electron-remote` sempre que possível. Além disso, é recomendável manter o aplicativo do Electron atualizado com as versões mais recentes do framework e das dependências.
O _**contextIsolation**_ introduz os **contextos separados entre os scripts da página da web e o código interno do JavaScript do Electron** para que a execução do JavaScript de cada código não afete um ao outro. Essa é uma característica necessária para eliminar a possibilidade de RCE.
Se houver restrições aplicadas quando você clica em um link, você pode ser capaz de contorná-las **fazendo um clique do meio** em vez de um clique esquerdo regular.
Se o aplicativo de desktop Electron for implantado com as configurações adequadas de `nodeIntegration` e `contextIsolation`, isso simplesmente significa que **a execução remota de código do lado do cliente, direcionando scripts de pré-carregamento ou código nativo do Electron do processo principal, não pode ser alcançada**.
A aplicação desktop **substitui esses ouvintes** para implementar a própria **lógica de negócios** da aplicação desktop. Durante a criação de novas janelas, a aplicação verifica se o link navegado deve ser aberto em uma janela ou guia da aplicação desktop, ou se deve ser aberto no navegador da web. Em nosso exemplo, a verificação é implementada com a função `openInternally`, se ela retornar `false`, a aplicação assumirá que o link deve ser aberto no navegador da web usando a função `shell.openExternal`.
De acordo com as melhores práticas de segurança do Electron JS, a função `openExternal`**não deve aceitar conteúdo não confiável****porque isso pode levar a RCE abusando de diferentes protocolos** se a aplicação não limitar a navegação dos usuários por meio de protocolos como https:// ou http://.
Diferentes sistemas operacionais suportam diferentes protocolos que podem desencadear RCE, para obter mais informações sobre eles, verifique [https://positive.security/blog/url-open-rce](https://positive.security/blog/url-open-rce#windows-10-19042), mas aqui estão alguns exemplos do Windows:
Para mais informações sobre esses exemplos, consulte [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) e [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Se `contextIsolation` estiver definido como falso, você pode tentar usar \<webview> (semelhante a \<iframe>, mas pode carregar arquivos locais) para ler arquivos locais e exfiltrá-los: usando algo como **\<webview src=”file:///etc/passwd”>\</webview>:**
Outra maneira de **ler um arquivo interno** a partir deste [**writeup**](https://bugcrowd.com/disclosures/f7ce8504-0152-483b-bbf3-fb9b759f9f89/critical-local-file-read-in-electron-desktop-app):
Se o **chromium** usado pela aplicação for **antigo** e houver **vulnerabilidades conhecidas** nele, pode ser possível **explorá-lo e obter RCE por meio de um XSS**.\
Você pode ver um exemplo neste **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
Supondo que você encontrou um XSS, mas **não pode acionar RCE ou roubar arquivos internos**, você pode tentar usá-lo para **roubar credenciais por meio de phishing**.
A chamada para **`openInternally`** decidirá se o **link** será **aberto** na **janela do desktop** como um link pertencente à plataforma, **ou** se será aberto no **navegador como um recurso de terceiros**.
No caso em que o **regex** usado pela função é **vulnerável a bypasses** (por exemplo, **não escapando os pontos dos subdomínios**), um invasor poderia abusar do XSS para **abrir uma nova janela que** estará localizada na infraestrutura do invasor **solicitando credenciais** ao usuário:
* [**Electronegativity**](https://github.com/doyensec/electronegativity) é uma ferramenta para identificar configurações incorretas e anti-padrões de segurança em aplicativos baseados em Electron.
* [**Electrolint**](https://github.com/ksdmitrieva/electrolint) é um plugin de código aberto do VS Code para aplicativos Electron que usa o Electronegativity.
Em [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s) você pode encontrar um laboratório para explorar aplicativos Electron vulneráveis.
* Mais pesquisas e artigos sobre segurança do Electron em [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).