
Usa le regole YARA sulle tracce di Time Travel Debugging
Usa le regole YARA sulle tracce di Time Travel Debugging
Un semplice binario che avvia calc.exe, impacchettato con UPX.
yara-ttd trova la stringa calc.exe nella memoria del modulo, durante la creazione di un thread.
calc.exeIl binario testato decripta uno shellcode e lo esegue in un nuovo thread.
yara-ttd riesce a trovare la stringa calc.exe nell'heap agganciandosi alla funzione ntdll!NtCreateThreadEx.
YARA è un potente strumento di pattern matching per binari.
YARA è uno strumento pensato (ma non solo) per aiutare i ricercatori di malware a identificare e classificare i campioni di malware. Con YARA puoi creare descrizioni di famiglie di malware (o di qualunque cosa tu voglia descrivere) basate su pattern testuali o binari.
Grazie a YARA, possiamo risparmiare molto tempo classificando automaticamente i campioni di malware in una pipeline prima di analizzarli.
Purtroppo, la maggior parte dei campioni di malware è protetta con diversi tipi di packer. Uno schema classico di runtime-packer come UPX o VMProtect consiste nell'auto-estrarre ed eseguire codice offuscato e talvolta cifrato. Di conseguenza, YARA non può gestire i binari impacchettati perché non troverà alcuna corrispondenza nel codice impacchettato.
Time Travel Debugging - o TTD - è una funzionalità del debugger nativo di Windows, WinDbg.
Time Travel Debugging è uno strumento che ti permette di catturare una traccia del tuo processo mentre viene eseguito e di riprodurla in seguito sia in avanti che all'indietro. Time Travel Debugging (TTD) può aiutarti a risolvere i problemi più facilmente permettendoti di "riavvolgere" la sessione del debugger, invece di dover riprodurre il problema fino a trovare il bug.
Per l'analisi del malware, TTD è uno strumento potente perché consente di registrare la traccia di un malware in una sandbox. In questo modo, possiamo riprodurre e condividere in sicurezza il file registrato al di fuori della sandbox per analizzare il malware.
Inoltre, TTD non è un debugger, quindi non verrà rilevato dalle classiche tecniche anti-debug come PEB.BeingDebugged.
Per un'analisi più approfondita di TTD dal punto di vista della sicurezza, consulta questo articolo: Approfondimento sull'ecosistema TTD
Ovviamente, TTD è un software proprietario, e questo lavoro non potrebbe esistere senza i ttd-bindings sviluppati da commial.
L'idea alla base di yara-ttd è usare i file di traccia registrati da TTD con yara stesso per sconfiggere i packer.
Poiché yara non può scansionare il binario impacchettato di per sé, yara-ttd fornisce un modo per analizzare il file di traccia che contiene tutte le informazioni di runtime, incluso il processo di unpacking.
Con yara-ttd, puoi selezionare un insieme di posizioni nel file di traccia in cui vuoi scansionare la memoria con le tue regole yara.
Quindi, puoi agganciare il binario impacchettato dove vuoi con le tue regole yara!
yara-ttd fornisce diverse strategie di scansione della memoria, come quando i moduli vengono caricati o quando viene allocata memoria virtuale, che sono spesso usate per memorizzare il codice del malware una volta spacchettato.
Per ora, yara-ttd supporta solo Windows, perché deve interagire con l'API TTD.
Prima compila il progetto:
mkdir build
cd build
cmake ..
cmake --build .
Quindi, aggiungi i file TTDReplay.dll e TTDReplayCPU.dll nella stessa directory dell'eseguibile.
Troverai questi file DLL in %LocalAppData%\Microsoft\WindowsApps\Microsoft.WinDbg_X\TTD
Prima devi registrare una traccia (file .run) del tuo programma.
Per un aiuto dettagliato su come registrare una traccia TTD, consulta questo tutorial.
Quindi esegui semplicemente:
.\yara-ttd path\to\rule path\to\trace\file
Ci sono tre modalità per scansionare la memoria:
Puoi selezionare la modalità con -m:
.\yara-ttd -m 1 path\to\rule path\to\trace\file
Come la CLI ufficiale di yara, puoi usare il flag -s per stampare i dettagli delle corrispondenze, come l'indirizzo di memoria e la sottoregola esatta che ha trovato una corrispondenza.
Poiché TTD non memorizza la struttura della memoria, yara-ttd calcola prima della scansione la struttura degli indirizzi dell'heap per ogni posizione temporale.
Creerà un file di cache con estensione .tmp nello stesso percorso del file di traccia per memorizzare la struttura dell'heap.
Se vuoi rieseguire yara-ttd su una traccia e caricare la struttura dell'heap dal file di cache generato, puoi semplicemente fare:
.\yara-ttd -m 1 --cache=path\to\cache\file path\to\rule path\to\trace\file
Possiamo accedere all'intero intervallo di memoria di un processo con TTD, che corrisponde all'indirizzo minimo e massimo restituito da GetSystemInfo. Tuttavia, nella maggior parte dei casi, questo intervallo è troppo ampio per essere scansionato senza alcuna ottimizzazione.
Le posizioni temporali predefinite che verranno scansionate sono:
Con i flag -t e -f, puoi selezionare altre posizioni o chiamate di funzione da scansionare:
.\yara-ttd -m 1 -t 3C1:A -t 5FF:22 -f ntdll!FreeVirtualMemory -f ntdll!NtCreateThreadEx path\to\rule path\to\trace\file
Il flag -t si aspetta posizioni TTD nella forma major:minor (entrambe in esadecimale, senza 0x).
Il flag -f si aspetta una stringa nella forma module_name!function_name.
Puoi anche aggiungere tutte le funzioni che vuoi agganciare in un file:
> cat .\functions.txt
ntdll!FreeVirtualMemory
ntdll!NtCreateThreadEx
> .\yara-ttd -m 1 -F functions.txt path\to\rule path\to\trace\file
Se hai più file da scansionare con yara-ttd, puoi anche scansionare un'intera directory.
yara-ttd ignorerà tutte le seguenti estensioni nella cartella:
.tmp (file di cache generati da yara-ttd).idx (file di indice generati da ttd).err (file di errore generati da ttd).out (file di log generati da ttd)Nell'esempio seguente, yara-ttd scansionerà solo i file trace01.run e trace02.run.
> dir .\traces
trace01.run
trace01.out
trace01.idx
trace02.run
trace01.run.err
trace01.tmp
> .\yara-ttd path\to\rule .\traces