CVE 2022–26923 漏洞复现及分析
漏洞信息
漏洞简述
- 漏洞名称:AD域权限提升漏洞
- 漏洞编号:CVE-2022–26923
- 漏洞类型:设计缺陷
- 漏洞影响:权限提升
- CVSS评分:3.1 8.8 / 7.7
- 利用难度:Medium
- 基础权限:需要
漏洞影响
受影响的 Windows 版本:
- Windows 8.1
- Windows 10 Version 1607, 1809, 1909, 2004, 20H2, 21H1, 21H2
- Windows 11
- Windows Server 2008,2012,2016,2019,2022
解决方案
官方已经提供了修补程序: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-26923
漏洞复现
环境搭建
靶机:Windows Server 2019 Standard 17763.379
攻击机:Windows 7 x64 SP1
exp: https://github.com/ly4k/Certipy
配置:证书服务
安装过程按默认配置进行,选择企业 CA(独立 CA 虽然也能实现证书颁发,但是并不会泄露域控证书)。
准备:普通域账号
复现过程
利用 impacket 根据现有账户创建机器账号
修改 servicePrincipalName
修改 DNSHostName
通过 certipy 工具申请证书
通过证书进行认证,获取域控的 NT hash 值
再利用 NT hash 值读取账号信息
获取域控权限
漏洞分析
Active Directory证书服务
Active Directory证书服务简称AD CS,是一种域内认证服务,是公钥基础设施PKI的一个实现,通过发行证书提供了文件加密、数字签名、身份验证等功能。其中,证书颁发机构(CA)负责颁发证书。
证书中包含的信息将身份(主体)绑定到公钥/私钥对。然后,应用程序可以在操作中使用密钥对作为用户身份的证明。证书颁发机构 (CA) 负责颁发证书。
证书申请流程大致过程:
- 客户端创建公钥/私钥对;
- 将公钥与其他信息 (如证书的主题和证书模板名称) 一起放在证书签名请求 (CSR) 消息中,并使用私钥签署;
- CA 首先判断用户是否允许进行证书申请,证书模板是否存在以及判断请求内容是否符合证书模板;
- 通过审核后,CA 生成含有客户端公钥的证书并使用自己的私钥来签署;
- 签署完的证书可以进行查看并使用。
证书模板
默认情况下,域用户可以注册User证书模板,域计算机可以注册Machine证书模板。两个证书模板都允许客户端身份验证。这意味着颁发的证书可以通过PKINIT Kerberos扩展用于针对KDC的身份验证。
两者的主要区别在于申请者身份证明使用的属性不同,User证书模板的身份证明使用用户主体名称(User Principal Name, UPN),而基于Machine证书模板的机器账户将使用dNSHostName
属性作为证明。
用户账户的证书申请 | UPN
用户账户根据模板申请证书时,用户账户的UPN将被嵌入到证书中进行识别。当我们使用该证书进行认证时,KDC会尝试将证书中的UPN映射到用户身上。
User证书模板的msPKI-Certificate-Name-Flag
属性存在一个CT_FLAG_SUBJECT_ALT_REQUIRE_UPN
标志位,用于指示UPN标志
根据MS-ADTS (3.1.1.5.1.3 Uniqueness Constraints),UPN必须具有唯一性。假如我们将win10@winsrv19.com
更改成test1@winsrv19.com
,系统会提示约束冲突错误,因为test1@winsrv19.com
已经被test1
使用了。
机器账户的证书申请 | dNSHostName
基于Machine证书模板的机器账户进行证书申请时需要借助dNSHostName
属性进行验证。CA下发的证书中会嵌入计算机的DNS属性。
dNSHostName
不同于userPrincipalName
,其并不需要确保唯一性,因为在MS-ADTS (3.1.1.5.1.3 Uniqueness Constraints)中只提到了UPN和SPN的唯一性。
在证书模板的msPKI-Certificate-Name-Flag
属性还存在一个CT_FLAG_SUBJECT_ALT_REQUIRE_DNS
标志位,其指示CA将从Active Directory中请求者用户对象的DNS属性获得的值添加到已颁发证书的主题备用名称中。
域控SPN唯一性
通过上面的分析,漏洞点就呼之欲出了:可以通过修改dNSHostName
来伪造高权限用户,直接尝试修改dNSHostName
测试下。
将dre4merpc$
机器账户的dNSHostName
更改为win10.winsrv19.com
,并没有出现不允许操作,而是出现如下错误:
原因是SPN的唯一性,当我们试图将dre4merpc$
机器账户的dNSHostName
属性更新为win10.winsrv19.com
时,域控制器试图更新SPN属性,该属性将被更新为包括RestrictedKrbHost/Win10.winsrv19.com
和HOST/Win10.winsrv19.com
,这将与域控制器的SPN属性冲突。
因此,通过更新dre4merpc$
机器账户的dNSHostName
属性,当域控制器也试图更新dre4merpc$
机器账户的SPN时,我们间接地造成了约束性违反。
我们注意到,当我们更新dNSHostName
时,只有两个值被更新和检查,即RestrictedKrbHost/dre4merpc.winsrv19.com
和HOST/dre4merpc.winsrv19.com
,其中包含dNSHostName
属性值,解决措施就是删除dre4merpc$
机器账户中这两个SPN值,在域控同步更新时不造成冲突
此时,我们使用dre4merpc$
机器账户申请证书时,颁发的证书中将会包含填充篡改后的dNSHostName
,即win10.winsrv19.com
。dre4merpc$
机器账户申请的证书就具备域控的身份了。
参考文献
https://mp.weixin.qq.com/s/yMTnM9mtisCgN-z2KunTNQ
https://research.ifcr.dk/certifried-active-directory-domain-privilege-escalation-cve-2022-26923-9e098fe298f4
http://noahblog.360.cn/active-directory-certificate-services-attack-and-exploit/