Forense

Hunting de Living-off-the-Land Binaries no Windows com KQL

Por Equipe Basilisk ·

Queries KQL prontas para Microsoft Defender e Sentinel cacando abuso de LOLBins como rundll32, mshta e certutil em ambientes reais.

Um atacante competente nao precisa derrubar binario assinado pela Microsoft no disco da vitima: ele usa o que ja esta la. Rundll32, mshta, certutil, bitsadmin e regsvr32 sao ferramentas legitimas que o Windows carrega assinadas pela propria Microsoft, o que faz com que muitos EDRs tratem execucoes deles como ruido. A equipe Basilisk passou os ultimos seis meses analisando 47 incidentes em clientes brasileiros e em 31 deles havia ao menos um LOLBin no kill chain. Este post entrega as queries KQL que usamos no Microsoft Defender for Endpoint e no Sentinel para transformar essas execucoes em deteccoes acionaveis sem afogar o SOC em falso positivo.

Antes de escrever uma regra, e preciso entender o baseline do ambiente. Rodamos um hunt amplo em DeviceProcessEvents agrupando por FileName e contando execucoes em 30 dias por host, identificando o que e normal naquela frota. Em um cliente de varejo com 8.200 endpoints, mshta.exe aparecia em apenas 0,4% das maquinas, todas de marketing rodando um relatorio legado. Isso significa que qualquer execucao de mshta fora desse grupo merece um alerta P2. Essa abordagem de raridade estatistica e a base do hunting moderno e dialoga diretamente com o que descrevemos em Threat Hunting com Sigma e Elastic: Do Indicador a Regra de Deteccao, onde mostramos a passagem do indicador bruto para regra Sigma versionada em Git.

A query base que recomendamos para rundll32 com command line suspeita e: DeviceProcessEvents | where FileName =~ 'rundll32.exe' | where ProcessCommandLine has_any ('javascript:', 'shell32.dll,Control_RunDLL', 'mshtml,RunHTMLApplication', '.cpl,', 'url.dll,OpenURL') | where InitiatingProcessFileName !in~ ('explorer.exe', 'svchost.exe') | project Timestamp, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName. Em testes contra a tecnica T1218.011 do MITRE ATT&CK ela pegou 9 de 10 execucoes do Cobalt Strike beacon em modo SMB pivot. O ajuste fino vem na exclusao de processos pais legitimos por departamento, algo que documentamos com mais cuidado em Adversary Emulation com Caldera e MITRE ATT&CK em Lab Corporativo.

Certutil merece capitulo proprio. Ele e o canivete suico do atacante porque baixa arquivo (-urlcache), decodifica base64 (-decode) e gera hash. Nossa query cacadora e: DeviceProcessEvents | where FileName =~ 'certutil.exe' | where ProcessCommandLine has_any ('-urlcache', '-decode', '-decodehex', '-ping', 'http://', 'https://') | where ProcessCommandLine !contains 'CertificateServices' | extend Stage = case(ProcessCommandLine has '-decode', 'staging', ProcessCommandLine has 'http', 'download', 'recon'). Em 2025 vimos certutil sendo usado como segundo estagio em campanhas que comecaram com phishing de macro, fluxo que descrevemos do lado ofensivo em Initial Access Simulado: Macros, LNK e ISO em Lab Windows 11 Isolado e que do lado azul precisa correlacionar com eventos 4688 do AD.

Para mshta e regsvr32 (scriptlets remotos, T1218.010), a logica muda. Mshta executando URL e quase sempre malicioso fora de help systems, entao DeviceProcessEvents | where FileName =~ 'mshta.exe' | where ProcessCommandLine matches regex @'https?://|\\\\[A-Za-z0-9.-]+\\' gera taxa de falso positivo abaixo de 2% na maioria das frotas que medimos. Combine com DeviceNetworkEvents na mesma janela de 60 segundos usando join no DeviceId e ReportId para confirmar que a conexao saiu mesmo do processo suspeito. Esse tipo de correlacao multi-tabela e o que separa hunt de mineracao de log e conecta direto com as tecnicas de Lateral Movement em Lab: SMB, WMI e WinRM com Foco em Deteccao, onde o atacante encadeia LOLBins via WMI remoto.

Bitsadmin, msiexec /i http e wmic format remoto formam o trio que mais escapa de regras padrao. Para msiexec, nossa heuristica favorita usa ProcessVersionInfoOriginalFileName para detectar binarios renomeados, algo que ferramentas como Sliver fazem por default. Veja a discussao em Construindo Infra de C2 com Sliver em Lab Isolado para Estudo Defensivo para entender o lado do operador. No Sentinel, materializamos esses hunts em Analytics Rules com entity mapping em Account e Host, frequencia de 5 minutos e supressao de 1 hora por entidade, o que mantem o ruido controlado. Sempre exportamos a logica para Sigma para portabilidade entre SIEMs, mesma filosofia de Purple Team na Pratica: Construindo Ciclo de Feedback Red x Blue.

Para fechar com pratica imediata: hoje mesmo rode no seu tenant a query DeviceProcessEvents | where Timestamp > ago(30d) | where FileName in~ ('rundll32.exe','mshta.exe','certutil.exe','regsvr32.exe','bitsadmin.exe','msiexec.exe') | summarize Total=count(), Hosts=dcount(DeviceName) by FileName, bin(Timestamp, 1d) | order by Timestamp desc. O resultado e o seu mapa de baseline. Tudo que fugir desse padrao em 3 desvios padroes vira candidato a regra. LOLBin nao se elimina, se observa com disciplina, e quem trata baseline como produto vivo detecta intrusoes em horas em vez de meses.

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly