macOS Apps - Inspekteer, debugg en Fuzzing
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Statiese Analise
otool & objdump & nm
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
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
nm -m ./tccd # List of symbols
jtool2 & Disarm
Jy kan disarm hier afgelaai.
ARCH=arm64e disarm -c -i -I --signature /path/bin # Get bin info and signature
ARCH=arm64e disarm -c -l /path/bin # Get binary sections
ARCH=arm64e disarm -c -L /path/bin # Get binary commands (dependencies included)
ARCH=arm64e disarm -c -S /path/bin # Get symbols (func names, strings...)
ARCH=arm64e disarm -c -d /path/bin # Get disasembled
jtool2 -d __DATA.__const myipc_server | grep MIG # Get MIG info
U kan jtool2 hier aflaai of dit met brew installeer.
# 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
[!CAUTION] > jtool is verouderd ten gunste van disarm
Codesign / ldid
[!TIP] >
Codesignkan in macOS gevind word terwylldidin iOS gevind kan word
# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
# Check if the appâs 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 is ân hulpmiddel wat nuttig is om .pkg lĂȘers (installeerders) te inspekteer en te sien wat binne is voordat dit geĂŻnstalleer word.
Hierdie installeerders het preinstall en postinstall bash-skripte wat malware-skeppers gewoonlik misbruik om die malware te hou.
hdiutil
Hierdie hulpmiddel laat jou toe om Apple skyfbeeldes (.dmg) lĂȘers te monteer om dit te inspekteer voordat jy enigiets uitvoer:
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg
It will be mounted in /Volumes
Gepakte binĂȘre
- Kontroleer vir hoë entropie
- Kontroleer die strings (as daar amper geen verstaanbare string is, gepak)
- Die UPX-pakker vir MacOS genereer ân afdeling genaamd â__XHDRâ
Statiese Objective-C analise
Metadata
Caution
Let daarop dat programme geskryf in Objective-C hul klasverklarings behou wanneer gecompileer in Mach-O binĂȘre. Sulke klasverklarings sluit die naam en tipe van in:
- Die interfaces wat gedefinieer is
- Die interface metodes
- Die interface instansie veranderlikes
- Die protokolle wat gedefinieer is
Let daarop dat hierdie name dalk obfuskeer kan word om die omkering van die binĂȘre moeiliker te maak.
Funksie-aanroep
Wanneer ân funksie in ân binĂȘre wat Objective-C gebruik, aangeroep word, sal die gecompileerde kode in plaas daarvan om daardie funksie aan te roep, objc_msgSend aanroep. Dit sal die finale funksie aanroep:
.png)
Die parameters wat hierdie funksie verwag is:
- Die eerste parameter (self) is ân aanwijser wat na die instansie van die klas wat die boodskap moet ontvang wysâ. Of eenvoudiger gestel, dit is die objek waarop die metode aangeroep word. As die metode ân klasmetode is, sal dit ân instansie van die klasobjek (as ân geheel) wees, terwyl dit vir ân instansiemetode, self na ân geĂŻnstantieerde instansie van die klas as ân objek sal wys.
- Die tweede parameter, (op), is âdie selektor van die metode wat die boodskap hanteerâ. Weer eens, eenvoudiger gestel, dit is net die naam van die metode.
- Die oorblywende parameters is enige waardes wat deur die metode vereis word (op).
Sien hoe om hierdie inligting maklik te kry met lldb in ARM64 op hierdie bladsy:
x64:
| Argument | Register | (vir) objc_msgSend |
|---|---|---|
| 1ste argument | rdi | self: objek waarop die metode aangeroep word |
| 2de argument | rsi | op: naam van die metode |
| 3de argument | rdx | 1ste argument aan die metode |
| 4de argument | rcx | 2de argument aan die metode |
| 5de argument | r8 | 3de argument aan die metode |
| 6de argument | r9 | 4de argument aan die metode |
| 7de+ argument |
rsp+ | 5de+ argument aan die metode |
Dump ObjectiveC metadata
Dynadump
Dynadump is ân hulpmiddel om Objective-C binĂȘre te klasdump. Die github spesifiseer dylibs maar dit werk ook met uitvoerbare lĂȘers.
./dynadump dump /path/to/bin
Tydens die skryf hiervan, is dit huidiglik die een wat die beste werk.
Gereelde gereedskap
nm --dyldinfo-only /path/to/bin
otool -ov /path/to/bin
objdump --macho --objc-meta-data /path/to/bin
class-dump
class-dump is die oorspronklike hulpmiddel om verklarings te genereer vir die klasse, kategorieë en protokolle in ObjetiveC geformateerde kode.
Dit is oud en word nie meer onderhou nie, so dit sal waarskynlik nie behoorlik werk nie.
ICDump
iCDump is ân moderne en kruis-platform Objective-C klas dump. In vergelyking met bestaande hulpmiddels, kan iCDump onafhanklik van die Apple-ekosisteem werk en dit stel Python-bindings bloot.
import icdump
metadata = icdump.objc.parse("/path/to/bin")
print(metadata.to_decl())
Statiese Swift analise
Met Swift binĂȘre, aangesien daar Objective-C kompatibiliteit is, kan jy soms verklarings onttrek met behulp van class-dump maar nie altyd nie.
Met die jtool -l of otool -l opdraglyne is dit moontlik om verskeie afdelings te vind wat met die __swift5 voorvoegsel begin:
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
[...]
Jy kan verdere inligting oor die inligting wat in hierdie afdeling gestoor is in hierdie blogpos vind.
Boonop kan Swift-binaries simbole hĂȘ (byvoorbeeld moet biblioteke simbole stoor sodat hul funksies aangeroep kan word). Die simbole het gewoonlik die inligting oor die funksienaam en attribuut op ân lelike manier, so hulle is baie nuttig en daar is âdemanglersâ wat die oorspronklike naam kan kry:
# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
# Swift cli
swift demangle
Dinamiese Analise
Warning
Let daarop dat om binaire lĂȘers te debugeer, SIP moet gedeaktiveer word (
csrutil disableofcsrutil enable --without debug) of om die binaire lĂȘers na ân tydelike gids te kopieer en die handtekening te verwyder metcodesign --remove-signature <binary-path>of om die debuggery van die binaire lĂȘer toe te laat (jy kan hierdie skrif gebruik)
Warning
Let daarop dat om stelselbinaries te instrumenteer, (soos
cloudconfigurationd) op macOS, SIP moet gedeaktiveer word (net die handtekening verwyder sal nie werk nie).
APIâs
macOS stel ân paar interessante APIâs bloot wat inligting oor die prosesse gee:
proc_info: Dit is die hoof een wat baie inligting oor elke proses gee. Jy moet root wees om inligting oor ander prosesse te verkry, maar jy het nie spesiale regte of mach-poorte nodig nie.libsysmon.dylib: Dit maak dit moontlik om inligting oor prosesse te verkry via XPC blootgestelde funksies, egter, dit is nodig om die regtecom.apple.sysmond.clientte hĂȘ.
Stackshot & mikrostackshots
Stackshotting is ân tegniek wat gebruik word om die toestand van die prosesse vas te vang, insluitend die oproepstapels van alle lopende drade. Dit is veral nuttig vir debuggery, prestasieanalise, en om die gedrag van die stelsel op ân spesifieke tydstip te verstaan. Op iOS en macOS kan stackshotting uitgevoer word met verskeie gereedskap en metodes soos die gereedskap sample en spindump.
Sysdiagnose
Hierdie gereedskap (/usr/bini/ysdiagnose) versamel basies baie inligting van jou rekenaar deur ân tiental verskillende opdragte soos ps, zprint⊠uit te voer.
Dit moet as root uitgevoer word en die daemon /usr/libexec/sysdiagnosed het baie interessante regte soos com.apple.system-task-ports en get-task-allow.
Sy plist is geleë in /System/Library/LaunchDaemons/com.apple.sysdiagnose.plist wat 3 MachServices verklaar:
com.apple.sysdiagnose.CacheDelete: Verwyder ou argiewe in /var/rmpcom.apple.sysdiagnose.kernel.ipc: Spesiale poort 23 (kernel)com.apple.sysdiagnose.service.xpc: Gebruikersmodus-koppelvlak deurLibsysdiagnoseObj-C klas. Drie argumente in ân dict kan oorgedra word (compress,display,run)
GeĂŻntegreerde Logs
MacOS genereer ân groot aantal logs wat baie nuttig kan wees wanneer ân toepassing uitgevoer word om te probeer verstaan wat dit doen.
Boonop is daar ân paar logs wat die etiket <private> sal bevat om te verberg sommige gebruikers of rekenaar identifiseerbare inligting. Dit is egter moontlik om ân sertifikaat te installeer om hierdie inligting bekend te maak. Volg die verduidelikings van hier.
Hopper
Linker paneel
In die linker paneel van hopper is dit moontlik om die simbole (Labels) van die binaire lĂȘer, die lys van prosedures en funksies (Proc) en die strings (Str) te sien. Dit is nie al die strings nie, maar diegene wat in verskeie dele van die Mac-O lĂȘer gedefinieer is (soos cstring of objc_methname).
Middelpaneel
In die middelpaneel kan jy die gedissemboleerde kode sien. En jy kan dit as ân rauwe disassemble, as grafiek, as gedekodeer en as binaire sien deur op die onderskeie ikoon te klik:
.png)
Regsklik op ân kode objek kan jy verwysings na/vanaf daardie objek sien of selfs sy naam verander (dit werk nie in gedekodeerde pseudokode nie):
.png)
Boonop kan jy in die middel onder python-opdragte skryf.
Regter paneel
In die regter paneel kan jy interessante inligting sien soos die navigasiegeskiedenis (sodat jy weet hoe jy by die huidige situasie gekom het), die oproepgrafiek waar jy al die funksies wat hierdie funksie oproep en al die funksies wat hierdie funksie oproep, en lokale veranderlikes inligting kan sien.
dtrace
Dit stel gebruikers in staat om toegang tot toepassings op ân uiters lae vlak te verkry en bied ân manier vir gebruikers om programme te volg en selfs hul uitvoeringsvloei te verander. Dtrace gebruik probes wat oor die kernel geplaas is en is op plekke soos die begin en einde van stelselaanroepe.
DTrace gebruik die dtrace_probe_create funksie om ân probe vir elke stelselaanroep te skep. Hierdie probes kan in die toegang en uitgangspunt van elke stelselaanroep geaktiveer word. Die interaksie met DTrace vind plaas deur /dev/dtrace wat slegs beskikbaar is vir die root gebruiker.
Tip
Om Dtrace in te skakel sonder om SIP-beskerming heeltemal te deaktiveer, kan jy in herstelmodus uitvoer:
csrutil enable --without dtraceJy kan ook
dtraceofdtrussbinaire lĂȘers wat jy gecompileer het.
Die beskikbare probes van dtrace kan verkry word met:
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
Die proefnaam bestaan uit vier dele: die verskaffer, module, funksie, en naam (fbt:mach_kernel:ptrace:entry). As jy nie ân deel van die naam spesifiseer nie, sal Dtrace daardie deel as ân wildcard toepas.
Om DTrace te konfigureer om probes te aktiveer en om te spesifiseer watter aksies uitgevoer moet word wanneer hulle afgaan, sal ons die D-taal moet gebruik.
ân Meer gedetailleerde verduideliking en meer voorbeelde kan gevind word in https://illumos.org/books/dtrace/chp-intro.html
Voorbeelde
Voer man -k dtrace uit om die DTrace skripte beskikbaar te lys. Voorbeeld: sudo dtruss -n binary
- In lyn
#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
- skrif
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
kdebug
Dit is ân kern-tracing fasiliteit. Die gedokumenteerde kodes kan gevind word in /usr/share/misc/trace.codes.
Gereedskap soos latency, sc_usage, fs_usage en trace gebruik dit intern.
Om met kdebug te kommunikeer, word sysctl gebruik oor die kern.kdebug naamruimte en die MIBs wat gebruik kan word, kan gevind word in sys/sysctl.h met die funksies geĂŻmplementeer in bsd/kern/kdebug.c.
Om met kdebug te interaksie met ân pasgemaakte kliĂ«nt, is dit gewoonlik die stappe:
- Verwyder bestaande instellings met KERN_KDSETREMOVE
- Stel trace in met KERN_KDSETBUF en KERN_KDSETUP
- Gebruik KERN_KDGETBUF om die aantal buffer inskrywings te kry
- Kry die eie kliënt uit die trace met KERN_KDPINDEX
- Aktiveer tracing met KERN_KDENABLE
- Lees die buffer deur KERN_KDREADTR aan te roep
- Om elke draad met sy proses te pas, bel KERN_KDTHRMAP.
Om hierdie inligting te verkry, is dit moontlik om die Apple-gereedskap trace of die pasgemaakte gereedskap kDebugView (kdv).
Let daarop dat Kdebug slegs vir 1 kliĂ«nt op ân slag beskikbaar is. Dus kan slegs een k-debug aangedrewe gereedskap terselfdertyd uitgevoer word.
ktrace
Die ktrace_* APIs kom van libktrace.dylib wat diĂ© van Kdebug omhul. Dan kan ân kliĂ«nt eenvoudig ktrace_session_create en ktrace_events_[single/class] aanroep om callbacks op spesifieke kodes in te stel en dit dan begin met ktrace_start.
Jy kan hierdie een selfs gebruik met SIP geaktiveer
Jy kan die nutsgereedskap ktrace as kliënte gebruik:
ktrace trace -s -S -t c -c ls | grep "ls("
Of tailspin.
kperf
Dit word gebruik om ân kernvlak-profilerings te doen en dit is gebou met behulp van Kdebug oproepe.
Basies, die globale veranderlike kernel_debug_active word nagegaan en as dit ingestel is, roep dit kperf_kdebug_handler aan met die Kdebug kode en adres van die kernraam wat aanroep. As die Kdebug kode ooreenstem met een wat gekies is, kry dit die âaksiesâ wat as ân bitmap geconfigureer is (kyk osfmk/kperf/action.h vir die opsies).
Kperf het ook ân sysctl MIB tabel: (as root) sysctl kperf. Hierdie kode kan gevind word in osfmk/kperf/kperfbsd.c.
Boonop, ân subset van Kperf se funksionaliteit woon in kpc, wat inligting verskaf oor masjienprestasie tellers.
ProcessMonitor
ProcessMonitor is ân baie nuttige hulpmiddel om die prosesverwante aksies wat ân proses uitvoer, na te gaan (byvoorbeeld, om te monitor watter nuwe prosesse ân proses skep).
SpriteTree
SpriteTree is ân hulpmiddel om die verhoudings tussen prosesse te druk.
Jy moet jou mac monitor met ân opdrag soos sudo eslogger fork exec rename create > cap.json (die terminal wat hierdie vereiste FDA begin). En dan kan jy die json in hierdie hulpmiddel laai om al die verhoudings te sien:
.png)
FileMonitor
FileMonitor laat jou toe om lĂȘer gebeurtenisse (soos skepping, wysigings, en verwyderings) te monitor en bied gedetailleerde inligting oor sulke gebeurtenisse.
Crescendo
Crescendo is ân GUI-hulpmiddel met die voorkoms en gevoel wat Windows-gebruikers dalk van Microsoft Sysinternal se Procmon ken. Hierdie hulpmiddel laat die opname van verskeie gebeurtenistipes toe om begin en gestop te word, laat die filtrering van hierdie gebeurtenisse deur kategorieĂ« soos lĂȘer, proses, netwerk, ens., en bied die funksionaliteit om die opgeneemde gebeurtenisse in ân json-formaat te stoor.
Apple Instruments
Apple Instruments is deel van Xcode se Ontwikkelaarshulpmiddels â gebruik om toepassingsprestasie te monitor, geheuelekas te identifiseer en lĂȘfstelsaktiwiteit te volg.
.png)
fs_usage
Laat toe om aksies wat deur prosesse uitgevoer word, te volg:
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 is nuttig om die biblioteke wat deur ân binĂȘre gebruik word, die lĂȘers wat dit gebruik en die netwerk verbindings te sien.
Dit kontroleer ook die binĂȘre prosesse teen virustotal en wys inligting oor die binĂȘre.
PT_DENY_ATTACH
In hierdie blogpos kan jy ân voorbeeld vind van hoe om ân lopende daemon te debug wat PT_DENY_ATTACH gebruik het om debugging te voorkom selfs al was SIP gedeaktiveer.
lldb
lldb is die de facto tool vir macOS binĂȘre debugging.
lldb ./malware.bin
lldb -p 1122
lldb -n malware.bin
lldb -n malware.bin --waitfor
Jy kan die intel-smaak instel wanneer jy lldb gebruik deur ân lĂȘer genaamd .lldbinit in jou tuisgids te skep met die volgende lyn:
settings set target.x86-disassembly-flavor intel
Warning
Binne lldb, dump ân proses met
process save-core
| (lldb) Opdrag | Besonderheid | ||||||||||||||||||||||
| run (r) | Begin uitvoering, wat ononderbroke sal voortduur totdat 'n breekpunt bereik word of die proses beëindig. | ||||||||||||||||||||||
| process launch --stop-at-entry | Begin uitvoering wat by die ingangspunt stop | ||||||||||||||||||||||
| continue (c) | Voortgaan met die uitvoering van die gedebugde proses. | ||||||||||||||||||||||
| nexti (n / ni) | Voer die volgende instruksie uit. Hierdie opdrag sal funksie-oproepe oorslaan. | ||||||||||||||||||||||
| stepi (s / si) | Voer die volgende instruksie uit. Anders as die nexti-opdrag, sal hierdie opdrag in funksie-oproepe stap. | ||||||||||||||||||||||
| finish (f) | Voer die res van die instruksies in die huidige funksie (âraamâ) uit en keer terug en stop. | ||||||||||||||||||||||
| control + c | Pauseer uitvoering. As die proses gedraai (r) of voortgegaan (c) is, sal dit die proses laat stop ... waar dit ook al tans uitvoer. | ||||||||||||||||||||||
| breakpoint (b) |
breakpoint delete help breakpoint #Kry hulp van breekpunt opdrag help memory write #Kry hulp om in die geheue te skryf reg read reg read $rax reg read $rax --format <formaat> reg write $rip 0x100035cc0 Dit sal die objek wat deur die param verwys word druk po $raw Let daarop dat die meeste van Apple se Objective-C APIs of metodes objekte teruggee, en dus via die âprint objectâ (po) opdrag vertoon moet word. As po nie 'n betekenisvolle uitvoer lewer nie, gebruik dis #Disas huidige funksie dis -n dis -n Tip Wanneer die Kern dumps word geskep as: In daardie gevalle word die kern dumps gegenereer volgens ReportCrash analiseer neergestorte prosesse en stoor ân neergestorte verslag op skyf. ân Neergestorte verslag bevat inligting wat kan help ân ontwikkelaar om die oorsaak van ân neergestorte te diagnoseer. As jy bekommerd is oor neergestorte verslae wat na Apple gestuur word, kan jy dit deaktiveer. As nie, kan neergestorte verslae nuttig wees om uit te vind hoe ân bediener neergestort het. Terwyl jy fuzz in ân MacOS, is dit belangrik om te verhoed dat die Mac slaap: As jy fuzz via ân SSH-verbinding, is dit belangrik om te verseker dat die sessie nie gaan slaap nie. So verander die sshd_config-lĂȘer met: Kyk na die volgende bladsy om uit te vind hoe jy kan bepaal watter app verantwoordelik is vir die hantering van die gespesifiseerde skema of protokol: macOS File Extension & URL scheme app handlers Dit is interessant om prosesse te vind wat netwerkdata bestuur: Of gebruik Werk vir CLI gereedskap Dit âwerk netâ met macOS GUI gereedskap. Let daarop dat sommige macOS programme spesifieke vereistes het soos unieke lĂȘernamen, die regte uitbreiding, en dat dit die lĂȘers uit die sandbox moet lees ( Sommige voorbeelde: Tip Leer en oefen AWS Hacking: |
HackTricks


