
Internal Monologue Attack: LSASSに触れずにNTLMハッシュを取得する
Benjamin Delpy(@gentilkiwi)が開発したMimikatzは、よく知られたポストエクスプロイテーションツールであり、攻撃者がプレーンテキストパスワード、NTLMハッシュ、Kerberosチケットをメモリから抽出したり、pass-the-hash、pass-the-ticket、ゴールデンチケットの作成などの攻撃を実行することを可能にします。間違いなく、Mimikatzの主な用途は、LSASSプロセスメモリからユーザー資格情報を取得し、ポストエクスプロイテーションの横方向の移動に使用することです。
最近、MicrosoftはWindows 10 EnterpriseおよびWindows Server 2016にCredential Guardを導入しました。これは仮想化ベースのセキュリティを使用してシークレットを分離し、Mimikatzがメモリから直接ハッシュを取得するのを防ぐのに非常に効果的です。 また、Mimikatzはほとんどのエンドポイント保護ソリューションの主要なターゲットとなっており、それらはMimikatzの検出と防止に非常に積極的です。これらの取り組みは最終的には失敗する運命にありますが、次第に厄介なものになっています。
NetNTLMは、主にKerberosがサポートされていない環境で使用されるWindowsのチャレンジレスポンスプロトコルです。NetNTLMでは、サーバーがクライアントにランダムな8バイトのnonceをチャレンジとして送信し、クライアントはNTLMハッシュ(ユーザーのパスワードのMD4ハッシュ)をキーとしてチャレンジを処理したレスポンスを計算します。NetNTLM認証プロトコルには2つのバージョンがあり、どちらも特定の攻撃に対して脆弱です。当然ながら、バージョン1はバージョン2よりもはるかに弱く、そのためWindows Vista/2008以降、NetNTLMバージョン1はデフォルトで無効になっています。
NTLMハッシュはレスポンスを計算するためのキーであるため、攻撃者はPass the Hashのために被害者のプレーンテキストパスワードを必ずしも入手する必要はありません。したがって、Mimikatzを使用してLSASSメモリからハッシュを取得することは、プレーンテキストパスワードを盗むこととほぼ同等です。 Chris Hummelは2009年にこのテクニックを説明した記事を公開し、それを「Pass the Hash」と名付けました [https://www.sans.org/reading-room/whitepapers/testing/crack-pass-hash-33219]。
Defcon 2012で、Moxie MarlinspikeとDavid HultonはNetNTLMv1に対する「Divide and Conquer」攻撃を発表しました [https://www.youtube.com/watch?v=sIidzPntdCM]。NetNTLMv1では、クライアントは8バイトのチャレンジを受信し、NTLMハッシュの異なる部分をキーとしてDESを使用して3回暗号化することでレスポンスを計算します。DESのキー長は実質的に56ビット(7バイト)ですが、NTLMハッシュは16バイトです。NetNTLMv1はまずNTLMハッシュの最初の7バイトをキーとしてチャレンジを暗号化し、次にNTLMハッシュの次の7バイトをキーとしてチャレンジを暗号化し、最後にNTLMハッシュの最後の2バイトにnullバイトをパディングしたものをキーとしてチャレンジを暗号化します。これは実質的に、NetNTLMv1のチャレンジとレスポンスが与えられた場合、攻撃者は2つの56ビットDES鍵をクラックする必要があり、これは単一の128ビット鍵をクラックするよりも指数関数的に容易であることを意味します。 MoxieとHultonはこのタスクのためにカスタムハードウェアを開発し、24時間以内にDES鍵空間全体をブルートフォースすることに成功し、妥当な時間内にNTLMハッシュの取得を保証しました。 辞書攻撃やパスワードに対するブルートフォース攻撃とは異なり、この攻撃はNTLMハッシュの取得を保証することに注意してください。
ToorConがhttps://crack.shで実証したように、選択したチャレンジ(例: 0x1122334455667788)に対するすべての可能なNetNTLMv1レスポンスについて完全なレインボーテーブルを作成することが可能であり、これにより与えられたレスポンスに対するNTLMハッシュを数分以内にクラックできます。その意味は、選択したチャレンジに対するNetNTLMv1レスポンスをキャプチャすれば、ほぼ瞬時に対応するNTLMハッシュに変換でき、Pass the Hashのためにパスワードを取得するのとほぼ同等であるということです。
Mimikatzは通常、攻撃者がターゲットホストへの昇格したアクセスを取得した後に実行されます。この時点で、攻撃者はLMCompatibilityLevelなどのレジストリキーも変更でき、これはホストがNetNTLMv1とNetNTLMv2のどちらをネゴシエートするかを指定します。攻撃者は値を0、1、または2に変更してクライアントとしてNetNTLMv1を有効にし、その後、クライアントのレスポンスをキャプチャする不正なSMBサーバーに対して認証を試みることができます。Optivのブログ記事で説明されています [https://www.optiv.com/blog/post-exploitation-using-netntlm-downgrade-attacks]。
さらに2つの設定が、被害者がNetNTLMv1レスポンスをネゴシエートするのを防ぐ可能性があります:
Mimikatzを実行すべきではないセキュアな環境では、攻撃者はInternal Monologue Attackを実行できます。この攻撃では、SSPIを介してユーザーモードアプリケーションからNTLM認証パッケージ(MSV1_0)へのローカルプロシージャコールを呼び出し、拡張NetNTLMダウングレードを実行した後、ログオンしているユーザーのコンテキストでNetNTLMレスポンスを計算します。
Internal Monologue Attackのフローは以下の通りです:
最近、Credential Guardが有効な環境でInternal Monologueを再テストしましたが、否定的な結果を得ました。初期テスト中に私のテスト環境でCredential Guardが正しく機能していなかったのか、それともその後何かが変わったのかはわかりません。 実装を更新し、AcceptSecurityContextから動的にサーバートークンを取得し、それを改変してローカル認証トラップを回避するようにしました。これにより、拡張セッションセキュリティなしのNetNTLMv1が失敗した場合でも、少なくともNetNTLMv2チャレンジレスポンスをキャプチャできるようになります。
Internal Monologue Attackは、保護されたプロセスにコードを注入したりメモリをダンプしたりする必要がないため、Mimikatzを実行するよりもステルス性が高いと言えます。 NetNTLMv1レスポンスはローカルでNTLM SSPと対話することによって引き出されるため、ネットワークトラフィックは発生せず、選択したチャレンジも容易には見えません。 ログに成功したNTLM認証イベントは記録されません。 NetNTLMダウングレードのためのレジストリ変更やトークンの窃取/他のユーザーの偽装は、指標を引き起こす可能性があります。
このツールは、Internal Monologue AttackをC#で実装した概念実証です。コードをPowerShellに移植すると、監査証跡の特定のイベントログが他のものに置き換わる可能性があります。 PoCコードは完璧には程遠いです。積極的な貢献と改善を歓迎します。
The Missing Link SecurityのElad Shamir