04 - Hunting por Descoberta (Enumeração de rede, usuários)
video: https://youtu.be/... no frontmatter da nota.Hunting por Descoberta (Enumeração de rede, usuários)
Nota 04 do Capítulo 08, "Técnicas de Hunting por TTPs", cobrindo a tática de Descoberta
(TA0007) em ambiente Windows e Active Directory. Dialoga com a nota 02, cujos saltos
costumam suceder a enumeração, com o TH.8 de stack counting, que é a técnica central
desta nota, e com o TH.14 de análise de autenticação e credenciais.
1. Contexto e Posicionamento na Biblioteca
A Descoberta é a tática em que o adversário mapeia o ambiente: usuários e grupos, privilégios, hosts vivos, compartilhamentos e serviços de rede. É também a tática mais barulhenta do ciclo de intrusão, porque todo comando de enumeração é um processo executado, e quase todo mapeamento de diretório é uma consulta LDAP auditável. O trade-off do caçador é oposto ao da evasiva: os eventos são abundantes e fáceis de coletar, mas a maior parte deles é benigna, porque administradores de domínio executam comandos de enumeração todos os dias. O valor do hunting aqui não está em flagrar um evento, está em flagrar cadência, volume e contexto anormais.
A nota estrutura a caça em três camadas. A primeira mapeia os binários e protocolos de enumeração e os eventos que cada um produz. A segunda define os padrões de volume e cadência que distinguem operação administrativa de reconhecimento adversário, com atenção especial ao stack counting do TH.8 como método principal. A terceira apresenta as consultas KQL por família de técnica e um exemplo completo de caça, no qual a pilha de comandos de enumeração por conta e por hora revela um mapeamento de domínio com SharpHound disfarçado de rotina.
2. Técnicas de Descoberta e Telemetria Associada
As técnicas da tática se organizam em três famílias: descoberta de contas e privilégios, descoberta de sistemas e rede, e descoberta de diretório. A tabela consolida as técnicas mais relevantes com seus identificadores ATT&CK e eventos associados.
| Técnica | ID ATT&CK | Comando ou mecanismo típico | Eventos-chave |
|---|---|---|---|
| Account Discovery | T1087, T1087.002 | net user, net group, whoami | Sysmon 1; 4662 em leitura de objetos DS |
| Permission Groups Discovery | T1069.002 | net group /domain, whoami /groups | Sysmon 1; 4662 |
| Remote System Discovery | T1018 | net view, nltest /dclist, arp -a, nbtstat -A | Sysmon 1; 4624 tipo 3 em massa |
| Network Service Scanning | T1046 | varredura de portas e ping sweep | Telemetria de rede, Sysmon 3 |
| Domain Trust Discovery | T1482 | nltest /domain_trusts, [System.DirectoryServices] | Sysmon 1; 4662 |
| Directory enumeration | T1087 e afins | SharpHound, AdFind, ADSI e LDAP puro | 4662 em volume; 4104 |
A dependência crítica desta tática é a auditoria de acesso ao diretório: sem a subcategoria Audit Directory Service Access habilitada na GPO, o evento 4662 não existe, e toda a camada de enumeração LDAP, inclusive DCSync, fica invisível. O inventário do DAT.1 deve registrar essa habilitação por domínio, e a recomendação de engenharia é coletar 4662 filtrando leituras de objetos de baixo valor, pois o volume bruto do evento em domínios grandes inviabiliza a ingestão sem filtro, mas um filtro mal calibrado derruba exatamente os sinais que esta nota usa.
3. Padrões de Volume e Cadência
Operação administrativa e reconhecimento adversário produzem os mesmos binários com distribuições diferentes no tempo, no espaço e na origem. O administrador executa poucos comandos por hora, a partir de hosts de gestão conhecidos, dentro de janelas de expediente, sobre conjuntos previsíveis de objetos. O atacante executa rajadas: dezenas de consultas em minutos, a partir de uma estação de usuário comum, frequentemente fora do horário, tocando objetos nunca lidos pela baseline. A cadência é o sinal mais estável, porque ferramentas ofensivas de enumeração automatizada, SharpHound em particular, geram milhares de leituras LDAP em segundos, sequência impossível de ser confundida com trabalho manual.
Três padrões quantitativos concentram o retorno do caçador. O primeiro é volume por conta e por hora de comandos de enumeração, comparado com a baseline do TH.2. O segundo é diversidade de objetos lidos no diretório, medido pela contagem distinta de ObjectDN no 4662, onde qualquer conta sem função de gestão de identidade que toque milhares de objetos é candidata. O terceiro é a combinação de famílias: nslookup em massa seguido de net view e de varredura de rede na mesma janela descreve reconhecimento em preparação de movimento lateral, e a correlação entre as famílias vale mais que qualquer contagem isolada.
4. Consultas Práticas em KQL
4.1 Execuções de binários de enumeração
A consulta abaixo empilha os binários clássicos de descoberta por host e por conta, em janela horária, expondo rajadas de execução.
Event
| where Source == "Microsoft-Windows-Sysmon" and EventID == 1
| extend X = parse_xml(EventData).DataItem.EventData.Data
| extend Image = tostring(X[4]["@text"]), CommandLine = tostring(X[10]["@text"]),
User = tostring(X[12]["@text"]), ParentImage = tostring(X[20]["@text"])
| extend Binario = tostring(split(Image, "\\")[-1])
| where Binario in~ ("net.exe", "net1.exe", "nltest.exe", "arp.exe", "nbtstat.exe",
"nslookup.exe", "whoami.exe", "systeminfo.exe", "netstat.exe",
"tasklist.exe", "quser.exe", "dsquery.exe", "adfind.exe")
| summarize Execucoes = count(), Hosts = dcount(Computer) by Binario, User, bin(TimeGenerated, 1h)
| where Execucoes >= 20
| order by Execucoes desc
4.2 Enumeração LDAP pelo evento 4662
O 4662 audita leitura de objetos do diretório quando a auditoria de DS Access está habilitada, e a contagem distinta de objetos por conta revela tanto enumeração manual abrangente quanto ferramentas ofensivas. Contas de máquina terminadas em cifrão e contas de sistema dominam o volume benigno e devem ser filtradas antes da agregação.
SecurityEvent
| where EventID == 4662 and ObjectServer == "DS" and TimeGenerated > ago(7d)
| where SubjectUserName !endswith "$" and SubjectUserName !in ("SYSTEM", "NETWORK SERVICE", "LOCAL SERVICE")
| summarize ObjetosLidos = dcount(ObjectDN), Eventos = count() by SubjectUserName, bin(TimeGenerated, 1h)
| where ObjetosLidos >= 500 or Eventos >= 2000
| order by ObjetosLidos desc
4.3 SharpHound, AdFind e ADSI em PowerShell
Ferramentas de mapeamento de domínio expõem assinaturas na linha de comando e no script block logging. A consulta cobre nomes conhecidos e o vocabulário ADSI que enumeration cases usam quando disfarçam o binário.
Event
| where EventID == 1 and Source == "Microsoft-Windows-Sysmon"
| extend X = parse_xml(EventData).DataItem.EventData.Data
| extend CommandLine = tostring(X[10]["@text"]), User = tostring(X[12]["@text"])
| where CommandLine has_any ("SharpHound", "BloodHound", "Shufflehound", "adfind",
"ldapdomaindump", "Get-DomainObject", "Find-LocalAdminAccess",
"Get-DomainUser", "Get-NetGroup")
| project TimeGenerated, Computer, User, CommandLine
Event
| where EventID == 4104 and Source contains "PowerShell"
| where Message has_any ("DirectorySearcher", "System.DirectoryServices.ActiveDirectory",
"(&(objectCategory=", "(&(objectClass=", "GetDirectoryEntry")
| summarize Ocorrencias = count(), Hosts = dcount(Computer) by bin(TimeGenerated, 1h)
| where Ocorrencias >= 10
4.4 Resolução de nomes em massa
Varredura de DNS é precursora direta de movimento lateral, e a contagem distinta de domínios consultados por conta e por hora isola o padrão de nslookup em loop.
DeviceProcessEvents
| where Timestamp > ago(14d)
| where FileName =~ "nslookup.exe"
| extend Dominio = tostring(split(ProcessCommandLine, " ", -1))
| summarize DominiosDistintos = dcount(Dominio), Execucoes = count(), Hosts = dcount(DeviceName)
by AccountName, bin(Timestamp, 1h)
| where DominiosDistintos >= 50
| order by DominiosDistintos desc
5. Diferenciando Administradores de Atacantes
O julgamento de benignidade nesta tática nunca é sobre o comando isolado, é sobre o contexto completo da execução. A tabela organiza os discriminadores que o caçador deve aplicar em cada caso.
| Dimensão | Padrão administrativo | Padrão adversário |
|---|---|---|
| Volume por hora | Baixo, com picos previstos em janelas de rotina | Rajadas de dezenas a milhares em minutos |
| Processo pai | Explorer, console de gestão, agentes | Word, Excel, wscript, cmd filho de injeção |
| Host de origem | Estações de gestão e jump servers da baseline | Estação de usuário comum ou host recém comprometido |
| Objetos tocados | Conjunto estável na baseline | Massa nova de objetos nunca lidos pela conta |
| Horário | Janelas de expediente e rotinas documentadas | Noite, fim de semana ou início abrupto de série |
| Sequência | Comandos isolados com propósito único | Combinações encadeadas de conta, host e rede |
A aplicação da tabela exige humildade estatística: contas de helpdesk e de times de infraestrutura tocam muitos objetos em picos legítimos, e é exatamente por isso que a baseline do TH.2 deve ser construída por população e por função, e não por limiar global. O método recomendado é calibrar a consulta com o time de identidade, remover da pilha as contas com função documentada e investigar o resto, mantendo registro das exceções com data de revisão, como manda a disciplina das whitelists.
6. Exemplo de Caça Completa com Stack Counting
Cenário: caça rotina mensal com a pilha de binários de enumeração por conta e por hora, no espírito do TH.8. A pilha retorna uma conta de analista comercial, sem qualquer função técnica, com 340 execuções de nslookup em 50 minutos em uma estação da filial, seguidas de 120 execuções de net view na mesma janela.
DeviceProcessEvents
| where Timestamp > ago(14d)
| where FileName in~ ("net.exe", "nltest.exe", "arp.exe", "nbtstat.exe", "nslookup.exe")
| summarize Ocorrencias = count(), Dominios = dcount(ProcessCommandLine),
PaiDistinto = dcount(InitiatingProcessFileName) by AccountName, FileName, bin(Timestamp, 1h)
| where Ocorrencias >= 100
| order by Ocorrencias desc
O pivoting segue o roteiro do TH.7: o processo pai dos nslookup é um Excel executado de caminho de usuário, confirmando macro maliciosa; a linha do tempo mostra que duas horas depois da rajada começam logons tipo 3 da mesma conta em três servidores de arquivo, indicando que a descoberta já virou movimento lateral. O caso confirma comprometimento de estação com captura de credenciais em curso, alimenta o IR.x com a lista de máquinas tocadas, gera detecção permanente de net view em rajada por conta não técnica e devolve à inteligência do capítulo 05 a ferramenta empregada, compatível com o arsenal de um grupo do crime financeiro monitorado pela equipe.
7. Erros Comuns e Pontos de Atenção
- Caçar comando de enumeração sem baseline: net user e arp -a são executados por qualquer ambiente Windows em operação, e sem a pilha comparativa toda saída da consulta é ruído não acionável.
- Deixar contas de máquina e de sistema na agregação do 4662: contas terminadas em cifrão e contas de serviço dominam a distribuição e escondem as contas humanas anômalas, que são o alvo.
- Tratar 4662 como evento de escrita: o evento registra acesso a objeto, incluindo leitura, e é justamente a leitura em massa que caracteriza enumeração de diretório.
- Ignorar ferramentas renomeadas: SharpHound executado com nome de dllhost ou empacotado em PowerShell não aparece na busca por nome, e só o volume de 4662 ou o vocabulário ADSI no 4104 o denunciam.
- Medir descoberta apenas por processo: varredura de rede por ferramenta nativa de script pode não gerar Sysmon 1 específico, e a telemetria de rede do Sysmon 3 e do NDR é a fonte complementar obrigatória.
8. Integração com o Restante da Biblioteca
A caça de descoberta é a aplicação mais natural do stack counting do TH.8 e consome as baselines comportamentais do TH.2 e do INS.5 para separar administradores de atacantes. Os padrões confirmados alimentam o TH.14, que aprofunda a análise das autenticações que sucedem a enumeração, e as detecções derivadas entram no capítulo 18 e no DET.x com limiares calibrados pelas pilhas mensais. O comprometimento confirmado abre o IR.x, e a identificação da ferramenta ofensiva retroalimenta o capítulo 05, enriquecendo o perfil técnico dos grupos monitorados e os requisitos de intel do CTI.2.
Uma orientação operacional encerra a nota: descoberta é a tática em que o limiar de priorização erra mais por excesso que por omissão, e a disciplina que protege o programa é calibrar tudo por população e função, documentar cada exceção com data de revisão e revisar a pilha mensalmente, porque funções mudam e os limiares de três meses atrás envelhecem. Essa manutenção contínua das pilhas é o preço baixo de uma tática que, quando bem calibrada, aponta comprometimento semanas antes de qualquer alerta de malware.