macOS Apps - Inspecting, debugging and Fuzzing

Support HackTricks

WhiteIntel ni injini ya utaftaji inayotumia dark-web ambayo inatoa huduma za bure za kuangalia ikiwa kampuni au wateja wake wameathiriwa na malware za wizi.

Lengo kuu la WhiteIntel ni kupambana na utekaji wa akaunti na mashambulio ya ransomware yanayotokana na programu hasidi za wizi wa habari.

Unaweza kutembelea tovuti yao na kujaribu injini yao bure kwa:


Uchambuzi wa Stetiki

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

Unaweza kupakua disarm kutoka hapa.

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 kusakinisha kwa kutumia 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

jtool imepitwa na wakati kwa faida ya disarm

Codesign / ldid

Codesign inaweza kupatikana kwenye macOS wakati ldid inaweza kupatikana kwenye iOS

# 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 kuchunguza faili za .pkg (wakufunzi) na kuona kilichomo ndani kabla ya kuiweka. Wakufunzi hawa wana skripti za bash za preinstall na postinstall ambazo waundaji wa programu hasidi kawaida hutumia vibaya kudumisha programu hasidi.

hdiutil

Chombo hiki kuruhusu kufunga picha za diski za Apple (.dmg) ili kuzichunguza kabla ya kuzitumia:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

Itakuwa imemountiwa katika /Volumes

Binari zilizopakwa

  • Angalia kwa entropy kubwa

  • Angalia strings (kama hakuna string inayoeleweka, imepakwa)

  • Packer wa UPX kwa MacOS huzalisha sehemu inayoitwa "__XHDR"

Uchambuzi wa Static Objective-C

Metadata

Tafadhali kumbuka kuwa programu zilizoandikwa kwa Objective-C huhifadhi maelezo yao ya darasa wakati zina kuchakatwa kuwa binari za Mach-O. Maelezo haya ya darasa ni pamoja na jina na aina ya:

  • Interfaces zilizofafanuliwa

  • Njia za interface

  • Variables za kesi za interface

  • Itifaki zilizofafanuliwa

Kumbuka kuwa majina haya yanaweza kufichwa ili kufanya kugeuza nyuma ya binari kuwa ngumu zaidi.

Kuita kazi

Wakati kazi inaitwa katika binari inayotumia Objective-C, badala ya kuita kazi hiyo, msimbo uliochakatwa utaita objc_msgSend. Ambayo itaita kazi ya mwisho:

Parameta ambazo kazi hii inatarajia ni:

  • Parameta ya kwanza (self) ni "kiashiria kinachoelekeza kwa mfano wa darasa ambalo linapaswa kupokea ujumbe". Au kusema kwa urahisi zaidi, ni kitu ambacho njia inaitwa juu yake. Ikiwa njia ni njia ya darasa, hii itakuwa mfano wa kitu cha darasa (kwa jumla), wakati kwa njia ya kesi, self itaelekeza kwa mfano ulioanzishwa wa darasa kama kitu.

  • Parameta ya pili, (op), ni "chaguzi ya njia inayoshughulikia ujumbe". Tena, kwa urahisi zaidi, hii ni tu jina la njia.

  • Parameta zilizobaki ni thamani zozote zinazohitajika na njia (op).

Angalia jinsi ya kupata habari hii kwa urahisi na lldb katika ARM64 kwenye ukurasa huu:

Introduction to ARM64v8

x64:

Hoja

Kirejista

(kwa) objc_msgSend

Hoja ya 1

rdi

self: kitu ambacho njia inaitwa juu yake

Hoja ya 2

rsi

op: jina la njia

Hoja ya 3

rdx

Hoja ya 1 kwa njia

Hoja ya 4

rcx

Hoja ya 2 kwa njia

Hoja ya 5

r8

Hoja ya 3 kwa njia

Hoja ya 6

r9

Hoja ya 4 kwa njia

Hoja ya 7+

rsp+ (kwenye steki)

Hoja ya 5+ kwa njia

Tupa Metadata ya ObjectiveC

Dynadump

Dynadump ni chombo cha kuchambua darasa la binari za Objective-C. Ukurasa wa github unataja dylibs lakini hii pia inafanya kazi na faili za kutekelezwa.

./dynadump dump /path/to/bin

Wakati wa kuandika, hii ni mojawapo inayofanya kazi vizuri zaidi.

Vifaa vya Kawaida

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 awali kinachozalisha tamko kwa ajili ya madarasa, makundi, na itifaki katika nambari iliyopangwa kwa ObjetiveC.

Ni cha zamani na hakihifadhiwi kwa hiyo labda haitafanya kazi vizuri.

ICDump

iCDump ni daraja la darasa la Objective-C la kisasa na la msalaba-jukwaa. Ikilinganishwa na zana zilizopo, iCDump inaweza kufanya kazi kivyake kutoka kwa mfumo wa Apple na inafunua vifungo vya Python.

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

print(metadata.to_decl())

Uchambuzi Statisia wa Swift

Kwa mafaili ya Swift, kwa kuwa kuna utangamano wa Objective-C, mara kwa mara unaweza kutoa tamko kutumia class-dump lakini sio kila wakati.

Kwa kutumia mistari ya amri ya jtool -l au otool -l niwezekanavyo kupata sehemu kadhaa ambazo zinaanza na kiambishi cha __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
[...]

Unaweza kupata habari zaidi kuhusu habari zilizohifadhiwa katika sehemu hizi katika chapisho hili la blogi.

Zaidi ya hayo, Binaries za Swift zinaweza kuwa na alama (kwa mfano maktaba hulazimika kuhifadhi alama ili kazi zake ziweze kuitwa). Alama kwa kawaida huwa na habari kuhusu jina la kazi na sifa kwa njia isiyovutia, hivyo ni muhimu sana na kuna "wachambuzi" ambao wanaweza kupata jina halisi:

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

# Swift cli
swift demangle

Uchambuzi wa Kudumu

Tafadhali elewa kwamba ili kudebugi binaries, SIP inahitaji kuwa imelemazwa (csrutil disable au csrutil enable --without debug) au kuiga binaries kwenye folda ya muda na kuondoa saini na codesign --remove-signature <njia-ya-binary> au kuruhusu kudebugi ya binary (unaweza kutumia script hii)

Tafadhali elewa kwamba ili kuinstrumenti binaries za mfumo, (kama vile cloudconfigurationd) kwenye macOS, SIP lazima iwe imelemazwa (kuondoa tu saini haitafanya kazi).

APIs

macOS ina APIs za kuvutia zinazotoa habari kuhusu michakato:

  • proc_info: Hii ni moja kuu inayotoa habari nyingi kuhusu kila mchakato. Unahitaji kuwa na ruhusa ya mizizi kupata habari za michakato mingine lakini hauitaji ruhusa maalum au mach ports.

  • libsysmon.dylib: Inaruhusu kupata habari kuhusu michakato kupitia kazi zilizofunuliwa za XPC, hata hivyo, ni muhimu kuwa na ruhusa ya com.apple.sysmond.client.

Stackshot & microstackshots

Stackshotting ni mbinu inayotumika kukamata hali ya michakato, ikiwa ni pamoja na mstari wa wito wa nyuzi zote zinazoendesha. Hii ni muhimu hasa kwa kudebugi, uchambuzi wa utendaji, na kuelewa tabia ya mfumo wakati fulani maalum. Kwenye iOS na macOS, stackshotting inaweza kufanywa kwa kutumia zana na njia kadhaa kama vile zana sample na spindump.

Sysdiagnose

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

Inapaswa kutekelezwa kama mizizi na daemon /usr/libexec/sysdiagnosed ina ruhusa za kuvutia sana kama vile 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 nyaraka za zamani katika /var/rmp

  • com.apple.sysdiagnose.kernel.ipc: Bandari maalum 23 (kernel)

  • com.apple.sysdiagnose.service.xpc: Kiolesura cha mode ya mtumiaji kupitia darasa la Libsysdiagnose Obj-C. Vigezo vitatu vinaweza kupitishwa katika neno (compress, display, run)

Unified Logs

MacOS inazalisha magogo mengi ambayo yanaweza kuwa na manufaa sana wakati wa kukimbia programu jaribio kuelewa inachofanya.

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

Hopper

Kifungu cha Kushoto

Kwenye kifungu cha kushoto cha hopper inawezekana kuona alama (Labels) za binary, orodha ya taratibu na kazi (Proc) na herufi (Str). Hizi si herufi zote lakini zile zilizofafanuliwa katika sehemu kadhaa za faili ya Mac-O (kama vile cstring au objc_methname).

Kifungu cha Kati

Kwenye kifungu cha kati unaweza kuona msimbo uliopanguliwa. Na unaweza kuona kama panguliwa, kama grafu, kama kupasuliwa na kama binary kwa kubofya kwenye ishara husika:

Kwa kubofya kulia kwenye kitu cha msimbo unaweza kuona marejeo kwa/kutoka kwa kitu hicho au hata kubadilisha jina lake (hii haifanyi kazi katika pseudokodi iliyopasuliwa):

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

Kifungu cha Kulia

Kwenye kifungu cha kulia unaweza kuona habari za kuvutia kama historia ya urambazaji (ili ujue jinsi ulivyofika kwenye hali ya sasa), grafu ya wito ambapo unaweza kuona kazi zote zinazopiga simu kazi hii na kazi zote ambazo kazi hii inapiga simu, na habari za mazingira ya ndani.

dtrace

Inaruhusu watumiaji kupata ufikiaji kwenye programu kwa kiwango cha chini sana na hutoa njia kwa watumiaji kufuatilia programu na hata kubadilisha mtiririko wao wa utekelezaji. Dtrace hutumia probes ambazo zinawekwa kote kwenye kernel na ziko katika maeneo kama mwanzo na mwisho wa wito wa mfumo.

DTrace hutumia kazi ya dtrace_probe_create kuunda kipimo kwa kila wito wa mfumo. Probes hizi zinaweza kufyatuliwa kwenye nukta ya kuingia na kutoka kwa kila wito wa mfumo. Mwingiliano na DTrace hufanyika kupitia /dev/dtrace ambayo inapatikana kwa mtumiaji wa mizizi pekee.

Ili kuwezesha Dtrace bila kulemaza kabisa ulinzi wa SIP unaweza kutekeleza kwenye hali ya kupona: csrutil enable --without dtrace

Unaweza pia kudtrace au kudtruss binaries ambazo umekusanya.

Probes zilizopo za dtrace zinaweza kupatikana na:

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 kichunguzi linajumuisha sehemu nne: mtoa huduma, moduli, kazi, na jina (fbt:mach_kernel:ptrace:entry). Ikiwa haujataja sehemu fulani ya jina, Dtrace itatumia sehemu hiyo kama kichujio.

Ili kusanidi DTrace kuamsha vichunguzi na kutaja ni hatua gani za kutekeleza wanapochomwa, tutahitaji kutumia lugha ya D.

Maelezo zaidi na mifano zaidi inaweza kupatikana katika https://illumos.org/books/dtrace/chp-intro.html

Mifano

Chapa man -k dtrace ili kuorodhesha skrini za DTrace zilizopo. Mfano: sudo dtruss -n binary

  • Katika mstari

#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • skript

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

Hii ni kituo cha kufuatilia kernel. Miezi iliyodhibitishwa inaweza kupatikana katika /usr/share/misc/trace.codes.

Vyombo kama latency, sc_usage, fs_usage na trace hutumia hii ndani.

Kuongeza na kdebug sysctl hutumiwa kupitia kern.kdebug namespace na MIBs za kutumia zinaweza kupatikana katika sys/sysctl.h zikiwa na kazi zilizoanzishwa katika bsd/kern/kdebug.c.

Kuwasiliana na kdebug na mteja wa desturi hatua hizi kawaida hufuatwa:

  • Ondoa mipangilio iliyopo na KERN_KDSETREMOVE

  • Weka ufuatiliaji na KERN_KDSETBUF na KERN_KDSETUP

  • Tumia KERN_KDGETBUF kupata idadi ya vipengele vya buffer

  • Pata mteja wako kutoka kwenye ufuatiliaji na KERN_KDPINDEX

  • Wezesha ufuatiliaji na KERN_KDENABLE

  • Soma buffer kwa kuita KERN_KDREADTR

  • Kulinganisha kila mchakato na mchakato wake kwa kuita KERN_KDTHRMAP.

Ili kupata habari hii inawezekana kutumia zana ya Apple trace au zana ya desturi kDebugView (kdv).

Tafadhali kumbuka kuwa Kdebug inapatikana kwa mteja 1 kwa wakati mmoja. Kwa hivyo zana moja tu yenye nguvu ya k-debug inaweza kutekelezwa kwa wakati mmoja.

ktrace

API za ktrace_* zinatoka kwa libktrace.dylib ambayo inafunika zile za Kdebug. Kisha, mteja anaweza tu kuita ktrace_session_create na ktrace_events_[single/class] kuweka maingiliano kwenye nambari maalum na kisha kuanza na ktrace_start.

Unaweza kutumia hii hata na SIP imewashwa

Unaweza kutumia kama wateja zana ya ktrace:

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

Au tailspin.

kperf

Hii hutumika kufanya uchambuzi wa kiwango cha kernel na imejengwa kwa kutumia simu za Kdebug.

Kimsingi, kivinjari cha jumla kernel_debug_active huchunguzwa na ikisetiwa huita kperf_kdebug_handler na simu ya Kdebug na anwani ya fremu ya kernel inayopiga simu. Ikiwa simu ya Kdebug inalingana na moja iliyochaguliwa inapata "vitendo" vilivyowekwa kama ramani (angalia osfmk/kperf/action.h kwa chaguo).

Kperf ina jedwali la MIB la sysctl pia: (kama mzizi) sysctl kperf. Nambari hizi zinaweza kupatikana katika osfmk/kperf/kperfbsd.c.

Zaidi ya hayo, sehemu ya Kperfs inapatikana katika kpc, ambayo hutoa habari kuhusu vigezo vya utendaji wa mashine.

ProcessMonitor

ProcessMonitor ni chombo cha kufuatilia vitendo vinavyohusiana na mchakato ambavyo mchakato unafanya (kwa mfano, kufuatilia mchakato mpya ambao mchakato unazalisha).

SpriteTree

SpriteTree ni chombo cha kuchapisha mahusiano kati ya michakato. Unahitaji kufuatilia mac yako na amri kama sudo eslogger fork exec rename create > cap.json (terminal inayoanzisha hii inahitaji FDA). Kisha unaweza kupakia json katika chombo hiki kuona mahusiano yote:

FileMonitor

FileMonitor inaruhusu kufuatilia matukio ya faili (kama vile uundaji, marekebisho, na kufutwa) ikitoa habari ya kina kuhusu matukio hayo.

Crescendo

Crescendo ni chombo cha GUI kinachofanana na watumiaji wa Windows wanaweza kufahamu kutoka kwa Procmon ya Microsoft Sysinternal. Chombo hiki kuruhusu kuanza na kuacha kurekodi aina mbalimbali za matukio, kuruhusu kuchuja matukio haya kwa makundi kama vile faili, mchakato, mtandao, n.k., na hutoa utendaji wa kuhifadhi matukio yaliyorekodiwa kwa muundo wa json.

Apple Instruments

Apple Instruments ni sehemu ya zana za Developer za Xcode - hutumika kufuatilia utendaji wa programu, kutambua uvujaji wa kumbukumbu na kufuatilia shughuli za mfumo wa faili.

fs_usage

Inaruhusu kufuata vitendo vilivyofanywa na michakato:

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

Mchunguzi wa Kazi

Mchunguzi wa Kazi ni muhimu kuona maktaba zinazotumiwa na faili, faili inazotumia, na muunganisho wa mtandao. Pia huchunguza michakato ya faili dhidi ya virustotal na kuonyesha habari kuhusu faili hiyo.

PT_DENY_ATTACH

Katika chapisho hili la blogi unaweza kupata mfano kuhusu jinsi ya kudebugi daemon inayotumika ambayo ilikuwa inatumia PT_DENY_ATTACH kuzuia kudebugi hata kama SIP ilikuwa imelemazwa.

lldb

lldb ni chombo cha kweli kwa kudebugi faili za macOS.

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

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

settings set target.x86-disassembly-flavor intel

Ndani ya lldb, dumpisha mchakato kwa kutumia process save-core

(lldb) Amri

Maelezo

run (r)

Kuanza utekelezaji, ambao utaendelea bila kikomo mpaka kivinjari kikome au mchakato ukome.

continue (c)

Kuendelea na utekelezaji wa mchakato uliopo kwenye uchunguzi.

nexti (n / ni)

Kutekeleza maagizo ijayo. Amri hii itaruka wito wa kazi.

stepi (s / si)

Kutekeleza maagizo ijayo. Tofauti na amri ya nexti, amri hii itaingia kwenye wito wa kazi.

finish (f)

Kutekeleza maagizo mengine kwenye kazi ya sasa ("frame") kurudi na kusimamisha.

control + c

Kusitisha utekelezaji. Ikiwa mchakato umekuwa ukitekelezwa (r) au kuendelea (c), hii itasababisha mchakato kusimama ...popote ulipo kwenye utekelezaji.

breakpoint (b)

b main #Wito wowote wa kazi unaoitwa main

b <binname>`main #Kazi kuu ya bin

b set -n main --shlib <lib_name> #Kazi kuu ya bin iliyotajwa

b -[NSDictionary objectForKey:]

b -a 0x0000000100004bd9

br l #Orodha ya vituo vya kuvunja

br e/dis <num> #Wezesha/lemaza kituo cha kuvunja

breakpoint delete <num>

help

help breakpoint #Pata msaada wa amri ya kuvunja

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 <reg/memory address>

Onyesha kumbukumbu kama herufi zilizomalizika na sifuri.

x/i <reg/memory address>

Onyesha kumbukumbu kama maagizo ya mkusanyiko.

x/b <reg/memory address>

Onyesha kumbukumbu kama baiti.

print object (po)

Hii itachapisha kitu kinachotajwa na paramu

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Taarifa kwamba APIs au njia za Apple za Objective-C kwa kawaida hurejesha vitu, na hivyo inapaswa kuonyeshwa kupitia amri ya "print object" (po). Ikiwa po haizalishi matokeo yanayofaa tumia x/b

memory

kumbukumbu soma 0x000.... kumbukumbu soma $x0+0xf2a kumbukumbu andika 0x100600000 -s 4 0x41414141 #Andika AAAA kwenye anwani hiyo kumbukumbu andika -f s $rip+0x11f+7 "AAAA" #Andika AAAA kwenye anwani

disassembly

dis #Disas kazi ya sasa

dis -n <funcname> #Disas kazi

dis -n <funcname> -b <basename> #Disas kazi dis -c 6 #Disas mistari 6 dis -c 0x100003764 -e 0x100003768 # Kutoka anwani moja hadi nyingine dis -p -c 4 # Anza kwenye anwani ya sasa ya kuchambua

parray

parray 3 (char **)$x1 # Angalia safu ya 3 katika x1 reg

Unapoitisha objc_sendMsg function, rsi register inashikilia jina la njia kama herufi zilizomalizika ("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:"

Uchambuzi wa Kielelezo

Uchunguzi wa VM

  • Amri sysctl hw.model inarudisha "Mac" wakati mwenyeji ni MacOS lakini kitu tofauti wakati ni VM.

  • Kwa kucheza na thamani za hw.logicalcpu na hw.physicalcpu baadhi ya programu hasidi jaribu kugundua ikiwa ni VM.

  • Baadhi ya programu hasidi pia zinaweza kugundua ikiwa mashine ni VMware kulingana na anwani ya MAC (00:50:56).

  • Pia inawezekana kugundua ikiwa mchakato unachunguzwa kwa kutumia msimbo rahisi kama huu:

  • 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 kivinjari kutua na kufuatilia.

  • Unaweza kuchunguza ikiwa sysctl au ptrace kazi inaingizwa (lakini programu hasidi inaweza kuiongeza kwa kudhurika)

  • Kama ilivyobainishwa katika andiko hili, “Kushinda Mbinu za Kuzuia Uchunguzi wa Kielelezo: toleo la macOS la ptrace” : “Ujumbe Mchakato # ulitoka na hali = 45 (0x0000002d) kawaida ni ishara wazi kwamba lengo la uchunguzi linatumia PT_DENY_ATTACH

Kuvuja Kwa Msingi

Kuvuja kwa msingi hufanyika ikiwa:

  • kern.coredump sysctl imewekwa kama 1 (kwa chaguo-msingi)

  • Ikiwa mchakato haukuwa suid/sgid au kern.sugid_coredump ni 1 (kwa chaguo-msingi ni 0)

  • Kikomo cha AS_CORE kuruhusu operesheni. Inawezekana kuzuia uundaji wa kuvuja kwa msingi kwa kuita ulimit -c 0 na kuiruhusu tena kwa ulimit -c isiyokuwa na kikomo.

Katika kesi hizo, kuvuja kwa msingi huzalishwa kulingana na kern.corefile sysctl na kuhifadhiwa kawaida katika /cores/core/.%P.

Fuzzing

ReportCrash anauchambua mchakato unaovuja na kuokoa ripoti ya kuvuja kwa diski. Ripoti ya kuvuja ina habari ambazo zinaweza kusaidia mwandishi wa programu kutambua sababu ya kuvuja. Kwa maombi na michakato mingine inayoendesha katika muktadha wa uzinduzi wa mtumiaji, ReportCrash inaendeshwa kama LaunchAgent na kuokoa ripoti za kuvuja kwenye ~/Library/Logs/DiagnosticReports/ ya mtumiaji Kwa daemons, michakato mingine inayoendesha katika muktadha wa uzinduzi wa mfumo na michakato mingine yenye mamlaka, ReportCrash inaendeshwa kama LaunchDaemon na kuokoa ripoti za kuvuja kwenye /Library/Logs/DiagnosticReports ya mfumo

Ikiwa una wasiwasi kuhusu ripoti za kuvuja zikitumwa kwa Apple unaweza kuzizima. Vinginevyo, ripoti za kuvuja zinaweza kuwa na manufaa kutambua jinsi server ilivyovuja.

#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

Kulala

Wakati wa kufanya fuzzing kwenye MacOS ni muhimu kuzuia Mac kulala:

Kukatisha SSH

Ikiwa unafanya fuzzing kupitia uhusiano wa SSH ni muhimu kuhakikisha kikao hakitakwenda siku nzima. Kwa hivyo badilisha faili ya sshd_config na:

  • TCPKeepAlive Ndiyo

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

Wasindikaji wa Ndani

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

macOS File Extension & URL scheme app handlers

Kuhesabu Michakato ya Mtandao

Hii ni ya kuvutia kugundua michakato inayosimamia data ya mtandao:

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

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

Inafanya kazi kwa zana za CLI

Inafanya kazi "inavyopaswa" na zana za GUI za macOS. Tafadhali kumbuka kuwa baadhi ya programu za macOS zinahitaji mahitaji maalum kama majina ya faili ya kipekee, ugani sahihi, kusoma faili kutoka kwenye sanduku (~/Library/Containers/com.apple.Safari/Data)...

Baadhi ya mifano:

# 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

Maelezo Zaidi ya Fuzzing kwenye MacOS

Marejeo

WhiteIntel ni injini ya utaftaji inayotumia dark-web ambayo inatoa huduma za bure za kuangalia ikiwa kampuni au wateja wake wameathiriwa na malwares za kuiba.

Lengo kuu la WhiteIntel ni kupambana na utekaji wa akaunti na mashambulio ya ransomware yanayotokana na programu hasidi za kuiba taarifa.

Unaweza kutembelea tovuti yao na kujaribu injini yao bure kwa:

Support HackTricks

Last updated