
Rogue Assembly Hunter est un utilitaire permettant de découvrir des modules .NET CLR 'intéressants' dans les processus en cours.
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | |/ \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter est un utilitaire pour découvrir des modules .NET CLR « intéressants » dans les processus en cours d’exécution.
.NET est une plateforme de développement et un framework d’exécution très puissants et capables pour construire et exécuter des applications gérées .NET. Au cours des dernières années, .NET a été adopté par les Red Teams (et assimilés) pour instrumenter des techniques afin de soutenir des opérations offensives. En particulier, le passage de PowerShell offensif à .NET a été un saut logique (pour beaucoup) en raison de la visibilité accrue et de l’opportunité offerte par PowerShell v5+. Ainsi, les outils et techniques offensifs .NET ont été utilisés avec succès pour contourner les capacités défensives basées sur l’hôte, contourner le contrôle des applications et construire/stager/livrer/exécuter du code malveillant (similaire à PowerShell).
D’un point de vue préventif, Microsoft fait davantage pour lutter contre les menaces instrumentées par .NET et minimiser la surface d’attaque globale de .NET. Par exemple, Microsoft a ajouté des capacités d’inspection AMSI dans .NET Framework 4.8, et les mécanismes WDAC/WLDP sont assez efficaces. D’un point de vue détection/réponse, une visibilité et une introspection supplémentaires dans l’écosystème .NET sont toujours avantageuses pour découvrir de nouvelles façons de combattre les menaces ciblant .NET.
En 2017, Joe Desimone (@dez_) a écrit un article fantastique intitulé Hunting For In-Memory .NET Attacks. Toujours d’actualité, l’article décrit les vecteurs d’attaque .NET modernes ainsi que les techniques de détection à la demande et basées sur les événements. Accompagnant l’article, Joe a publié un outil (Get-ClrReflection) pour détecter (et récupérer) de manière proactive les modules CLR .NET en mémoire qui n’ont pas de référence disque appropriée. Inspiré par le travail de Joe et profitant des capacités d’introspection de la bibliothèque de diagnostics d’exécution CLRMD (ainsi que des capacités d’accès aux données ultérieures de mscordacwks.dll), Rogue Assembly Hunter a été créé pour :
[*] Paramètres :
--mode=<.> : Requis | Sélectionnez le mode d’analyse. Options : sweep, process et watch.
--hunt=<.> : Facultatif | Sélectionnez le type de chasse pour trouver des modules CLR intéressants. Spécifiez all (par défaut), memory-only, unusual-dir,
sig-status, imposter-file ou list.
--export=<.> : Facultatif, expérimental | Spécifiez un chemin de fichier pour exporter les modules CLR chargés pour les chasses en mémoire et les chasses de fichiers imposteurs
(ex. --hunt=memory-only/imposter-file/all).
--pid=<.> : Facultatif | Spécifiez un processus ciblé par PID. Doit être utilisé avec le paramètre/valeur --mode=process.
--checks=<.> : Facultatif | Spécifiez une valeur pour les cycles d’analyse. Cela peut aider à réduire les oublis dus aux conditions de concurrence, mais peut aussi répéter la sortie des résultats.
Valeur par défaut : 1.
--sleep=<.> : Facultatif | Spécifiez une valeur pour les secondes de pause. Cela peut aider à réduire les oublis dus aux conditions de concurrence en retardant le cycle de vérification.
Valeur par défaut : 0 seconde.
--debug : Facultatif | Afficher les informations d’exception (ex. erreurs de connexion au processus).
--nobanner : Facultatif | Supprimer la bannière d’affichage. Utile pour l’exécution avec le script PowerShell ou pour des cas d’utilisation automatisés.
--suppress : Facultatif | Ne pas analyser le processus RogueAssemblyHunter pendant --mode=sweep ou --mode=watch.
--help : Facultatif | Afficher cette aide. Cela remplacera tout autre paramètre et quittera l’application. *C’est la valeur par défaut sans paramètres.
[*] Modes (--mode=)
- sweep : Analyser/parcourir tous les processus (Remarque : seuls les processus de la même architecture/« bitness » seront analysés avec succès. Compilez pour x86/x64/etc.).
- process : Analyser un seul processus. Utilisez --pid=<PID>.
- watch : Analyser les nouveaux processus lors de leur création. Ajustez les attributs d’analyse avec --checks et --sleep. (Remarque : c’est expérimental. Des conditions de concurrence sont probables.)
[*] Chasses (--hunt=)
- all : Valeur par défaut. Analyser avec toutes les options de chasse (sauf 'list').
- memory-only : Chasse mémoire. Analyser les modules CLR qui ne sont pas sauvegardés sur le disque.
- unusual-dir : Chasse répertoire inhabituel. Analyser les modules CLR chargés en dehors des répertoires « normaux ».
Modifiez '_huntUnusualDirectoryFilter' pour personnaliser.
- sig-status : Chasse signature de fichier. Analyser les modules CLR avec un état de signature anormal (ex. non signé). Remarque : expérimental. De faux positifs sont possibles.
Modifiez '_huntSigExclusionsFilter' pour personnaliser.
- imposter-file : Chasse module CLR inattendu. Analyser les modules CLR avec un fichier de sauvegarde suspect. Expérimental.
- list : Parcourir tous les modules CLR et les lister en conséquence.
[*] Exemples d’utilisation
- Exemple 1 : Analyser les processus et lancer toutes les chasses pour les processus 64 bits accessibles (sauf 'list') -
RogueAssemblyHunter_x64.exe --mode=sweep
- Exemple 2 : Analyser les processus, lister tous les modules CLR dans les processus gérés 32 bits accessibles et afficher les informations d’erreur -
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- Exemple 3 : Surveiller les nouveaux processus, analyser tous les modules CLR (si gérés et 64 bits), ne pas analyser le processus RogueAssemblyHunter, et effectuer 2 vérifications avec 3 secondes de délai -
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- Exemple 4 : Analyser un seul processus par PID, lister uniquement les modules CLR en mémoire et exporter les modules CLR vers le chemin spécifié -
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- Exemple 5 : Analyser les processus, lister uniquement les modules CLR en mémoire pour les processus 64 bits accessibles, ne pas analyser le processus RogueAssemblyHunter et ne pas afficher la bannière -
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
Pour plus de commodité, un script PowerShell ainsi que deux binaires compilés (RogueAssemblyHunter_x64.exe et RogueAssemblyHunter_x86.exe) ont été inclus dans le dossier \Release. N’hésitez pas à les modifier pour les adapter à vos cas d’utilisation (ex. déploiement, intégration, vérifications, pause, etc.).
Exemple d’utilisation :
Exécuter Invoke-RogueAssemblyHunter en mode sweep et vérifier toutes les options de chasse
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
Exécuter Invoke-RogueAssemblyHunter en mode watch et vérifier toutes les options de chasse
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter -ScanMode watch
Empreintes SHA256 :
e804711a8b6469f1b13b388de47dfa6dde1c85279d365db7b6e19e1644990fa6 Invoke-RogueAssemblyHunter.ps1
cc985d918e566671aa209142abc55bd798ca6c1a18730b785ac8c18d489736c3 RogueAssemblyHunter_x64.exe
ae3aead43871e263cd8465d5356c4daaae0635714321f872c931ec825008287a RogueAssemblyHunter_x86.exe