
Native Image Cache内のDLLをハイジャックしてUACをバイパスする
ユーザーアカウント制御(UAC)をバイパスして昇格(管理者)特権を取得し、任意のプログラムを高整合性レベルで実行します。

ByeIntegrityをより高速、軽量、かつ信頼性の高いものにアップデートすることにしました。これは大幅な見直しであるため、VSソリューション内に「ByeIntegrity2021」という新しいプロジェクトを作成しました。これが本攻撃手法のアップデート版です。もちろん、オリジナル版も引き続き利用可能です。新バージョンの詳細については、以下の詳細を展開してください。
新しいバージョンでは、NICに既にインストールされているネイティブイメージに依存せずにNICを乗っ取ることができるようになりました。これは、独自のネイティブイメージ記述子とペイロードを作成し、それらをNICに移動することで実現しており、以下の要件が不要になります。
NGEN.exeによって生成された既存の*.niイメージCLRは、各エントリを再帰的にディレクトリスキャンし、その*.auxファイルを読み取ることでNICからネイティブイメージを読み込みます。このファイルには、ネイティブイメージとその依存関係に関する情報が含まれています。AUXファイルの情報に基づき、CLRはイメージを読み込むか拒否し、次の候補に進みます。有効な候補が見つからない場合は、標準イメージを読み込み、jitを使用して通常通りコンパイルします。実際のネイティブイメージのどの部分も読み取られない(存在確認のみ行われる)ため、ByeIntegrityはペイロードDLLをネイティブイメージと同じ名前で配置するだけです。
アップデート版のByeIntegrityにはAUXGenというツールが付属しており、GACからアセンブリの名前を受け取り、対応するAUXファイルを生成します。このAUXファイルはCLRのチェックに一致するように生成され、CLRはAUXファイルで記述された「ネイティブイメージ」を読み込みます。注意:AUXGenはAUXファイル生成時に依存関係を処理しません。CLRがイメージを読み込むために必要な最低限のことだけを行います。AUXファイル形式の詳細は後日公開します。
ByeIntegrityはUACMeと同様にISecurityEditorを使用するようになり、必要なコード量が削減されました。また、アセンブリMMCExのAUXファイルを生成し、ByeIntegrityと同じディレクトリに配置する必要があります。MMCExはそのロード順序と短い名前により、現在ターゲットとなっているイメージです。
ByeIntegrityは、ネイティブイメージキャッシュ(NIC)にあるDLLを乗っ取ります。NICは、.NET FrameworkがNgen(.NET Frameworkネイティブイメージジェネレーター)などのプログラムから生成された最適化された.NETアセンブリを保存するために使用されます。Ngenは通常、タスクスケジューラを通じて現在のユーザーが管理者権限で実行するため、NICは管理者グループのメンバーに対して変更アクセスを許可します。
Microsoft管理コンソール(MMC)のWindowsファイアウォールスナップインは.NET Frameworkを使用しており、初期化時にNICのモジュールがMMCプロセスに読み込まれます。MMC実行可能ファイルはAutoElevate(WindowsがUACプロンプトなしでプロセストークンを自動的に昇格させるメカニズム)を使用します。
ByeIntegrityは、NIC内の特定のDLLであるAccessibility.ni.dllを乗っ取ります。このDLLの.textセクションにある適切なサイズのパディング領域にシェルコードを書き込み、DLLのエントリポイントをそのシェルコードを指すように更新します。DLL読み込み時に、エントリポイント(実際にはシェルコード)が実行されます。シェルコードはkernel32!CreateProcessWのアドレスを計算し、管理者として実行されるcmd.exeの新しいインスタンスを作成し、単にTRUEを返します。これはDLL_PROCESS_ATTACH理由の場合のみで、その他の理由では即座にTRUEを返します。
この攻撃手法は、UACMeではメソッド #63 として実装されています。この攻撃を試したい場合は、まずUACMeを使用してください。攻撃自体は同じですが、UACMeはNICを変更するために異なる方法を使用しています。ByeIntegrityはIFileOperationを使用するのに対し、UACMeはISecurityEditorを使用します。さらに、UACMeはシステムに適切なAccessibility.ni.dllを選択し、必要に応じてシステムメンテナンスタスクを実行します(NICコンポーネントを生成するため)。一方、ByeIntegrityは存在する最初のNICエントリを選択するだけで(MMCが使用している正しいエントリであるとは限らない)、システムメンテナンスタスクを実行しません。ByeIntegrityにはUACMeよりもかなり多くのコードが含まれているため、ByeIntegrityのコードを読むよりもUACMeの実装を読む方がはるかに理解しやすいでしょう。最後に、ByeIntegrityは攻撃中に子プロセスを起動しますが、UACMeは起動しません。
tl;dr: UACMeはByeIntegrityよりもシンプルで効果的なので、まずUACMeを使用してください。
これを読んでいるなら、おそらくソースコードのコンパイル方法はご存知でしょう。ただし、これはx86を全く考慮してテストも設計もされておらず、おそらくx86では動作しないことに注意してください。
UACMeと同様に、このリポジトリにコンパイル済みバイナリをアップロードすることは決してありません。 世界を混乱させ破壊したいと考える人々は常に存在し、彼らがこれを他人のコンピュータで実行して意図的な損害を与えるための簡単な手段を提供したくありません。また、スクリプトキディがこの攻撃を、その内容や引き起こす可能性のある損害を理解せずに使用することも望んでいません。
この攻撃はWindows 7 (7600) から最新版のWindowsまで動作します。