
Un unpacker e logger automatico per file destinati a DotNet Framework
Uno strumento automatico per unpacking e logging di file destinati al DotNet Framework! Questo strumento è stato presentato al Black Hat USA 2022. Al Black Hat Asia 2023, sono stati pubblicati DotDumperGUI e DotDumperNative, insieme alla versione 1.1-stable di DotDumper. Questi tre strumenti sono pensati per essere usati insieme, dove DotDumper 1.1-stable richiede la presenza delle DLL di DotDumperNative, mentre DotDumperGUI è inteso come interfaccia grafica per aprire e filtrare l'output JSON delle esecuzioni di DotDumper.
Il rilevamento e la classificazione automatici di qualsiasi file in modo affidabile è spesso considerato il Santo Graal dell'analisi malware. Le prove e le tribolazioni per arrivarci sono molte, motivo per cui la creazione di un tale sistema è tenuta in grande considerazione. Quando si tratta di binari destinati a DotNet, il nostro nuovo strumento open-source DotDumper mira ad assistere in diversi passaggi cruciali lungo il percorso: registrare l'attività (in memoria), scaricare segmenti di memoria interessanti ed estrarre caratteristiche dal campione dato.
In breve, l'unpacking manuale è un processo noioso che consuma una quantità di tempo sproporzionata per gli analisti. I binari offuscati aumentano ulteriormente il tempo che un analista deve dedicare per decomprimere un dato file. Scalando questo, le organizzazioni hanno bisogno di numerosi analisti che analizzano il malware quotidianamente, probabilmente in combinazione con una sandbox scalabile. Il tempo prezioso perso potrebbe essere utilizzato per approfondire campagne o campioni interessanti per scoprire nuove minacce, piuttosto che il malware generico e banale ampiamente diffuso. Dopotutto, gli analisti cercano i pochi aghi nel pagliaio.
Allora, che differenza fa DotDumper? Eseguire un campione malware basato su DotNet tramite DotDumper fornisce file di log di chiamate di funzione cruciali, contestualizzanti e comuni in tre formati (testo semplice leggibile dall'uomo, JSON e XML), oltre a copie di segmenti di memoria utili. In questo modo, un analista può scorrere il registro delle chiamate di funzione. Inoltre, i file scaricati possono essere scansionati per classificarli, fornendo ulteriori informazioni sul campione malware e sui dati che contiene. Ciò riduce il tempo vitale per i processi di triage e risposta agli incidenti e libera il tempo degli analisti SOC e dei ricercatori per esigenze di analisi più sofisticate.
Per registrare e dumpare le chiamate di funzione contestualizzanti e i loro risultati, DotDumper utilizza una miscela di reflection e hook gestiti, tutti scritti in puro C#. Di seguito, le caratteristiche chiave verranno evidenziate e approfondite, in combinazione con estratti dei risultati di DotDumper su un campione di AgentTesla stealer impacchettato, i cui hash sono riportati di seguito.
| Tipo di hash | Valore hash |
|---|---|
| SHA-256 | b7512e6b8e9517024afdecc9e97121319e7dad2539eb21a79428257401e5558d |
| SHA-1 | c10e48ee1f802f730f41f3d11ae9d7bcc649080c |
| MD-5 | 23541daadb154f1f59119952e7232d6b |
DotDumper è accessibile tramite un'interfaccia a riga di comando, con una varietà di argomenti. L'immagine seguente mostra il menu di aiuto. Nota che non tutti gli argomenti verranno discussi, ma piuttosto quelli più usati.

Il requisito minimo per eseguire un dato campione è fornire l'argomento “-file”, insieme a un nome file o un percorso file. Se viene fornito un percorso completo, viene utilizzato. Se viene fornito un nome file, vengono controllati la directory di lavoro corrente e la cartella della posizione dell'eseguibile di DotDumper.
A meno che non venga fornito un nome di directory, il nome della cartella “-log” viene impostato uguale al nome del file del campione senza estensione (se presente). La cartella si trova nella stessa cartella in cui risiede DotDumper, ed è lì che verranno salvati i log e i file dumpati.
Nel caso di una libreria o di un punto di ingresso alternativo in un binario, è necessario sovrascrivere il punto di ingresso usando “-overrideEntry true”. Inoltre, bisogna fornire la classe completamente qualificata, che include il namespace usando “-fqcn My.NameSpace.MyClass”. Questo dice a DotDumper quale classe selezionare, da cui viene recuperato il nome della funzione fornito (usando “-functionName MyFunction”).
Se la funzione selezionata richiede argomenti, bisogna fornire il numero di argomenti usando “-argc” e il numero di argomenti richiesti. I tipi e i valori degli argomenti devono essere forniti come “string|myValue int|9”. Nota che quando vengono usati spazi nei valori, l'argomento nell'interfaccia a riga di comando deve essere racchiuso tra virgolette per garantire che venga passato come un singolo argomento.
Altre opzioni meno usate come “-raceTime” o “-deprecated” sono sicure nelle loro impostazioni predefinite ma potrebbero richiedere modifiche in futuro a causa di cambiamenti nel DotNet Framework. Sono attualmente esposte nell'interfaccia a riga di comando per consentire facilmente modifiche, se necessario, anche se si sta utilizzando una versione precedente di DotDumper quando arriva il momento.
La registrazione e il dumping sono le due funzionalità principali di DotDumper. Per ridurre al minimo il tempo impiegato dall'analisi, la registrazione dovrebbe fornire contesto all'analista. Questo viene fatto fornendo all'analista le seguenti informazioni per ogni chiamata di funzione registrata:
Nota che per ogni file dumpato, il nome del file è uguale all'hash SHA-256 del file.
Per chiarire quanto sopra, viene fornito di seguito un estratto di un log. L'estratto mostra i dettagli per il suddetto campione AgentTesla, dove carica il secondo stadio usando la funzione Assembly.Load di DotNet.
![Il log per una chiamata alla funzione Assembly.Load(byte[] rawAssembly) intercettata](images/assembly_load.png)