
Rogue Assembly Hunter es una utilidad para descubrir módulos .NET CLR 'interesantes' en procesos en ejecución.
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | |/ \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter es una utilidad para descubrir módulos '.NET CLR' 'interesantes' en procesos en ejecución.
.NET es una plataforma de desarrollo y un marco de tiempo de ejecución muy potente y capaz para construir y ejecutar aplicaciones administradas de .NET. En los últimos años, .NET ha sido adoptado por Red Teams (y afines) para instrumentar tácticas que apoyan operaciones ofensivas. En particular, el cambio de PowerShell ofensivo a .NET fue un salto lógico (para muchos) debido al aumento de la óptica y la visibilidad oportunista presentes en PowerShell v5+. Como tal, las herramientas y tácticas ofensivas de .NET se han utilizado con éxito para evadir capacidades defensivas basadas en el host, eludir el control de aplicaciones y construir/preparar/entregar/ejecutar código malicioso (similar a PowerShell).
Desde una perspectiva de prevención, Microsoft está haciendo más para combatir las amenazas instrumentadas con .NET y minimizar la superficie de ataque general de .NET. Por ejemplo, Microsoft ha añadido capacidades de inspección AMSI en .NET Framework 4.8, y los mecanismos WDAC/WLDP son bastante efectivos. Desde una perspectiva de detección/respuesta, una mayor visibilidad e introspección en el ecosistema .NET siempre es ventajosa para descubrir nuevas formas de combatir las amenazas centradas en .NET.
En 2017, Joe Desimone (@dez_) escribió un fantástico artículo llamado Hunting For In-Memory .NET Attacks. Aún relevante hoy, el artículo describe vectores de ataque modernos de .NET, así como técnicas de detección bajo demanda y basadas en eventos. Acompañando al artículo, Joe lanzó una herramienta (Get-ClrReflection) para detectar (y recuperar) de forma proactiva módulos CLR de .NET en memoria que carecen de una referencia de disco adecuada. Inspirado por el trabajo de Joe y aprovechando las capacidades de introspección de la biblioteca de diagnóstico en tiempo de ejecución CLRMD (+ las capacidades de acceso a datos posteriores de mscordacwks.dll), se creó Rogue Assembly Hunter para:
[*] Parameters:
--mode=<.> : Required | Select analysis mode. Options include sweep, process, and watch.
--hunt=<.> : Optional | Select the hunt scan type to find interesting CLR modules. Specify all (default), memory-only, unusual-dir,
sig-status, imposter-file, or list.
--export=<.> : Optional, Experimental | Specify a file path to export loaded CLR modules for in-memory hunt scans and imposter-file hunt scans
(e.g. --hunt=memory-only/imposter-file/all).
--pid=<.> : Optional | Specify a targeted process by PID. Must be used with --mode=process parameter/value.
--checks=<.> : Optional | Specify a value for scan cycles. This may help reduce race condition misses during scans but could also repeat result output.
Default value is 1.
--sleep=<.> : Optional | Specify a value for sleep seconds. This may help reduce race condition misses during scans by delaying the check cycle.
Default value is 0 seconds.
--debug : Optional | Display exception information (e.g. process connect errors).
--nobanner : Optional | Suppress the display banner. Useful for executing with the PowerShell script or for use cases that leverage automation.
--suppress : Optional | Do not scan the RogueAssemblyHunter process during --mode=sweep or --mode=watch.
--help : Optional | Show this help. This will override any other cmdline parameters and exit the application. *This is the default without parameters.
[*] Modes (--mode=)
- sweep : Scan/iterate through all processes (Note: Only processes of like architecture/'bitness' will be successfully scanned. Compile to run for x86/x64/etc.).
- process : Scan a single process. Use with --pid=<PID>.
- watch : Scan new processes when created. Adjust scan attributes with --checks and --sleep. (Note: This is experimental. Race conditions are likely.)
[*] Hunts (--hunt=)
- all : Default value. Analyze with all hunt options (Except 'list').
- memory-only : Memory hunt. Analyze CLR modules that are not backed by disk.
- unusual-dir : Unusual directory hunt. Analyze CLR modules loaded outside of 'normal' directories.
Edit '_huntUnusualDirectoryFilter' to customize.
- sig-status : File signature hunt. Analyze CLR modules with anomalous signature status (e.g. unsigned). Note: This is experimental. False positives are possible.
Edit '_huntSigExclusionsFilter' to customize.
- imposter-file : Unexpected CLR module hunt. Analyze CLR module with suspicious disk file backing. Experimental.
- list : Iterate through all CLR modules and list accordingly.
[*] Example Usage
- Example 1 : Scan processes and run through all hunts for accessible 64-bit processes (except 'list') -
RogueAssemblyHunter_x64.exe --mode=sweep
- Example 2 : Scan processes, list all CLR modules in accessible 32-bit managed processes, and show error information -
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- Example 3 : Watch for new processes, scan all CLR modules (if managed and 64-bit), do not scan the RogueAssemblyHunter process, and do 2 checks with a 3 second delay between -
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- Example 4 : Scan single process by PID, list in-memory only CLR module findings, and export CLR modules to specified path -
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- Example 5 : Scan processes, list in-memory only CLR module findings for accessible 64-bit processes, do no scan RogueAssemblyHunter process, and do not show title banner -
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
Para mayor comodidad, se han incluido un script de PowerShell junto con dos binarios compilados (RogueAssemblyHunter_x64.exe y RogueAssemblyHunter_x86.exe) en la carpeta \Release. Siéntase libre de modificar para adaptarse a sus casos de uso (por ejemplo, implementación, incrustación, comprobaciones, pausas, etc.).
Ejemplo de Uso:
Ejecute Invoke-RogueAssemblyHunter en modo de barrido y verifique todas las opciones de cacería
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
Ejecute Invoke-RogueAssemblyHunter en modo de vigilancia y verifique todas las opciones de cacería
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter -ScanMode watch
Hashes SHA256:
e804711a8b6469f1b13b388de47dfa6dde1c85279d365db7b6e19e1644990fa6 Invoke-RogueAssemblyHunter.ps1
cc985d918e566671aa209142abc55bd798ca6c1a18730b785ac8c18d489736c3 RogueAssemblyHunter_x64.exe
ae3aead43871e263cd8465d5356c4daaae0635714321f872c931ec825008287a RogueAssemblyHunter_x86.exe