macOS Electron Applications Injection
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jeśli nie wiesz, czym jest Electron, możesz znaleźć wiele informacji tutaj. Ale na razie wystarczy wiedzieć, że Electron uruchamia node. A node ma pewne parametry i zmienne środowiskowe, które mogą być używane do wykonywania innego kodu oprócz wskazanego pliku.
Te techniki zostaną omówione w następnej kolejności, ale w ostatnich czasach Electron dodał kilka flagi zabezpieczeń, aby je zapobiec. Oto Electron Fuses i to są te, które służą do zapobiegania ładowaniu przez aplikacje Electron w macOS dowolnego kodu:
RunAsNode
: Jeśli jest wyłączone, zapobiega używaniu zmiennej środowiskowej ELECTRON_RUN_AS_NODE
do wstrzykiwania kodu.
EnableNodeCliInspectArguments
: Jeśli jest wyłączone, parametry takie jak --inspect
, --inspect-brk
nie będą respektowane. Unikając w ten sposób wstrzykiwania kodu.
EnableEmbeddedAsarIntegrityValidation
: Jeśli jest włączone, załadowany asar
plik będzie walidowany przez macOS. Zapobiegając w ten sposób wstrzykiwaniu kodu poprzez modyfikację zawartości tego pliku.
OnlyLoadAppFromAsar
: Jeśli to jest włączone, zamiast szukać ładowania w następującej kolejności: app.asar
, app
i w końcu default_app.asar
. Sprawdzi i użyje tylko app.asar, zapewniając w ten sposób, że gdy jest połączone z embeddedAsarIntegrityValidation
fuse, jest niemożliwe załadowanie niezweryfikowanego kodu.
LoadBrowserProcessSpecificV8Snapshot
: Jeśli jest włączone, proces przeglądarki używa pliku o nazwie browser_v8_context_snapshot.bin
dla swojego zrzutu V8.
Innym interesującym fuse, który nie będzie zapobiegał wstrzykiwaniu kodu, jest:
EnableCookieEncryption: Jeśli jest włączone, magazyn ciasteczek na dysku jest szyfrowany przy użyciu kluczy kryptograficznych na poziomie systemu operacyjnego.
Możesz sprawdzić te flagi z aplikacji za pomocą:
Jak wspominają dokumenty, konfiguracja bezpieczników Electron jest skonfigurowana wewnątrz binarnego pliku Electron, który zawiera gdzieś ciąg dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX
.
W aplikacjach macOS zazwyczaj znajduje się to w application.app/Contents/Frameworks/Electron Framework.framework/Electron Framework
Możesz załadować ten plik w https://hexed.it/ i wyszukać poprzedni ciąg. Po tym ciągu możesz zobaczyć w ASCII liczbę "0" lub "1", wskazującą, czy każdy bezpiecznik jest wyłączony czy włączony. Po prostu zmodyfikuj kod szesnastkowy (0x30
to 0
, a 0x31
to 1
), aby zmodyfikować wartości bezpieczników.
Zauważ, że jeśli spróbujesz nadpisać binarny plik Electron Framework
wewnątrz aplikacji tymi zmodyfikowanymi bajtami, aplikacja nie będzie działać.
Mogą istnieć zewnętrzne pliki JS/HTML, które wykorzystuje aplikacja Electron, więc atakujący może wstrzyknąć kod do tych plików, których podpis nie będzie sprawdzany, i wykonać dowolny kod w kontekście aplikacji.
Jednak w tej chwili istnieją 2 ograniczenia:
Uprawnienie kTCCServiceSystemPolicyAppBundles
jest potrzebne do modyfikacji aplikacji, więc domyślnie nie jest to już możliwe.
Skonstruowany plik asap
zazwyczaj ma włączone bezpieczniki embeddedAsarIntegrityValidation
i
onlyLoadAppFromAsar
Co sprawia, że ta ścieżka ataku jest bardziej skomplikowana (lub niemożliwa).
Zauważ, że można obejść wymóg kTCCServiceSystemPolicyAppBundles
poprzez skopiowanie aplikacji do innego katalogu (takiego jak /tmp
), zmieniając nazwę folderu app.app/Contents
na app.app/NotCon
, modyfikując plik asar swoim złośliwym kodem, zmieniając go z powrotem na app.app/Contents
i uruchamiając go.
Możesz rozpakować kod z pliku asar za pomocą:
I spakuj to z powrotem po dokonaniu modyfikacji za pomocą:
ELECTRON_RUN_AS_NODE
Zgodnie z dokumentacją, jeśli ta zmienna środowiskowa jest ustawiona, uruchomi proces jako normalny proces Node.js.
Jeśli bezpiecznik RunAsNode
jest wyłączony, zmienna środowiskowa ELECTRON_RUN_AS_NODE
zostanie zignorowana, a to nie zadziała.
Jak proponowano tutaj, możesz nadużyć tej zmiennej środowiskowej w plist, aby utrzymać persistencję:
NODE_OPTIONS
Możesz przechować ładunek w innym pliku i go wykonać:
Jeśli bezpiecznik EnableNodeOptionsEnvironmentVariable
jest wyłączony, aplikacja zignoruje zmienną środowiskową NODE_OPTIONS podczas uruchamiania, chyba że zmienna środowiskowa ELECTRON_RUN_AS_NODE
jest ustawiona, która również będzie zignorowana, jeśli bezpiecznik RunAsNode
jest wyłączony.
Jeśli nie ustawisz ELECTRON_RUN_AS_NODE
, napotkasz błąd: Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.
Możesz nadużyć tej zmiennej środowiskowej w pliku plist, aby utrzymać persistencję, dodając te klucze:
Zgodnie z tym, jeśli uruchomisz aplikację Electron z flagami takimi jak --inspect
, --inspect-brk
i --remote-debugging-port
, port debugowania będzie otwarty, więc możesz się z nim połączyć (na przykład z Chrome w chrome://inspect
) i będziesz mógł wstrzyknąć kod lub nawet uruchomić nowe procesy.
Na przykład:
Jeśli bezpiecznik EnableNodeCliInspectArguments
jest wyłączony, aplikacja zignoruje parametry node (takie jak --inspect
) podczas uruchamiania, chyba że zmienna środowiskowa ELECTRON_RUN_AS_NODE
jest ustawiona, która również będzie zignorowana, jeśli bezpiecznik RunAsNode
jest wyłączony.
Jednak nadal możesz użyć parametru --remote-debugging-port=9229
, ale poprzedni ładunek nie zadziała, aby uruchomić inne procesy.
Używając parametru --remote-debugging-port=9222
, możliwe jest kradzież niektórych informacji z aplikacji Electron, takich jak historia (za pomocą poleceń GET) lub ciasteczka przeglądarki (ponieważ są odszyfrowane wewnątrz przeglądarki i istnieje punkt końcowy json, który je zwróci).
Możesz nauczyć się, jak to zrobić tutaj i tutaj oraz użyć automatycznego narzędzia WhiteChocolateMacademiaNut lub prostego skryptu jak:
W tym wpisie na blogu to debugowanie jest wykorzystywane do tego, aby headless chrome pobierał dowolne pliki w dowolnych lokalizacjach.
Możesz wykorzystać tę zmienną środowiskową w pliku plist, aby utrzymać persistencję, dodając te klucze:
Demon TCC w macOS nie sprawdza wersji aplikacji, która jest uruchamiana. Więc jeśli nie możesz wstrzyknąć kodu w aplikację Electron za pomocą żadnej z wcześniejszych technik, możesz pobrać wcześniejszą wersję APLIKACJI i wstrzyknąć w nią kod, ponieważ nadal uzyska uprawnienia TCC (chyba że Trust Cache to uniemożliwi).
Wcześniejsze techniki pozwolą ci uruchomić kod JS wewnątrz procesu aplikacji electron. Jednak pamiętaj, że procesy potomne działają pod tym samym profilem piaskownicy co aplikacja nadrzędna i dziedziczą ich uprawnienia TCC. Dlatego, jeśli chcesz wykorzystać uprawnienia do uzyskania dostępu do kamery lub mikrofonu, możesz po prostu uruchomić inny plik binarny z procesu.
Narzędzie electroniz3r można łatwo wykorzystać do znalezienia podatnych aplikacji electron zainstalowanych i wstrzyknięcia w nie kodu. To narzędzie spróbuje użyć techniki --inspect
:
Musisz skompilować je samodzielnie i możesz użyć go w ten sposób:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)