
Rogue Assembly Hunter è un'utility per scoprire moduli .NET CLR 'interessanti' in processi in esecuzione.
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | |/ \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter è un'utilità per scoprire moduli .NET CLR 'interessanti' nei processi in esecuzione.
.NET è una piattaforma di sviluppo e un runtime framework molto potente e capace per la creazione e l'esecuzione di applicazioni gestite .NET. Negli ultimi anni, .NET è stato adottato dai Red Team (e simili) per strumentare tecniche di supporto alle operazioni offensive. In particolare, il passaggio da PowerShell offensivo a .NET è stato un salto logico (per molti) a causa dell'aumento della visibilità e dell'opportunità di osservazione presenti in PowerShell v5+. Di conseguenza, gli strumenti e le tecniche offensive .NET sono state utilizzate con successo per eludere le capacità difensive basate su host, bypassare i controlli delle applicazioni e per creare/preparare/distribuire/eseguire codice malevolo (simile a PowerShell).
Dal punto di vista della prevenzione, Microsoft sta facendo di più per combattere le minacce strumentate da .NET e per ridurre al minimo la superficie d'attacco complessiva di .NET. Ad esempio, Microsoft ha aggiunto funzionalità di ispezione AMSI in .NET Framework 4.8, e i meccanismi WDAC/WLDP sono piuttosto efficaci. Dal punto di vista del rilevamento/risposta, una maggiore visibilità e introspezione nell'ecosistema .NET è sempre vantaggiosa per scoprire nuovi modi per combattere le minacce incentrate su .NET.
Nel 2017, Joe Desimone (@dez_) ha scritto un articolo fantastico intitolato Hunting For In-Memory .NET Attacks. Ancora attuale oggi, l'articolo delinea i moderni vettori d'attacco .NET oltre a tecniche di rilevamento su richiesta e basate su eventi. In accompagnamento all'articolo, Joe ha rilasciato uno strumento (Get-ClrReflection) per rilevare proattivamente (e recuperare) moduli CLR .NET in memoria che non hanno un riferimento su disco. Ispirato dal lavoro di Joe e sfruttando le capacità di introspezione della libreria di diagnostica runtime CLRMD (+ le successive capacità di accesso ai dati di mscordacwks.dll), è stato creato Rogue Assembly Hunter per:
[*] Parametri:
--mode=<.> : Obbligatorio | Seleziona la modalità di analisi. Opzioni: sweep, process e watch.
--hunt=<.> : Opzionale | Seleziona il tipo di scansione di caccia per trovare moduli CLR interessanti. Specificare all (predefinito), memory-only, unusual-dir,
sig-status, imposter-file o list.
--export=<.> : Opzionale, Sperimentale | Specifica un percorso file per esportare i moduli CLR caricati per le scansioni di caccia in-memory e imposter-file
(es. --hunt=memory-only/imposter-file/all).
--pid=<.> : Opzionale | Specifica un processo target tramite PID. Deve essere usato con il parametro/valore --mode=process.
--checks=<.> : Opzionale | Specifica un valore per i cicli di scansione. Può aiutare a ridurre le race condition mancate durante le scansioni ma potrebbe anche ripetere l'output dei risultati.
Il valore predefinito è 1.
--sleep=<.> : Opzionale | Specifica un valore per i secondi di pausa. Può aiutare a ridurre le race condition mancate durante le scansioni ritardando il ciclo di controllo.
Il valore predefinito è 0 secondi.
--debug : Opzionale | Mostra le informazioni sulle eccezioni (es. errori di connessione al processo).
--nobanner : Opzionale | Sopprime il banner di visualizzazione. Utile per l'esecuzione con lo script PowerShell o per casi d'uso che sfruttano l'automazione.
--suppress : Opzionale | Non esegue la scansione del processo RogueAssemblyHunter durante --mode=sweep o --mode=watch.
--help : Opzionale | Mostra questo aiuto. Sostituirà qualsiasi altro parametro della riga di comando e uscirà dall'applicazione. *Questo è il comportamento predefinito senza parametri.
[*] Modalità (--mode=)
- sweep : Scansiona/itera attraverso tutti i processi (Nota: Solo i processi della stessa architettura/'bitness' verranno scansionati con successo. Compilare per eseguire per x86/x64/ecc.).
- process : Scansiona un singolo processo. Usare con --pid=<PID>.
- watch : Scansiona i nuovi processi quando vengono creati. Regola gli attributi di scansione con --checks e --sleep. (Nota: Questo è sperimentale. Le race condition sono probabili.)
[*] Cacce (--hunt=)
- all : Valore predefinito. Analizza con tutte le opzioni di caccia (eccetto 'list').
- memory-only : Caccia in memoria. Analizza i moduli CLR che non sono supportati dal disco.
- unusual-dir : Caccia in directory insolite. Analizza i moduli CLR caricati al di fuori delle directory 'normali'.
Modificare '_huntUnusualDirectoryFilter' per personalizzare.
- sig-status : Caccia alla firma del file. Analizza i moduli CLR con stato di firma anomalo (es. non firmati). Nota: Questo è sperimentale. Sono possibili falsi positivi.
Modificare '_huntSigExclusionsFilter' per personalizzare.
- imposter-file : Caccia ai moduli CLR inaspettati. Analizza il modulo CLR con supporto di file su disco sospetto. Sperimentale.
- list : Itera attraverso tutti i moduli CLR e li elenca di conseguenza.
[*] Esempi di Utilizzo
- Esempio 1 : Scansiona i processi ed esegue tutte le cacce per i processi 64-bit accessibili (eccetto 'list') -
RogueAssemblyHunter_x64.exe --mode=sweep
- Esempio 2 : Scansiona i processi, elenca tutti i moduli CLR nei processi gestiti 32-bit accessibili e mostra le informazioni sugli errori -
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- Esempio 3 : Osserva i nuovi processi, scansiona tutti i moduli CLR (se gestiti e 64-bit), non esegue la scansione del processo RogueAssemblyHunter e fa 2 controlli con un ritardo di 3 secondi -
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- Esempio 4 : Scansiona un singolo processo per PID, elenca i risultati dei moduli CLR solo in memoria ed esporta i moduli CLR nel percorso specificato -
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- Esempio 5 : Scansiona i processi, elenca i risultati dei moduli CLR solo in memoria per i processi 64-bit accessibili, non esegue la scansione del processo RogueAssemblyHunter e non mostra il banner del titolo -
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
Per comodità, uno script PowerShell insieme a due binari compilati (RogueAssemblyHunter_x64.exe e RogueAssemblyHunter_x86.exe) sono stati inclusi nella cartella \Release. Sentiti libero di modificare per adattarli ai tuoi casi d'uso (es. distribuzione, incorporamento, controlli, sleep, ecc.).
Esempio di Utilizzo:
Esegui Invoke-RogueAssemblyHunter in modalità sweep e controlla tutte le opzioni di caccia
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
Esegui Invoke-RogueAssemblyHunter in modalità watch e controlla tutte le opzioni di caccia
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter -ScanMode watch
SHA256 Hashes:
e804711a8b6469f1b13b388de47dfa6dde1c85279d365db7b6e19e1644990fa6 Invoke-RogueAssemblyHunter.ps1
cc985d918e566671aa209142abc55bd798ca6c1a18730b785ac8c18d489736c3 RogueAssemblyHunter_x64.exe
ae3aead43871e263cd8465d5356c4daaae0635714321f872c931ec825008287a RogueAssemblyHunter_x86.exe