
YARA-Regeln auf Time-Travel-Debugging-Traces anwenden
Nutze YARA-Regeln auf Time-Travel-Debugging-Traces
Ein einfaches Binary, das calc.exe startet und mit UPX gepackt wurde.
yara-ttd findet den calc.exe-String im Modulspeicher während einer Thread-Erstellung.
calc.exe ausführtDas getestete Binary entschlüsselt einen Shellcode und führt ihn in einem neuen Thread aus.
yara-ttd findet den calc.exe-String auf dem Heap, wenn die Funktion ntdll!NtCreateThreadEx gehookt wird.
YARA ist ein leistungsfähiges Werkzeug zum Musterabgleich in Binärdateien.
YARA ist ein Tool, das darauf abzielt (aber nicht darauf beschränkt ist), Malware-Forschern zu helfen, Malware-Proben zu identifizieren und zu klassifizieren. Mit YARA kannst du Beschreibungen von Malware-Familien (oder was auch immer du beschreiben möchtest) auf der Grundlage von textuellen oder binären Mustern erstellen.
Dank YARA können wir viel Zeit sparen, indem wir Malware-Proben in einer Pipeline automatisch klassifizieren, bevor wir sie analysieren.
Leider sind die meisten Malware-Proben mit verschiedenen Arten von Packern geschützt. Ein klassisches Runtime-Packer-Schema wie UPX oder VMProtect besteht darin, obfuskierten und manchmal verschlüsselten Code selbst zu entpacken und auszuführen. Daher kann YARA nicht mit gepackten Binärdateien umgehen, weil es im gepackten Code keine Übereinstimmungen findet.
Time Travel Debugging - oder TTD - ist eine Funktion des nativen Windows-Debuggers WinDbg.
Time Travel Debugging ist ein Tool, mit dem du eine Ablaufverfolgung deines Prozesses aufzeichnen kannst, während er ausgeführt wird, und sie später sowohl vorwärts als auch rückwärts abspielen kannst. Time Travel Debugging (TTD) kann dir helfen, Probleme leichter zu beheben, indem du deine Debugger-Sitzung „zurückspulen“ kannst, anstatt das Problem zu reproduzieren, bis du den Fehler findest.
Für die Malware-Analyse ist TTD ein mächtiges Werkzeug, da es ermöglicht, die Ablaufverfolgung einer Malware in einer Sandbox aufzuzeichnen. Daher können wir die aufgezeichnete Datei außerhalb der Sandbox sicher abspielen und teilen, um die Malware zu analysieren.
Außerdem ist TTD kein Debugger und wird daher von klassischen Anti-Debugging-Techniken wie PEB.BeingDebugged nicht erkannt.
Für eine tiefere Analyse von TTD aus Sicherheitssicht wirf einen Blick auf diesen Artikel: Tiefer Einblick in das TTD-Ökosystem
Natürlich ist TTD eine proprietäre Software, und diese Arbeit wäre ohne die von commial entwickelten ttd-bindings nicht möglich.
Die Idee hinter yara-ttd ist es, die von TTD aufgezeichneten Trace-Dateien mit yara selbst zu verwenden, um Packer zu besiegen.
Da yara die gepackte Binärdatei selbst nicht scannen kann, bietet yara-ttd eine Möglichkeit, die Trace-Datei zu analysieren, die alle Laufzeitinformationen einschließlich des Entpackvorgangs enthält.
Mit yara-ttd kannst du eine Reihe von Positionen in der Trace-Datei auswählen, an denen du den Speicher mit deinen YARA-Regeln scannen möchtest.
So kannst du die gepackte Binärdatei mit deinen YARA-Regeln an jeder gewünschten Stelle hooken!
yara-ttd bietet verschiedene Speicher-Scan-Strategien, z. B. wenn Module geladen werden oder wenn virtueller Speicher zugewiesen wird – diese werden häufig genutzt, um den Malware-Code zu speichern, sobald er entpackt wurde.
Derzeit unterstützt yara-ttd nur Windows, da es mit der TTD-API interagieren muss.
Baue zuerst das Projekt:
mkdir build
cd build
cmake ..
cmake --build .
Füge dann die Dateien TTDReplay.dll und TTDReplayCPU.dll im selben Verzeichnis wie die ausführbare Datei hinzu.
Diese DLL-Dateien findest du in %LocalAppData%\Microsoft\WindowsApps\Microsoft.WinDbg_X\TTD
Zuerst musst du eine Ablaufverfolgung (.run-Datei) deines Programms aufzeichnen.
Eine detaillierte Anleitung zum Aufzeichnen einer TTD-Ablaufverfolgung findest du in diesem Tutorial.
Führe dann einfach Folgendes aus:
.\yara-ttd path\to\rule path\to\trace\file
Es gibt drei Modi, um den Speicher zu scannen:
Du kannst den Modus mit -m auswählen:
.\yara-ttd -m 1 path\to\rule path\to\trace\file
Wie beim offiziellen yara-CLI kannst du mit dem Flag -s die Details der Übereinstimmungen ausgeben, z. B. die Speicheradresse und die genaue Subregel, die übereinstimmte.
Da TTD die Speicherstruktur nicht speichert, berechnet yara-ttd vor dem Scan die Struktur der Heap-Adressen für jede Zeitposition.
Es wird eine Cache-Datei mit der Erweiterung .tmp im selben Pfad wie die Trace-Datei erstellt, um die Heap-Struktur zu speichern.
Wenn du yara-ttd erneut mit einer Trace-Datei ausführen und die Heap-Struktur aus der erzeugten Cache-Datei laden möchtest, kannst du einfach Folgendes tun:
.\yara-ttd -m 1 --cache=path\to\cache\file path\to\rule path\to\trace\file
Mit TTD können wir auf den gesamten Speicherbereich eines Prozesses zugreifen, der der minimalen und maximalen Adresse entspricht, die von GetSystemInfo zurückgegeben wird. Dennoch ist dieser Bereich in den meisten Fällen zu groß, um ohne Optimierung gescannt zu werden.
Die standardmäßigen Zeitpositionen, die gescannt werden, sind:
Mit den Flags -t und -f kannst du andere Positionen oder Funktionsaufrufe zum Scannen auswählen:
.\yara-ttd -m 1 -t 3C1:A -t 5FF:22 -f ntdll!FreeVirtualMemory -f ntdll!NtCreateThreadEx path\to\rule path\to\trace\file
Das Flag -t erwartet TTD-Positionen in der Form major:minor (beide hexadezimal, ohne 0x).
Das Flag -f erwartet eine Zeichenkette in der Form module_name!function_name.
Du kannst auch alle Funktionen, die du hooken möchtest, in einer Datei angeben:
> cat .\functions.txt
ntdll!FreeVirtualMemory
ntdll!NtCreateThreadEx
> .\yara-ttd -m 1 -F functions.txt path\to\rule path\to\trace\file
Wenn du mehrere Dateien mit yara-ttd scannen möchtest, kannst du auch ein ganzes Verzeichnis scannen.
yara-ttd ignoriert alle folgenden Erweiterungen im Ordner:
.tmp (Cache-Dateien, die von yara-ttd erzeugt werden).idx (Indexdateien, die von ttd erzeugt werden).err (Fehlerdateien, die von ttd erzeugt werden).out (Logdateien, die von ttd erzeugt werden)