
アイコンを使用してエクスプローラープロセスにDLLを注入する
これは、Windowsのアイコン変更ダイアログを利用した、Windows ExplorerへのDLLインジェクション技術です。
ユーザーを騙して、悪意のあるDLLをエクスプローラプロセスに読み込ませることができます:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
さらに、別のプロセスからエクスプローラへDLLを注入するためにも使用できます:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
DLLはコードを含むだけでなく、アイコンのようなリソースを保存するためにも使用されます。デモでは、デフォルトのアイコンがshell32.dllに保存されていることがわかります:

実際には、最新のWindowsバージョンでは、それらはshell32.dll.muiに保存されていますが、それでもshell32.dllとして表示されます
エクスプローラプロセスがダイアログ内のDLLに保存されているすべてのアイコンを表示できるようにするには、DLLをメモリに読み込んで解析できるようにする必要があります。
さらに、WindowsのDLLには、省略可能なDllMain関数を定義する機能があります。この関数は、LoadLibrary関数とFreeLibrary関数を使用してDLLが読み込まれたり解放されたりするときに呼び出されます。
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
つまり、DllMain関数を持つDLLがエクスプローラによって読み込まれると、DllMain関数で定義されたコードがエクスプローラのメモリ内で実行されることになります。
そして、これこそがまさにここで行われていることです。さらに、DLLはアイコンとして偽装されています:
「アイコン」は実際には.ico拡張子を持つ単純なDLLファイルであり、Resource Hackerを使用して追加されたアイコンリソースとともに電卓アプリを開きます。(アイコンはVisual Studioでも追加できます)
フォルダビューでのアイコンの表示にはいくつかの異常があります。私は2つの異なるWindows 10バージョン(最新版とより古いバージョン)とWindows 11でこれをテストしました。
両方のWindows 10バージョンで、拡張子が.icoに変更されたとき、DLL内に保存されたアイコンは表示されませんでした

ただし、最新のWindows 10バージョンでは、フォトアプリで「アイコン」を開こうとするまでは動作しました。それ以来、それを再現することはできていません。

Windows 11では、偽装されたDLLはエクスプローラビューで通常のアイコンと同様に表示されました。ただし、フォトアプリで開くとエラーが表示されます。
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
ユーザーを騙して手動でDLLを読み込ませることに加えて、攻撃者はこの技術を使用してDLLファイルをエクスプローラプロセスにプログラム的に注入するオプションもあります:
まず、一時ディレクトリにフォルダが作成され、SHObjectPropertiesを使用してフォルダのプロパティが開かれます。システム言語に依存せずにウィンドウのハンドルを取得するために、開いているすべてのウィンドウで一意のフォルダ名をチェックするコールバック関数とともにEnumWindowsが使用されます。

プロパティページを通じてアイコン変更ダイアログが呼び出され、そのハンドルもEnumWindowsで取得されます。最後に、アイコンパスがDLL(この場合は.ico拡張子を持つ)に変更され、OKボタンが押された後にエクスプローラがDLLを読み込むことになります。
これは、通常のDLLインジェクションAPIを使用しないため、ExplorerプロセスにDLLを注入する非常にステルスな方法です。ただし、2つの短いポップアップが表示されますが、それほど邪魔にはなりません。そのため、脅威アクターが正当なエクスプローラプロセスを介してコードを実行したり、UMDルートキットを読み込んだりするためのAV回避技術として使用される可能性があります。
また、.icoファイルに偽装したDLLを拡散することは、興味深い攻撃ベクトルになる可能性があります。
正しいウィンドウハンドルを取得するために、Visual StudioとともにインストールされるツールであるSpy++を使用しました。

美しいフォルダアイコンを提供してくれたMicrosoftのBill G.氏に感謝します!
美しいインジェクションアイコンを提供してくれた、インターネット上の名無しの人物に感謝します!