本期作者/ordar123
无需重置计算机帐户即可利用 Zerologon 的方法
什么是Netlogon 协议?
在Active Directory中比较重要的一个服务:”Netlogon”服务,此服务在DC和域成员服务器上运行,为域身份验证提供重要服务,如果此服务停止成员服务器将无法登陆到域中。
客户端和认证服务器之间建立一个基于NETLOGON协议的安全会话有两个目的:一是用于认证;二是用于交换通信秘钥SessionKey。
Netlogon 认证过程简单来说就是是让客户端 (域内计算机)和服务器(域控制器)向分别对方证明他们都知道一个共同的秘密。此共享秘密是客户端计算机帐户密码的散列(其实就是NTLM)。
Netlogon协议身份验证握手过程详细说可以分为以下几个步骤:
-
客户端启动Netlogon会话,客户端和认证服务器通过该会话相互交换随机生成的8字节挑战(挑战就是一个随机数)。
-
客户端和认证服务器,同时使用密钥派生函数(KDF全称Key derivation function)将两个挑战与共享秘密(NTLM)混合来计算出SessionKey。SessionKey=KDF(NTLM,client challenge+server challenge),如果客户端和认证服务器使用的NTLM相同的话,客户端和认证服务器就拥有同一个SessionKey了,这一步是认证的基础。
-
客户端使用SessionKey和客户端挑战使用AES-CFB8算法加密后结果A1发给服务端,然后认证服务器内部使用同样的算法AES-CFB8算法生成A2,如果A1等于A2,那么认证服务器就知道客户端是知道NTLM的,然后客户端在服务器这里就认证通过了。同理,认证服务器使用SessionKey和服务端挑战加密后结果B1发给客户端,客户端内部使用同样的方法生成B2,如果B1等于B2,那么客户端就知道了服务端是知道NTLM的。到这里认证过程就结束了,双方互相认证了对方的身份;同时协商出来了一个加密密钥SessionKey,这样客户端和认证服务器后续的所有消息都使用SessionKey来加密,然后SessionKey来解密对方的消息。
这个过程直接引用网上的图片如下:
ZeroLogon(CVE-2020-1472)
漏洞原理与风险
该漏洞存在一个加密缺陷,其中对于每256个随机生成的密钥中的1个,对由所有0组成的纯文本进行加密将导致也包含所有0的密文。简单来说就是通过将Client challenge置为0的方式来碰撞密文client credential为0的情况,不断重复这个过程直至服务器那端计算出来的密文hash也全是0,从而可以绕过认证过程。详情可以查看ZeroLogon(CVE-2020-1472) 分析与狩猎(https://xz.aliyun.com/t/8367)。
Netlogon协议在Active Directory中主要由工作站和服务器使用,以通过安全通道与域控制器进行通信。因为加入Active Directory的每个工作站或服务器都有一个计算机帐户,Active Directory知道该帐户的密码。Active Directory拥有多个从同一密码派生的密钥,这些密钥可用于Kerberos和NTLM等身份验证协议。
最初的Zerologon攻击的工作原理是将域中域控制器的Active Directory帐户的密码重置为空字符串。这允许攻击者以该域控制器的身份向另一个域控制器甚至同一域控制器进行身份验证。能够以域控制器身份进行身份验证是一项高权限,因为域控制器可以使用DRSUAPI协议同步Active Directory数据,包括NT哈希和Kerberos密钥。反过来,这些密钥可用于模拟域中的任何用户,或创建伪造的 Kerberos 票证。
这其实是有风险的。在Active Directory中重置域控制器计算机帐户密码为空的那一刻,DC 处于不一致状态。因为存储在注册表和内存lsass.exe中的加密计算机帐户密码不会更改。Active Directory中同一帐户的密码现在已更改,这将影响从此域控制器到此域控制器的身份验证。如果重新启动域控制器,则各种服务将不再启动,因为它们想要从Active Directory读取信息。如果执行漏洞利用的速度足够快,则可以从注册表中恢复原始密码,但是任然有风险,这就是为什么不建议在生产环境中利用它的原因。
什么是NTLM中继?
NTLM协议的认证过程分为三步:
-
协商:主要用于确认双方协议版本。
-
质询:就是挑战(Chalenge)/ 响应(Response)。
-
验证:验证主要是在质询完成后,验证结果,是认证的最后一步。
NTLM协议的认证过程如下图所示:
应用服务器在收到用户客户端的认证信息后,由于本身没有存储用户的NT哈希,所以必须依赖域服务器进行认证,将收到的认证信息发送给域服务器,这个过程基于NETLOGON协议。服务器使用 Netlogon RPC 协议将身份验证消息发送到域控制器,该协议将此会话密钥(SessionKey)返回给服务器。如下图所示。
NTLM中继攻击(NTLM Relay)本质上是中间人的利用手法:欺骗客户端向自己发起认证,自己再将完整认证过程转发给服务端,达到绕过挑战响应认证直接获取服务端权限的目的。
-
攻击者让客户端向攻击者服务器发起 NTLM 请求
-
攻击者服务器将客户端的NTLM 请求转发给真实服务器,真实服务端返回challenge
-
攻击者服务器将收到的challenge转发送给客户端
-
客户端返回response,攻击者服务器将response转发送给服务端
-
服务端验证通过,攻击者服务器获得服务端权限
如下图所示:
由此可以得知,如果攻击者控制了任何一台域内主机(域内主机均具有自身主机账号的口令NTLM值),只要能获取此前客户端请求用户发送给应用服务器的认证信息,攻击者就可以向域服务器发起NETLOGON会话,从而获取SessionKey,随后可以发起重放攻击。
什么是DCSync
不同域控制器(DC)之间,每15分钟都会有一次域数据的同步。当一个域控制器(DC1)想从其他域控制器(DC2)获取数据时,DC1会向DC2发起一个GetNCChanges请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync就是利用的这个原理,通过DirectoryReplicationService(DRS)服务的GetNCChanges接口向域控发起数据同步请求。
在默认情况下,只有Administrators、Domain Controllers和Enterprise Domain Admins组内的用户有权限使用DCSync。
以前获取域的账号口令信息,需要登录域服务器,在域服务器上运行代码才可以获取。DCSync的最大特点,在于不用登录域服务器,即可远程通过域数据同步复制的方式获得想要的用户口令信息。
NTLM中继+Zerologon
在Active Directory中,有两种主要身份验证协议:NTLM和Kerberos。Kerberos是去中心化的,基于加密和共享机密工作。NTLM是中心化的,如果使用域帐户认证,则需要与域控制器通信才能工作。这是因为NTLM使用质询-响应身份验证机制,其中对服务器发送的质询执行加密操作,以证明用户拥有其密码(或确切地说是其密码的哈希版本)。对于ActiveDirectory帐户,服务器实际上并不知道尝试进行身份验证的用户的密码是什么,因此它会将其转发给域控制器,域控制器会告诉服务器响应是否适合给定的质询。这种转发实际上是通过Netlogon协议完成的,其中存在Zerologon漏洞。
NTLM协议的一个弱点是,如果攻击者可以诱使用户使用NTLM向他们进行身份验证,则他们可以将身份验证消息转发到其他服务器并模拟此服务器上的用户,这被称为NTLM中继。
“打印机错误”功能允许攻击者通过NTLM触发任何启用了后台处理服务的计算机的身份验证,还可以通过使计算机帐户向攻击者的IP地址而不是主机名进行身份验证来强制使用NTLM进行身份验证,从而使其使用NTLM而不是Kerberos来认证,这为NTLM中继提供了触发条件。
NTLM协议执行身份验证时对消息进行签名和加密的加密密钥称为SessionKey,SessionKey是基于用户的NT哈希和协议中协商的某些属性生成的。这意味着为了计算SessionKey,服务器需要拥有用户的NT哈希。除非服务器是域控制器,否则它不具有该NT哈希。因此,服务器会使用NetlogonRPC协议将身份验证消息发送到域控制器,该协议将此会话密钥返回给服务器。
我们可以使用中继连接直接向DRSUAPI协议的RPC端点进行身份验证,虽然该协议需要签名和加密,但我们可以使用Zerologon获取SessionKey,并遵守与该协议通信的所有加密要求。
所有这些结合在一起,我们有一个全新的攻击,它不依赖于重置机器帐户的密码来利用。它确实具有原始攻击所没有的一些先决条件,尽管这些先决条件默认存在,并且可能在大多数AD中起作用:
-
触发打印机bug需要一个帐户
-
打印后台处理程序服务应在DC上运行
-
DC应该容易受到Zerologon的攻击
-
域中至少应有2个DC,因为中继回同一DC不起作用
最终流程如下图所示:
攻击实践
实验环境
Zerologon漏洞
漏洞复现
这里使用poc直接验证,如下图所示,证明DC1存在zerologon漏洞,并且成功dump出域控hash。
NTLM中继+Zerologon
环境搭建
接下来恢复快照,恢复DC到zerologon利用之前的快照。
然后搭建DC2
1.先设置DNS为DC的ip
2.加入域rangenet.cn,同时将计算机名改成dc2。
3.重启之后搭建域环境
选择Active Directory 域服务,然后将此服务器提升为域控制器。这个过程相比大家都比较熟,这里就简化步骤了,只截图关键部分。
选择将域控制器添加到现有域,然后更改操作所需凭据,凭据为主域控DC的账号密码。后面都是下一步就完了,之后会重启,重启之后输入的是主域控DC的账号密码。
这样在同一个域(rangenet.cn)中就会有两个域控,接下来将两个域控互相设为备份。
4.互相设置DNS名称服务器
进入主域控DC,然后打开DNS管理器。在正向查找区域中找到rangenet.cn,然后右键选择属性,选择名称服务器选项卡,然后添加新的名称服务器。
然后将备域控DC2的域名和ip填进去。
进入DC2,做同样的操作,将DC的名称服务器添加进去。
这样主域控DC和备域控DC2就互相冗余了。
漏洞复现
因为DC和DC2互为主备,所以随便选一个进入,然后创建一个普通域用户user。这个普通域用户user是用于win10域成员登录的。
假设我们事先拿下了win10域成员,然后在win10上拿到了rangenet/user的账号密码。
1.在kali上开启NTLM中继,中继目标是主域控DC,中继成功之后直接执行DCSYNC来dump域控凭据。脚本会同时开启SMB、HTTP、WCF、WAW服务用来执行NTLM中继。
2.在使用printbug攻击DC2,使DC2强制使用NTLM登录kali,这样kali就能通过NTLM中继拿到sessionkey。
3.通过NTLM中继+zerologon漏洞组合利用,模拟DC2$机器账户的身份,使用zerologon绕过NETLOGON协议认证,然后使用窃取到session key,再调用DRSUAPI执行DCSYNC操作,以DC2$的身份向DC请求同步凭据,然后域内凭据就被dump出来了。
之后凭据可以用来登录任意域控或域成员。
总结:这是一种无须重置域控密码即可使用zerologon漏洞攻击域控或提权的方法,但是利用条件又比直接zerologon漏洞攻击多出了许多。利用条件需要双域控同时需要一个域成员账号密码,但是没有重置密码的风险。
zerologon漏洞只需要域控主机名和ip即可利用,利用条件简单,但是一旦将域控密码置空就会造成域控脱域。因为在Active Directory中重置域控制器计算机帐户密码为空的那一刻,DC 处于不一致状态。因为存储在注册表和内存lsass.exe中的加密计算机帐户密码不会更改,但是Active Directory中同一帐户的密码现在已更改,这将影响从此域控制器到此域控制器的身份验证。如果重新启动域控制器,则各种服务将不再启动,因为它们想要从Active Directory读取信息。
原文始发于微信公众号(蛇矛实验室):NTLM中继+Zerologon漏洞利用的方法