
PoC de pré-auth para o CVE-2026-41089, estouro de pilha (stack overflow) no Netlogon CLDAP via UDP/389, causando o crash do LSASS/reinicialização do DC. Inclui script de exploit, análise de causa raiz, detecção e orientações de mitigação.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Execução Remota de Código no Windows Netlogon via Estouro de Buffer de Pilha no CLDAP
Um único pacote UDP forjado para a porta 389 causa estouro de um buffer de pilha de 528 bytes dentro do LSASS em qualquer Controlador de Domínio Windows sem patch. O LSASS trava. O DC reinicia em cerca de 60 segundos. Nenhuma credencial é necessária.
| Vetor de Ataque | UDP 389 (CLDAP), pré-autenticação, zero credenciais |
| Impacto | Travamento do LSASS, reinicialização do DC, potencial RCE |
| CWE | CWE-121 (Estouro de Buffer Baseado em Pilha) |
| Vetor CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publicado | 12 de maio de 2026 pela Microsoft |
python3 poc.py 10.0.50.21 corp.local
O PoC envia um ping normal e, em seguida, um ping de estouro com um nome de usuário de 130 caracteres, e então verifica se o DC sobreviveu. Cerca de 10 segundos no total.
Versões do Windows Server que atuam como Controladores de Domínio:
NlGetLocalPingResponse aloca um buffer de pilha de 528 bytes e o entrega a BuildSamLogonResponse. Essa função chama NetpLogonPutUnicodeString para gravar nome do servidor, nome do domínio, GUIDs e o nome de usuário controlado pelo atacante no buffer.
O bug: NetpLogonPutUnicodeString recebe um comprimento máximo em bytes, mas o interpreta como uma contagem de WCHAR. Cada string gravada por esse caminho ocupa o dobro do espaço esperado. O campo "User" no filtro CLDAP (até 130 wchars, 260 bytes no fio) empurra a gravação combinada para além do limite de 528 bytes.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| Flag | Descrição | Padrão |
|---|---|---|
-l | Comprimento do nome de usuário em caracteres |
# Connectivity test (short username, no overflow)
python3 poc.py 10.0.50.21 corp.local
# Default overflow attempt
python3 poc.py 10.0.50.21 corp.local -l 130
# Larger payload, longer timeout for slow networks
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Python 3.8+. Nenhum pacote de terceiros.
O estouro causa um DoS (travamento do LSASS, reinicialização do DC). A corrupção da pilha pode permitir RCE, mas este PoC permanece no DoS.
Rede. Procure por solicitações de busca CLDAP cujo atributo de filtro "User" tenha mais de 20-30 caracteres. Pings normais do localizador de DC usam nomes curtos de contas de serviço.
Host. Observe travamentos do LSASS vinculados a netlogon.dll (Event ID 1000). Ative o log de depuração do Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 reduz pela metade o comprimento máximo do nome de usuário)Legal. Este código existe para pesquisa e educação em segurança autorizadas. Teste apenas em sistemas que você possui ou para os quais tenha permissão escrita para testar. O acesso não autorizado a sistemas de computação viola a CFAA e leis equivalentes na maioria das jurisdições.
| Versão do Servidor | Corrigido em |
|---|
| 2012 / 2012 R2 | Somente patches ESU |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
| 130 |
-t | Tempo limite de recebimento UDP (segundos) | 5 |
-d | Atraso entre o estouro e a verificação de atividade (segundos) | 3 |