██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Windows Netlogon 通过 CLDAP 栈缓冲区溢出实现远程代码执行
一个精心构造的 UDP 数据包发往端口 389,即可溢出任意未打补丁的 Windows 域控制器上 LSASS 内部的 528 字节栈缓冲区。该进程崩溃。域控制器约 60 秒后重启。无需任何身份验证。
| 攻击向量 | UDP 389 (CLDAP),预认证,零凭据 |
| 影响 | LSASS 崩溃、DC 重启、潜在 RCE |
| CWE | CWE-121(基于栈的缓冲区溢出) |
| CVSS 向量 | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 发布时间 | 2026 年 5 月 12 日 by Microsoft |
python3 poc.py 10.0.50.21 corp.local
三个阶段:正常 ping 确认 DC 存活,使用 130 字符用户名的溢出 ping,存活检测。整个过程约需 10 秒。
每个作为域控制器运行的 Windows Server 版本:
NlGetLocalPingResponse 分配一个 528 字节的栈缓冲区并将其传递给 BuildSamLogonResponse。该函数调用 NetpLogonPutUnicodeString 将服务器名称、域名、GUID 以及攻击者控制的用户名写入缓冲区。
漏洞在于:NetpLogonPutUnicodeString 接收一个以字节为单位的最大长度,但将其视为 WCHAR 计数。通过此路径写入的每个字符串所占空间是预期的两倍。CLDAP 过滤中的 "User" 字段(最多 130 个 wchar,线路上 260 字节)将合并写入推过 528 字节边界。
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528 字节栈缓冲区
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // 字节/WCHAR 大小混淆
python3 poc.py <target_ip> <domain_name> [options]
| 标志 | 描述 | 默认值 |
|---|---|---|
-l | 用户名字符长度 | 130 |
-t | UDP recv 超时(秒) | 5 |
# 连通性测试(短用户名,无溢出)
python3 poc.py 10.0.50.21 corp.local
# 默认溢出尝试
python3 poc.py 10.0.50.21 corp.local -l 130
# 更大 payload,针对慢速网络使用更长超时
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
需要 Python 3.8+。无需第三方包。
溢出触发拒绝服务(LSASS 崩溃,DC 重启)。通过栈损坏实现 RCE 在理论上可行。此 PoC 不尝试执行代码。
网络. 扫描 CLDAP 流量,查找 "User" 过滤属性超过 20-30 个字符的搜索请求。正常的 DC 定位器 ping 使用服务帐户名称(短字符串)。
主机. 监控与 netlogon.dll 相关的 LSASS 崩溃(事件 ID 1000)。启用 Netlogon 调试日志:
nltest /dbflag:0x2080ffff
mov edx, 0x40 将最大用户名长度减半)法律声明. 此代码仅供授权的安全研究和教育使用。仅对你拥有或已获得明确书面许可的系统进行测试。未经授权访问计算机系统违反了 CFAA 及大多数司法管辖区的等效法律。
| 服务器版本 | 修复版本 |
|---|
| 2012 / 2012 R2 | 仅 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 |
-d |
| 溢出与存活检测之间的延迟(秒) |
| 3 |