
PoC de preautenticación para CVE-2026-41089: desbordamiento de pila en Netlogon CLDAP a través de UDP/389, que provoca el bloqueo de LSASS y el reinicio del DC. Incluye script del exploit, análisis de causa raíz, detección y guía de mitigación.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Ejecución remota de código en Windows Netlogon mediante desbordamiento de búfer de pila en CLDAP
Un solo paquete UDP manipulado al puerto 389 desborda un búfer de pila de 528 bytes dentro de LSASS en cualquier controlador de dominio de Windows sin parchear. LSASS se bloquea. El DC se reinicia en unos 60 segundos. No se necesitan credenciales.
| Vector de ataque | UDP 389 (CLDAP), pre-autenticación, cero credenciales |
| Impacto | Bloqueo de LSASS, reinicio del DC, posible RCE |
| CWE | CWE-121 (Desbordamiento de búfer en la pila) |
| Vector CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publicado | 12 de mayo de 2026 por Microsoft |
python3 poc.py 10.0.50.21 corp.local
El PoC envía un ping normal, luego un ping de desbordamiento con un nombre de usuario de 130 caracteres, y después comprueba si el DC sigue vivo. Unos 10 segundos en total.
Versiones de Windows Server que actúan como controladores de dominio:
| Versión del servidor | Corregido en |
|---|---|
| 2012 / 2012 R2 | Solo parches 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 |
NlGetLocalPingResponse asigna un búfer de pila de 528 bytes y se lo pasa a BuildSamLogonResponse. Esa función llama a NetpLogonPutUnicodeString para escribir el nombre del servidor, el nombre de dominio, los GUID y el nombre de usuario controlado por el atacante en el búfer.
El error: NetpLogonPutUnicodeString recibe una longitud máxima en bytes pero la interpreta como un recuento de WCHAR. Cada cadena escrita a través de esta ruta ocupa el doble del espacio esperado. El campo "User" del filtro CLDAP (hasta 130 caracteres anchos, 260 bytes en la red) empuja la escritura combinada más allá del límite 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]
| Opción | Descripción | Predeterminado |
|---|---|---|
-l | Longitud del nombre de usuario en caracteres | 130 |
-t | Tiempo de espera de recepción UDP (segundos) | 5 |
-d | Retardo entre el desbordamiento y la comprobación de actividad (segundos) | 3 |
# 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+. Sin paquetes de terceros.
El desbordamiento provoca una denegación de servicio (bloqueo de LSASS, reinicio del DC). La corrupción de la pila podría permitir RCE, pero este PoC se limita a la denegación de servicio.
Red. Busca solicitudes de búsqueda CLDAP con un atributo de filtro "User" de más de 20-30 caracteres. Los pings normales de localización de DC usan nombres de cuenta de servicio cortos.
Host. Observa los bloqueos de LSASS relacionados con netlogon.dll (ID de evento 1000). Activa el registro de depuración de Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 reduce a la mitad la longitud máxima del nombre de usuario)Legal. Este código existe para la investigación y educación de seguridad autorizadas. Prueba únicamente contra sistemas que poseas o para los que tengas permiso por escrito. El acceso no autorizado a sistemas informáticos viola la CFAA y las leyes equivalentes en la mayoría de las jurisdicciones.