# Aplicaciones de Escritorio Electron
Aprende a hackear AWS desde cero hasta convertirte en un experto conhtARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCI脫N**](https://github.com/sponsors/carlospolop)!
* Obt茅n el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **s铆gueme** en **Twitter** 馃惁 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Introducci贸n
Electron combina un backend local (con **NodeJS**) y un frontend (**Chromium**), aunque carece de algunos de los mecanismos de seguridad de los navegadores modernos.
Por lo general, es posible encontrar el c贸digo de la aplicaci贸n de electron dentro de una aplicaci贸n `.asar`, para obtener el c贸digo es necesario extraerlo:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
En el c贸digo fuente de una aplicaci贸n de Electron, dentro de `packet.json`, puedes encontrar especificado el archivo `main.js` donde se establecen las configuraciones de seguridad.
```json
{
"name": "standard-notes",
"main": "./app/index.js",
```
Electron tiene 2 tipos de procesos:
* Proceso Principal (tiene acceso completo a NodeJS)
* Proceso de Renderizado (deber铆a tener acceso restringido a NodeJS por razones de seguridad)
![](<../../../.gitbook/assets/image (307) (5) (1).png>)
Un **proceso de renderizado** ser谩 una ventana del navegador cargando un archivo:
```javascript
const {BrowserWindow} = require('electron');
let win = new BrowserWindow();
//Open Renderer Process
win.loadURL(`file://path/to/index.html`);
```
La **configuraci贸n** del **proceso de renderizado** se puede **configurar** en el **proceso principal** dentro del archivo main.js. Algunas de las configuraciones **evitar谩n que la aplicaci贸n Electron sea vulnerable a RCE** u otras vulnerabilidades si los **ajustes se configuran correctamente**.
La aplicaci贸n Electron **podr铆a acceder al dispositivo** a trav茅s de las API de Node aunque se puede configurar para evitarlo:
* **`nodeIntegration`** - est谩 `desactivado` de forma predeterminada. Si est谩 activado, permite acceder a las funciones de Node desde el proceso de renderizado.
* **`contextIsolation`** - est谩 `activado` de forma predeterminada. Si est谩 activado, los procesos principal y de renderizado no est谩n aislados.
* **`preload`** - vac铆o de forma predeterminada.
* [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est谩 desactivado de forma predeterminada. Restringir谩 las acciones que NodeJS puede realizar.
* Integraci贸n de Node en Workers
* **`nodeIntegrationInSubframes`** - est谩 `desactivado` de forma predeterminada.
* Si **`nodeIntegration`** est谩 **habilitado**, esto permitir铆a el uso de **APIs de Node.js** en p谩ginas web que se **cargan en iframes** dentro de una aplicaci贸n Electron.
* Si **`nodeIntegration`** est谩 **deshabilitado**, entonces los preloads se cargar谩n en el iframe
Ejemplo de configuraci贸n:
```javascript
const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};
```
Algunos **payloads de RCE** de [aqu铆](https://7as.es/electron/nodeIntegration\_rce.txt):
```html
Example Payloads (Windows):
Example Payloads (Linux & MacOS):
```
### Captura de tr谩fico
Modifica la configuraci贸n start-main y agrega el uso de un proxy como:
```javascript
"start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors",
```
## Inyecci贸n de C贸digo Local en Electron
Si puedes ejecutar localmente una aplicaci贸n de Electron, es posible que puedas hacer que ejecute c贸digo JavaScript arbitrario. Verifica c贸mo hacerlo en:
{% content-ref url="../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md" %}
[macos-electron-applications-injection.md](../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md)
{% endcontent-ref %}
## RCE: XSS + nodeIntegration
Si la opci贸n **nodeIntegration** est谩 configurada en **on**, el JavaScript de una p谩gina web puede utilizar f谩cilmente las funciones de Node.js simplemente llamando a `require()`. Por ejemplo, la forma de ejecutar la aplicaci贸n de calculadora en Windows es:
```html
```
## RCE: preload
El script indicado en esta configuraci贸n se **carga antes que otros scripts en el renderizador**, por lo que tiene **acceso ilimitado a las APIs de Node**:
```javascript
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Por lo tanto, el script puede exportar las caracter铆sticas del nodo a las p谩ginas:
{% code title="preload.js" %}
```javascript
typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};
```
{% endcode %}
{% code title="index.html" %}
```html
```
{% endcode %}
{% hint style="info" %}
**Si `contextIsolation` est谩 activado, esto no funcionar谩**
{% endhint %}
## RCE: XSS + contextIsolation
El _**contextIsolation**_ introduce los **contextos separados entre los scripts de la p谩gina web y el c贸digo interno de JavaScript de Electron** para que la ejecuci贸n de JavaScript de cada c贸digo no se afecte mutuamente. Esta es una caracter铆stica necesaria para eliminar la posibilidad de RCE.
Si los contextos no est谩n aislados, un atacante puede:
1. Ejecutar **JavaScript arbitrario en el renderizador** (XSS o navegaci贸n a sitios externos)
2. **Sobrescribir el m茅todo integrado** que se utiliza en el c贸digo de precarga o en el c贸digo interno de Electron por una funci贸n propia
3. **Desencadenar** el uso de la **funci贸n sobrescrita**
4. 驴RCE?
Hay 2 lugares donde los m茅todos integrados pueden ser sobrescritos: en el c贸digo de precarga o en el c贸digo interno de Electron:
{% content-ref url="electron-contextisolation-rce-via-preload-code.md" %}
[electron-contextisolation-rce-via-preload-code.md](electron-contextisolation-rce-via-preload-code.md)
{% endcontent-ref %}
{% content-ref url="electron-contextisolation-rce-via-electron-internal-code.md" %}
[electron-contextisolation-rce-via-electron-internal-code.md](electron-contextisolation-rce-via-electron-internal-code.md)
{% endcontent-ref %}
{% content-ref url="electron-contextisolation-rce-via-ipc.md" %}
[electron-contextisolation-rce-via-ipc.md](electron-contextisolation-rce-via-ipc.md)
{% endcontent-ref %}
### Bypass al evento de clic
Si hay restricciones aplicadas cuando haces clic en un enlace, es posible que puedas evitarlas **haciendo clic medio** en lugar de un clic izquierdo regular.
```javascript
window.addEventListener('click', (e) => {
```
## RCE a trav茅s de shell.openExternal
Para obtener m谩s informaci贸n sobre estos ejemplos, consulta [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) y [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Al implementar una aplicaci贸n de escritorio Electron, es crucial garantizar la configuraci贸n correcta de `nodeIntegration` y `contextIsolation`. Se ha establecido que la **ejecuci贸n remota de c贸digo en el lado del cliente (RCE)** dirigida a scripts de precarga o al c贸digo nativo de Electron desde el proceso principal se previene de manera efectiva con estas configuraciones en su lugar.
Cuando un usuario interact煤a con enlaces o abre nuevas ventanas, se activan oyentes de eventos espec铆ficos, los cuales son cruciales para la seguridad y funcionalidad de la aplicaci贸n:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Estos listeners son **sobrescritos por la aplicaci贸n de escritorio** para implementar su propia **l贸gica de negocio**. La aplicaci贸n eval煤a si un enlace navegado debe abrirse internamente o en un navegador web externo. Esta decisi贸n suele tomarse a trav茅s de una funci贸n, `openInternally`. Si esta funci贸n devuelve `false`, indica que el enlace debe abrirse externamente, utilizando la funci贸n `shell.openExternal`.
**Aqu铆 tienes un seudoc贸digo simplificado:**
![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../.gitbook/assets/image (638) (2) (1) (1).png>)
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../.gitbook/assets/image (620).png>)
Las mejores pr谩cticas de seguridad de Electron JS desaconsejan aceptar contenido no confiable con la funci贸n `openExternal`, ya que podr铆a conducir a una ejecuci贸n remota de c贸digo a trav茅s de varios protocolos. Los sistemas operativos admiten diferentes protocolos que podr铆an desencadenar una ejecuci贸n remota de c贸digo. Para ejemplos detallados y una explicaci贸n m谩s profunda sobre este tema, se puede consultar [este recurso](https://positive.security/blog/url-open-rce#windows-10-19042), que incluye ejemplos de protocolos de Windows capaces de explotar esta vulnerabilidad.
**Ejemplos de exploits de protocolos de Windows incluyen:**
```html
```
## Leyendo Archivos Internos: XSS + contextIsolation
**Desactivar `contextIsolation` permite el uso de etiquetas ``, similares a `