hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing
2024-03-28 12:21:24 +00:00
..
arm64-basic-assembly.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2024-03-28 12:21:24 +00:00
introduction-to-x64.md Translated to Serbian 2024-02-10 13:11:20 +00:00
README.md Translated ['exploiting/tools/README.md', 'macos-hardening/macos-securit 2024-03-28 08:47:51 +00:00

macOS Aplikacije - Inspekcija, debugovanje i Faziranje

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Statistička Analiza

otool

otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application

objdump

{% code overflow="wrap" %}

objdump -m --dylibs-used /bin/ls #List dynamically linked libraries
objdump -m -h /bin/ls # Get headers information
objdump -m --syms /bin/ls # Check if the symbol table exists to get function names
objdump -m --full-contents /bin/ls # Dump every section
objdump -d /bin/ls # Dissasemble the binary
objdump --disassemble-symbols=_hello --x86-asm-syntax=intel toolsdemo #Disassemble a function using intel flavour

jtool2

Ovaj alat može se koristiti kao zamena za codesign, otool, i objdump, i pruža nekoliko dodatnih funkcija. Preuzmite ga ovde ili ga instalirajte pomoću brew.

# Install
brew install --cask jtool2

jtool2 -l /bin/ls # Get commands (headers)
jtool2 -L /bin/ls # Get libraries
jtool2 -S /bin/ls # Get symbol info
jtool2 -d /bin/ls # Dump binary
jtool2 -D /bin/ls # Decompile binary

# Get signature information
ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Automator

# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG

Potpisivanje koda / ldid

{% hint style="danger" %} Codesign se može pronaći u macOS-u, dok se ldid može pronaći u iOS-u {% endhint %}

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the apps contents have been modified
codesign --verify --verbose /Applications/Safari.app

# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms

# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app

# Sign a binary
codesign -s <cert-name-keychain> toolsdemo

# Get signature info
ldid -h <binary>

# Get entitlements
ldid -e <binary>

# Change entilements
## /tmp/entl.xml is a XML file with the new entitlements to add
ldid -S/tmp/entl.xml <binary>

SuspiciousPackage

SuspiciousPackage je alat koristan za inspekciju .pkg fajlova (instalatera) i videti šta se nalazi unutra pre instalacije.
Ovi instalateri imaju preinstall i postinstall bash skripte koje zlonamerni autori obično zloupotrebljavaju da bi upornost malvera.

hdiutil

Ovaj alat omogućava montiranje Apple disk slika (.dmg) fajlova radi njihove inspekcije pre pokretanja bilo čega:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Biće montiran u /Volumes

Objective-C

Metapodaci

{% hint style="danger" %} Imajte na umu da programi napisani u Objective-C zadržavaju svoje deklaracije klasa kada se kompajliraju u Mach-O binarne datoteke. Takve deklaracije klasa uključuju ime i tip: {% endhint %}

  • Klasu
  • Metode klase
  • Instance varijable klase

Ove informacije možete dobiti koristeći class-dump:

class-dump Kindle.app

Pozivanje funkcija

Kada se funkcija pozove u binarnom fajlu koji koristi Objective-C, kompajlirani kod umesto pozivanja te funkcije, pozvaće objc_msgSend. Što će pozvati konačnu funkciju:

Parametri koje ova funkcija očekuje su:

  • Prvi parametar (self) je "pokazivač koji pokazuje na instancu klase koja treba da primi poruku". Jednostavnije rečeno, to je objekat na koji se metod poziva. Ako je metod klasni metod, ovo će biti instanca objekta klase (u celini), dok će za instancu metoda, self pokazivati na instanciranu instancu klase kao objekat.
  • Drugi parametar, (op), je "selektor metoda koji obrađuje poruku". Ponovo, jednostavnije rečeno, ovo je samo ime metoda.
  • Preostali parametri su bilo vrednosti koje su potrebne metodu (op).

Pogledajte kako lako dobiti ove informacije sa lldb u ARM64 na ovoj stranici:

{% content-ref url="arm64-basic-assembly.md" %} arm64-basic-assembly.md {% endcontent-ref %}

x64:

Argument Registar (za) objc_msgSend
1. argument rdi self: objekat na koji se metod poziva
2. argument rsi op: ime metoda
3. argument rdx 1. argument metodu
4. argument rcx 2. argument metodu
5. argument r8 3. argument metodu
6. argument r9 4. argument metodu
7.+ argument

rsp+
(na steku)

5.+ argument metodu

Swift

Sa Swift binarnim fajlovima, s obzirom da postoji kompatibilnost sa Objective-C, ponekad možete izvući deklaracije koristeći class-dump ali ne uvek.

Pomoću komandne linije jtool -l ili otool -l moguće je pronaći nekoliko sekcija koje počinju sa prefiksom __swift5:

jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64              Mem: 0x000000000-0x100000000    __PAGEZERO
LC 01: LC_SEGMENT_64              Mem: 0x100000000-0x100028000    __TEXT
[...]
Mem: 0x100026630-0x100026d54        __TEXT.__swift5_typeref
Mem: 0x100026d60-0x100027061        __TEXT.__swift5_reflstr
Mem: 0x100027064-0x1000274cc        __TEXT.__swift5_fieldmd
Mem: 0x1000274cc-0x100027608        __TEXT.__swift5_capture
[...]

Možete pronaći dodatne informacije o informacijama koje se čuvaju u ovim odeljcima u ovom blog postu.

Štaviše, Swift binarni fajlovi mogu imati simbole (na primer, biblioteke moraju čuvati simbole kako bi se funkcije mogle pozvati). Simboli obično sadrže informacije o imenu funkcije i atributima na ružan način, pa su veoma korisni, i postoje "demangleri" koji mogu dobiti originalno ime:

# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py

# Swift cli
swift demangle

Pakovani binarnih fajlova

  • Provera visoke entropije
  • Provera stringova (da li postoji skoro nijedan razumljiv string, pakovan)
  • UPX paket za MacOS generiše sekciju nazvanu "__XHDR"

Dinamička analiza

{% hint style="warning" %} Imajte na umu da bi za debagovanje binarnih fajlova, SIP treba da bude onemogućen (csrutil disable ili csrutil enable --without debug) ili da kopirate binarne fajlove u privremenu fasciklu i uklonite potpis sa codesign --remove-signature <putanja-do-binarnog-fajla> ili dozvolite debagovanje binarnog fajla (možete koristiti ovaj skript) {% endhint %}

{% hint style="warning" %} Imajte na umu da bi za instrumentiranje sistemskih binarnih fajlova (kao što je cloudconfigurationd) na macOS-u, SIP mora biti onemogućen (samo uklanjanje potpisa neće raditi). {% endhint %}

Unified Logs

MacOS generiše mnogo logova koji mogu biti veoma korisni prilikom pokretanja aplikacije pokušavajući da razumete šta radi.

Osim toga, postoje neki logovi koji će sadržati oznaku <private> da bi sakrili neke identifikacione informacije korisnika ili računara. Međutim, moguće je instalirati sertifikat da biste otkrili ove informacije. Pratite objašnjenja sa ovde.

Hopper

Leva tabla

Na levoj tabli Hoppera mogu se videti simboli (Oznake) binarnog fajla, lista procedura i funkcija (Proc) i stringovi (Str). To nisu svi stringovi, već oni definisani u nekoliko delova Mac-O fajla (kao što su cstring ili objc_methname).

Srednja tabla

Na srednjoj tabli možete videti dizasemblovani kod. I možete ga videti kao sirov disasemblovani kod, kao graf, kao dekompilirani i kao binarni klikom na odgovarajuću ikonu:

Desnim klikom na objekat koda možete videti reference ka/tom objektu ili čak promeniti njegovo ime (ovo ne funkcioniše u dekompiliranom pseudokodu):

Osim toga, u sredini dole možete pisati Python komande.

Desna tabla

Na desnoj tabli možete videti zanimljive informacije kao što su istorija navigacije (da znate kako ste stigli do trenutne situacije), pozivni grafikon gde možete videti sve funkcije koje pozivaju ovu funkciju i sve funkcije koje ova funkcija poziva, i informacije o lokalnim promenljivima.

dtrace

Omogućava korisnicima pristup aplikacijama na izuzetno niskom nivou i pruža način korisnicima da prate programe i čak promene njihov tok izvršavanja. Dtrace koristi sonde koje su postavljene širom jezgra i nalaze se na lokacijama poput početka i kraja sistemskih poziva.

DTrace koristi funkciju dtrace_probe_create za kreiranje sonde za svaki sistemski poziv. Ove sonde mogu biti aktivirane na ulaznoj i izlaznoj tački svakog sistemskog poziva. Interakcija sa DTrace-om se odvija preko /dev/dtrace koji je dostupan samo root korisniku.

{% hint style="success" %} Da biste omogućili Dtrace bez potpune onemogućenosti SIP zaštite, možete izvršiti u režimu oporavka: csrutil enable --without dtrace

Takođe možete dtrace ili dtruss binarne fajlove koje ste kompajlirali. {% endhint %}

Dostupne sonde dtrace-a mogu se dobiti sa:

dtrace -l | head
ID   PROVIDER            MODULE                          FUNCTION NAME
1     dtrace                                                     BEGIN
2     dtrace                                                     END
3     dtrace                                                     ERROR
43    profile                                                     profile-97
44    profile                                                     profile-199

Ime sonde se sastoji od četiri dela: pružalac, modul, funkcija i ime (fbt:mach_kernel:ptrace:entry). Ako ne navedete neki deo imena, Dtrace će taj deo primeniti kao zamenski znak.

Da biste konfigurisali DTrace da aktivira sonde i specificira koje akcije treba izvršiti kada se aktiviraju, moraćemo koristiti D jezik.

Detaljnije objašnjenje i više primera možete pronaći na https://illumos.org/books/dtrace/chp-intro.html

Primeri

Pokrenite man -k dtrace da biste videli dostupne DTrace skripte. Primer: sudo dtruss -n binary

  • U liniji
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • skripta
syscall:::entry
/pid == $1/
{
}

#Log every syscall of a PID
sudo dtrace -s script.d 1234
syscall::open:entry
{
printf("%s(%s)", probefunc, copyinstr(arg0));
}
syscall::close:entry
{
printf("%s(%d)\n", probefunc, arg0);
}

#Log files opened and closed by a process
sudo dtrace -s b.d -c "cat /etc/hosts"
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

#Log sys calls with values
sudo dtrace -s syscalls_info.d -c "cat /etc/hosts"

dtruss

dtruss -c ls #Get syscalls of ls
dtruss -c -p 1000 #get syscalls of PID 1000

ktrace

Možete koristiti ovu čak i kada je SIP aktiviran

ktrace trace -s -S -t c -c ls | grep "ls("

ProcessMonitor

ProcessMonitor je veoma koristan alat za proveru akcija povezanih sa procesom koje proces obavlja (na primer, praćenje novih procesa koje proces kreira).

SpriteTree

SpriteTree je alat koji prikazuje odnose između procesa.
Potrebno je pratiti vaš Mac pomoću komande poput sudo eslogger fork exec rename create > cap.json (terminal koji pokreće ovo zahteva FDA). Zatim možete učitati json datoteku u ovaj alat da biste videli sve odnose:

FileMonitor

FileMonitor omogućava praćenje događaja sa datotekama (kao što su kreiranje, izmene i brisanje), pružajući detaljne informacije o takvim događajima.

Crescendo

Crescendo je GUI alat sa izgledom koji korisnici Windowsa mogu prepoznati iz Microsoft Sysinternal-ovog Procmon-a. Ovaj alat omogućava pokretanje i zaustavljanje snimanja različitih vrsta događaja, omogućava filtriranje ovih događaja po kategorijama kao što su datoteka, proces, mreža, itd., i pruža funkcionalnost za čuvanje snimljenih događaja u json formatu.

Apple Instruments

Apple Instruments su deo Xcode-ovih Developer alata - koriste se za praćenje performansi aplikacija, identifikaciju curenja memorije i praćenje aktivnosti sistema datoteka.

fs_usage

Omogućava praćenje akcija koje obavljaju procesi:

fs_usage -w -f filesys ls #This tracks filesystem actions of proccess names containing ls
fs_usage -w -f network curl #This tracks network actions

TaskExplorer

Taskexplorer je koristan alat za pregled biblioteka koje koristi binarni fajl, datoteke koje koristi i mrežne veze.
Takođe proverava binarne procese protiv virustotala i prikazuje informacije o binarnom fajlu.

PT_DENY_ATTACH

U ovom blog postu možete pronaći primer kako debugovati pokrenuti daemon koji koristi PT_DENY_ATTACH kako bi sprečio debugovanje čak i ako je SIP onemogućen.

lldb

lldb je glavni alat za debugovanje binarnih fajlova na macOS platformi.

lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor

Možete postaviti intel ukus prilikom korišćenja lldb-a kreiranjem datoteke nazvane .lldbinit u vašem matičnom folderu sa sledećom linijom:

settings set target.x86-disassembly-flavor intel

{% hint style="warning" %} Unutar lldb-a, dumpuj proces sa process save-core {% endhint %}

(lldb) KomandaOpis
run (r)Pokretanje izvršenja, koje će se nastaviti dok se ne naiđe na prekid ili dok se proces ne završi.
continue (c)Nastavak izvršenja debugovanog procesa.
nexti (n / ni)Izvršava sledeću instrukciju. Ova komanda će preskočiti pozive funkcija.
stepi (s / si)Izvršava sledeću instrukciju. Za razliku od nexti komande, ova komanda će ući u pozive funkcija.
finish (f)Izvršava preostale instrukcije u trenutnoj funkciji ("frame") i zaustavlja se.
control + cPauzira izvršenje. Ako je proces pokrenut (r) ili nastavljen (c), ovo će uzrokovati zaustavljanje procesa ...gde god se trenutno izvršava.
breakpoint (b)

b main #Bilo koja funkcija nazvana main

b <ime_binarne_datoteke>`main #Glavna funkcija binarne datoteke

b set -n main --shlib <ime_biblioteke> #Glavna funkcija naznačene binarne datoteke

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #Lista prekida

br e/dis <br> #Omogući/Onemogući prekid

breakpoint delete <br>

help

help breakpoint #Dobijanje pomoći za komandu prekida

help memory write #Dobijanje pomoći za pisanje u memoriju

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/adresa_memorije>Prikazuje memoriju kao string sa null-terminatorom.
x/i <reg/adresa_memorije>Prikazuje memoriju kao asemblersku instrukciju.
x/b <reg/adresa_memorije>Prikazuje memoriju kao bajt.
print object (po)

Ovo će ispisati objekat na koji se parametar odnosi

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Imajte na umu da većina Apple-ovih Objective-C API-ja ili metoda vraća objekte, i stoga bi trebalo da se prikažu putem "print object" (po) komande. Ako po ne proizvodi smislene rezultate, koristite x/b

memorymemory read 0x000....
memory read $x0+0xf2a
memory write 0x100600000 -s 4 0x41414141 #Upisuje AAAA na tu adresu
memory write -f s $rip+0x11f+7 "AAAA" #Upisuje AAAA na adresu
disassembly

dis #Disasembleruje trenutnu funkciju

dis -n <ime_funkcije> #Disasembleruje funkciju

dis -n <ime_funkcije> -b <ime_datoteke> #Disasembleruje funkciju
dis -c 6 #Disasembleruje 6 linija
dis -c 0x100003764 -e 0x100003768 # Od jedne adrese do druge
dis -p -c 4 # Počinje sa trenutnom adresom disasemblerovanja

parrayparray 3 (char **)$x1 # Proverava niz od 3 komponente u x1 registru

{% hint style="info" %} Prilikom pozivanja funkcije objc_sendMsg, registar rsi sadrži ime metode kao string sa null-terminatorom ("C"). Da biste ispisali ime putem lldb-a, uradite sledeće:

(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:" {% endhint %}

Anti-Dinamička Analiza

Detekcija virtuelne mašine

  • Komanda sysctl hw.model vraća "Mac" kada je domaćin MacOS, ali nešto drugo kada je virtuelna mašina.
  • Igranje sa vrednostima hw.logicalcpu i hw.physicalcpu neki malveri pokušavaju da detektuju da li je u pitanju virtuelna mašina.
  • Neki malveri takođe mogu detektovati da li je mašina zasnovana na VMware-u na osnovu MAC adrese (00:50:56).
  • Moguće je otkriti da li se proces debuguje jednostavnim kodom poput:
  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proces se debuguje }
  • Takođe se može pozvati sistemski poziv ptrace sa zastavicom PT_DENY_ATTACH. Ovo sprečava debager da se poveže i prati.
  • Možete proveriti da li se funkcija sysctl ili ptrace uvozi (ali malver bi mogao da je dinamički uveze)
  • Kao što je navedeno u ovom tekstu, “Pobeda nad tehnikama protiv-debugovanja: macOS ptrace varijante” :
    Poruka Proces # je završen sa statusom = 45 (0x0000002d) obično je znak da je cilj debugovanja koristi PT_DENY_ATTACH

Fuzzing

ReportCrash

ReportCrash analizira procese koji se ruše i čuva izveštaj o rušenju na disku. Izveštaj o rušenju sadrži informacije koje mogu pomoći programeru da dijagnostikuje uzrok rušenja.
Za aplikacije i druge procese koji se izvršavaju u kontekstu pokretanja po korisniku, ReportCrash se izvršava kao LaunchAgent i čuva izveštaje o rušenju u ~/Library/Logs/DiagnosticReports/ korisnika.
Za demone, druge procese koji se izvršavaju u kontekstu pokretanja po sistemu i druge privilegovane procese, ReportCrash se izvršava kao LaunchDaemon i čuva izveštaje o rušenju u /Library/Logs/DiagnosticReports sistema.

Ako vas brine slanje izveštaja o rušenju Apple-u, možete ih onemogućiti. U suprotnom, izveštaji o rušenju mogu biti korisni za određivanje načina na koji je server pao.

#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

#To re-enable crash reporting:
launchctl load -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.ReportCrash.Root.plist

Spavanje

Prilikom faziiranja u MacOS-u važno je sprečiti Mac da zaspi:

SSH Prekid

Ako faziirate putem SSH veze važno je osigurati da sesija neće isteći. Promenite sshd_config datoteku sa:

  • TCPKeepAlive Yes
  • ClientAliveInterval 0
  • ClientAliveCountMax 0
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Interni rukovaoci

Proverite sledeću stranicu da biste saznali kako možete pronaći koja je aplikacija odgovorna za obradu određene šeme ili protokola:

{% content-ref url="../macos-file-extension-apps.md" %} macos-file-extension-apps.md {% endcontent-ref %}

Enumeracija mrežnih procesa

dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
sort -u recv.log > procs.txt
cat procs.txt

Ili koristite netstat ili lsof

Libgmalloc

{% code overflow="wrap" %}

lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib" -o "run arg1 arg2" -o "bt" -o "reg read" -o "dis -s \$pc-32 -c 24 -m -F intel" -o "quit"

{% endcode %}

Fuzzeri

AFL++

Radi za CLI alate

Litefuzz

On "samo radi" sa macOS GUI alatima. Imajte na umu da neki macOS aplikacije imaju specifične zahteve kao što su jedinstvena imena datoteka, ispravna ekstenzija, potreba za čitanjem datoteka iz peska (~/Library/Containers/com.apple.Safari/Data)...

Neki primeri:

{% code overflow="wrap" %}

# iBooks
litefuzz -l -c "/System/Applications/Books.app/Contents/MacOS/Books FUZZ" -i files/epub -o crashes/ibooks -t /Users/test/Library/Containers/com.apple.iBooksX/Data/tmp -x 10 -n 100000 -ez

# -l : Local
# -c : cmdline with FUZZ word (if not stdin is used)
# -i : input directory or file
# -o : Dir to output crashes
# -t : Dir to output runtime fuzzing artifacts
# -x : Tmeout for the run (default is 1)
# -n : Num of fuzzing iterations (default is 1)
# -e : enable second round fuzzing where any crashes found are reused as inputs
# -z : enable malloc debug helpers

# Font Book
litefuzz -l -c "/System/Applications/Font Book.app/Contents/MacOS/Font Book FUZZ" -i input/fonts -o crashes/font-book -x 2 -n 500000 -ez

# smbutil (using pcap capture)
litefuzz -lk -c "smbutil view smb://localhost:4455" -a tcp://localhost:4455 -i input/mac-smb-resp -p -n 100000 -z

# screensharingd (using pcap capture)
litefuzz -s -a tcp://localhost:5900 -i input/screenshared-session --reportcrash screensharingd -p -n 100000

{% endcode %}

Više informacija o Fuzzingu na MacOS-u

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: