macOS Apps - Inspecting, debugging and Fuzzing
WhiteIntel ist eine von Dark Web angetriebene Suchmaschine, die kostenlose Funktionen bietet, um zu überprüfen, ob ein Unternehmen oder seine Kunden von Stealer-Malwaren kompromittiert wurden.
Das Hauptziel von WhiteIntel ist es, Kontoübernahmen und Ransomware-Angriffe aufgrund von informationsstehlender Malware zu bekämpfen.
Sie können ihre Website besuchen und ihren Motor kostenlos ausprobieren unter:
Statische Analyse
otool
objdump
jtool2
Das Tool kann als Ersatz für codesign, otool und objdump verwendet werden und bietet einige zusätzliche Funktionen. Laden Sie es hier herunter oder installieren Sie es mit brew
.
Codesign / ldid
Codesign
kann in macOS gefunden werden, während ldid
in iOS gefunden werden kann.
SuspiciousPackage
SuspiciousPackage ist ein nützliches Tool zum Inspektion von .pkg-Dateien (Installationsprogramme) und zum Anzeigen des Inhalts, bevor sie installiert werden.
Diese Installationsprogramme enthalten preinstall
- und postinstall
-Bash-Skripte, die Malware-Autoren normalerweise missbrauchen, um die Malware dauerhaft zu machen.
hdiutil
Dieses Tool ermöglicht das Mounten von Apple-Disk-Images (.dmg-Dateien), um sie vor der Ausführung zu inspizieren:
Es wird in /Volumes
eingehängt.
Objective-C
Metadaten
Bitte beachten Sie, dass Programme, die in Objective-C geschrieben sind, ihre Klassendeklarationen beibehalten, wenn sie in Mach-O-Binärdateien kompiliert werden. Zu diesen Klassendeklarationen gehören der Name und der Typ von:
Die Klasse
Die Klassenmethoden
Die Instanzvariablen der Klasse
Diese Informationen können mit class-dump abgerufen werden:
Funktionsaufruf
Wenn eine Funktion in einem Binärprogramm aufgerufen wird, das Objective-C verwendet, wird anstelle des Aufrufs dieser Funktion der kompilierte Code objc_msgSend
aufrufen. Dieser wird die endgültige Funktion aufrufen:
Die Parameter, die diese Funktion erwartet, sind:
Der erste Parameter (self) ist "ein Zeiger, der auf die Instanz der Klasse zeigt, die die Nachricht empfangen soll". Oder einfacher ausgedrückt, es handelt sich um das Objekt, auf dem die Methode aufgerufen wird. Wenn die Methode eine Klassenmethode ist, wird dies eine Instanz des Klassenobjekts (als Ganzes) sein, während für eine Instanzmethode self auf eine instanziierte Instanz der Klasse als Objekt verweisen wird.
Der zweite Parameter (op) ist "der Selektor der Methode, die die Nachricht verarbeitet". Noch einfacher ausgedrückt, handelt es sich einfach um den Namen der Methode.
Die verbleibenden Parameter sind alle Werte, die von der Methode benötigt werden (op).
Erfahren Sie, wie Sie diese Informationen einfach mit lldb
in ARM64 erhalten können, auf dieser Seite:
x64:
Argument | Register | (für) objc_msgSend |
1. Argument | rdi | self: Objekt, auf dem die Methode aufgerufen wird |
2. Argument | rsi | op: Name der Methode |
3. Argument | rdx | 1. Argument für die Methode |
4. Argument | rcx | 2. Argument für die Methode |
5. Argument | r8 | 3. Argument für die Methode |
6. Argument | r9 | 4. Argument für die Methode |
7. und weitere Argumente | rsp+ (auf dem Stack) | 5. und weitere Argumente für die Methode |
Swift
Bei Swift-Binärdateien, da es eine Objective-C-Kompatibilität gibt, können manchmal Deklarationen mithilfe von class-dump extrahiert werden, aber nicht immer.
Mit den Befehlszeilen jtool -l
oder otool -l
ist es möglich, mehrere Abschnitte zu finden, die mit dem Präfix __swift5
beginnen:
Sie können weitere Informationen über die in diesem Abschnitt gespeicherten Informationen in diesem Blog-Beitrag finden.
Darüber hinaus können Swift-Binärdateien Symbole enthalten (zum Beispiel müssen Bibliotheken Symbole speichern, damit ihre Funktionen aufgerufen werden können). Die Symbole enthalten normalerweise Informationen über den Funktionsnamen und die Attribute auf eine hässliche Weise, daher sind sie sehr nützlich, und es gibt "Demangler", die den ursprünglichen Namen erhalten können:
Gepackte Binärdateien
Überprüfen Sie die hohe Entropie
Überprüfen Sie die Zeichenfolgen (gibt es fast keine verständliche Zeichenfolge, gepackt)
Der UPX-Packer für MacOS generiert einen Abschnitt namens "__XHDR"
Dynamische Analyse
Beachten Sie, dass zum Debuggen von Binärdateien SIP deaktiviert sein muss (csrutil disable
oder csrutil enable --without debug
) oder die Binärdateien in einen temporären Ordner kopiert werden müssen und die Signatur mit codesign --remove-signature <binary-path>
entfernt werden muss oder das Debuggen der Binärdatei erlaubt ist (Sie können dieses Skript verwenden).
Beachten Sie, dass zum Instrumentieren von Systembinärdateien (wie cloudconfigurationd
) auf macOS SIP deaktiviert sein muss (nur das Entfernen der Signatur funktioniert nicht).
Vereinheitlichte Protokolle
MacOS generiert viele Protokolle, die sehr nützlich sein können, wenn eine Anwendung ausgeführt wird, um zu verstehen, was sie tut.
Darüber hinaus gibt es einige Protokolle, die das Tag <private>
enthalten, um einige benutzer- oder computeridentifizierbare Informationen zu verbergen. Es ist jedoch möglich, ein Zertifikat zu installieren, um diese Informationen offenzulegen. Befolgen Sie die Erklärungen von hier.
Hopper
Linkes Panel
Im linken Panel von Hopper können Sie die Symbole (Labels) der Binärdatei, die Liste der Prozeduren und Funktionen (Proc) und die Zeichenfolgen (Str) sehen. Dies sind nicht alle Zeichenfolgen, sondern diejenigen, die in verschiedenen Teilen der Mac-O-Datei definiert sind (wie cstring oder objc_methname
).
Mittleres Panel
Im mittleren Panel sehen Sie den disassemblierten Code. Sie können ihn als rohen Disassemblierung, als Graph, als decompiliert und als binär anzeigen, indem Sie auf das entsprechende Symbol klicken:
Durch Rechtsklicken auf ein Codeobjekt können Sie Verweise auf/von diesem Objekt sehen oder sogar dessen Namen ändern (dies funktioniert nicht im dekompilierten Pseudocode):
Darüber hinaus können Sie im mittleren unteren Bereich Python-Befehle eingeben.
Rechtes Panel
Im rechten Panel können Sie interessante Informationen wie die Navigationshistorie (damit Sie wissen, wie Sie zur aktuellen Situation gekommen sind), den Aufrufgraphen, in dem Sie alle Funktionen sehen können, die diese Funktion aufrufen, und alle Funktionen, die diese Funktion aufruft, und Informationen zu lokalen Variablen sehen.
dtrace
Es ermöglicht Benutzern den Zugriff auf Anwendungen auf einer extrem niedrigen Ebene und bietet Benutzern die Möglichkeit, Programme zu verfolgen und sogar ihren Ausführungsfluss zu ändern. Dtrace verwendet Sonden, die im gesamten Kernel platziert sind und sich an Standorten wie dem Anfang und Ende von Systemaufrufen befinden.
DTrace verwendet die Funktion dtrace_probe_create
, um eine Sonde für jeden Systemaufruf zu erstellen. Diese Sonden können im Einstiegs- und Ausstiegspunkt jedes Systemaufrufs ausgelöst werden. Die Interaktion mit DTrace erfolgt über /dev/dtrace, das nur für den Root-Benutzer verfügbar ist.
Um Dtrace zu aktivieren, ohne den SIP-Schutz vollständig zu deaktivieren, können Sie im Wiederherstellungsmodus ausführen: csrutil enable --without dtrace
Sie können auch dtrace
oder dtruss
Binärdateien ausführen, die Sie kompiliert haben.
Die verfügbaren Sonden von dtrace können mit erhalten werden:
Der Sondenname besteht aus vier Teilen: dem Anbieter, dem Modul, der Funktion und dem Namen (fbt:mach_kernel:ptrace:entry
). Wenn Sie einen Teil des Namens nicht angeben, wird Dtrace diesen Teil als Platzhalter verwenden.
Um DTrace zu konfigurieren, um Sonden zu aktivieren und anzugeben, welche Aktionen ausgeführt werden sollen, wenn sie ausgelöst werden, müssen wir die D-Sprache verwenden.
Eine ausführlichere Erklärung und weitere Beispiele finden Sie unter https://illumos.org/books/dtrace/chp-intro.html
Beispiele
Führen Sie man -k dtrace
aus, um die verfügbaren DTrace-Skripte aufzulisten. Beispiel: sudo dtruss -n binary
In Zeile
Skript
dtruss
ktrace
Sie können dieses sogar mit SIP aktiviert verwenden
ProcessMonitor
ProcessMonitor ist ein sehr nützliches Tool, um die prozessbezogenen Aktionen zu überprüfen, die ein Prozess ausführt (zum Beispiel, um zu überwachen, welche neuen Prozesse ein Prozess erstellt).
SpriteTree
SpriteTree ist ein Tool, das die Beziehungen zwischen Prozessen darstellt.
Sie müssen Ihren Mac mit einem Befehl wie sudo eslogger fork exec rename create > cap.json
überwachen (das Terminal, das dies startet, erfordert FDA). Anschließend können Sie das JSON in diesem Tool laden, um alle Beziehungen anzuzeigen:
FileMonitor
FileMonitor ermöglicht das Überwachen von Dateiereignissen (wie Erstellung, Änderungen und Löschungen) und liefert detaillierte Informationen zu solchen Ereignissen.
Crescendo
Crescendo ist ein GUI-Tool mit dem Look and Feel, das Windows-Benutzer möglicherweise von Microsoft Sysinternals Procmon kennen. Dieses Tool ermöglicht das Starten und Stoppen der Aufzeichnung verschiedener Ereignistypen, das Filtern dieser Ereignisse nach Kategorien wie Datei, Prozess, Netzwerk usw. und bietet die Funktionalität, die aufgezeichneten Ereignisse im JSON-Format zu speichern.
Apple Instruments
Apple Instruments sind Teil der Xcode-Entwicklertools und werden zur Überwachung der Anwendungsleistung, Identifizierung von Speicherlecks und Verfolgung von Dateisystemaktivitäten verwendet.
fs_usage
Ermöglicht das Verfolgen von Aktionen, die von Prozessen ausgeführt werden:
TaskExplorer
Taskexplorer ist nützlich, um die Bibliotheken, die von einem Binärprogramm verwendet werden, die Dateien, die es verwendet, und die Netzwerk-Verbindungen zu sehen. Es überprüft auch die Binärprozesse gegen virustotal und zeigt Informationen über das Binärprogramm an.
PT_DENY_ATTACH
In diesem Blog-Beitrag finden Sie ein Beispiel dafür, wie man ein laufendes Daemonprogramm debuggt, das PT_DENY_ATTACH
verwendet, um das Debuggen zu verhindern, selbst wenn SIP deaktiviert ist.
lldb
lldb ist das Standardwerkzeug für das Debuggen von macOS-Binärdateien.
Sie können das Intel-Flavour festlegen, wenn Sie lldb verwenden, indem Sie eine Datei namens .lldbinit
in Ihrem Home-Verzeichnis mit der folgenden Zeile erstellen:
Innerhalb von lldb einen Prozess mit process save-core
dumpen
(lldb) Befehl | Beschreibung |
run (r) | Startet die Ausführung, die fortgesetzt wird, bis ein Breakpoint erreicht wird oder der Prozess beendet wird. |
continue (c) | Führt die Ausführung des debuggten Prozesses fort. |
nexti (n / ni) | Führt die nächste Anweisung aus. Dieser Befehl überspringt Funktionsaufrufe. |
stepi (s / si) | Führt die nächste Anweisung aus. Im Gegensatz zum Befehl nexti wird dieser Befehl Funktionsaufrufe durchlaufen. |
finish (f) | Führt den Rest der Anweisungen in der aktuellen Funktion ("frame") aus und hält an. |
Strg + C | Unterbricht die Ausführung. Wenn der Prozess ausgeführt (r) oder fortgesetzt (c) wurde, wird der Prozess anhalten ... wo er sich gerade befindet. |
breakpoint (b) | b main #Irgendeine Funktion namens main b <binname>`main #Hauptfunktion der Binärdatei b set -n main --shlib <lib_name> #Hauptfunktion der angegebenen Binärdatei b -[NSDictionary objectForKey:] b -a 0x0000000100004bd9 br l #Breakpoint-Liste br e/dis <num> #Breakpoint aktivieren/deaktivieren breakpoint delete <num> |
Hilfe | Hilfe breakpoint #Hilfe zum Befehl breakpoint erhalten Hilfe memory write #Hilfe zum Schreiben in den Speicher erhalten |
reg | |
x/s <reg/memory address> | Zeigt den Speicher als nullterminierten String an. |
x/i <reg/memory address> | Zeigt den Speicher als Assembler-Anweisung an. |
x/b <reg/memory address> | Zeigt den Speicher als Byte an. |
print object (po) | Dies druckt das Objekt, auf das der Parameter verweist po $raw
Beachten Sie, dass die meisten Objective-C-APIs oder Methoden von Apple Objekte zurückgeben und daher über den Befehl "print object" (po) angezeigt werden sollten. Wenn po keine sinnvolle Ausgabe liefert, verwenden Sie |
memory | memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Schreibt AAAA an diese Adresse memory write -f s $rip+0x11f+7 "AAAA" #Schreibt AAAA in die Adresse |
disassembly | dis #Disassembliert die aktuelle Funktion dis -n <funcname> #Disassembliert die Funktion dis -n <funcname> -b <basename> #Disassembliert die Funktion dis -c 6 #Disassembliert 6 Zeilen dis -c 0x100003764 -e 0x100003768 # Von einer Adresse bis zur anderen dis -p -c 4 # Beginnt in der aktuellen Adresse mit dem Disassemblieren |
parray | parray 3 (char **)$x1 # Überprüft ein Array mit 3 Komponenten im Register x1 |
Beim Aufruf der Funktion objc_sendMsg
enthält das Register rsi den Methodennamen als nullterminierten ("C")-String. Um den Namen über lldb auszugeben, tun Sie folgendes:
(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-Dynamische Analyse
VM-Erkennung
Der Befehl
sysctl hw.model
gibt "Mac" zurück, wenn der Host ein MacOS ist, aber etwas anderes, wenn es sich um eine VM handelt.Durch Spielen mit den Werten von
hw.logicalcpu
undhw.physicalcpu
versuchen einige Malwares zu erkennen, ob es sich um eine VM handelt.Einige Malwares können auch erkennen, ob die Maschine auf VMware basiert, basierend auf der MAC-Adresse (00:50:56).
Es ist auch möglich festzustellen, ob ein Prozess debuggt wird, mit einem einfachen Code wie:
if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //Prozess wird debuggt }
Es kann auch der
ptrace
-Systemaufruf mit dem FlagPT_DENY_ATTACH
aufgerufen werden. Dies verhindert, dass ein Debugger angehängt und verfolgt wird.Sie können überprüfen, ob die Funktion
sysctl
oderptrace
importiert wird (aber die Malware könnte sie dynamisch importieren)Wie in diesem Artikel erwähnt, "Defeating Anti-Debug Techniques: macOS ptrace variants": "Die Meldung Prozess # wurde mit Status = 45 (0x0000002d) beendet, ist in der Regel ein deutliches Zeichen dafür, dass das Debug-Ziel PT_DENY_ATTACH verwendet"
Fuzzing
ReportCrash analysiert abstürzende Prozesse und speichert einen Absturzbericht auf der Festplatte. Ein Absturzbericht enthält Informationen, die einem Entwickler helfen können, die Ursache eines Absturzes zu diagnostizieren.
Für Anwendungen und andere Prozesse, die im Kontext des benutzerbezogenen launchd ausgeführt werden, wird ReportCrash als LaunchAgent ausgeführt und speichert Absturzberichte im Verzeichnis des Benutzers ~/Library/Logs/DiagnosticReports/
.
Für Daemons, andere Prozesse, die im Kontext des systemweiten launchd ausgeführt werden, und andere privilegierte Prozesse wird ReportCrash als LaunchDaemon ausgeführt und speichert Absturzberichte im Verzeichnis des Systems /Library/Logs/DiagnosticReports
Wenn Sie sich Sorgen machen, dass Absturzberichte an Apple gesendet werden, können Sie sie deaktivieren. Andernfalls können Absturzberichte nützlich sein, um herauszufinden, wie ein Server abgestürzt ist.
Schlaf
Beim Fuzzing in einem MacOS ist es wichtig, zu verhindern, dass der Mac schläft:
systemsetup -setsleep Never
pmset, Systemeinstellungen
SSH-Verbindung trennen
Wenn Sie über eine SSH-Verbindung fuzzing, ist es wichtig sicherzustellen, dass die Sitzung nicht abläuft. Ändern Sie daher die sshd_config-Datei wie folgt:
TCPKeepAlive Yes
ClientAliveInterval 0
ClientAliveCountMax 0
Interne Handler
Überprüfen Sie die folgende Seite, um herauszufinden, wie Sie herausfinden können, welche App für das Behandeln des angegebenen Schemas oder Protokolls verantwortlich ist:
pagemacOS File Extension & URL scheme app handlersNetzwerkprozesse aufzählen
Es ist interessant, Prozesse zu finden, die Netzwerkdaten verwalten:
Oder verwenden Sie netstat
oder lsof
Libgmalloc
Fuzzer
Funktioniert für CLI-Tools
Es funktioniert "einfach so" mit macOS GUI-Tools. Beachten Sie, dass einige macOS-Apps spezifische Anforderungen haben, wie z.B. eindeutige Dateinamen, die richtige Erweiterung, die Notwendigkeit, die Dateien aus dem Sandbox-Bereich zu lesen (~/Library/Containers/com.apple.Safari/Data
)...
Einige Beispiele:
Weitere Informationen zu Fuzzing auf MacOS
Referenzen
WhiteIntel ist eine von Dark Web angetriebene Suchmaschine, die kostenlose Funktionen bietet, um zu überprüfen, ob ein Unternehmen oder seine Kunden von Stealer-Malware kompromittiert wurden.
Das Hauptziel von WhiteIntel ist es, Kontoübernahmen und Ransomware-Angriffe aufgrund von informationsstehlender Malware zu bekämpfen.
Sie können ihre Website besuchen und ihre Engine kostenlos ausprobieren unter:
Last updated