
Wdigest メモリへのパッチ適用による Credential Guard バイパス
Adam Chester(@_xpn_)氏が、UseLogonCredentialを有効にし、Wdigestがクリアテキスト資格情報をキャッシュさせるためのメモリパッチに関する記事「Exploring Mimikatz - Part 1 - WDigest」を執筆しており、その内容に強い興味を持ちました。
LSASSプロセスに読み込まれるwdigest.dllモジュールには、2つの興味深いグローバル変数があります。g_fParameter_useLogonCredentialとg_IsCredGuardEnabledです。その役割は名前だけで明らかですが、前者はクリアテキストのパスワードをメモリに保存するかどうかを決定するために使用され、後者はモジュール内のWindows Defender Credential Guardの状態を保持します。そして、これらの2つのグローバル変数の値をメモリ内でパッチすることにより、Credential Guardが有効なシステムでもWdigestの平文パスワードキャッシュを有効化できます。
より詳細な分析については、私のブログ「Revisiting a Credential Guard Bypass From Wdigest」をお読みください。
Credential Guardの保護が有効なシステムで、私たちが作成したPOCを実行します。ユーザーが再度ログインするためにユーザー名とパスワードを入力すると、下図のように平文のパスワードを再び取得できます。
BypassCredGuard.exe

実際には、2020年8月には早くもTeam Hydra(@N4k3dTurtl3)がブログで「Bypassing Credential Guard」という記事を公開し、この非常に巧妙でシンプルなトリックについて解説し、概念実証となるCredGuard_PoCを簡単に公開しました。ただし、すべてのWindowsシステムで動作するわけではありません。
Team Hydraはこの問題についてMicrosoftに報告を送り、次のような回答を受け取りました:
"この問題を調査した結果、これはCredential Guardのバイパスではないと考えています。Credential Guardは、この機能が有効な間にキャッシュされた資格情報を保護するためのものです。特権ユーザーがCredential Guardを無効にした場合、この機能はそれ以降のログオンを保護することはできません。この動作を明確にするため、公開ドキュメントを更新します。"
この回答を踏まえると、当分の間は、Credential Guardが有効なシステムでクリアテキスト資格情報を取得するための信頼できる方法であり続けるのではないかと考えています。