macOS Apps - Inspecting, debugging and Fuzzing

Ondersteun HackTricks

Statiese Analise

otool & objdump & nm

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

<div data-gb-custom-block data-tag="code" data-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
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

jtool is verouderd ten gunste van disarm

Codesign / ldid

Codesign kan in macOS gevind word terwyl ldid in 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-skrywers gewoonlik misbruik om te volhard in die malware.

hdiutil

Hierdie hulpmiddel laat jou toe om Apple skyfbeeldes (.dmg) lêers te monteer om hulle te inspekteer voordat jy enigiets uitvoer:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

It sal gemonteer word 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

Let daarop dat programme wat in Objective-C geskryf is behou hul klasverklarings 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:

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:

Introduction to ARM64v8

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+ (op die stapel)

5de+ argument aan die metode

Dump ObjectiveC metadata

Dynadump

Dynadump is 'n hulpmiddel om Objective-C binêre te klas-dump. 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 wat verklarings 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-binaries, aangesien daar Objective-C-ondersteuning 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
[...]

U kan verdere inligting oor die inligting wat in hierdie afdeling gestoor is in hierdie blogpos.

Boonop kan Swift-binaries simbole hê (byvoorbeeld biblioteke moet 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

Let daarop dat om binêre te debugeer, SIP moet gedeaktiveer word (csrutil disable of csrutil enable --without debug) of om die binêre na 'n tydelike gids te kopieer en die handtekening te verwyder met codesign --remove-signature <binary-path> of om die debuggings van die binêre toe te laat (jy kan hierdie skrip gebruik)

Let daarop dat om sisteembinêre 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 kry, 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 regte com.apple.sysmond.client te 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 debuggings, 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 tientalle verskillende opdragte soos ps, zprint...

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/rmp

  • com.apple.sysdiagnose.kernel.ipc: Spesiale poort 23 (kernel)

  • com.apple.sysdiagnose.service.xpc: Gebruikersmodus-koppelvlak deur Libsysdiagnose Obj-C klas. Drie argumente in 'n dict kan oorgedra word (compress, display, run)

Geünifiseerde 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 binêre, 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 gedissasembelde kode sien. En jy kan dit as 'n rauwe disassemble, as grafiek, as gedekodeer en as binêr sien deur op die onderskeie ikoon te klik:

Regsklik op 'n kode objek kan jy verwysings na/van daardie objek sien of selfs sy naam verander (dit werk nie in gedekodeerde pseudokode nie):

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 programmas 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.

Om Dtrace in te skakel sonder om SIP-beskerming heeltemal te deaktiveer, kan jy in herstelmodus uitvoer: csrutil enable --without dtrace

Jy kan ook dtrace of dtruss binêre 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 kommunikeer 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. So slegs een k-debug aangedrewe gereedskap kan 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 nut ktrace as kliënte gebruik:

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

Or tailspin.

kperf

Dit word gebruik om 'n kernvlak-profilerings te doen en dit is gebou met behulp van Kdebug aanroepings.

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 substel 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 dit begin het die nodige FDA). En dan kan jy die json in hierdie hulpmiddel laai om al die verhoudings te sien:

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, geheue lekkasies te identifiseer en lêerstelselsaktiwiteit te volg.

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

U kan die intel-smaak instel wanneer u lldb gebruik deur 'n lêer genaamd .lldbinit in u tuisgids te skep met die volgende lyn:

settings set target.x86-disassembly-flavor intel

Binne lldb, dump 'n proses met process save-core

(lldb) Opdrag

Besonderhede

run (r)

Begin uitvoering, wat sonder onderbreking sal voortgaan totdat 'n breekpunt bereik word of die proses beëindig word.

process launch --stop-at-entry

Begin uitvoering wat by die toegangspunt 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, keer terug en stop.

control + c

Pauzeer uitvoering. As die proses gedraai (r) of voortgegaan (c) is, sal dit die proses laat stop ... waar dit ook al tans uitvoer.

breakpoint (b)

b main #Enige funksie genoem main

b <binname>`main #Hoof funksie van die bin

b set -n main --shlib <lib_name> #Hoof funksie van die aangeduide bin

breakpoint set -r '\[NSFileManager .*\]$' #Enige NSFileManager metode

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

break set -r . -s libobjc.A.dylib # Breek in alle funksies van daardie biblioteek

b -a 0x0000000100004bd9

br l #Breekpunt lys

br e/dis <num> #Aktiveer/Deaktiveer breekpunt

breekpunt verwyder <num>

help

help breekpunt #Kry hulp met breekpunt opdrag

help geheue skryf #Kry hulp om in die geheue te skryf

reg

reg lees

reg lees $rax

reg lees $rax --format <formaat>

reg skryf $rip 0x100035cc0

x/s <reg/geheue adres>

Vertoon die geheue as 'n null-beëindigde string.

x/i <reg/geheue adres>

Vertoon die geheue as assembly instruksie.

x/b <reg/geheue adres>

Vertoon die geheue as byte.

print object (po)

Dit sal die objek wat deur die param verwys word druk

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Let daarop dat die meeste van Apple se Objective-C API's of metodes objekte teruggee, en dus via die “print object” (po) opdrag vertoon moet word. As po nie 'n betekenisvolle uitvoer lewer nie, gebruik x/b

geheue

geheue lees 0x000.... geheue lees $x0+0xf2a geheue skryf 0x100600000 -s 4 0x41414141 #Skryf AAAA in daardie adres geheue skryf -f s $rip+0x11f+7 "AAAA" #Skryf AAAA in die addr

disassembly

dis #Disas huidige funksie

dis -n <funcname> #Disas funksie

dis -n <funcname> -b <basename> #Disas funksie dis -c 6 #Disas 6 lyne dis -c 0x100003764 -e 0x100003768 # Van een add tot die ander dis -p -c 4 # Begin in huidige adres disassemble

parray

parray 3 (char **)$x1 # Kontroleer array van 3 komponente in x1 reg

image dump sections

Druk kaart van die huidige proses geheue

image dump symtab <library>

image dump symtab CoreNLP #Kry die adres van al die simbole van CoreNLP

Wanneer die objc_sendMsg funksie aangeroep word, hou die rsi register die naam van die metode as 'n null-beëindigde (“C”) string. Om die naam via lldb te druk, doen:

(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-Dinamiese Analise

VM opsporing

  • Die opdrag sysctl hw.model gee "Mac" terug wanneer die gasheer 'n MacOS is, maar iets anders wanneer dit 'n VM is.

  • Deur met die waardes van hw.logicalcpu en hw.physicalcpu te speel, probeer sommige malware om te detecteer of dit 'n VM is.

  • Sommige malware kan ook opspoor of die masjien VMware gebaseer is op die MAC adres (00:50:56).

  • Dit is ook moontlik om te vind of 'n proses gedebug word met 'n eenvoudige kode soos:

  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proses word gedebug }

  • Dit kan ook die ptrace stelselskakel met die PT_DENY_ATTACH vlag aanroep. Dit verhoed dat 'n debugger aanheg en opspoor.

  • Jy kan nagaan of die sysctl of ptrace funksie geïmporteer word (maar die malware kan dit dinamies invoer)

  • Soos opgemerk in hierdie skrywe, “Defeating Anti-Debug Techniques: macOS ptrace variants” : “Die boodskap Proses # het met status = 45 (0x0000002d) verlaat, is gewoonlik 'n duidelike teken dat die debug-teiken PT_DENY_ATTACH gebruik

Kern Dumps

Kern dumps word geskep as:

  • kern.coredump sysctl is op 1 gestel (per standaard)

  • As die proses nie suid/sgid was nie of kern.sugid_coredump is 1 (per standaard is 0)

  • Die AS_CORE limiet laat die operasie toe. Dit is moontlik om die skepping van kode dumps te onderdruk deur ulimit -c 0 aan te roep en dit weer in te skakel met ulimit -c unlimited.

In daardie gevalle word die kern dumps gegenereer volgens kern.corefile sysctl en gewoonlik gestoor in /cores/core/.%P.

Fuzzing

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. Vir toepassings en ander prosesse wat in die per-gebruiker launchd konteks loop, loop ReportCrash as 'n LaunchAgent en stoor neergestorte verslae in die gebruiker se ~/Library/Logs/DiagnosticReports/ Vir daemons, ander prosesse wat in die stelsel launchd konteks loop en ander bevoorregte prosesse, loop ReportCrash as 'n LaunchDaemon en stoor neergestorte verslae in die stelsel se /Library/Logs/DiagnosticReports

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.

#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

Slaap

Terwyl jy fuzz in 'n MacOS, is dit belangrik om te verhoed dat die Mac slaap:

SSH Ontkoppeling

As jy via 'n SSH-verbinding fuzz, is dit belangrik om te verseker dat die sessie nie gaan doodgaan nie. So verander die sshd_config-lêer met:

  • TCPKeepAlive Ja

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

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

Interne Hanteerders

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

Opname van Netwerkprosesse

Dit is interessant om prosesse te vind wat netwerkdata bestuur:

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

Of gebruik netstat of 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

Werk vir CLI gereedskap

Dit "werk net" met macOS GUI gereedskap. Let daarop dat sommige macOS toepassings spesifieke vereistes het soos unieke lêernamen, die regte uitbreiding, en dat dit die lêers uit die sandbox (~/Library/Containers/com.apple.Safari/Data) moet lees...

Sommige voorbeelde:

# 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

Meer Fuzzing MacOS Inligting

Verwysings

Ondersteun HackTricks

Last updated