# Aplicaciones de Escritorio Electron
Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (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 ` ``` ## **RCE: XSS + Chromium Antiguo** Si el **chromium** utilizado por la aplicaci贸n es **antiguo** y existen **vulnerabilidades conocidas** en 茅l, podr铆a ser posible **explotarlo y obtener RCE a trav茅s de un XSS**.\ Puedes ver un ejemplo en este **informe t茅cnico**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/) ## **Phishing de XSS a trav茅s de la omisi贸n de regex de URL interna** Suponiendo que encontraste un XSS pero **no puedes activar RCE o robar archivos internos**, podr铆as intentar usarlo para **robar credenciales a trav茅s de phishing**. En primer lugar, necesitas saber qu茅 sucede cuando intentas abrir una nueva URL, revisando el c贸digo JS en el front-end: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below) webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below) ``` La llamada a **`openInternally`** decidir谩 si el **enlace** se **abrir谩** en la **ventana del escritorio** como un enlace perteneciente a la plataforma, **o** si se abrir谩 en el **navegador como un recurso de terceros**. En caso de que el **regex** utilizado por la funci贸n sea **vulnerable a eludir** (por ejemplo, al **no escapar los puntos de los subdominios**), un atacante podr铆a abusar del XSS para **abrir una nueva ventana que** se ubicar谩 en la infraestructura del atacante **solicitando credenciales** al usuario: ```html ``` ## **Herramientas** * [**Electronegativity**](https://github.com/doyensec/electronegativity) es una herramienta para identificar configuraciones incorrectas y patrones de seguridad en aplicaciones basadas en Electron. * [**Electrolint**](https://github.com/ksdmitrieva/electrolint) es un complemento de c贸digo abierto para VS Code para aplicaciones de Electron que utiliza Electronegativity. * [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) para verificar bibliotecas de terceros vulnerables. * [**Electro.ng**](https://electro.ng/): Necesitas comprarlo. ## Laboratorios En [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s) puedes encontrar un laboratorio para explotar aplicaciones de Electron vulnerables. Algunos comandos que te ayudar谩n con el laboratorio: ```bash # Download apps from these URls # Vuln to nodeIntegration https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable1.zip # Vuln to contextIsolation via preload script https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable2.zip # Vuln to IPC Rce https://training.7asecurity.com/ma/webinar/desktop-xss-rce/apps/vulnerable3.zip # Get inside the electron app and check for vulnerabilities npm audit # How to use electronegativity npm install @doyensec/electronegativity -g electronegativity -i vulnerable1 # Run an application from source code npm install -g electron cd vulnerable1 npm install npm start ``` ## **Referencias** * [https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028](https://shabarkin.medium.com/unsafe-content-loading-electron-js-76296b6ac028) * [https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d](https://medium.com/@renwa/facebook-messenger-desktop-app-arbitrary-file-read-db2374550f6d) * [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=8) * [https://www.youtube.com/watch?v=a-YnG3Mx-Tg](https://www.youtube.com/watch?v=a-YnG3Mx-Tg) * [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s) * M谩s investigaciones y escritos sobre la seguridad de Electron en [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking) * [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81)
Aprende hacking en AWS de cero a h茅roe con htARTE (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 [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **脷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).