
Gerador de Ofuscação de Comandos do Cmd.exe & Estrutura de Teste de Detecção

O Invoke-DOSfuscation é uma framework de ofuscação de comandos cmd.exe compatível com PowerShell v2.0+. (White paper: https://www.fireeye.com/blog/threat-research/2018/03/dosfuscation-exploring-obfuscation-and-detection-techniques.html)
Ao longo dos últimos anos como consultor de Resposta a Incidentes, testemunhei uma infinidade de técnicas de ofuscação e evasão empregadas por vários atores de ameaças. Algumas dessas técnicas são incrivelmente complexas, enquanto outras são elegantemente simples, mas ambas as categorias são usadas para evitar detecção. Na minha experiência, constatei que APT32 e FIN7 são os que utilizam as técnicas de ofuscação mais atraentes e sua criatividade é notável.
Em junho de 2017, após uma série de técnicas incrementais de ofuscação de linha de comando, o FIN7 usou uma capacidade de substituição de strings de variáveis de ambiente nativa do cmd.exe que, na época, eu nem sabia que existia. Impulsionado por essa descoberta, coescrevi um post no blog com Nick Carr (@ItsReallyNick) intitulado Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques, onde destacamos as técnicas de ofuscação de vários grupos que identificamos na natureza.
No fim de semana seguinte, explorei essa funcionalidade de substituição nativa do cmd.exe e construí e lancei uma ferramenta simples de Prova de Conceito chamada Out-FINcodedCommand. Assim que lancei essa POC, recuei e pensei: "Talvez existam mais capacidades de ofuscação dentro do cmd.exe que eu deva explorar e construir detecções antes de descobrirmos seu uso na natureza."
Esse foi o início da minha pesquisa que, eventualmente, me levou a desenvolver esta framework Invoke-DOSfuscation.
Os atacantes estão cada vez mais usando técnicas de ofuscação para evitar detecções baseadas fortemente em valores de argumentos de linha de comando. Para combater isso, passei cinco meses pesquisando e desenvolvendo técnicas de ofuscação e codificação nativas do cmd.exe, para que eu pudesse criar detecções robustas para essas técnicas principais que ainda não vi sendo usadas na natureza.
O único propósito desta framework é permitir que defensores gerem aleatoriamente milhares de comandos de amostra exclusivamente ofuscados para testar e ajustar suas capacidades de detecção contra essas técnicas. Incluí meu harness de teste completo nesta versão para automatizar esse processo de teste de detecção.
De muitas maneiras, esta framework permite que defensores façam fuzzing das técnicas de ofuscação do cmd.exe e, ao construir esta ferramenta, descobri inúmeras oportunidades adicionais de ofuscação que não encontrei em minha pesquisa inicial.
Também compartilhei essas informações com a Microsoft em novembro de 2017 e perguntei sobre oportunidades para expor maior visibilidade sobre o funcionamento interno do cmd.exe no uso das técnicas principais que são os blocos de construção de todas as funções de ofuscação incorporadas nesta framework.
Como defensor, o objetivo final desta pesquisa e desenvolvimento é aumentar a conscientização e impulsionar mudanças que ajudem os usuários finais a se protegerem melhor contra as TTPs (Ferramentas, Técnicas e Procedimentos) em constante evolução dos atacantes.
Embora todos os componentes de ofuscação sejam construídos como funções formais
independentes, a maioria dos usuários considerará a função Invoke-DOSfuscation como a
maneira mais fácil de explorar e visualizar as técnicas de ofuscação que esta
framework suporta. Para fuzzing e exploração aprofundada das inúmeras opções de
ajuste para cada categoria de ofuscação, no entanto, é recomendado que as
funções individuais sejam usadas diretamente fora do wrapper da função
Invoke-DOSfuscation.
Para permitir que defensores comecem facilmente a fazer fuzzing e testar ideias de detecção, esta
framework também inclui um módulo adicional, Invoke-DOSfuscationTestHarness.psm1,
que é importado automaticamente com o restante do projeto. As duas funções principais
neste módulo para defensores são:
Invoke-DosTestHarness - Gera (com configurações de argumento padrão) mais de 1000 comandos ofuscados aleatoriamente
a partir de uma lista de comandos de teste, tanto para integridade do payload quanto para propósitos de detecção. Cada iteração
do harness de teste randomiza todos os argumentos de função disponíveis e chama as quatro funções
de ofuscação diretamente, em vez de usar os valores mais padronizados de -ObfuscationLevel (1-3)
que a função orientada por menu Invoke-DOSfuscation usa por padrão. Isso produz uma gama significativamente mais
ampla de saída de ofuscação contra a qual se pode construir detecções mais completas. Cada comando ofuscado
é então verificado contra a segunda função:Get-DosDetectionMatch - Verifica um comando de entrada (string) contra todos os valores de detecção regex
inseridos no array $regexDetectionTerms na função. Isso é chamado automaticamente por
Invoke-DosTestHarness, mas também pode ser chamado de forma independente.Ao final de cada invocação do harness de teste, estatísticas para execução adequada do comando e detecção serão exibidas para que os defensores possam identificar rapidamente quais comandos têm 0 ou apenas 1-2 correspondências de detecção e quais podem precisar de melhor cobertura.
Finalmente, para evitar que os defensores precisem executar o harness de teste para começar, forneci
1000 comandos de amostra no diretório Samples
divididos entre cada uma das quatro funções de ofuscação. Os formatos incluem arquivos .txt e arquivos .evtx do Security e Sysmon. Incluí algumas
regras de detecção de amostra no array $regexDetectionTerms em Invoke-DOSfuscationTestHarness.psm1,
mas você vai querer adicionar e testar muitas mais regras ao testar os comandos ofuscados de amostra).
Além dos arquivos .txt com os comandos brutos, há arquivos .evtx contendo os logs de execução
de processo (eventos Sysmon EID 1) para cada um dos 1000 comandos de amostra. Esses logs de eventos são extremamente
úteis para construir indicadores baseados em execuções de processos filho diferenciados que são subprodutos
de várias técnicas de bloco de construção sobre as quais o Invoke-DOSfuscation é construído.
Para começar, exiba comandos ofuscados de amostra que não correspondem a nenhuma de suas regras de detecção atuais simplesmente executando:
(Get-Content .\Samples\STATIC_1-of-4_Out-DosConcatenatedCommand.txt) | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
Para testar tanto comandos ofuscados quanto processos filho de logs de eventos de execução registrados no Security EID 4688, execute:
(Get-WinEvent -Path .\Samples\DYNAMIC_SECURITY_EID4688_1-of-4_Out-DosConcatenatedCommand.evtx) | where-object { $_.Message } | foreach-object { ($_.Message.Split("`n") | select-string '^\tProcess Command Line:\t') -replace '^\tProcess Command Line:\t','' } | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
O código-fonte do Invoke-DOSfuscation está hospedado no Github, e você pode baixá-lo, fazer fork e revisá-lo a partir deste repositório (https://github.com/danielbohannon/Invoke-DOSfuscation). Por favor, reporte problemas ou solicitações de funcionalidades através do rastreador de bugs do Github associado a este projeto.
Para instalar:
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
O Invoke-DOSfuscation é distribuído sob a licença Apache 2.0.
v1.0 - 2018-03-23 Black Hat Asia (Cingapura): Lançamento Público do Invoke-DOSfuscation.