Node inspector/CEF debug abuse
Podstawowe informacje
Z dokumentacji: Gdy uruchomiono z przełącznikiem --inspect
, proces Node.js nasłuchuje na klienta debugowania. Domyślnie będzie nasłuchiwał na hoście i porcie 127.0.0.1:9229
. Każdy proces otrzymuje również unikalne UUID.
Klienci inspektora muszą znać i określić adres hosta, port oraz UUID, aby się połączyć. Pełny adres URL będzie wyglądał mniej więcej tak: ws://127.0.0.1:9229/0f2c936f-b1cd-4ac9-aab3-f63b0f33d55e
.
Ponieważ debugger ma pełny dostęp do środowiska wykonawczego Node.js, złośliwy podmiot zdolny do połączenia się z tym portem może wykonać dowolny kod w imieniu procesu Node.js (potencjalne eskalowanie uprawnień).
Istnieje kilka sposobów uruchomienia inspektora:
Kiedy uruchomisz proces poddany inspekcji, pojawi się coś w tym stylu:
Procesy oparte na CEF (Chromium Embedded Framework) muszą użyć parametru: --remote-debugging-port=9222
aby otworzyć debugger (zabezpieczenia SSRF pozostają bardzo podobne). Jednakże zamiast udzielać sesji debugowania NodeJS, będą komunikować się z przeglądarką za pomocą Chrome DevTools Protocol, jest to interfejs do kontrolowania przeglądarki, ale nie ma bezpośredniego RCE.
Gdy uruchomisz przeglądarkę w trybie debugowania, pojawi się coś w rodzaju tego:
Przeglądarki, WebSockets i polityka tego samego pochodzenia
Strony internetowe otwarte w przeglądarce internetowej mogą wykonywać żądania WebSocket i HTTP zgodnie z modelem bezpieczeństwa przeglądarki. Początkowe połączenie HTTP jest konieczne do uzyskania unikalnego identyfikatora sesji debugera. Polityka tego samego pochodzenia zapobiega stronom internetowym możliwości nawiązania tego połączenia HTTP. Dla dodatkowego zabezpieczenia przed atakami DNS rebinding, Node.js sprawdza, czy nagłówki 'Host' dla połączenia precyzyjnie określają adres IP lub localhost
lub localhost6
.
Te środki bezpieczeństwa zapobiegają wykorzystaniu inspektora do uruchamiania kodu poprzez wysłanie żądania HTTP (co mogłoby zostać zrobione poprzez wykorzystanie podatności SSRF).
Uruchamianie inspektora w działających procesach
Możesz wysłać sygnał SIGUSR1 do działającego procesu nodejs, aby ten uruchomił inspektora na domyślnym porcie. Należy jednak pamiętać, że wymagane są odpowiednie uprawnienia, co może dać dostęp do przywilejów do informacji wewnątrz procesu, ale nie spowoduje bezpośredniego eskalowania uprawnień.
To jest przydatne w kontenerach, ponieważ zatrzymanie procesu i uruchomienie nowego z --inspect
nie jest opcją, ponieważ kontener zostanie zabity wraz z procesem.
Połączenie z inspektorem/debugerem
Aby połączyć się z przeglądarką opartą na Chromium, można uzyskać dostęp do adresów URL chrome://inspect
lub edge://inspect
dla przeglądarek Chrome lub Edge, odpowiednio. Klikając przycisk Konfiguruj, należy upewnić się, że docelowy host i port są poprawnie wymienione. Na obrazku przedstawiono przykład zdalnego wykonania kodu (RCE):
Korzystając z wiersza poleceń, można połączyć się z debugerem/inspektorem za pomocą:
Narzędzie https://github.com/taviso/cefdebug pozwala znaleźć inspektory działające lokalnie i wstrzyknąć kod do nich.
Należy pamiętać, że eksploity RCE NodeJS nie zadziałają, jeśli połączysz się z przeglądarką za pomocą protokołu Chrome DevTools (musisz sprawdzić interfejs API, aby znaleźć interesujące rzeczy do zrobienia).
RCE w NodeJS Debugger/Inspector
Jeśli tu trafiłeś, szukając informacji, jak uzyskać RCE z XSS w Electron, sprawdź tę stronę.
Niektóre powszechne sposoby uzyskania RCE, gdy możesz połączyć się z inspektorem Node, to korzystanie z czegoś takiego (wygląda na to, że to nie zadziała w połączeniu z protokołem Chrome DevTools):
Dane wejściowe protokołu Chrome DevTools
Możesz sprawdzić API tutaj: https://chromedevtools.github.io/devtools-protocol/ W tej sekcji wymienię interesujące rzeczy, które ludzie wykorzystali do atakowania tego protokołu.
Wstrzykiwanie parametrów za pomocą głębokich linków
W CVE-2021-38112 Rhino Security odkryło, że aplikacja oparta na CEF zarejestrowała niestandardowy adres URI w systemie (workspaces://), który otrzymywał pełny adres URI, a następnie uruchamiał aplikację opartą na CEF z konfiguracją częściowo tworzoną z tego adresu URI.
Odkryto, że parametry URI były dekodowane z adresu URL i używane do uruchamiania podstawowej aplikacji CEF, umożliwiając użytkownikowi wstrzyknięcie flagi --gpu-launcher
w wierszu poleceń i wykonanie dowolnych poleceń.
Więc, taki ładunek jak:
Nadpisz pliki
Zmień folder, do którego zapisywane są pobrane pliki, i pobierz plik, aby nadpisać często używany kod źródłowy aplikacji swoim złośliwym kodem.
Wywołanie zdalnego kodu (RCE) i eksfiltracja za pomocą Webdriver
Zgodnie z tym postem: https://medium.com/@knownsec404team/counter-webdriver-from-bot-to-rce-b5bfb309d148 istnieje możliwość uzyskania RCE i eksfiltracji wewnętrznych stron za pomocą Webdriver.
Po wykorzystaniu podatności
W rzeczywistym środowisku i po skompromitowaniu komputera użytkownika korzystającego z przeglądarki opartej na Chrome/Chromium, można uruchomić proces Chrome z aktywowanym debugowaniem i przekierować port debugowania, aby uzyskać do niego dostęp. W ten sposób będzie można sprawdzić wszystko, co ofiara robi z Chrome, oraz ukraść wrażliwe informacje.
Sposobem na zachowanie dyskrecji jest zakończenie każdego procesu Chrome i następnie wywołanie czegoś w stylu
Odnośniki
Last updated