macOS .Net 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)
To jest podsumowanie posta https://blog.xpnsec.com/macos-injection-via-third-party-frameworks/. Sprawdź go, aby uzyskać więcej szczegółów!
Zarządzanie komunikacją między debuggerem a debuggee w .NET jest obsługiwane przez dbgtransportsession.cpp. Ten komponent ustawia dwa nazwane potoki dla każdego procesu .NET, jak widać w dbgtransportsession.cpp#L127, które są inicjowane przez twowaypipe.cpp#L27. Te potoki mają sufiksy -in
i -out
.
Odwiedzając $TMPDIR
użytkownika, można znaleźć dostępne FIFOs do debugowania aplikacji .Net.
DbgTransportSession::TransportWorker jest odpowiedzialny za zarządzanie komunikacją z debuggerem. Aby zainicjować nową sesję debugowania, debugger musi wysłać wiadomość przez potok out
, zaczynając od struktury MessageHeader
, szczegółowo opisanej w kodzie źródłowym .NET:
Aby zażądać nowej sesji, ta struktura jest wypełniana w następujący sposób, ustawiając typ wiadomości na MT_SessionRequest
i wersję protokołu na bieżącą wersję:
Ten nagłówek jest następnie wysyłany do celu za pomocą wywołania systemowego write
, a następnie struktura sessionRequestData
zawierająca GUID dla sesji:
Operacja odczytu na rurze out
potwierdza sukces lub niepowodzenie nawiązania sesji debugowania:
Gdy sesja debugowania jest nawiązana, pamięć można odczytać za pomocą typu wiadomości MT_ReadMemory
. Funkcja readMemory jest szczegółowo opisana, wykonując niezbędne kroki do wysłania żądania odczytu i pobrania odpowiedzi:
Pełny dowód koncepcji (POC) jest dostępny tutaj.
Podobnie, pamięć można zapisać za pomocą funkcji writeMemory
. Proces polega na ustawieniu typu wiadomości na MT_WriteMemory
, określeniu adresu i długości danych, a następnie wysłaniu danych:
Powiązany POC jest dostępny tutaj.
Aby wykonać kod, należy zidentyfikować obszar pamięci z uprawnieniami rwx, co można zrobić za pomocą vmmap -pages:
Zlokalizowanie miejsca do nadpisania wskaźnika funkcji jest konieczne, a w .NET Core można to zrobić, celując w Dynamic Function Table (DFT). Ta tabela, szczegółowo opisana w jithelpers.h
, jest używana przez środowisko uruchomieniowe do funkcji pomocniczych kompilacji JIT.
W systemach x64 można użyć polowania na sygnatury, aby znaleźć odniesienie do symbolu _hlpDynamicFuncTable
w libcorclr.dll
.
Funkcja debugera MT_GetDCB
dostarcza przydatnych informacji, w tym adresu funkcji pomocniczej, m_helperRemoteStartAddr
, wskazującego lokalizację libcorclr.dll
w pamięci procesu. Ten adres jest następnie używany do rozpoczęcia wyszukiwania DFT i nadpisania wskaźnika funkcji adresem shellcode.
Pełny kod POC do wstrzykiwania do PowerShell jest dostępny tutaj.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)