Si el script de precarga expone un punto final IPC desde el archivo main.js, el proceso de renderizado podrá acceder a él y, si es vulnerable, podría ser posible una RCE. **Todos estos ejemplos fueron tomados de aquí** [**https://www.youtube.com/watch?v=xILfQGkLXQo**](https://www.youtube.com/watch?v=xILfQGkLXQo) # Ejemplo 1 Verifique cómo `main.js` escucha en `getUpdate` y **descargará y ejecutará cualquier URL** que se le pase.\ También verifique cómo `preload.js` **expone cualquier evento IPC** desde el principal. ```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); }; ``` Explotación: ```html ``` # Ejemplo 2 Si el script de precarga expone directamente al renderizador una forma de llamar a shell.openExternal, es posible obtener RCE. ```javascript // Part of preload.js code window.electronOpenInBrowser = (url) => { shell.openExternal(url); }; ``` # Ejemplo 3 Si el script de precarga expone formas de comunicarse completamente con el proceso principal, un XSS podrá enviar cualquier evento. El impacto de esto depende de lo que el proceso principal exponga en términos de IPC. ```javascript window.electronListen = (event, cb) => { ipcRenderer.on(event, cb); }; window.electronSend = (event, data) => { ipcRenderer.send(event, data); }; ```
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! - Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) - **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Comparte tus trucos de hacking enviando PRs al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.