
Windows のローカル権限昇格 (LPE) 脆弱性が、2022 年 9 月 9 日に Andrea Pierini (@decoder_it) 氏と Antonio Cocomazzi (@splinter_code) 氏によって Microsoft に報告されました。この脆弱性により、ホスト上の低権限アカウントを持つ攻撃者が、SYSTEM 権限で任意のファイルを読み書きできるようになります。
この脆弱性自体は SYSTEM としてコマンドを直接実行できるようにするものではありませんが、複数のベクターと組み合わせることでこの結果を達成できます。幸運なことに、2 月 13 日には BlackArrowSec によって StorSvc サービスを悪用する別の権限昇格 PoC が公開されました。これは、攻撃者が PATH 内の任意のディレクトリに DLL ファイルを書き込める限り、SYSTEM としてコードを実行できるようにするものです。
LocalPotato PoC は、NTLM ローカル認証と呼ばれる NTLM 認証の特殊なケースにおける欠陥を利用して、特権プロセスを欺き、攻撃者がローカル SMB サーバーに対して開始したセッションを認証させます。その結果、攻撃者は、欺かれたプロセスの権限で、C$ や ADMIN$ などの特別な共有を含む任意の共有にアクセスできる接続を手に入れることになります。
エクスプロイトが実行するプロセスは次のとおりです。
SMB 共有への特権接続を手に入れることで、攻撃者はターゲットマシン上の任意の場所にあるファイルを読み書きできます。これだけでは脆弱なマシンに対して直接コマンドを実行することはできませんが、別の攻撃ベクターと組み合わせてその目的を達成します。
この脆弱性は SMB サーバーではなく NTLM プロトコルにあることに注意してください。したがって、この同じ攻撃ベクターは、理論上は NTLM による認証を利用する任意のサービスに対して使用できる可能性があります。ただし、実際には、攻撃するプロトコルを選択する際にいくつかの注意点に対処する必要があります。PoC は、同様の攻撃ベクターに対する他のプロトコルの追加保護を回避するために SMB サーバーを使用しており、SMB サーバーに対してエクスプロイトを機能させるための簡単なバイパスも実装しています。 オリジナルのエクスプロイト作者の投稿 - (https://decoder.cloud/2023/02/13/localpotato-when-swapping-the-context-leads-you-to-system/)
これまで、LocalPotato を使用してターゲットマシンに任意のファイルを書き込んできました。特権シェルを取得するには、任意のファイル書き込みを使用してコマンドを実行する方法をまだ見つける必要があります。
最近、攻撃者が欠落している DLL をハイジャックして SYSTEM 権限で任意のコマンドを実行できる、もう 1 つの権限昇格ベクターが見つかりました。このベクターの唯一の問題は、攻撃者がそれをトリガーするためにシステムの PATH に DLL を書き込む必要があることでした。デフォルトでは、Windows の PATH には特権アカウントのみが書き込めるディレクトリだけが含まれます。特定のアプリケーションのインストールによって PATH 変数が変更され、マシンが脆弱になっている場合を見つけられる可能性はありますが、この攻撃ベクターは特定のシナリオにのみ適用されます。この攻撃を LocalPotato と組み合わせることで、この制限を克服し、完全に機能する権限昇格エクスプロイトを実現できます。
StorSvc と DLL ハイジャック
BlackArrowSec によって発見されたように (https://github.com/blackarrowsec/redteam-research/tree/26e6fc0c0d30d364758fa11c2922064a9a7fd309/LPE via StorSvc)、攻撃者は "StorSvc" サービスが提供する "SvcRebootToFlashingMode" メソッドに RPC 呼び出しを送信できます。これにより、最終的に "SprintCSP.dll" と呼ばれる欠落した DLL の読み込み試行がトリガーされます。
RPC に詳しくない場合は、リモートで使用できるように関数を公開する API だと考えてください。この場合、StorSvc サービスは SvcRebootToFlashingMode メソッドを公開しており、マシンにアクセスできる人なら誰でも呼び出すことができます。
StorSvc は SYSTEM 権限で実行されるため、PATH 内のどこかに SprintCSP.dll を作成すると、SvcRebootToFlashingMode への呼び出しが行われるたびにそれが読み込まれます。
エクスプロイトのコンパイル
エクスプロイトリンク - (https://github.com/decoder-it/LocalPotato)
このエクスプロイトを使用するには、まず提供されている両方のファイルをコンパイルする必要があります。
まず "RpcClient.exe" から始めましょう。前述のとおり、ターゲットマシンの Windows バージョンに応じてエクスプロイトを変更する必要があります。これを行うには、"LPE via StorSvc\RpcClient\RpcClient\storsvc_c.c" の最初の行を変更して、正しいオペレーティングシステムが選択されるようにする必要があります。これにより、エクスプロイトが正しい RPC インターフェース識別子を使用するように設定されます。コードを修正したら、開発者コマンドプロンプトを開き、次のコマンドを実行してプロジェクトをビルドしましょう。 コマンド: C:\LPE via StorSvc\RpcClient> msbuild RpcClient.sln C:\LPE via StorSvc\RpcClient> move x64\Debug\RpcClient.exe C:\Users\user\Desktop\ (コンパイルされた実行可能ファイルはデスクトップにあります。)
次に "SprintCSP.dll" をコンパイルするには、"C:\LPE via StorSvc\SprintCSP\SprintCSP\main.c" 内の "DoStuff()" 関数を変更して、マシンへの特権アクセスを許可するコマンドを実行するようにするだけです。簡単にするために、DLL が現在のユーザーを Administrators グループに追加するようにします。ターゲットから自分のマシンへのリバースシェルを取得することもできます。 次のコマンドを実行して DLL をコンパイルし、結果をデスクトップに戻します。 コマンド: C:\LPE via StorSvc\SprintCSP> msbuild SprintCSP.sln C:\LPE via StorSvc\SprintCSP> move x64\Debug\SprintCSP.dll C:\Users\user\Desktop\
これでエクスプロイトを実行する準備が整いました。"LocalPotato.exe" エクスプロイト、"RpcClient.exe"、"SprintCSP.dll" ファイルがあることを確認してください。
検出と緩和策
検出
localpotato エクスプロイトがどのように機能し、StorSrv サービスと連鎖させて SYSTEM としてコードを実行する方法を理解したところで、この攻撃をシステム内でどのように検出し、防止するかを見ていきましょう。
YARA ルール: この攻撃は引数を指定してコマンドラインターミナルで実行される実行可能ファイルを伴うため、この活動を検出する一般的な方法は 2 つあります。パターンマッチングツール YARA を使用してファイルパターンを検出する方法と、このハックツール localpotato.exe の実行によって生成されたイベントを調べる方法です。この攻撃は localpotato.exe として知られるハックツールを使用するため、YARA または THOR などの他の検出ツールを使用してホストをスキャンし、システム内のこのツールの存在を検出する YARA ルールを作成できます。 (YARA ルールはこのリポジトリに添付されています。この最小限のルールは、localpotato 実行可能ファイル内の一般的な文字列パターンを探します。)
Sigma ルール: SIGMA は、イベントログで見つかったパターンに基づいて検出ルールを作成するために使用される汎用シグネチャ言語です。ネットワーク上の localpotato を検出するには、集中ログ監視が有効になっていることが期待されます。次の SIGMA ルールは、SIGMA 公式リポジトリ (https://github.com/SigmaHQ/sigma/blob/master/rules/windows/process_creation/proc_creation_win_hktl_localpotato.yml) から取得したものです。
これらの Sigma ルールは、導入済みの検出/監視ツールに変換し、イベントログを検索して潜在的な攻撃を探すために使用できます。
緩和策