macOS Apps - Inspecting, debugging and Fuzzing
Last updated
Last updated
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unaweza kupakua disarm kutoka hapa.
Unaweza kupakua jtool2 hapa au kuisakinisha kwa kutumia brew
.
jtool imeachwa kwa ajili ya disarm
Codesign
inaweza kupatikana katika macOS wakati ldid
inaweza kupatikana katika iOS
SuspiciousPackage ni chombo kinachofaa kukagua .pkg faili (wawekaji) na kuona kilichomo ndani kabla ya kuinstall.
Wawekaji hawa wana preinstall
na postinstall
bash scripts ambazo waandishi wa malware mara nyingi hutumia vibaya ili kuendelea na malware.
Chombo hiki kinaruhusu kuunganisha picha za diski za Apple (.dmg) ili kukagua kabla ya kuendesha chochote:
It will be mounted in /Volumes
Angalia kwa entropy ya juu
Angalia nyuzi (kama hakuna nyuzi zinazoweza kueleweka, zimepakwa)
Packer wa UPX kwa MacOS huunda sehemu inayoitwa "__XHDR"
Kumbuka kwamba programu zilizoandikwa kwa Objective-C zinahifadhi matangazo yao ya darasa wakati zinapokanzwa katika Mach-O binaries. Matangazo kama haya ya darasa yanajumuisha jina na aina ya:
Interfaces zilizofafanuliwa
Mbinu za interface
Vigezo vya mfano wa interface
Itifaki zilizofafanuliwa
Kumbuka kwamba majina haya yanaweza kufichwa ili kufanya kurudi nyuma kwa binary kuwa ngumu zaidi.
Wakati kazi inapoitwa katika binary inayotumia objective-C, msimbo uliokanzwa badala ya kuita kazi hiyo, utaita objc_msgSend
. Ambayo itakuwa ikitafuta kazi ya mwisho:
Paramu ambazo kazi hii inatarajia ni:
Paramu ya kwanza (self) ni "kiashiria kinachoelekeza kwa mfano wa darasa ambalo litapokea ujumbe". Au kwa maneno rahisi, ni kitu ambacho mbinu inaitwa juu yake. Ikiwa mbinu ni mbinu ya darasa, hii itakuwa mfano wa kitu cha darasa (kama jumla), wakati kwa mbinu ya mfano, self itakuwa ikielekeza kwa mfano ulioanzishwa wa darasa kama kitu.
Paramu ya pili, (op), ni "mchaguzi wa mbinu inayoshughulikia ujumbe". Tena, kwa maneno rahisi, hii ni tu jina la mbinu.
Paramu zilizobaki ni thamani zozote zinazohitajika na mbinu (op).
Tazama jinsi ya kupata habari hii kwa urahisi na lldb
katika ARM64 katika ukurasa huu:
x64:
Argument
Register
(kwa) objc_msgSend
1st argument
rdi
self: kitu ambacho mbinu inaitwa juu yake
2nd argument
rsi
op: jina la mbinu
3rd argument
rdx
paramu ya 1 kwa mbinu
4th argument
rcx
paramu ya 2 kwa mbinu
5th argument
r8
paramu ya 3 kwa mbinu
6th argument
r9
paramu ya 4 kwa mbinu
7th+ argument
rsp+ (katika stack)
paramu ya 5+ kwa mbinu
Dynadump ni chombo cha kutupa darasa la Objective-C binaries. Github inaelezea dylibs lakini hii pia inafanya kazi na executable.
Wakati wa uandishi, hii ni sasa ndiyo inayo fanya kazi vizuri zaidi.
class-dump ni chombo cha asili kinachozalisha matamko ya madarasa, makundi na protokali katika msimbo wa muundo wa ObjetiveC.
Ni ya zamani na haina matengenezo hivyo huenda isifanye kazi vizuri.
iCDump ni chombo cha kisasa na chenye uwezo wa kufanya kazi kwenye majukwaa mbalimbali cha Objective-C. Ikilinganishwa na zana zilizopo, iCDump inaweza kufanya kazi bila kutegemea mfumo wa Apple na inatoa viunganishi vya Python.
Kwa binaries za Swift, kwa kuwa kuna ulinganifu wa Objective-C, wakati mwingine unaweza kutoa matamko kwa kutumia class-dump lakini si kila wakati.
Kwa kutumia amri za jtool -l
au otool -l
inawezekana kupata sehemu kadhaa zinazooanza na kiambishi __swift5
:
Unaweza kupata taarifa zaidi kuhusu taarifa zilizohifadhiwa katika sehemu hii katika chapisho hili la blog.
Zaidi ya hayo, binaries za Swift zinaweza kuwa na alama (kwa mfano maktaba zinahitaji kuhifadhi alama ili kazi zake ziweze kuitwa). Alama hizo kwa kawaida zina taarifa kuhusu jina la kazi na attr kwa njia isiyo nzuri, hivyo ni muhimu sana na kuna "demanglers" ambazo zinaweza kupata jina la asili:
Kumbuka kwamba ili kubadilisha binaries, SIP inahitaji kuzuiliwa (csrutil disable
au csrutil enable --without debug
) au nakala ya binaries kwenye folda ya muda na ondoa saini kwa codesign --remove-signature <binary-path>
au ruhusu kubadilisha binary (unaweza kutumia hiki skripti)
Kumbuka kwamba ili kuweka vifaa vya mfumo, (kama cloudconfigurationd
) kwenye macOS, SIP inapaswa kuzuiliwa (kuondoa saini pekee haitafanya kazi).
macOS inatoa APIs kadhaa za kuvutia ambazo zinatoa habari kuhusu michakato:
proc_info
: Hii ndiyo kuu inayoleta habari nyingi kuhusu kila mchakato. Unahitaji kuwa root ili kupata habari za michakato mingine lakini huhitaji haki maalum au mach ports.
libsysmon.dylib
: Inaruhusu kupata habari kuhusu michakato kupitia kazi zilizofichwa za XPC, hata hivyo, inahitajika kuwa na haki com.apple.sysmond.client
.
Stackshotting ni mbinu inayotumika kukamata hali ya michakato, ikiwa ni pamoja na stack za simu za nyuzi zote zinazofanya kazi. Hii ni muhimu sana kwa ajili ya kubadilisha, uchambuzi wa utendaji, na kuelewa tabia ya mfumo katika wakati maalum. Kwenye iOS na macOS, stackshotting inaweza kufanywa kwa kutumia zana na mbinu kadhaa kama zana sample
na spindump
.
Zana hii (/usr/bini/ysdiagnose
) kimsingi inakusanya habari nyingi kutoka kwa kompyuta yako ikitekeleza amri tofauti kumi kama ps
, zprint
...
Inapaswa kuendeshwa kama root na daemon /usr/libexec/sysdiagnosed
ina haki za kuvutia kama com.apple.system-task-ports
na get-task-allow
.
Plist yake iko katika /System/Library/LaunchDaemons/com.apple.sysdiagnose.plist
ambayo inatangaza MachServices 3:
com.apple.sysdiagnose.CacheDelete
: Inafuta archives za zamani katika /var/rmp
com.apple.sysdiagnose.kernel.ipc
: Bandari maalum 23 (kernel)
com.apple.sysdiagnose.service.xpc
: Kiolesura cha hali ya mtumiaji kupitia Libsysdiagnose
darasa la Obj-C. Hoja tatu katika dict zinaweza kupitishwa (compress
, display
, run
)
MacOS inazalisha logi nyingi ambazo zinaweza kuwa muhimu sana unapokimbia programu ukijaribu kuelewa inayofanya nini.
Zaidi ya hayo, kuna logi ambazo zitakuwa na lebo <private>
ili kuficha baadhi ya mtumiaji au kompyuta inayoweza kutambulika habari. Hata hivyo, inawezekana kufunga cheti kufichua habari hii. Fuata maelezo kutoka hapa.
Katika panel ya kushoto ya hopper inawezekana kuona alama (Labels) za binary, orodha ya taratibu na kazi (Proc) na nyuzi (Str). Hizi si nyuzi zote lakini zile zilizofafanuliwa katika sehemu kadhaa za faili la Mac-O (kama cstring au objc_methname
).
Katika panel ya katikati unaweza kuona kanuni iliyovunjwa. Na unaweza kuiona kama raw disassemble, kama graph, kama decompiled na kama binary kwa kubofya kwenye ikoni husika:
Kubofya kulia kwenye kitu cha kanuni unaweza kuona marejeleo kwa/kutoka kwa kitu hicho au hata kubadilisha jina lake (hii haitafanya kazi katika pseudocode iliyotafsiriwa):
Zaidi ya hayo, katika katikati chini unaweza kuandika amri za python.
Katika panel ya kulia unaweza kuona habari za kuvutia kama historia ya urambazaji (ili ujue jinsi ulivyofika katika hali ya sasa), ramani ya simu ambapo unaweza kuona kazi zote zinazopiga simu kazi hii na kazi zote ambazo kazi hii inaita, na habari za mabadiliko ya ndani.
Inaruhusu watumiaji kufikia programu kwa kiwango cha chini sana na inatoa njia kwa watumiaji kufuatilia programu na hata kubadilisha mtiririko wa utekelezaji wao. Dtrace inatumia probes ambazo zimewekwa katika kernel na ziko katika maeneo kama mwanzo na mwisho wa simu za mfumo.
DTrace inatumia kazi dtrace_probe_create
kuunda probe kwa kila simu ya mfumo. Probes hizi zinaweza kuanzishwa katika kuingia na kutoka kwa kila simu ya mfumo. Maingiliano na DTrace yanatokea kupitia /dev/dtrace ambayo inapatikana tu kwa mtumiaji wa root.
Ili kuwezesha Dtrace bila kuzima kabisa ulinzi wa SIP unaweza kutekeleza katika hali ya urejeleaji: csrutil enable --without dtrace
Unaweza pia dtrace
au dtruss
binaries ambazo umeziunda.
Probes zinazopatikana za dtrace zinaweza kupatikana na:
Jina la probe linajumuisha sehemu nne: mtoa huduma, moduli, kazi, na jina (fbt:mach_kernel:ptrace:entry
). Ikiwa hujatoa sehemu fulani ya jina, Dtrace itatumia sehemu hiyo kama wildcard.
Ili kuunda DTrace ili kuamsha probes na kubaini ni hatua zipi za kuchukua wakati zinapowaka, tutahitaji kutumia lugha ya D.
Maelezo ya kina zaidi na mifano zaidi yanaweza kupatikana katika https://illumos.org/books/dtrace/chp-intro.html
Kimbia man -k dtrace
ili orodheshe scripts za DTrace zinazopatikana. Mfano: sudo dtruss -n binary
Katika mstari
hati
Ni kituo cha kufuatilia kernel. M codes zilizoorodheshwa zinaweza kupatikana katika /usr/share/misc/trace.codes
.
Zana kama latency
, sc_usage
, fs_usage
na trace
zinatumia ndani yake.
Ili kuingiliana na kdebug
, sysctl
inatumika juu ya namespace ya kern.kdebug
na MIBs zinazoweza kutumika zinaweza kupatikana katika sys/sysctl.h
zikiwa na kazi zilizotekelezwa katika bsd/kern/kdebug.c
.
Ili kuingiliana na kdebug na mteja maalum, hatua hizi kawaida hufuatwa:
Ondoa mipangilio iliyopo na KERN_KDSETREMOVE
Weka trace na KERN_KDSETBUF na KERN_KDSETUP
Tumia KERN_KDGETBUF kupata idadi ya entries za buffer
Pata mteja wako kutoka kwenye trace na KERN_KDPINDEX
Washa kufuatilia na KERN_KDENABLE
Soma buffer kwa kuita KERN_KDREADTR
Ili kulinganisha kila thread na mchakato wake, piga KERN_KDTHRMAP.
Ili kupata habari hii, inawezekana kutumia zana ya Apple trace
au zana maalum kDebugView (kdv).
Kumbuka kwamba Kdebug inapatikana kwa mteja 1 tu kwa wakati mmoja. Hivyo, zana moja iliyo na k-debug inaweza kutekelezwa kwa wakati mmoja.
APIs za ktrace_*
zinatoka katika libktrace.dylib
ambazo zinafungua zile za Kdebug
. Kisha, mteja anaweza tu kuita ktrace_session_create
na ktrace_events_[single/class]
kuweka callbacks kwenye codes maalum na kisha kuanza nayo kwa ktrace_start
.
Unaweza kutumia hii hata na SIP imewezeshwa
Unaweza kutumia kama wateja zana ktrace
:
Or tailspin
.
Hii inatumika kufanya profiling ya kiwango cha kernel na imejengwa kwa kutumia Kdebug
callouts.
Kimsingi, kigezo cha kimataifa kernel_debug_active
kinakaguliwa na kinapowekwa inaita kperf_kdebug_handler
na Kdebug
code na anwani ya kernel frame inayoiita. Ikiwa Kdebug
code inalingana na moja iliyochaguliwa inapata "vitendo" vilivyowekwa kama bitmap (angalia osfmk/kperf/action.h
kwa chaguo).
Kperf ina meza ya sysctl MIB pia: (kama root) sysctl kperf
. Mifano hii inaweza kupatikana katika osfmk/kperf/kperfbsd.c
.
Zaidi ya hayo, subset ya kazi za Kperf inapatikana katika kpc
, ambayo inatoa habari kuhusu vigezo vya utendaji wa mashine.
ProcessMonitor ni chombo muhimu sana kuangalia vitendo vinavyohusiana na mchakato ambao mchakato unatekeleza (kwa mfano, kufuatilia mchakato mpya ambao mchakato unaunda).
SpriteTree ni chombo kinachochapisha uhusiano kati ya michakato.
Unahitaji kufuatilia mac yako kwa amri kama sudo eslogger fork exec rename create > cap.json
(terminal inayozindua hii inahitaji FDA). Na kisha unaweza kupakia json katika chombo hiki ili kuona uhusiano wote:
FileMonitor inaruhusu kufuatilia matukio ya faili (kama vile uundaji, marekebisho, na kufutwa) ikitoa habari za kina kuhusu matukio hayo.
Crescendo ni chombo cha GUI chenye muonekano na hisia ambazo watumiaji wa Windows wanaweza kujua kutoka Microsoft Sysinternal’s Procmon. Chombo hiki kinaruhusu kurekodi aina mbalimbali za matukio kuanzishwa na kusitishwa, kinaruhusu kuchuja matukio haya kwa makundi kama faili, mchakato, mtandao, nk., na kinatoa uwezo wa kuhifadhi matukio yaliyorekodiwa katika muundo wa json.
Apple Instruments ni sehemu ya zana za Developer za Xcode – zinazotumika kwa kufuatilia utendaji wa programu, kubaini leaks za kumbukumbu na kufuatilia shughuli za mfumo wa faili.
Inaruhusu kufuatilia vitendo vinavyofanywa na michakato:
Taskexplorer ni muhimu kuona maktaba zinazotumiwa na binary, faili inazotumia na mifumo ya mtandao. Pia inakagua michakato ya binary dhidi ya virustotal na kuonyesha taarifa kuhusu binary.
Katika hiki blogu unaweza kupata mfano wa jinsi ya kudebug daemon inayotembea ambayo ilitumia PT_DENY_ATTACH
kuzuia kudebug hata kama SIP ilikuwa imezimwa.
lldb ni chombo cha de facto kwa macOS binary kudebug.
Unaweza kuweka ladha ya intel unapotumia lldb kwa kuunda faili inayoitwa .lldbinit
katika folda yako ya nyumbani na mstari ufuatao:
Ndani ya lldb, dump mchakato kwa process save-core
(lldb) Amri
Maelezo
run (r)
Kuanza utekelezaji, ambayo itaendelea bila kukatizwa hadi breakpoint ipatikane au mchakato uishe.
process launch --stop-at-entry
Kuanza utekelezaji ukisimama kwenye kiingilio
continue (c)
Endelea na utekelezaji wa mchakato unaosimamiwa.
nexti (n / ni)
Tekeleza amri inayofuata. Amri hii itakataa kupita kwenye simu za kazi.
stepi (s / si)
Teekeleza amri inayofuata. Tofauti na amri ya nexti, amri hii itachambua simu za kazi.
finish (f)
Teekeleza maagizo mengine katika kazi ya sasa (“frame”) rudisha na simamisha.
control + c
Simamisha utekelezaji. Ikiwa mchakato umekuwa ukikimbia (r) au unaendelea (c), hii itasababisha mchakato kusimama ... popote ulipo.
breakpoint (b)
b main
#Kila func inayoitwa main
b <binname>`main
#Main func ya bin
b set -n main --shlib <lib_name>
#Main func ya bin iliyoonyeshwa
breakpoint set -r '\[NSFileManager .*\]$'
#Kila njia ya NSFileManager
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib
# Break katika kazi zote za maktaba hiyo
b -a 0x0000000100004bd9
br l
#Orodha ya breakpoint
br e/dis <num>
#Washa/Zima breakpoint
breakpoint delete <num>
help
help breakpoint #Pata msaada wa amri ya breakpoint
help memory write #Pata msaada wa kuandika kwenye kumbukumbu
reg
x/s <reg/memory address>
Onyesha kumbukumbu kama mfuatano wa herufi unaomalizika kwa null.
x/i <reg/memory address>
Onyesha kumbukumbu kama amri ya mkusanyiko.
x/b <reg/memory address>
Onyesha kumbukumbu kama byte.
print object (po)
Hii itachapisha kitu kinachorejelewa na param
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
Kumbuka kwamba nyingi za API za Objective-C za Apple au njia hurudisha vitu, na hivyo zinapaswa kuonyeshwa kupitia amri ya “print object” (po). Ikiwa po haitoi matokeo yenye maana tumia x/b
memory
memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Andika AAAA katika anwani hiyo memory write -f s $rip+0x11f+7 "AAAA" #Andika AAAA katika anwani
disassembly
dis #Disas kazi ya sasa
dis -n <funcname> #Disas func
dis -n <funcname> -b <basename> #Disas func dis -c 6 #Disas mistari 6 dis -c 0x100003764 -e 0x100003768 # Kutoka moja kuongeza hadi nyingine dis -p -c 4 # Anza katika anwani ya sasa ikichambua
parray
parray 3 (char **)$x1 # Angalia array ya vipengele 3 katika reg x1
image dump sections
Chapisha ramani ya kumbukumbu ya mchakato wa sasa
image dump symtab <library>
image dump symtab CoreNLP
#Pata anwani ya alama zote kutoka CoreNLP
Wakati wa kuita kazi ya objc_sendMsg
, register ya rsi ina jina la njia kama mfuatano wa herufi unaomalizika kwa null (“C”). Ili kuchapisha jina kupitia lldb fanya:
(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:"
Amri sysctl hw.model
inarudisha "Mac" wakati mwenyeji ni MacOS lakini kitu tofauti wakati ni VM.
Kucheza na thamani za hw.logicalcpu
na hw.physicalcpu
baadhi ya malware hujaribu kugundua ikiwa ni VM.
Malware zingine zinaweza pia gundua ikiwa mashine ni VMware kulingana na anwani ya MAC (00:50:56).
Pia inawezekana kupata ikiwa mchakato unachunguzwa kwa kutumia msimbo rahisi kama:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //mchakato unachunguzwa }
Inaweza pia kuita wito wa mfumo wa ptrace
na bendera ya PT_DENY_ATTACH
. Hii inazuia debugger kuungana na kufuatilia.
Unaweza kuangalia ikiwa sysctl
au ptrace
inatumika (lakini malware inaweza kuingiza kwa njia ya kidinamikia)
Kama ilivyotajwa katika andiko hili, “Kushinda Mbinu za Anti-Debug: macOS ptrace variants” : “Ujumbe Mchakato # ulitoka na hali = 45 (0x0000002d) mara nyingi ni ishara ya wazi kwamba lengo la debug linatumia PT_DENY_ATTACH”
Core dumps zinaundwa ikiwa:
kern.coredump
sysctl imewekwa kuwa 1 (kwa kawaida)
Ikiwa mchakato haukuwa suid/sgid au kern.sugid_coredump
ni 1 (kwa kawaida ni 0)
Kiwango cha AS_CORE
kinaruhusu operesheni. Inawezekana kuzuiya uundaji wa core dumps kwa kuita ulimit -c 0
na kuziwezesha tena kwa ulimit -c unlimited
.
Katika hali hizo core dumps inaundwa kulingana na kern.corefile
sysctl na kuhifadhiwa kwa kawaida katika /cores/core/.%P
.
ReportCrash inafanya uchambuzi wa michakato inayoshindwa na kuhifadhi ripoti ya ajali kwenye diski. Ripoti ya ajali ina habari ambazo zinaweza kusaidia mendelezi kutambua sababu ya ajali.
Kwa programu na michakato mingine inayoendesha katika muktadha wa per-user launchd, ReportCrash inakimbia kama LaunchAgent na kuhifadhi ripoti za ajali katika ~/Library/Logs/DiagnosticReports/
ya mtumiaji
Kwa daemons, michakato mingine inayoendesha katika muktadha wa mfumo wa launchd na michakato mingine yenye mamlaka, ReportCrash inakimbia kama LaunchDaemon na kuhifadhi ripoti za ajali katika /Library/Logs/DiagnosticReports
ya mfumo
Ikiwa unahofia ripoti za ajali zinazosambazwa kwa Apple unaweza kuzizima. Ikiwa sivyo, ripoti za ajali zinaweza kuwa na manufaa katika kugundua jinsi seva ilivyoshindwa.
Wakati wa fuzzing katika MacOS, ni muhimu kutokuruhusu Mac kulala:
systemsetup -setsleep Never
pmset, Mipangilio ya Mfumo
Ikiwa unafuzzing kupitia muunganisho wa SSH, ni muhimu kuhakikisha kuwa kikao hakitakufa. Hivyo badilisha faili ya sshd_config na:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
Angalia ukurasa ufuatao ili kujua jinsi unavyoweza kupata ni programu ipi inayohusika na kushughulikia mpango au itifaki iliyoainishwa:
macOS File Extension & URL scheme app handlersHii ni ya kuvutia kupata michakato inayosimamia data ya mtandao:
Au tumia netstat
au lsof
Inafanya kazi kwa zana za CLI
Inafanya kazi tu na zana za GUI za macOS. Kumbuka kwamba baadhi ya programu za macOS zina mahitaji maalum kama vile majina ya faili ya kipekee, kiambishi sahihi, zinahitaji kusoma faili kutoka kwenye sandbox (~/Library/Containers/com.apple.Safari/Data
)...
Baadhi ya mifano:
Jifunze & fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Jifunze & fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)