在默认情况下,加入域的Windows工作站是可以通过锁屏页面来访问网络选择的用户界面。因此,可以物理访问具有WiFi功能的、处于锁屏状态的设备(例如,笔记本电脑或工作站)的攻击者可以滥用这个功能,强制笔记本电脑针对恶意访问点进行身份验证,并捕获域计算机帐户的MSCHAPv2质询响应的哈希值。
然后,攻击者只需将这个质询响应的哈希值提交到crack.sh站点,便可以在24小时内恢复计算机帐户的NTLM哈希值。
一旦恢复NTLM哈希值,再结合域SID就可以伪造Kerberos的白银票据,以模拟特权用户并控制主机。举例来说,攻击者可以为笔记本电脑的CIFS服务创建一张白银票据,以便通过SMB认证为SYSTEM用户,从而获得对硬盘的无限制访问权限。
由于可以从处于锁屏状态的设备执行攻击,因此,攻击者可以利用它来绕过BitLocker全磁盘加密并获得对设备文件系统的访问权限。
此外,由于可以为特权用户伪造白银票据,因此,攻击者也可以利用该攻击将自身的权限提升为设备上的本地管理员权限,具体可以参考下面的演示视频:
https://shenaniganslabs.io/images/airstrike/video.mp4
受影响的版本
目前我们已经确认该漏洞存在于加入域的Windows 10主机上。
此外,Windows的早期版本也可能会受到影响,但尚未经过测试。
背景知识
对于熟悉企业无线网络的读者来说,可能早就听说过受保护的可扩展身份验证协议协议(Protected Extensible Authentication Protocol,PEAP)。实际上,这是一种隧道式身份验证协议,这意味着首先需要与RADIUS服务器建立SSL隧道(称为阶段1),以保护在身份验证(阶段2)期间发送的凭证数据。
Windows环境中使用的最常见的内部身份验证方法之一是MSCHAPv2。实际上,MSCHAPv2协议已经存在了很长时间了,并且存在一些严重的密码学方面的缺陷。
该研究的结果是提供了crack.sh服务,该服务能够将任何给定的MSCHAPv2质询响应的哈希值(无论密码的复杂度如何)都恢复为NTLM哈希值。
在Windows环境中,当域用户使用PEAP协议通过MSCHAPv2对无线接入点进行身份验证时,所产生的质询响应的哈希值实际上来自域用户密码的NTLM哈希值。
除了域用户身份验证之外,Windows还提供了使用机器/计算机身份验证(Machine/Computer Authentication)的选项,以便让设备在域用户登录之前对无线网络进行认证。
计算机身份验证是为了解决设备能够访问活动目录并对域用户进行身份验证之前,首先需要对网络进行认证这一“先有鸡后有蛋”的问题的:为了给用户创造一个无缝的体验,在用户登录设备之前,从锁屏页面进行身份验证。
计算机身份验证可以使用客户端证书或MSCHAPv2作为它的内部认证机制。在使用客户端证书的情况下,可以使用为域计算机账户签发的证书进行身份验证。但如果计算机身份验证使用PEAP和MSCHAPv2时,该如何处理呢?在这种情况下,可以使用域计算机账户的NTLM哈希值进行身份验证。
计算机帐户密码通常很复杂,很长并且是随机生成的。我们通常无法恢复该帐户的纯文本密码,但是,这又有什么关系呢?虽然我们无法恢复纯文本密码,但是借助于crack.sh服务,我们仍然可以恢复NTLM的哈希值呀!
计算机帐户的NTL哈希值在Windows域环境中具有特殊意义,因为它们与Kerberos的白银票据有关——使用计算机帐户的NTLM哈希值可以对由计算机托管的服务(例如CIFS服务)的Kerberos服务票据进行签名和加密。
为了伪造服务票据,我们需要以下信息:
- 计算机帐户的NTLM哈希值
- 我们想获得的服务名称
- 域SID
一旦利用crack.sh服务恢复了计算机帐户的NTLM哈希值,如果再加上域SID,我们就可以伪造自己的票据了。好消息是,域SID并不是秘密信息,可以供任何常规域用户获取。
权限提升:从域用户到本地管理员
为了将上面的漏洞武器化,我们首先需要创建一个支持PEAP的恶意接入点,并将MSCHAPV2设置为内部认证方式。实际上,目前已经有很多工具可以实现这个功能,这里我们使用的是hostapd-mana。
需要注意的是,为了允许后续版本的Windows 10连接到接入点,需要使用可信的CA来签署RADIUS服务器证书。否则的话,将导致Windows 10请求方出现一个模糊的 “连接失败”错误提示。
在这里,我们将使用LetsEncrypt通过以下命令来实现这一点(注意:证书上的服务器名称是无关紧要的,只需由受信任的权威机构对其进行签名即可)。
# Generate LetsEncrypt certificates
sudo snap install --classic certbot
sudo certbot certonly --standalone -d radius.breakfix.co
生成证书后,我们重命名它们以使hostapd配置更好理解,并生成相应的DH参数。
# Rename certificates to work with hostapd
cp /etc/letsencrypt/live/radius.breakfix.co/fullchain.pem ca.pem
cp /etc/letsencrypt/live/radius.breakfix.co/privkey.pem server.key
cp /etc/letsencrypt/live/radius.breakfix.co/cert.pem server.pem
# Generate DH params
openssl dhparam 2048 > dhparam.pem
然后,我们创建一个”hostapd.conf”文件,其内容如下所示:
interface=$WIRELESS_INTERFACE_HERE
ssid=Airstrike
hw_mode=g
channel=6
wpa=3
wpa_key_mgmt=WPA-EAP
wpa_pairwise=TKIP CCMP
auth_algs=3
ieee8021x=1
eapol_key_index_workaround=0
eap_server=1
eap_user_file=hostapd.eap_user
ca_cert=ca.pem
server_cert=server.pem
private_key=server.key
private_key_passwd=
dh_file=dhparam.pem
mana_wpe=1
而“hostapd.eap_user”文件的内容如下所示:
* PEAP,TTLS,TLS,MD5,GTC
"t" GTC,TTLS-MSCHAPV2,MSCHAPV2,MD5,TTLS-PAP,TTLS-CHAP,TTLS-MSCHAP "1234test" [2]
完成上面的操作后,就可以通过命令./hostapd hostpad.conf来运行hostpad-mana了。此时,攻击者可以强制笔记本电脑通过锁屏页面连接到接入点(这时看不到证书的报错消息),从而捕获计算机帐户的MSCHAPV2质询响应的哈希值,具体如下所示:
由于MSCHAPv2要求接入点也知道相应的密码,所以在这个阶段无线认证将会失败,但质询响应的哈希值将被正确捕获。
小结
在本文中,我们为读者详细介绍了CVE-2021-28316漏洞的背景知识,并展示了实现本地提权的过程,在本文的下篇中,我们将为继续读者深入介绍如何恢复HTML哈希值等重要知识点。
(未完待续)