
Rogue Assembly Hunter é um utilitário para descobrir módulos 'interessantes' do .NET CLR em processos em execução.
__________ _____ . .
_____ \ ____ ____ __ __ ____ / _ \ ______ ______ ____ _ | | | ..
| // _ \ / __| | _/ __ \ / /\ \ / // __// __ \ / | __ | |< | |
| | ( <> ) // > | /\ / / | \ \ _ \ /| Y Y \ _\ \ |_ |
|| /_/_ /|/ _ > _| /____ >____ >___ >|| / /____/ |
/ // / / / / / / / /
___ ___ __
/ | \ __ __ / | ___________
/ ~ \ | |/ \ __/ __ _ __
\ Y / | / | \ | \ /| | /
_| /|/|| /| _ >|
/ / /
Rogue Assembly Hunter é um utilitário para descobrir módulos CLR .NET 'interessantes' em processos em execução.
.NET é uma plataforma de desenvolvimento e um runtime framework muito poderosa e capaz para construir e executar aplicações gerenciadas .NET. Nos últimos anos, o .NET foi adotado por Red Teams (e afins) para instrumentar táticas de suporte a operações ofensivas. Em particular, a mudança do PowerShell ofensivo para .NET foi um salto lógico (para muitos) devido ao aumento da visibilidade e oportunidades de observação presentes no PowerShell v5+. Como tal, ferramentas e táticas ofensivas .NET têm sido usadas com sucesso para evadir capacidades defensivas baseadas em host, contornar controle de aplicações e construir/preparar/entregar/executar código malicioso (similar ao PowerShell).
Do ponto de vista da prevenção, a Microsoft está fazendo mais para combater ameaças instrumentadas pelo .NET e minimizar a superfície de ataque geral do .NET. Por exemplo, a Microsoft adicionou capacidades de inspeção AMSI no .NET Framework 4.8, e mecanismos WDAC/WLDP são bastante eficazes. Do ponto de vista de detecção/resposta, maior visibilidade e introspecção no ecossistema .NET é sempre vantajoso para descobrir novas formas de combater ameaças focadas em .NET.
Em 2017, Joe Desimone (@dez_) escreveu um artigo fantástico chamado Hunting For In-Memory .NET Attacks. Ainda relevante hoje, o artigo descreve vetores de ataque .NET modernos, bem como técnicas de detecção sob demanda e baseadas em eventos. Acompanhando o artigo, Joe lançou uma ferramenta (Get-ClrReflection) para detectar proativamente (e recuperar) módulos CLR .NET em memória que não possuem uma referência de disco adequada. Inspirado pelo trabalho de Joe e aproveitando as capacidades de introspecção da biblioteca de diagnóstico de runtime CLRMD (+ capacidades subsequentes de acesso a dados da mscordacwks.dll), o Rogue Assembly Hunter foi criado para:
[*] Parâmetros:
--mode=<.> : Obrigatório | Selecione o modo de análise. Opções: sweep, process e watch.
--hunt=<.> : Opcional | Selecione o tipo de varredura de caça para encontrar módulos CLR interessantes. Especifique all (padrão), memory-only, unusual-dir,
sig-status, imposter-file ou list.
--export=<.> : Opcional, Experimental | Especifique um caminho de arquivo para exportar módulos CLR carregados para varreduras de caça em memória e caça de arquivo impostor
(ex.: --hunt=memory-only/imposter-file/all).
--pid=<.> : Opcional | Especifique um processo alvo por PID. Deve ser usado com o parâmetro/valor --mode=process.
--checks=<.> : Opcional | Especifique um valor para ciclos de varredura. Isso pode ajudar a reduzir perdas por condição de corrida durante as varreduras, mas também pode repetir a saída de resultados.
Valor padrão é 1.
--sleep=<.> : Opcional | Especifique um valor para segundos de pausa. Isso pode ajudar a reduzir perdas por condição de corrida durante as varreduras, atrasando o ciclo de verificação.
Valor padrão é 0 segundos.
--debug : Opcional | Exiba informações de exceção (ex.: erros de conexão de processo).
--nobanner : Opcional | Suprime o banner de exibição. Útil para executar com o script PowerShell ou para casos de uso que aproveitam automação.
--suppress : Opcional | Não escaneie o processo RogueAssemblyHunter durante --mode=sweep ou --mode=watch.
--help : Opcional | Mostre esta ajuda. Isso substituirá qualquer outro parâmetro de linha de comando e sairá do aplicativo. *Este é o padrão sem parâmetros.
[*] Modos (--mode=)
- sweep : Escaneie/itera através de todos os processos (Nota: Apenas processos de mesma arquitetura/'bitness' serão escaneados com sucesso. Compile para executar para x86/x64/etc.).
- process : Escaneie um único processo. Use com --pid=<PID>.
- watch : Escaneie novos processos quando criados. Ajuste atributos de varredura com --checks e --sleep. (Nota: Isso é experimental. Condições de corrida são prováveis.)
[*] Caças (--hunt=)
- all : Valor padrão. Analise com todas as opções de caça (Exceto 'list').
- memory-only : Caça em memória. Analise módulos CLR que não são suportados por disco.
- unusual-dir : Caça de diretório incomum. Analise módulos CLR carregados fora de diretórios 'normais'.
Edite '_huntUnusualDirectoryFilter' para personalizar.
- sig-status : Caça de assinatura de arquivo. Analise módulos CLR com status de assinatura anômalo (ex.: não assinado). Nota: Isso é experimental. Falsos positivos são possíveis.
Edite '_huntSigExclusionsFilter' para personalizar.
- imposter-file : Caça de módulo CLR inesperado. Analise módulo CLR com suporte de arquivo de disco suspeito. Experimental.
- list : Itere através de todos os módulos CLR e liste de acordo.
[*] Exemplo de Uso
- Exemplo 1 : Escaneie processos e execute todas as caças para processos 64 bits acessíveis (exceto 'list') -
RogueAssemblyHunter_x64.exe --mode=sweep
- Exemplo 2 : Escaneie processos, liste todos os módulos CLR em processos gerenciados 32 bits acessíveis e mostre informações de erro -
RogueAssemblyHunter_x86.exe --mode=sweep --hunt=list --debug
- Exemplo 3 : Observe novos processos, escaneie todos os módulos CLR (se gerenciados e 64 bits), não escaneie o processo RogueAssemblyHunter e faça 2 verificações com um atraso de 3 segundos entre elas -
RogueAssemblyHunter_x64.exe --mode=watch --suppress --checks=2 --sleep=3
- Exemplo 4 : Escaneie um único processo por PID, liste apenas módulos CLR em memória e exporte módulos CLR para o caminho especificado -
RogueAssemblyHunter_x86.exe --mode=process --pid=4650 --hunt=memory-only --export=c:\evilassemblies\
- Exemplo 5 : Escaneie processos, liste apenas módulos CLR em memória para processos 64 bits acessíveis, não escaneie o processo RogueAssemblyHunter e não mostre o banner de título -
RogueAssemblyHunter_x64.exe --mode=sweep --hunt=memory-only --suppress --nobanner
Para conveniência, um script PowerShell junto com dois binários compilados (RogueAssemblyHunter_x64.exe e RogueAssemblyHunter_x86.exe) foram incluídos na pasta \Release. Sinta-se à vontade para modificar para atender aos seus casos de uso (ex.: implantação, incorporação, verificações, pausa, etc.).
Exemplo de Uso:
Execute Invoke-RogueAssemblyHunter no modo sweep e verifique todas as opções de caça
cd c:\path\to\RogueAssemblyHunter
import-module .\Invoke-RogueAssemblyHunter.ps1
Invoke-RogueAssemblyHunter
Execute Invoke-RogueAssemblyHunter no modo watch e verifique todas as opções de caç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