macOS Apps - Inspecting, debugging and Fuzzing

Support HackTricks

Static Analysis

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

Μπορείτε να κατεβάσετε το disarm από εδώ.

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

Μπορείτε να κατεβάσετε το jtool2 εδώ ή να το εγκαταστήσετε με 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 έχει αποσυρθεί υπέρ του disarm

Codesign / ldid

Codesign μπορεί να βρεθεί σε macOS ενώ ldid μπορεί να βρεθεί σε 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 είναι ένα εργαλείο χρήσιμο για να επιθεωρήσετε τα .pkg αρχεία (εγκαταστάτες) και να δείτε τι περιέχουν πριν την εγκατάσταση. Αυτοί οι εγκαταστάτες έχουν preinstall και postinstall bash scripts που οι συγγραφείς κακόβουλου λογισμικού συνήθως εκμεταλλεύονται για να persist the malware.

hdiutil

Αυτό το εργαλείο επιτρέπει να mount τις εικόνες δίσκων της Apple (.dmg) για να τις επιθεωρήσετε πριν τρέξετε οτιδήποτε:

hdiutil attach ~/Downloads/Firefox\ 58.0.2.dmg

It will be mounted in /Volumes

Packed binaries

  • Έλεγχος για υψηλή εντροπία

  • Έλεγχος των συμβολοσειρών (αν δεν υπάρχει σχεδόν καμία κατανοητή συμβολοσειρά, είναι συμπιεσμένο)

  • Ο συμπιεστής UPX για MacOS δημιουργεί μια ενότητα που ονομάζεται "__XHDR"

Static Objective-C analysis

Metadata

Σημειώστε ότι τα προγράμματα που έχουν γραφτεί σε Objective-C διατηρούν τις δηλώσεις κλάσης τους όταν μεταγλωττίζονται σε Mach-O binaries. Τέτοιες δηλώσεις κλάσης περιλαμβάνουν το όνομα και τον τύπο του:

  • Οι διεπαφές που ορίζονται

  • Οι μέθοδοι διεπαφής

  • Οι μεταβλητές στιγμής διεπαφής

  • Τα πρωτόκολλα που ορίζονται

Σημειώστε ότι αυτά τα ονόματα θα μπορούσαν να είναι κρυπτογραφημένα για να καταστήσουν την αναστροφή του δυαδικού πιο δύσκολη.

Function calling

Όταν καλείται μια συνάρτηση σε ένα δυαδικό που χρησιμοποιεί Objective-C, ο μεταγλωττισμένος κώδικας αντί να καλεί αυτή τη συνάρτηση, θα καλέσει objc_msgSend. Αυτό θα καλέσει τη τελική συνάρτηση:

Οι παράμετροι που αναμένει αυτή η συνάρτηση είναι:

  • Η πρώτη παράμετρος (self) είναι "ένας δείκτης που δείχνει στην περίπτωση της κλάσης που θα λάβει το μήνυμα". Ή πιο απλά, είναι το αντικείμενο πάνω στο οποίο καλείται η μέθοδος. Αν η μέθοδος είναι μέθοδος κλάσης, αυτό θα είναι μια περίπτωση του αντικειμένου κλάσης (ως σύνολο), ενώ για μια μέθοδο στιγμής, το self θα δείχνει σε μια δημιουργημένη περίπτωση της κλάσης ως αντικείμενο.

  • Η δεύτερη παράμετρος, (op), είναι "ο επιλεγέας της μεθόδου που χειρίζεται το μήνυμα". Και πάλι, πιο απλά, αυτό είναι απλώς το όνομα της μεθόδου.

  • Οι υπόλοιπες παράμετροι είναι οποιεσδήποτε τιμές απαιτούνται από τη μέθοδο (op).

Δείτε πώς να πάρετε αυτές τις πληροφορίες εύκολα με lldb σε ARM64 σε αυτή τη σελίδα:

Introduction to ARM64v8

x64:

Argument

Register

(for) objc_msgSend

1st argument

rdi

self: object that the method is being invoked upon

2nd argument

rsi

op: name of the method

3rd argument

rdx

1st argument to the method

4th argument

rcx

2nd argument to the method

5th argument

r8

3rd argument to the method

6th argument

r9

4th argument to the method

7th+ argument

rsp+ (on the stack)

5th+ argument to the method

Dump ObjectiveC metadata

Dynadump

Dynadump είναι ένα εργαλείο για την εξαγωγή κλάσεων από Objective-C binaries. Το github καθορίζει dylibs αλλά αυτό λειτουργεί επίσης με εκτελέσιμα.

./dynadump dump /path/to/bin

Στη στιγμή που γράφεται αυτό, αυτό είναι αυτή τη στιγμή η καλύτερη επιλογή.

Κανονικά εργαλεία

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

class-dump

class-dump είναι το αρχικό εργαλείο που δημιουργεί δηλώσεις για τις κλάσεις, κατηγορίες και πρωτόκολλα σε κώδικα μορφής ObjetiveC.

Είναι παλιό και δεν συντηρείται, οπότε πιθανότατα δεν θα λειτουργήσει σωστά.

ICDump

iCDump είναι ένα σύγχρονο και διαλειτουργικό εργαλείο απόρριψης κλάσεων Objective-C. Σε σύγκριση με τα υπάρχοντα εργαλεία, το iCDump μπορεί να εκτελείται ανεξάρτητα από το οικοσύστημα της Apple και εκθέτει Python bindings.

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

print(metadata.to_decl())

Στατική ανάλυση Swift

Με τα δυαδικά αρχεία Swift, καθώς υπάρχει συμβατότητα με το Objective-C, μερικές φορές μπορείτε να εξάγετε δηλώσεις χρησιμοποιώντας class-dump αλλά όχι πάντα.

Με τις εντολές jtool -l ή otool -l είναι δυνατόν να βρείτε πολλές ενότητες που ξεκινούν με το πρόθεμα __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
[...]

Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το πληροφορίες που αποθηκεύονται σε αυτήν την ενότητα σε αυτήν την ανάρτηση ιστολογίου.

Επιπλέον, τα Swift binaries μπορεί να έχουν σύμβολα (για παράδειγμα, οι βιβλιοθήκες χρειάζονται να αποθηκεύουν σύμβολα ώστε οι συναρτήσεις τους να μπορούν να καλούνται). Τα σύμβολα συνήθως έχουν τις πληροφορίες σχετικά με το όνομα της συνάρτησης και τα attr με άσχημο τρόπο, οπότε είναι πολύ χρήσιμα και υπάρχουν "demanglers" που μπορούν να πάρουν το αρχικό όνομα:

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

# Swift cli
swift demangle

Δυναμική Ανάλυση

Σημειώστε ότι για να αποσφαλματώσετε δυαδικά αρχεία, η SIP πρέπει να είναι απενεργοποιημένη (csrutil disable ή csrutil enable --without debug) ή να αντιγράψετε τα δυαδικά αρχεία σε έναν προσωρινό φάκελο και να αφαιρέσετε την υπογραφή με codesign --remove-signature <binary-path> ή να επιτρέψετε την αποσφαλμάτωση του δυαδικού αρχείου (μπορείτε να χρησιμοποιήσετε αυτό το σενάριο)

Σημειώστε ότι για να εργαστείτε με δυαδικά αρχεία συστήματος, (όπως το cloudconfigurationd) στο macOS, η SIP πρέπει να είναι απενεργοποιημένη (απλώς η αφαίρεση της υπογραφής δεν θα λειτουργήσει).

APIs

Το macOS εκθέτει μερικά ενδιαφέροντα APIs που παρέχουν πληροφορίες σχετικά με τις διαδικασίες:

  • proc_info: Αυτό είναι το κύριο που παρέχει πολλές πληροφορίες για κάθε διαδικασία. Πρέπει να είστε root για να αποκτήσετε πληροφορίες για άλλες διαδικασίες, αλλά δεν χρειάζεστε ειδικά δικαιώματα ή mach ports.

  • libsysmon.dylib: Επιτρέπει την απόκτηση πληροφοριών σχετικά με διαδικασίες μέσω εκτεθειμένων συναρτήσεων XPC, ωστόσο, απαιτείται να έχετε το δικαίωμα com.apple.sysmond.client.

Stackshot & microstackshots

Stackshotting είναι μια τεχνική που χρησιμοποιείται για την καταγραφή της κατάστασης των διαδικασιών, συμπεριλαμβανομένων των στοίβων κλήσεων όλων των εκτελούμενων νημάτων. Αυτό είναι ιδιαίτερα χρήσιμο για αποσφαλμάτωση, ανάλυση απόδοσης και κατανόηση της συμπεριφοράς του συστήματος σε μια συγκεκριμένη χρονική στιγμή. Στο iOS και το macOS, το stackshotting μπορεί να πραγματοποιηθεί χρησιμοποιώντας διάφορα εργαλεία και μεθόδους όπως τα εργαλεία sample και spindump.

Sysdiagnose

Αυτό το εργαλείο (/usr/bini/ysdiagnose) συλλέγει βασικά πολλές πληροφορίες από τον υπολογιστή σας εκτελώντας δεκάδες διαφορετικές εντολές όπως ps, zprint...

Πρέπει να εκτελείται ως root και η διεργασία /usr/libexec/sysdiagnosed έχει πολύ ενδιαφέροντα δικαιώματα όπως com.apple.system-task-ports και get-task-allow.

Η plist του βρίσκεται στο /System/Library/LaunchDaemons/com.apple.sysdiagnose.plist που δηλώνει 3 MachServices:

  • com.apple.sysdiagnose.CacheDelete: Διαγράφει παλιές αρχειοθετήσεις στο /var/rmp

  • com.apple.sysdiagnose.kernel.ipc: Ειδική θύρα 23 (kernel)

  • com.apple.sysdiagnose.service.xpc: Διεπαφή χρήστη μέσω της κλάσης Libsysdiagnose Obj-C. Τρία επιχειρήματα σε ένα dict μπορούν να περαστούν (compress, display, run)

Ενοποιημένα Καταγραφικά

Το macOS παράγει πολλές καταγραφές που μπορεί να είναι πολύ χρήσιμες κατά την εκτέλεση μιας εφαρμογής προσπαθώντας να κατανοήσει τι κάνει.

Επιπλέον, υπάρχουν κάποιες καταγραφές που θα περιέχουν την ετικέτα <private> για να κρύψουν κάποιες χρήστη ή υπολογιστή αναγνωρίσιμες πληροφορίες. Ωστόσο, είναι δυνατό να εγκαταστήσετε ένα πιστοποιητικό για να αποκαλύψετε αυτές τις πληροφορίες. Ακολουθήστε τις εξηγήσεις από εδώ.

Hopper

Αριστερό πάνελ

Στο αριστερό πάνελ του Hopper είναι δυνατό να δείτε τα σύμβολα (Labels) του δυαδικού αρχείου, τη λίστα διαδικασιών και συναρτήσεων (Proc) και τις συμβολοσειρές (Str). Αυτές δεν είναι όλες οι συμβολοσειρές αλλά αυτές που ορίζονται σε διάφορα μέρη του αρχείου Mac-O (όπως cstring ή objc_methname).

Μεσαίο πάνελ

Στο μεσαίο πάνελ μπορείτε να δείτε τον αποσυναρμολογημένο κώδικα. Και μπορείτε να τον δείτε σε ακατέργαστο αποσυναρμολόγηση, ως γράφημα, ως αποκωδικοποιημένο και ως δυαδικό κάνοντας κλικ στο αντίστοιχο εικονίδιο:

Κάνοντας δεξί κλικ σε ένα αντικείμενο κώδικα μπορείτε να δείτε αναφορές προς/από αυτό το αντικείμενο ή ακόμα και να αλλάξετε το όνομά του (αυτό δεν λειτουργεί σε αποκωδικοποιημένο ψευδοκώδικα):

Επιπλέον, στο κάτω μέρος του μεσαίου πάνελ μπορείτε να γράψετε εντολές python.

Δεξί πάνελ

Στο δεξί πάνελ μπορείτε να δείτε ενδιαφέρουσες πληροφορίες όπως το ιστορικό πλοήγησης (έτσι ξέρετε πώς φτάσατε στην τρέχουσα κατάσταση), το γράφημα κλήσεων όπου μπορείτε να δείτε όλες τις συναρτήσεις που καλούν αυτή τη συνάρτηση και όλες τις συναρτήσεις που καλεί αυτή η συνάρτηση, και πληροφορίες για τοπικές μεταβλητές.

dtrace

Επιτρέπει στους χρήστες πρόσβαση σε εφαρμογές σε εξαιρετικά χαμηλό επίπεδο και παρέχει έναν τρόπο για τους χρήστες να ιχνηλατούν προγράμματα και ακόμη και να αλλάζουν τη ροή εκτέλεσής τους. Το Dtrace χρησιμοποιεί probes που είναι τοποθετημένα σε όλο τον πυρήνα και βρίσκονται σε θέσεις όπως η αρχή και το τέλος των κλήσεων συστήματος.

Το DTrace χρησιμοποιεί τη συνάρτηση dtrace_probe_create για να δημιουργήσει ένα probe για κάθε κλήση συστήματος. Αυτά τα probes μπορούν να ενεργοποιηθούν στο σημείο εισόδου και εξόδου κάθε κλήσης συστήματος. Η αλληλεπίδραση με το DTrace συμβαίνει μέσω του /dev/dtrace που είναι διαθέσιμο μόνο για τον χρήστη root.

Για να ενεργοποιήσετε το Dtrace χωρίς να απενεργοποιήσετε πλήρως την προστασία SIP μπορείτε να εκτελέσετε σε λειτουργία ανάκτησης: csrutil enable --without dtrace

Μπορείτε επίσης να dtrace ή dtruss δυαδικά αρχεία που έχετε μεταγλωττίσει.

Οι διαθέσιμες probes του dtrace μπορούν να αποκτηθούν με:

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

Το όνομα της πρόβας αποτελείται από τέσσερα μέρη: τον πάροχο, το module, τη συνάρτηση και το όνομα (fbt:mach_kernel:ptrace:entry). Αν δεν καθορίσετε κάποιο μέρος του ονόματος, το Dtrace θα εφαρμόσει αυτό το μέρος ως wildcard.

Για να ρυθμίσουμε το DTrace να ενεργοποιεί τις πρόβες και να καθορίσουμε ποιες ενέργειες να εκτελούνται όταν ενεργοποιούνται, θα χρειαστεί να χρησιμοποιήσουμε τη γλώσσα D.

Μια πιο λεπτομερής εξήγηση και περισσότερα παραδείγματα μπορούν να βρεθούν στο https://illumos.org/books/dtrace/chp-intro.html

Παραδείγματα

Εκτελέστε man -k dtrace για να καταγράψετε τα διαθέσιμα σενάρια DTrace. Παράδειγμα: sudo dtruss -n binary

#Count the number of syscalls of each running process
sudo dtrace -n 'syscall:::entry {@[execname] = count()}'
  • σενάριο

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

Είναι μια εγκατάσταση παρακολούθησης πυρήνα. Οι τεκμηριωμένοι κωδικοί μπορούν να βρεθούν στο /usr/share/misc/trace.codes.

Εργαλεία όπως το latency, sc_usage, fs_usage και trace το χρησιμοποιούν εσωτερικά.

Για να αλληλεπιδράσετε με το kdebug, χρησιμοποιείται το sysctl πάνω από το namespace kern.kdebug και οι MIBs που πρέπει να χρησιμοποιηθούν μπορούν να βρεθούν στο sys/sysctl.h, έχοντας τις συναρτήσεις υλοποιημένες στο bsd/kern/kdebug.c.

Για να αλληλεπιδράσετε με το kdebug με έναν προσαρμοσμένο πελάτη, αυτά είναι συνήθως τα βήματα:

  • Αφαιρέστε τις υπάρχουσες ρυθμίσεις με KERN_KDSETREMOVE

  • Ρυθμίστε την παρακολούθηση με KERN_KDSETBUF και KERN_KDSETUP

  • Χρησιμοποιήστε KERN_KDGETBUF για να αποκτήσετε τον αριθμό των καταχωρήσεων του buffer

  • Αποκτήστε τον δικό σας πελάτη από την παρακολούθηση με KERN_KDPINDEX

  • Ενεργοποιήστε την παρακολούθηση με KERN_KDENABLE

  • Διαβάστε το buffer καλώντας KERN_KDREADTR

  • Για να αντιστοιχίσετε κάθε νήμα με τη διαδικασία του, καλέστε KERN_KDTHRMAP.

Για να αποκτήσετε αυτές τις πληροφορίες, είναι δυνατόν να χρησιμοποιήσετε το εργαλείο της Apple trace ή το προσαρμοσμένο εργαλείο kDebugView (kdv).

Σημειώστε ότι το Kdebug είναι διαθέσιμο μόνο για 1 πελάτη τη φορά. Έτσι, μόνο ένα εργαλείο που υποστηρίζεται από k-debug μπορεί να εκτελείται ταυτόχρονα.

ktrace

Οι APIs ktrace_* προέρχονται από το libktrace.dylib, το οποίο περιτυλίγει αυτά του Kdebug. Στη συνέχεια, ένας πελάτης μπορεί απλά να καλέσει ktrace_session_create και ktrace_events_[single/class] για να ορίσει callbacks σε συγκεκριμένους κωδικούς και στη συνέχεια να το ξεκινήσει με ktrace_start.

Μπορείτε να το χρησιμοποιήσετε ακόμη και με SIP ενεργοποιημένο

Μπορείτε να χρησιμοποιήσετε ως πελάτες το εργαλείο ktrace:

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

Or tailspin.

kperf

Αυτό χρησιμοποιείται για να γίνει προφίλ σε επίπεδο πυρήνα και είναι κατασκευασμένο χρησιμοποιώντας κλήσεις Kdebug.

Βασικά, ελέγχεται η παγκόσμια μεταβλητή kernel_debug_active και αν είναι ενεργοποιημένη καλεί τον kperf_kdebug_handler με τον κωδικό Kdebug και τη διεύθυνση του πλαισίου πυρήνα που καλεί. Αν ο κωδικός Kdebug ταιριάζει με έναν επιλεγμένο, αποκτά τις "ενέργειες" που έχουν ρυθμιστεί ως bitmap (ελέγξτε το osfmk/kperf/action.h για τις επιλογές).

Το kperf έχει επίσης έναν πίνακα MIB sysctl: (ως root) sysctl kperf. Αυτοί οι κωδικοί μπορούν να βρεθούν στο osfmk/kperf/kperfbsd.c.

Επιπλέον, ένα υποσύνολο της λειτουργικότητας του Kperf βρίσκεται στο kpc, το οποίο παρέχει πληροφορίες σχετικά με τους μετρητές απόδοσης της μηχανής.

ProcessMonitor

ProcessMonitor είναι ένα πολύ χρήσιμο εργαλείο για να ελέγξετε τις ενέργειες που σχετίζονται με τη διαδικασία που εκτελεί μια διαδικασία (για παράδειγμα, να παρακολουθήσετε ποιες νέες διαδικασίες δημιουργεί μια διαδικασία).

SpriteTree

SpriteTree είναι ένα εργαλείο που εκτυπώνει τις σχέσεις μεταξύ διαδικασιών. Πρέπει να παρακολουθήσετε το mac σας με μια εντολή όπως sudo eslogger fork exec rename create > cap.json (ο τερματικός που εκκινεί αυτό απαιτεί FDA). Και στη συνέχεια μπορείτε να φορτώσετε το json σε αυτό το εργαλείο για να δείτε όλες τις σχέσεις:

FileMonitor

FileMonitor επιτρέπει την παρακολούθηση γεγονότων αρχείων (όπως δημιουργία, τροποποιήσεις και διαγραφές) παρέχοντας λεπτομερείς πληροφορίες σχετικά με αυτά τα γεγονότα.

Crescendo

Crescendo είναι ένα εργαλείο GUI με την εμφάνιση και την αίσθηση που μπορεί να γνωρίζουν οι χρήστες Windows από το Procmon της Microsoft Sysinternal. Αυτό το εργαλείο επιτρέπει την καταγραφή διαφόρων τύπων γεγονότων να ξεκινά και να σταματά, επιτρέπει τη φιλτράρισή τους κατά κατηγορίες όπως αρχείο, διαδικασία, δίκτυο, κ.λπ., και παρέχει τη δυνατότητα αποθήκευσης των καταγεγραμμένων γεγονότων σε μορφή json.

Apple Instruments

Apple Instruments είναι μέρος των εργαλείων προγραμματιστών του Xcode – χρησιμοποιούνται για την παρακολούθηση της απόδοσης εφαρμογών, την αναγνώριση διαρροών μνήμης και την παρακολούθηση δραστηριότητας συστήματος αρχείων.

fs_usage

Επιτρέπει την παρακολούθηση ενεργειών που εκτελούνται από διαδικασίες:

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 είναι χρήσιμο για να δείτε τις βιβλιοθήκες που χρησιμοποιούνται από ένα δυαδικό αρχείο, τα αρχεία που χρησιμοποιεί και τις συνδέσεις δικτύου. Επίσης ελέγχει τις διαδικασίες του δυαδικού αρχείου σε σχέση με το virustotal και δείχνει πληροφορίες σχετικά με το δυαδικό αρχείο.

PT_DENY_ATTACH

Στο αυτό το blog post μπορείτε να βρείτε ένα παράδειγμα για το πώς να αποσφαλματώσετε έναν εκτελούμενο δαίμονα που χρησιμοποιεί PT_DENY_ATTACH για να αποτρέψει την αποσφαλμάτωση ακόμη και αν το SIP ήταν απενεργοποιημένο.

lldb

lldb είναι το de facto εργαλείο για αποσφαλμάτωση δυαδικών αρχείων macOS.

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

Μπορείτε να ορίσετε τη γεύση intel όταν χρησιμοποιείτε lldb δημιουργώντας ένα αρχείο με το όνομα .lldbinit στον φάκελο του σπιτιού σας με την εξής γραμμή:

settings set target.x86-disassembly-flavor intel

Μέσα στο lldb, εκτελέστε μια διαδικασία με process save-core

(lldb) Εντολή

Περιγραφή

run (r)

Ξεκινά την εκτέλεση, η οποία θα συνεχιστεί αδιάκοπα μέχρι να χτυπήσει ένα breakpoint ή να τερματιστεί η διαδικασία.

process launch --stop-at-entry

Ξεκινά την εκτέλεση σταματώντας στο σημείο εισόδου

continue (c)

Συνεχίζει την εκτέλεση της διαδικασίας που αποσφαλματώνεται.

nexti (n / ni)

Εκτελεί την επόμενη εντολή. Αυτή η εντολή θα παραλείψει τις κλήσεις συναρτήσεων.

stepi (s / si)

Εκτελεί την επόμενη εντολή. Σε αντίθεση με την εντολή nexti, αυτή η εντολή θα εισέλθει στις κλήσεις συναρτήσεων.

finish (f)

Εκτελεί τις υπόλοιπες εντολές στην τρέχουσα συνάρτηση (“frame”) και επιστρέφει και σταματά.

control + c

Παύει την εκτέλεση. Εάν η διαδικασία έχει εκτελεστεί (r) ή συνεχιστεί (c), αυτό θα προκαλέσει την παύση της διαδικασίας ...όπου κι αν εκτελείται αυτή τη στιγμή.

breakpoint (b)

b main #Οποιαδήποτε συνάρτηση ονομάζεται main

b <binname>`main #Κύρια συνάρτηση του bin

b set -n main --shlib <lib_name> #Κύρια συνάρτηση του υποδεικνυόμενου bin

breakpoint set -r '\[NSFileManager .*\]$' #Οποιαδήποτε μέθοδος NSFileManager

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

break set -r . -s libobjc.A.dylib # Σπάσιμο σε όλες τις συναρτήσεις αυτής της βιβλιοθήκης

b -a 0x0000000100004bd9

br l #Λίστα breakpoint

br e/dis <num> #Ενεργοποίηση/Απενεργοποίηση breakpoint

breakpoint delete <num>

help

help breakpoint #Λάβετε βοήθεια για την εντολή breakpoint

help memory write #Λάβετε βοήθεια για να γράψετε στη μνήμη

reg

reg read

reg read $rax

reg read $rax --format <format>

reg write $rip 0x100035cc0

x/s <reg/memory address>

Εμφανίζει τη μνήμη ως μια null-terminated συμβολοσειρά.

x/i <reg/memory address>

Εμφανίζει τη μνήμη ως εντολή assembly.

x/b <reg/memory address>

Εμφανίζει τη μνήμη ως byte.

print object (po)

Αυτό θα εκτυπώσει το αντικείμενο που αναφέρεται από την παράμετρο

po $raw

{

dnsChanger = {

"affiliate" = "";

"blacklist_dns" = ();

Σημειώστε ότι οι περισσότερες από τις APIs ή μεθόδους Objective-C της Apple επιστρέφουν αντικείμενα, και επομένως θα πρέπει να εμφανίζονται μέσω της εντολής “print object” (po). Εάν το po δεν παράγει μια χρήσιμη έξοδο, χρησιμοποιήστε x/b

memory

memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Γράψτε AAAA σε αυτή τη διεύθυνση memory write -f s $rip+0x11f+7 "AAAA" #Γράψτε AAAA στη διεύθυνση

disassembly

dis #Αποσυναρμολόγηση της τρέχουσας συνάρτησης

dis -n <funcname> #Αποσυναρμολόγηση της συνάρτησης

dis -n <funcname> -b <basename> #Αποσυναρμολόγηση της συνάρτησης dis -c 6 #Αποσυναρμολόγηση 6 γραμμών dis -c 0x100003764 -e 0x100003768 # Από μια προσθήκη μέχρι την άλλη dis -p -c 4 # Ξεκινήστε από τη τρέχουσα διεύθυνση αποσυναρμολόγησης

parray

parray 3 (char **)$x1 # Ελέγξτε τον πίνακα 3 στοιχείων στο x1 reg

image dump sections

Εκτυπώνει το χάρτη της μνήμης της τρέχουσας διαδικασίας

image dump symtab <library>

image dump symtab CoreNLP #Λάβετε τη διεύθυνση όλων των συμβόλων από το CoreNLP

Όταν καλείτε τη συνάρτηση objc_sendMsg, το rsi καταχωρητής περιέχει το όνομα της μεθόδου ως μια null-terminated (“C”) συμβολοσειρά. Για να εκτυπώσετε το όνομα μέσω του lldb κάντε:

(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:"

Αντι-Δυναμική Ανάλυση

Ανίχνευση VM

  • Η εντολή sysctl hw.model επιστρέφει "Mac" όταν ο φιλοξενούμενος είναι MacOS αλλά κάτι διαφορετικό όταν είναι VM.

  • Παίζοντας με τις τιμές των hw.logicalcpu και hw.physicalcpu ορισμένα κακόβουλα λογισμικά προσπαθούν να ανιχνεύσουν αν είναι VM.

  • Ορισμένα κακόβουλα λογισμικά μπορούν επίσης να ανιχνεύσουν αν η μηχανή είναι VMware με βάση τη διεύθυνση MAC (00:50:56).

  • Είναι επίσης δυνατό να βρείτε αν μια διαδικασία αποσφαλματώνεται με έναν απλό κώδικα όπως:

  • if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //η διαδικασία αποσφαλματώνεται }

  • Μπορεί επίσης να καλέσει την κλήση συστήματος ptrace με την σημαία PT_DENY_ATTACH. Αυτό αποτρέπει έναν αποσφαλματωτή από το να συνδεθεί και να παρακολουθήσει.

  • Μπορείτε να ελέγξετε αν η λειτουργία sysctl ή ptrace εισάγεται (αλλά το κακόβουλο λογισμικό θα μπορούσε να την εισάγει δυναμικά)

  • Όπως σημειώνεται σε αυτή τη γραφή, “Defeating Anti-Debug Techniques: macOS ptrace variants” : “Το μήνυμα Process # exited with status = 45 (0x0000002d) είναι συνήθως ένα προειδοποιητικό σημάδι ότι ο στόχος αποσφαλμάτωσης χρησιμοποιεί PT_DENY_ATTACH

Core Dumps

Τα core dumps δημιουργούνται αν:

  • kern.coredump sysctl είναι ρυθμισμένο σε 1 (κατά προεπιλογή)

  • Αν η διαδικασία δεν ήταν suid/sgid ή kern.sugid_coredump είναι 1 (κατά προεπιλογή είναι 0)

  • Το όριο AS_CORE επιτρέπει τη λειτουργία. Είναι δυνατό να καταστείλετε τη δημιουργία core dumps καλώντας ulimit -c 0 και να τις επανενεργοποιήσετε με ulimit -c unlimited.

Σε αυτές τις περιπτώσεις, το core dumps δημιουργείται σύμφωνα με το kern.corefile sysctl και αποθηκεύεται συνήθως στο /cores/core/.%P.

Fuzzing

Το ReportCrash αναλύει τις διαδικασίες που καταρρέουν και αποθηκεύει μια αναφορά σφάλματος στο δίσκο. Μια αναφορά σφάλματος περιέχει πληροφορίες που μπορούν να βοηθήσουν έναν προγραμματιστή να διαγνώσει την αιτία ενός σφάλματος. Για εφαρμογές και άλλες διαδικασίες που εκτελούνται στο πλαίσιο launchd ανά χρήστη, το ReportCrash εκτελείται ως LaunchAgent και αποθηκεύει τις αναφορές σφαλμάτων στους ~/Library/Logs/DiagnosticReports/ του χρήστη. Για δαίμονες, άλλες διαδικασίες που εκτελούνται στο πλαίσιο launchd του συστήματος και άλλες προνομιακές διαδικασίες, το ReportCrash εκτελείται ως LaunchDaemon και αποθηκεύει τις αναφορές σφαλμάτων στα /Library/Logs/DiagnosticReports του συστήματος.

Εάν ανησυχείτε για τις αναφορές σφαλμάτων που αποστέλλονται στην Apple, μπορείτε να τις απενεργοποιήσετε. Αν όχι, οι αναφορές σφαλμάτων μπορεί να είναι χρήσιμες για να καταλάβετε πώς κατέρρευσε ένας διακομιστής.

#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

Ύπνος

Κατά τη διάρκεια του fuzzing σε MacOS είναι σημαντικό να μην επιτρέπετε στον Mac να κοιμηθεί:

  • systemsetup -setsleep Never

  • pmset, Προτιμήσεις Συστήματος

Αποσύνδεση SSH

Εάν κάνετε fuzzing μέσω σύνδεσης SSH είναι σημαντικό να βεβαιωθείτε ότι η συνεδρία δεν θα αποσυνδεθεί. Έτσι, αλλάξτε το αρχείο sshd_config με:

  • TCPKeepAlive Yes

  • ClientAliveInterval 0

  • ClientAliveCountMax 0

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

Internal Handlers

Δείτε την παρακάτω σελίδα για να μάθετε πώς μπορείτε να βρείτε ποια εφαρμογή είναι υπεύθυνη για τη διαχείριση του καθορισμένου σχήματος ή πρωτοκόλλου:

macOS File Extension & URL scheme app handlers

Enumerating Network Processes

Αυτό είναι ενδιαφέρον για να βρείτε διεργασίες που διαχειρίζονται δεδομένα δικτύου:

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

Ή χρησιμοποιήστε netstat ή 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

Λειτουργεί για εργαλεία CLI

Λειτουργεί "απλά" με εργαλεία GUI macOS. Σημειώστε ότι ορισμένες εφαρμογές macOS έχουν συγκεκριμένες απαιτήσεις όπως μοναδικά ονόματα αρχείων, τη σωστή επέκταση, χρειάζεται να διαβάσουν τα αρχεία από το sandbox (~/Library/Containers/com.apple.Safari/Data)...

Ορισμένα παραδείγματα:

# 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

Περισσότερες Πληροφορίες Fuzzing MacOS

Αναφορές

Υποστήριξη HackTricks

Last updated