SOC Prime Bias: Médio

06 Jan 2026 18:50

Do Código à Cobertura (Parte 2): O Pesadelo do Espaço em Branco

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Seguir
Do Código à Cobertura (Parte 2): O Pesadelo do Espaço em Branco
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O artigo explica como os filtros LDAP produzidos pelas ferramentas do Impacket são normalizados pelo Active Directory de formas que introduzem espaços inconsistentes em ID de Evento 1644 logs. Essas mudanças de formatação podem quebrar detecções que dependem de correspondência exata de strings, mesmo quando a lógica subjacente do filtro é idêntica. O autor mostra por que a lógica básica de “contém” é frágil e passa por uma construção de detecções Sigma resilientes usando expressões regulares que toleram diferenças de espaçamento, mudanças de maiúsculas e variações de operadores.

Investigação

Para validar o problema, o autor revisou registros reais do Evento 1644 de produção e documentou múltiplas permutações de espaço em branco do mesmo filtro LDAP bit a bit (por exemplo, variantes de userAccountControl&524288 com diferentes espaçamentos, posicionamento de parênteses e formatação). Diversas abordagens de detecção foram testadas — começando com verificações de string estáticas e progredindo para padrões regex cada vez mais flexíveis — até que a regra correspondesse de forma confiável a todas as representações observadas sem alarmes falsos.

Mitigação

Adote detecções baseadas em regex que permitam espaço em branco opcional, suporte à correspondência sem distinção de maiúsculas/minúsculas e contemple ambos estilos de operador AND/OR. Para manter o desempenho razoável, prefiltre o nome do atributo alvo antes de aplicar a lógica regex mais cara. Finalmente, valide continuamente as detecções com um corpus “mural da vergonha” curado que capture todas as variantes de espaço em branco e formatação vistas no campo.

Resposta

Quando um filtro LDAP suspeito é acionado, notifique o SOC para avaliar atividade potencial de descoberta de privilégios ou enumeração relacionada a escalonamento. Correlacione o evento com o host/IP de origem, usuário solicitante e outros atributos LDAP para determinar intenção e escopo. Caso ocorram falsos positivos, ajuste limites e condições da regra enquanto preserva a cobertura para variantes de formatação conhecidas.

Fluxo de Ataque

Ainda estamos atualizando esta parte. Inscreva-se para ser notificado

Notifique-me

Execução de Simulação

Pré-requisito: A Verificação Preliminar de Telemetria & Base de Referência deve ter sido aprovada.

Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e buscar gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa & Comandos de Ataque:
    Um adversário com credenciais de domínio de baixo privilégio deseja localizar contas privilegiadas para movimento lateral. Eles criam um filtro LDAP que realiza um AND bit a bit em userAccountControl para isolar contas com a flag ADMINISTRATOR (valor 524288). Para escapar de uma correspondência simples de string, eles adicionam espaço em branco extra e parênteses exatamente como a regra Sigma espera.

    1. Construa a string de filtro LDAP com variações de espaço em branco.
    2. Execute a busca LDAP usando ldapsearch (via PowerShell) contra o controlador de domínio.
    3. Verifique se o Log de Eventos de Segurança registra o Evento 1644 contendo o filtro elaborado.
  • Script de Teste de Regressão:

    # --------------------------------------------------------------
    # Simular filtro LDAP bit a bit que deve acionar a regra Sigma
    # --------------------------------------------------------------
    
    # Parâmetros
    $DomainController = "dc01.example.com"
    $BaseDN = "DC=example,DC=com"
    $Filter = "(   userAccountControl   &   524288   )"
    $Attributes = "distinguishedName,samAccountName,userAccountControl"
    
    # Execute a consulta LDAP
    try {
        $result = [ADSI]"LDAP://$DomainController/$BaseDN"
        $searcher = New-Object System.DirectoryServices.DirectorySearcher($result)
        $searcher.Filter = $Filter
        $searcher.PropertiesToLoad.AddRange($Attributes.Split(','))
        $searcher.PageSize = 1000
    
        $entries = $searcher.FindAll()
        foreach ($entry in $entries) {
            $dn = $entry.Properties["distinguishedname"][0]
            $sam = $entry.Properties["samaccountname"][0]
            $uac = $entry.Properties["useraccountcontrol"][0]
            Write-Output "Found: $sam ($dn) – UAC=$uac"
        }
    } catch {
        Write-Error "LDAP query failed: $_"
    }
  • Comandos de Limpeza:

    # Nenhuma alteração persistente foi feita; apenas feche a conexão ADSI.
    Write-Output "Limpeza completa."