macOS Apps - Kukagua, kufanyia kazi na Fuzzing

Reading time: 24 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Uchambuzi wa Kijamii

otool & objdump & nm

bash
otool -L /bin/ls #List dynamically linked libraries
otool -tv /bin/ps #Decompile application
bash
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
bash
nm -m ./tccd # List of symbols

jtool2 & Disarm

Unaweza kupakua disarm kutoka hapa.

bash
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

Unaweza kupakua jtool2 hapa au kuisakinisha kwa kutumia brew.

bash
# 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 imeachwa kwa ajili ya disarm

Codesign / ldid

[!TIP] > Codesign inaweza kupatikana katika macOS wakati ldid inaweza kupatikana katika iOS

bash
# 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 ni chombo kinachofaa kukagua .pkg files (wawekaji) na kuona kilichomo ndani kabla ya kukiweka.
Wawekaji hawa wana preinstall na postinstall bash scripts ambazo waandishi wa malware mara nyingi hutumia vibaya ili kuhifadhi malware.

hdiutil

Chombo hiki kinaruhusu kuunganisha picha za diski za Apple (.dmg) ili kukagua kabla ya kuendesha chochote:

bash
hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Itakuwa imewekwa katika /Volumes

Binaries zilizopakizwa

  • Angalia kwa entropy ya juu
  • Angalia nyuzi (kama hakuna nyuzi zinazoweza kueleweka, zimepakizwa)
  • Packer ya UPX kwa MacOS inazalisha sehemu inayoitwa "__XHDR"

Uchambuzi wa Static Objective-C

Metadata

caution

Kumbuka kwamba programu zilizoandikwa kwa Objective-C zinashikilia 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.

Kuita kazi

Wakati kazi inaitwa katika binary inayotumia objective-C, msimbo uliokanzwa badala ya kuita kazi hiyo, itaita objc_msgSend. Ambayo itakuwa ikitafuta kazi ya mwisho:

Paramu ambazo kazi hii inatarajia ni:

  • Paramu ya kwanza (self) ni "kiashiria kinachopointia mfano wa darasa ambalo litapokea ujumbe". Au kwa kusema kwa urahisi, 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 itapointia mfano ulioanzishwa wa darasa kama kitu.
  • Paramu ya pili, (op), ni "mchaguzi wa mbinu inayoshughulikia ujumbe". Tena, kwa kusema kwa urahisi, 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:

{{#ref}} arm64-basic-assembly.md {{#endref}}

x64:

HojaRegister(kwa) objc_msgSend
hoja ya 1rdiself: kitu ambacho mbinu inaitwa juu yake
hoja ya 2rsiop: jina la mbinu
hoja ya 3rdxhoja ya 1 kwa mbinu
hoja ya 4rcxhoja ya 2 kwa mbinu
hoja ya 5r8hoja ya 3 kwa mbinu
hoja ya 6r9hoja ya 4 kwa mbinu
hoja ya 7+

rsp+
(katika stack)

hoja ya 5+ kwa mbinu

Dump Metadata ya ObjectiveC

Dynadump

Dynadump ni chombo cha kutupa darasa la binaries za Objective-C. Github inataja dylibs lakini hii pia inafanya kazi na executable.

bash
./dynadump dump /path/to/bin

Wakati wa kuandika, hii ni sasa ndiyo inafanya kazi vizuri zaidi.

Zana za kawaida

bash
nm --dyldinfo-only /path/to/bin
otool -ov /path/to/bin
objdump --macho --objc-meta-data /path/to/bin

class-dump

class-dump ni chombo cha asili kinachozalisha matamko ya madarasa, makundi na itifaki katika msimbo wa ObjectiveC.

Ni cha zamani na hakijatunzwa hivyo huenda hakiwezi kufanya kazi vizuri.

ICDump

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.

python
import icdump
metadata = icdump.objc.parse("/path/to/bin")

print(metadata.to_decl())

Static Swift analysis

Na binaries za Swift, kwa sababu kuna ulinganifu wa Objective-C, wakati mwingine unaweza kutoa matangazo kwa kutumia class-dump lakini si kila wakati.

Kwa kutumia amri za jtool -l au otool -l inawezekana kupata sehemu kadhaa ambazo zinaanza na kiambishi __swift5:

bash
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
[...]

Unaweza kupata taarifa zaidi kuhusu taarifa zilizohifadhiwa katika sehemu hizi 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:

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

# Swift cli
swift demangle

Uchambuzi wa Kineti

warning

Kumbuka kwamba ili kufanyia kazi 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 ufanyaji kazi wa binary (unaweza kutumia hiki skripti)

warning

Kumbuka kwamba ili kufanya kazi na binaries za mfumo, (kama cloudconfigurationd) kwenye macOS, SIP inapaswa kuzuiliwa (kuondoa saini pekee haitafanya kazi).

APIs

macOS inatoa APIs kadhaa za kuvutia ambazo zinatoa habari kuhusu michakato:

  • proc_info: Hii ndiyo muhimu zaidi inayoleta habari nyingi kuhusu kila mchakato. Unahitaji kuwa root ili kupata habari za michakato mingine lakini huwezi kuhitaji ruhusa maalum au mach ports.
  • libsysmon.dylib: Inaruhusu kupata habari kuhusu michakato kupitia kazi zilizofichwa za XPC, hata hivyo, inahitajika kuwa na ruhusa com.apple.sysmond.client.

Stackshot & microstackshots

Stackshotting ni mbinu inayotumika kukamata hali ya michakato, ikiwa ni pamoja na stacks za wito za nyuzi zote zinazofanya kazi. Hii ni muhimu sana kwa ajili ya ufanyaji kazi, 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.

Sysdiagnose

Zana hii (/usr/bini/ysdiagnose) kimsingi inakusanya habari nyingi kutoka kwa kompyuta yako ikitekeleza amri tofauti kumi kama ps, zprint...

Inapaswa kufanywa kama root na daemon /usr/libexec/sysdiagnosed ina ruhusa 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)

Magogo Yaliyojumuishwa

MacOS inazalisha magogo mengi ambayo yanaweza kuwa ya manufaa wakati wa kuendesha programu ikijaribu kuelewa kila inafanya.

Zaidi ya hayo, kuna baadhi ya magogo ambayo yatakuwa na lebo <private> ili kuficha baadhi ya mtumiaji au kompyuta habari zinazoweza kutambulika. Hata hivyo, inawezekana kusanidi cheti kufichua habari hii. Fuata maelezo kutoka hapa.

Hopper

Paneli ya Kushoto

Katika paneli 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).

Paneli ya Kati

Katika paneli ya kati unaweza kuona kanuni iliyovunjwa. Na unaweza kuiona kama raw disassemble, kama grafu, 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 iliyodecompiled):

Zaidi ya hayo, katika chini ya kati unaweza kuandika amri za python.

Paneli ya Kulia

Katika paneli ya kulia unaweza kuona habari za kuvutia kama historia ya urambazaji (ili ujue jinsi ulivyofika katika hali ya sasa), grafu ya wito ambapo unaweza kuona kazi zote zinazoiita kazi hii na kazi zote ambazo kazi hii inaita, na habari za mabadiliko ya ndani.

dtrace

Inaruhusu watumiaji kufikia programu katika ngazi ya 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 wito wa mfumo.

DTrace inatumia dtrace_probe_create kazi kuunda probe kwa kila wito wa mfumo. Probes hizi zinaweza kuwashwa katika kuingia na kutoka kwa kila wito wa mfumo. Maingiliano na DTrace yanatokea kupitia /dev/dtrace ambayo inapatikana tu kwa mtumiaji wa root.

tip

Ili kuwezesha Dtrace bila kuzima kabisa ulinzi wa SIP unaweza kutekeleza katika hali ya urejelezi: csrutil enable --without dtrace

Unaweza pia dtrace au dtruss binaries ambazo umeziunda.

Probes zinazopatikana za dtrace zinaweza kupatikana kwa:

bash
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

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

Mifano

Kimbia man -k dtrace ili orodheshe scripts za DTrace zinazopatikana. Mfano: sudo dtruss -n binary

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

#Log every syscall of a PID
sudo dtrace -s script.d 1234
bash
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"
bash
syscall:::entry
{
;
}
syscall:::return
{
printf("=%d\n", arg1);
}

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

dtruss

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

kdebug

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 kwa KERN_KDSETREMOVE
  • Weka trace kwa KERN_KDSETBUF na KERN_KDSETUP
  • Tumia KERN_KDGETBUF kupata idadi ya entries za buffer
  • Pata mteja wako kutoka kwenye trace kwa KERN_KDPINDEX
  • Wezesha kufuatilia kwa 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.

ktrace

APIs za ktrace_* zinatoka 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:

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

Or tailspin.

kperf

Hii inatumika kufanya profiling ya kiwango cha kernel na imejengwa kwa kutumia Kdebug callouts.

Kimsingi, variable ya kimataifa kernel_debug_active inakaguliwa na inapowekwa 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 taarifa kuhusu mashine ya hesabu za utendaji.

ProcessMonitor

ProcessMonitor ni chombo muhimu sana kuangalia vitendo vinavyohusiana na mchakato ambao mchakato unatekeleza (kwa mfano, kufuatilia mchakato gani mpya mchakato unaunda).

SpriteTree

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

FileMonitor inaruhusu kufuatilia matukio ya faili (kama vile uundaji, mabadiliko, na kufutwa) ikitoa taarifa za kina kuhusu matukio hayo.

Crescendo

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

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.

fs_usage

Inaruhusu kufuatilia vitendo vinavyofanywa na michakato:

bash
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 ni muhimu kuona maktaba zinazotumiwa na binary, faili inazotumia na muunganisho wa mtandao.
Pia inakagua michakato ya binary dhidi ya virustotal na kuonyesha taarifa kuhusu binary.

PT_DENY_ATTACH

Katika hiki kipande cha blogu unaweza kupata mfano kuhusu jinsi ya kudebug daemon inayotembea ambayo ilitumia PT_DENY_ATTACH kuzuia debugging hata kama SIP ilikuwa imezimwa.

lldb

lldb ni chombo cha de facto kwa macOS debugging ya binary.

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

Unaweza kuweka ladha ya intel unapotumia lldb kwa kuunda faili inayoitwa .lldbinit katika folda yako ya nyumbani na mstari ufuatao:

bash
settings set target.x86-disassembly-flavor intel

warning

Ndani ya lldb, dump mchakato kwa process save-core

(lldb) AmriMaelezo
run (r)Kuanza utekelezaji, ambayo itaendelea bila kukatizwa hadi breakpoint ipatikane au mchakato uishe.
process launch --stop-at-entryKuanza utekelezaji ukisimama kwenye kiingilio
continue (c)Endelea na utekelezaji wa mchakato unaoshughulikiwa.
nexti (n / ni)Tekeleza amri inayofuata. Amri hii itakataa kupita kwenye wito wa kazi.
stepi (s / si)Teekeleza amri inayofuata. Tofauti na amri ya nexti, amri hii itachambua wito wa kazi.
finish (f)Teekeleza maagizo yaliyobaki katika kazi ya sasa (“frame”) rudisha na simamisha.
control + cSimamisha utekelezaji. Ikiwa mchakato umekuwa ukikimbia (r) au umeendelea (c), hii itasababisha mchakato kusimama ... popote ulipo.
breakpoint (b)

b main #Kazi yoyote inayoitwa main

b `main #Kazi kuu ya bin

b set -n main --shlib #Kazi kuu ya bin iliyoonyeshwa

breakpoint set -r '\[NSFileManager .*\]$' #Njia yoyote ya NSFileManager

breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'

break set -r . -s libobjc.A.dylib # Vunjia kazi zote za maktaba hiyo

b -a 0x0000000100004bd9

br l #Orodha ya breakpoint

br e/dis #Washa/Zima breakpoint

breakpoint delete

help

help breakpoint #Pata msaada wa amri ya breakpoint

help memory write #Pata msaada wa kuandika kwenye kumbukumbu

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s Onyesha kumbukumbu kama mfuatano wa herufi ulio na mwisho wa null.
x/i Onyesha kumbukumbu kama amri ya mkusanyiko.
x/b 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 mbinu hurudisha vitu, na hivyo zinapaswa kuonyeshwa kupitia amri ya “print object” (po). Ikiwa po haitoi matokeo yenye maana tumia x/b

memorymemory 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 #Disas kazi

dis -n -b #Disas kazi
dis -c 6 #Disas mistari 6
dis -c 0x100003764 -e 0x100003768 # Kutoka moja hadi nyingine
dis -p -c 4 # Anza katika anwani ya sasa ukichambua

parrayparray 3 (char **)$x1 # Angalia array ya vipengele 3 katika reg x1
image dump sectionsChapisha ramani ya kumbukumbu ya mchakato wa sasa
image dump symtab image dump symtab CoreNLP #Pata anwani ya alama zote kutoka CoreNLP

note

Wakati wa kuita kazi objc_sendMsg, register rsi ina jina la mbinu kama mfuatano wa herufi ulio na mwisho wa 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:"

Anti-Dynamic Analysis

VM detection

  • 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.
  • Baadhi ya malware pia inaweza gundua ikiwa mashine ni VMware kulingana na anwani ya MAC (00:50:56).
  • Pia inawezekana kupata ikiwa mchakato unashughulikiwa kwa kutumia msimbo rahisi kama:
  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //mchakato unashughulikiwa }
  • Inaweza pia kuita ptrace mfumo wa wito na bendera PT_DENY_ATTACH. Hii inazuia debugger kuungana na kufuatilia.
  • Unaweza kuangalia ikiwa sysctl au ptrace kazi inapo ingizwa (lakini malware inaweza kuingiza kwa njia ya kidinamik).
  • Kama ilivyotajwa katika andiko hili, “Defeating Anti-Debug Techniques: 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

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.

Fuzzing

ReportCrash

ReportCrash inafanya uchambuzi wa michakato inayoshindwa na kuhifadhi ripoti ya ajali kwenye diski. Ripoti ya ajali ina habari ambayo inaweza 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 launchd na michakato mingine yenye mamlaka, ReportCrash inakimbia kama LaunchDaemon na kuhifadhi ripoti za ajali katika /Library/Logs/DiagnosticReports ya mfumo

Ikiwa unahisi wasiwasi kuhusu ripoti za ajali zinazosambazwa kwa Apple unaweza kuzizima. Ikiwa la, ripoti za ajali zinaweza kuwa na manufaa katika kugundua jinsi seva ilivyoshindwa.

bash
#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

Sleep

Wakati wa fuzzing katika MacOS ni muhimu kutoruhusu Mac kulala:

SSH Disconnect

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
bash
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Internal Handlers

Angalia ukurasa ufuatao ili kujua jinsi unavyoweza kupata ni programu ipi inayohusika na kushughulikia mpango au itifaki iliyoainishwa:

{{#ref}} ../macos-file-extension-apps.md {{#endref}}

Enumerating Network Processes

Hii ni ya kuvutia kupata michakato inayosimamia data ya mtandao:

bash
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

Au tumia netstat au lsof

Libgmalloc

bash
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"

Fuzzers

AFL++

Inafanya kazi kwa zana za CLI

Litefuzz

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, kiambatisho sahihi, zinahitaji kusoma faili kutoka kwenye sandbox (~/Library/Containers/com.apple.Safari/Data)...

Baadhi ya mifano:

bash
# 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

Taarifa Zaidi za Fuzzing MacOS

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks