macOS Apps - Inspecting, debugging and Fuzzing
WhiteIntel to wyszukiwarka zasilana przez dark web, która oferuje darmowe funkcje do sprawdzania, czy firma lub jej klienci zostali skompromitowani przez złośliwe oprogramowanie kradnące dane.
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za darmo pod adresem:
Analiza Statyczna
otool
objdump
jtool2
To narzędzie może być używane jako zamiennik dla codesign, otool i objdump, oraz dostarcza kilka dodatkowych funkcji. Pobierz tutaj lub zainstaluj za pomocą brew
.
Codesign / ldid
Codesign
można znaleźć w systemie macOS, podczas gdy ldid
można znaleźć w systemie iOS
SuspiciousPackage
SuspiciousPackage to narzędzie przydatne do inspekcji plików .pkg (instalatorów) i zobaczenia, co znajduje się w środku przed ich zainstalowaniem.
Te instalatory posiadają skrypty bash preinstall
i postinstall
, których autorzy złośliwego oprogramowania zazwyczaj nadużywają do utrwalenia złośliwego oprogramowania.
hdiutil
To narzędzie pozwala na zamontowanie obrazów dysków Apple (.dmg) do inspekcji przed uruchomieniem cokolwiek:
Zostanie zamontowany w /Volumes
Objective-C
Metadane
Zauważ, że programy napisane w Objective-C zachowują swoje deklaracje klas podczas kompilacji do binarnych Mach-O. Takie deklaracje klas obejmują nazwę i typ:
Klasę
Metody klasy
Zmienne instancji klasy
Te informacje można uzyskać za pomocą class-dump:
Wywoływanie funkcji
Kiedy funkcja jest wywoływana w binarnym pliku używającym Objective-C, skompilowany kod zamiast wywoływać tę funkcję, będzie wywoływał objc_msgSend
. Która z kolei wywołuje ostateczną funkcję:
Parametry, których ta funkcja oczekuje, to:
Pierwszy parametr (self) to "wskaźnik wskazujący na instancję klasy, która ma otrzymać wiadomość". Innymi słowy, jest to obiekt, na którym wywoływana jest metoda. Jeśli metoda jest metodą klasy, będzie to instancja obiektu klasy (całość), podczas gdy dla metody instancji self wskaże zainicjowaną instancję klasy jako obiekt.
Drugi parametr, (op), to "selektor metody obsługującej wiadomość". Prościej mówiąc, jest to po prostu nazwa metody.
Pozostałe parametry to wszelkie wartości wymagane przez metodę (op).
Zobacz, jak łatwo uzyskać te informacje za pomocą lldb
w ARM64 na tej stronie:
x64:
Argument | Rejestr | (dla) objc_msgSend |
1. argument | rdi | self: obiekt, na którym wywoływana jest metoda |
2. argument | rsi | op: nazwa metody |
3. argument | rdx | 1. argument metody |
4. argument | rcx | 2. argument metody |
5. argument | r8 | 3. argument metody |
6. argument | r9 | 4. argument metody |
7. i kolejne | rsp+ (na stosie) | 5. i kolejne argumenty metody |
Swift
W przypadku binarnych plików Swift, ponieważ istnieje kompatybilność z Objective-C, czasami można wyodrębnić deklaracje za pomocą class-dump, ale nie zawsze.
Z poleceniami wiersza poleceń jtool -l
lub otool -l
można znaleźć kilka sekcji z prefiksem __swift5
:
Możesz znaleźć dalsze informacje na temat informacji przechowywanych w tych sekcjach w tym wpisie na blogu.
Co więcej, binaria Swift mogą mieć symbole (na przykład biblioteki muszą przechowywać symbole, aby ich funkcje mogły być wywoływane). Symbole zazwyczaj zawierają informacje o nazwie funkcji i atrybutach w nieczytelny sposób, dlatego są bardzo przydatne, a istnieją "demanglery", które mogą odzyskać oryginalną nazwę:
Spakowane pliki
Sprawdź wysoką entropię
Sprawdź ciągi znaków (jeśli nie ma praktycznie żadnych zrozumiałych ciągów, jest spakowany)
Packer UPX dla systemu MacOS generuje sekcję o nazwie "__XHDR"
Analiza dynamiczna
Zauważ, że aby debugować pliki binarne, SIP musi być wyłączone (csrutil disable
lub csrutil enable --without debug
) lub skopiować pliki binarne do tymczasowego folderu i usunąć podpis za pomocą codesign --remove-signature <ścieżka-do-binarnego>
lub umożliwić debugowanie binarnego (możesz użyć tego skryptu)
Zauważ, że aby instrumentować binarne systemowe (takie jak cloudconfigurationd
) w systemie macOS, SIP musi być wyłączone (tylko usunięcie podpisu nie zadziała).
Zjednoczone dzienniki
System MacOS generuje wiele dzienników, które mogą być bardzo przydatne podczas uruchamiania aplikacji, próbując zrozumieć co robi.
Co więcej, istnieją dzienniki, które będą zawierać tag <private>
aby ukryć pewne identyfikowalne informacje o użytkowniku lub komputerze. Jednakże, można zainstalować certyfikat w celu ujawnienia tych informacji. Postępuj zgodnie z wyjaśnieniami z tutaj.
Hopper
Lewy panel
W lewym panelu Hoppera można zobaczyć symbole (Etykiety) binarnego pliku, listę procedur i funkcji (Proc) oraz ciągi znaków (Str). Nie są to wszystkie ciągi, ale te zdefiniowane w kilku częściach pliku Mac-O (takich jak cstring lub objc_methname
).
Środkowy panel
W środkowym panelu można zobaczyć kod zdekompilowany. Możesz zobaczyć go jako surowy rozkład, jako graf, jako zdekompilowany i jako binarny, klikając na odpowiednią ikonę:
Klikając prawym przyciskiem myszy na obiekcie kodu, możesz zobaczyć odwołania do/od tego obiektu lub nawet zmienić jego nazwę (to nie działa w zdekompilowanym pseudokodzie):
Co więcej, w środku na dole możesz pisać polecenia pythona.
Prawy panel
W prawym panelu można zobaczyć interesujące informacje, takie jak historia nawigacji (aby wiedzieć, jak dotarłeś do obecnej sytuacji), graf wywołań, gdzie można zobaczyć wszystkie funkcje, które wywołują tę funkcję i wszystkie funkcje, które ta funkcja wywołuje, oraz informacje o zmiennych lokalnych.
dtrace
Pozwala użytkownikom uzyskać dostęp do aplikacji na niezwykle niskim poziomie i zapewnia sposób śledzenia programów oraz nawet zmiany ich przepływu wykonania. Dtrace używa sond umieszczonych w całym jądrze i znajdujących się na przykład na początku i końcu wywołań systemowych.
DTrace używa funkcji dtrace_probe_create
do utworzenia sondy dla każdego wywołania systemowego. Sondy te mogą być wywoływane w punkcie wejścia i wyjścia każdego wywołania systemowego. Interakcja z DTrace odbywa się poprzez /dev/dtrace, który jest dostępny tylko dla użytkownika root.
Aby włączyć Dtrace bez pełnego wyłączania ochrony SIP, można wykonać w trybie odzyskiwania: csrutil enable --without dtrace
Możesz również dtrace
lub dtruss
binarne, które skompilowałeś.
Dostępne sondy dtrace można uzyskać za pomocą:
Nazwa sondy składa się z czterech części: dostawcy, modułu, funkcji i nazwy (fbt:mach_kernel:ptrace:entry
). Jeśli nie określisz części nazwy, Dtrace zastosuje tę część jako symbol wieloznaczny.
Aby skonfigurować DTrace w celu aktywowania sond i określenia działań do wykonania po ich wyzwoleniu, będziemy musieli użyć języka D.
Szczegółowe wyjaśnienie i więcej przykładów można znaleźć na stronie https://illumos.org/books/dtrace/chp-intro.html
Przykłady
Uruchom man -k dtrace
, aby wyświetlić dostępne skrypty DTrace. Przykład: sudo dtruss -n binary
W linii
skrypt
dtruss
ktrace
Możesz używać tego nawet z SIP aktywowanym.
ProcessMonitor
ProcessMonitor to bardzo przydatne narzędzie do sprawdzania działań związanych z procesem, które wykonuje dany proces (na przykład monitorowanie, które nowe procesy tworzy dany proces).
SpriteTree
SpriteTree to narzędzie do wyświetlania relacji między procesami.
Musisz monitorować swój Mac za pomocą polecenia takiego jak sudo eslogger fork exec rename create > cap.json
(uruchomienie tego w terminalu wymagało FDA). Następnie możesz załadować plik json do tego narzędzia, aby zobaczyć wszystkie relacje:
FileMonitor
FileMonitor pozwala monitorować zdarzenia plików (takie jak tworzenie, modyfikacje i usuwanie), dostarczając szczegółowych informacji na temat tych zdarzeń.
Crescendo
Crescendo to narzędzie GUI z wyglądem i funkcjonalnością, które mogą być znane użytkownikom systemu Windows z Procmon firmy Microsoft Sysinternal. Narzędzie to umożliwia rozpoczęcie i zatrzymanie nagrywania różnych typów zdarzeń, umożliwia filtrowanie tych zdarzeń według kategorii, takich jak plik, proces, sieć, itp., oraz zapewnia funkcjonalność zapisywania zarejestrowanych zdarzeń w formacie json.
Apple Instruments
Apple Instruments są częścią narzędzi deweloperskich Xcode, używanych do monitorowania wydajności aplikacji, identyfikowania wycieków pamięci i śledzenia aktywności systemu plików.
fs_usage
Pozwala śledzić działania wykonywane przez procesy:
TaskExplorer
Taskexplorer jest przydatny do sprawdzania bibliotek używanych przez plik binarny, plików, z którymi się komunikuje oraz połączeń sieciowych. Sprawdza również procesy binarne w stosunku do virustotal i wyświetla informacje na temat pliku binarnego.
PT_DENY_ATTACH
W tym wpisie na blogu znajdziesz przykład debugowania działającego demona, który używa PT_DENY_ATTACH
do uniemożliwienia debugowania, nawet jeśli SIP jest wyłączone.
lldb
lldb to narzędzie de facto do debugowania plików binarnych w systemie macOS.
Możesz ustawić wersję intel podczas korzystania z lldb, tworząc plik o nazwie .lldbinit
w swoim folderze domowym z następującą linijką:
Wewnątrz lldb, zrzuć proces za pomocą process save-core
(lldb) Polecenie | Opis |
run (r) | Rozpoczęcie wykonania, które będzie kontynuowane do momentu trafienia w punkt przerwania lub zakończenia procesu. |
continue (c) | Kontynuacja wykonania procesu w trybie debugowania. |
nexti (n / ni) | Wykonaj następną instrukcję. To polecenie pomija wywołania funkcji. |
stepi (s / si) | Wykonaj następną instrukcję. W przeciwieństwie do polecenia nexti, to polecenie wchodzi w wywołania funkcji. |
finish (f) | Wykonaj resztę instrukcji w bieżącej funkcji ("ramce") i zatrzymaj. |
control + c | Zatrzymaj wykonanie. Jeśli proces został uruchomiony (r) lub kontynuowany (c), spowoduje to zatrzymanie procesu ...gdziekolwiek jest obecnie wykonywany. |
breakpoint (b) | b main #Dowolna funkcja o nazwie main b <binname>`main #Główna funkcja binarki b set -n main --shlib <lib_name> #Główna funkcja wskazanej binarki b -[NSDictionary objectForKey:] b -a 0x0000000100004bd9 br l #Lista punktów przerwania br e/dis <num> #Włącz/Wyłącz punkt przerwania breakpoint delete <num> |
help | help breakpoint #Uzyskaj pomoc dotyczącą polecenia punktu przerwania help memory write #Uzyskaj pomoc w zapisywaniu do pamięci |
reg | |
x/s <reg/memory address | Wyświetl pamięć jako łańcuch zakończony zerem. |
x/i <reg/memory address | Wyświetl pamięć jako instrukcję asemblerową. |
x/b <reg/memory address | Wyświetl pamięć jako bajt. |
print object (po) | To polecenie wyświetli obiekt wskazywany przez parametr po $raw
Zauważ, że większość interfejsów API Objective-C firmy Apple zwraca obiekty i powinny być wyświetlane za pomocą polecenia "print object" (po). Jeśli po nie daje sensownego wyniku, użyj |
memory | memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Zapisz AAAA pod tym adresem memory write -f s $rip+0x11f+7 "AAAA" #Zapisz AAAA pod adresem |
disassembly | dis #Rozkład bieżącej funkcji dis -n <funcname> #Rozkład funkcji dis -n <funcname> -b <basename> #Rozkład funkcji dis -c 6 #Rozkład 6 linii dis -c 0x100003764 -e 0x100003768 # Od jednego adresu do drugiego dis -p -c 4 # Rozpocznij rozkładanie w bieżącym adresie |
parray | parray 3 (char **)$x1 # Sprawdź tablicę 3 komponentów w rejestrze x1 |
Podczas wywoływania funkcji objc_sendMsg
, rejestr rsi przechowuje nazwę metody jako łańcuch zakończony zerem ("C"). Aby wyświetlić nazwę za pomocą lldb, wykonaj:
(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) print (char*)$rsi:
(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"
Anty-Analiza Dynamiczna
Wykrywanie maszyn wirtualnych
Polecenie
sysctl hw.model
zwraca "Mac" gdy hostem jest MacOS, ale coś innego gdy jest to maszyna wirtualna.Grając z wartościami
hw.logicalcpu
ihw.physicalcpu
niektóre złośliwe oprogramowanie próbuje wykryć, czy jest to maszyna wirtualna.Niektóre złośliwe oprogramowanie może również wykryć, czy maszyna jest oparta na VMware na podstawie adresu MAC (00:50:56).
Można również sprawdzić, czy proces jest debugowany za pomocą prostego kodu takiego jak:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proces jest debugowany }
Można również wywołać wywołanie systemowe
ptrace
z flagąPT_DENY_ATTACH
. To uniemożliwia dołączenie i śledzenie przez debugera.Można sprawdzić, czy funkcja
sysctl
lubptrace
jest importowana (ale złośliwe oprogramowanie mogłoby importować je dynamicznie)Jak zauważono w tym artykule, „Pokonanie Technik Anty-Debugowania: macOS warianty ptrace” : „Wiadomość Proces # zakończony ze statusem = 45 (0x0000002d) jest zazwyczaj wyraźnym sygnałem, że cel debugowania używa PT_DENY_ATTACH”
Fuzzing
ReportCrash analizuje procesy, które uległy awarii, i zapisuje raport o awarii na dysku. Raport o awarii zawiera informacje, które mogą pomóc programiście zdiagnozować przyczynę awarii.
Dla aplikacji i innych procesów działających w kontekście uruchomieniowym na rzecz użytkownika, ReportCrash działa jako LaunchAgent i zapisuje raporty o awariach w ~/Library/Logs/DiagnosticReports/
użytkownika.
Dla demonów, innych procesów działających w kontekście uruchomieniowym systemowym oraz innych uprzywilejowanych procesów, ReportCrash działa jako LaunchDaemon i zapisuje raporty o awariach w /Library/Logs/DiagnosticReports
systemu.
Jeśli martwisz się o to, że raporty o awariach są wysyłane do Apple, możesz je wyłączyć. W przeciwnym razie raporty o awariach mogą być przydatne do zrozumienia, w jaki sposób serwer uległ awarii.
Sen
Podczas przeprowadzania fuzzingu w systemie MacOS ważne jest, aby nie pozwalać Macowi przechodzić w stan uśpienia:
systemsetup -setsleep Never
pmset, System Preferences
Rozłączenie SSH
Jeśli przeprowadzasz fuzzing za pośrednictwem połączenia SSH, ważne jest, aby upewnić się, że sesja nie zostanie przerwana. Zmodyfikuj plik sshd_config:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
Wewnętrzne obsługiwane
Sprawdź następującą stronę, aby dowiedzieć się, jak można znaleźć, która aplikacja jest odpowiedzialna za obsługę określonego schematu lub protokołu:
pagemacOS File Extension & URL scheme app handlersWyliczanie procesów sieciowych
To interesujące znaleźć procesy zarządzające danymi sieciowymi:
Lub użyj netstat
lub lsof
netstat
lub lsof
Libgmalloc
Fuzzers
Działa dla narzędzi CLI.
To "po prostu działa" z narzędziami GUI macOS. Zauważ, że niektóre aplikacje macOS mają specyficzne wymagania, takie jak unikalne nazwy plików, odpowiednie rozszerzenie, konieczność odczytu plików z piaskownicy (~/Library/Containers/com.apple.Safari/Data
)...
Przykłady:
Więcej informacji o Fuzzing MacOS
Odnośniki
WhiteIntel to wyszukiwarka zasilana przez dark web, która oferuje darmowe funkcje sprawdzania, czy firma lub jej klienci nie zostali skompromitowani przez złośliwe oprogramowanie kradnące informacje.
Ich głównym celem WhiteIntel jest zwalczanie przejęć kont i ataków ransomware wynikających z złośliwego oprogramowania kradnącego informacje.
Możesz odwiedzić ich stronę internetową i wypróbować ich silnik za darmo pod adresem:
Last updated