** 本記事は、Finding Minhook in a sideloading attack – and Sweden too の翻訳です。最新の情報は英語記事をご覧ください。**
ソフォスは 2023 年後半から 2024 年前半にかけて、複数の地域でお客様を標的とした攻撃キャンペーンを監視しました。試みられた攻撃では Cobalt Strike ペイロードがドロップされ、さらなる活動につながる可能性がありましたが、ソフォスの検出結果から得られた情報から、この活動を単一の脅威アクターによるものだと判断しました。
このキャンペーンには、以下のような注目すべき特徴がありました。
- 当初は東アジアを標的としていたが、スウェーデンに移行
- Windows API コールを迂回する目的で Minhook DLL (Minhook は Windows 用の最小限の API フックライブラリ) を使用
- クリーンローダーはサイドローディングパッケージの一部ではなく、感染したシステムから取得された
- コンポーネントに (有効期限が切れた) 流出したデジタル署名を使用していた
- 最終的なペイロードは Cobalt Strike
調査は終了しましたが、得られた知見から現在も成果がもたらされています。本記事では、詳細な分析結果だけでなく、調査がどのように展開されたかについても解説します。
中国/台湾における初期のインシデント
ソフォスはあるお客様の環境において、1 日の間に 2 つの異なるサイドローディングのシナリオを確認しました。その後、別のお客様で第 3 のシナリオを確認しました。これらのインシデントは関連している可能性があると考えました。なぜなら、暗号化されたペイロードファイルに同じファイル名が使用されており、どちらもペイロードは Cobalt Strike であったからです。しかし、これらのケースでは悪意のあるファイルを回収することはできませんでした。
レトロハンティングを実施したところ、中国と台湾のお客様で類似のインシデントを確認しました。最初のサンプルと報告は、2023 年 12 月 1 日に確認されました。これらの調査中に、3 つの異なるサイドローディングの試みを確認しました。詳細は以下で説明します。
MiracastView サイドローディング
ソフォスの Shellcode/C2Interceptor 緩和策がトリガーされ、Cobalt Strike サーバーに向けたアウトバウンド C2 接続が観測されました。ローダーとして使用された実行ファイルは、Windows 10 のコンポーネントである Miracast ワイヤレスディスプレイサービスでした。
特定したコンポーネントは以下のとおりです。
クリーンローダー:
パス: appdata\\local\\microsoft\\windowsapps\\miracastview.exe ハッシュ: 0bba1b25f7065118fbfd607a123b6c09d8b97ab5be4ca42b56a994188408f7a9
悪意のあるローダー:
パス: appdata\\local\\microsoft\\windowsapps\\miracastview.dll ハッシュ: 402be231f1c9258bb1510962b15c3ea5410e54f97e3269cd6cd4c355822798d1
ペイロードファイル:
appdata\\local\\microsoft\\windowsapps\\syncres.dat appdata\\local\\microsoft\\windowsapps\\dsccorer.mui
以下のアドレスへの C2 接続が観測されました。
note.dnsrd[.]com/list note.googlestaic[.]com/list prdelb.dubya[.]net/list
これらは Cobalt Strike の C2 サーバーです。以下のスニペットには、C2 構成の関連部分が含まれています。
C2Server:note.googlestaic[.]com,/list,note.dnsrd[.]com,/list,prdelb.dubya[.]net,/list UserAgent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CHrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.31 HTTP_Post_URI:/note
残念ながら、悪意のあるローダーとペイロードファイルを回収できませんでした。ただし、ファイル名から、VirusTotal で以下の情報を確認することができました。
db7349a2cf678d5ddbbeb989f0893a146ae536c9169c3940c6caac9cafb3de62: SyncRes.dat
同じファイル名に加え、2 番目のケースの悪意のあるローダーが検索していたエクスポート関数「StartEngineData」も含まれていたため、同じ脅威アクターによる同じコンポーネントであると推測されます。
PrintDialog サイドローディング
ペイロードファイル「dsccorer.mui」が関与するケースを調査した結果、これを発見しました。
ソフォスのテレメトリデータから、このケースのサイドローディング活動の発生元が LetsTalkApplication ツールの正規インストーラー (パス: C:\Program Files (x86)\Letstalk\LetstalkApplication.exe”) であることが判明しました。このシナリオでの最初の配布は、台湾の Letstalk Technology Limited が提供するチャットアプリケーション経由で行われた可能性があります。詳細な情報は入手できませんでした。
図 1: Letstalk アプリケーションファイルのサイドローディング悪用。チャートの円内の略語は、letstalkapplication.exe が 200 件のアウトバウンド IP 接続を確立し、レジストリを 135 回変更し、ファイル操作を自由に (読み取り 200 回、書き込み 154 回) を実行したことを示しています。
特定したコンポーネントは以下の通りです。
クリーンローダー:
パス: appdata\\local\\microsoft\\windows\\printdialog.exe ハッシュ: 138fla466c26675a16b4e9b8660873b89e5d7fc788ce3810bb357db7cb20aee9
悪意のあるローダー:
パス: appdata\\local\\microsoft\\windows\\printdialog.dll ハッシュ: 3f4cac516b8f2ccb6f10042100369c018d8671972fad360977fe522fd47e06c6
ペイロードファイル:
パス: appdata\\local\\microsoft\\windows\\syncres.dat パス: appdata\\local\\microsoft\\windows\\dsccorer.mui
SystemSettings サイドローディング
MiracastView のケースと同時期に、同じお客様の環境で別のサイドローディングシナリオを確認しました。特定したコンポーネントは以下のとおりです。
クリーンローダー:
パス: AppData\Local\Microsoft\Windows\SystemSettings.exe ハッシュ: e768ff1f2f31178fe5930f261acd4b19464acc019fb0aa697d0b48686e59050c
悪意のあるローダー:
パス: appdata\\local\\microsoft\\windows\\systemsettings.dll ハッシュ: b72daf654fc83cd6ccccedbf57a102b48af42f410dbc48f69ec5c8c62545dc18
ペイロードファイル:
appdata\\local\\microsoft\\windows\\wuapi.dat appdata\\local\\microsoft\\windows\\mprapi.dat
このケースでは悪意のあるローダーは回収できたため、wuapi.dat と mprapi.dat のコンテンツを解凍し、その両方の StartEngineData エクスポートを呼び出すことが判明しました。
また、このローダーは、リソースから Minhook DLL を抽出します (SHA256: bddd6adaee8ab13eabaa7c73c97718cee1437db2054ca713ec7cc86e8002a300)。このリソースからの DLL は、https://github[.]com/howmp/pyminhook/raw/master/minhook/MinHook.x64.dll に存在するものと同一です。
図 2: Minhook.x64 DLL の 16 進表示
これは、Minhook を使用して、以下の API 関数をフックします。
- GetProcAddress
- FreeLibrary
- LdrUnloadDll
図 3: API 関数へのフック
これらのフックは、トリガー時に mprapi.dat ペイロードファイルをロードするために使用されます。
スウェーデンとの関連
ソフォスは、回収したサンプルから抽出した情報を使用して、新たなサンプルを発見するための VirusTotal 検索を設定しました。アジア地域に関連する新たなサンプルが見つかることを予想していましたが、意外にも、発見された新たなサンプルの標的は、スウェーデンのユーザーでした。
発見された新しいサンプルはインストーラーでした。インストールされたサイドローディングコンポーネントは、SystemSettings のケースと同様にクリーンローダーと悪意のあるローダーに同じファイル名を使用していますが、ペイロードファイル名は MiracastView/PrintDialog シナリオのものとなっています。
もう 1 つの共通点は Minhook DLL が使用されていることですが、このケースでは悪意のあるローダーではなく、ペイロードファイルによって読み込まれています。
このサンプルを発見したことで、すべてのコンポーネントを収集・分析するだけでなく、前述した 3 つのシナリオ間の新たな関連性を特定することができました。
特定したコンポーネントは以下のとおりです。
クリーンローダー:
Name: GoogleUpdateStepup.exe ハッシュ: f87cb46cac1fa44c9f1430123fb23e179e3d653a0e4094e0c133fa48a924924f
悪意のあるローダー:
名前: SystemSetting.dll ハッシュ: fd93d7a9f884e0b63106e669a10b8faeaaafda49fac05a66d8581c9e9aa31ad3
ペイロードファイル:
Name: DscCoreR.mui ハッシュ: bc56676f0da4b0fba57aaa51d390732e40ef713909e5a70bb30264b724a65921 名前: SyncRes.dat ハッシュ: 47f60c25ab5bb07dc3f65694302991a0796a29021b570a2335acda8196dd2b52
インストーラ―
驚くことに、インストーラーにはデジタル署名が付与されていました。この署名は、韓国のオンラインゲーム開発会社である Gala Lab Corp. のものです。署名の期限はすでに切れていますが、システムクロックを期限切れ ( 2023 年初め) 前に戻すと有効と判定されます。
図 4: 不正に再利用をされている Gala Labs の証明書
要するに、脅威アクターがこの企業のデジタル署名を何らかの方法で不正に取得したようです。ただし、システムクロックが正しい場合には有効期限切れの証明書は無効と表示されるため、攻撃者がなぜ有効期限切れの証明書を使用したのかは不明です。
図 5: システムクロックが正しく設定されている場合、有効期限切れの証明書には警告が表示されます
サンプルは、2023 年の有効期限を大幅に経過した後にコンパイルされています。タイムスタンプによると、これらは実際には 2024 年 1 月 11 日にコンパイルされたものです。つまり、2023 年 12 月 1 日に発見した以前の感染の痕跡よりも後のことです。
攻撃プロセスの最中、コンポーネントはリソースに格納されます (下図参照)。
図 6: コンポーネントを隠蔽
サイドローディングコンポーネントを、次のように %AppData%\Roaming\xwreg\ にドロップします。
bc56676f0da4b0fba57aaa51d390732e40ef713909e5a70bb30264b724a65921 *DscCoreR.mui 47f60c25ab5bb07dc3f65694302991a0796a29021b570a2335acda8196dd2b52 *SyncRes.dat fd93d7a9f884e0b63106e669a10b8faeaaafda49fac05a66d8581c9e9aa31ad3 *SystemSettings.dll 880dea11f75380e300bfd5c8054a655eacb2aa0da2c0d89fef3c32666df9a533 *SystemSettings.exe
サイドローディングファイルは、2 つの圧縮 (zlib 展開) リソースに格納されています。
UMRDPRDAT (リソース ID: 129、SyncRes.dat に抽出) VAULTSVCD (リソース ID: 130、DscCoreR.mui に抽出)
SystemSetting.dll はリソース内に存在せず、.data セクション (こちらも zlib 展開) に格納されています。
図 7: 存在すべきでない場所
興味深いことに、クリーンローダー (SystemSettings.exe) はインストーラーパッケージの一部ではありません。標準コンポーネントであるため、正規のロケーション (%WINDOWS%\ImmersiveControlPanel) から取得し、悪意のあるサイドローディングコンポーネントと共にコピーできます。
図 8: システムに既に存在する素材の通常とは異なる使用
これはかなり珍しいアプローチです。LOLBin は人気が高まっていますが (こちらの記事を参照)、通常、この種の脅威アクターは、操作に必要なすべてのコンポーネントを確実に配信するようにします。
図 6 のテレメトリリソースは、偽の Google Update Setup インストーラーである可能性があります (下図参照)。
7b952d83286157163b655917188b2eaf92a50fe3058922810d47b25eaf6eb9fc: legit GoogleUpdateSetup.exe
図 9: スウェーデン語で目立たないようにインストールを試みる画面。(上はロード画面です。下の画面には「インターネットに接続できません。ファイアウォールを使用している場合は、GoogleUpdate.exe を承認リスト [ホワイトリスト] に追加してください」と表示されます)
インストール中に、Cobalt Strike のビーコンコンポーネントが bostik.cmsnet.se の C2 サーバーに接続します。
クリーンローダー
悪意のあるローダー
悪意のあるローダーは DscCoreR.mui をロード (および一部を解凍) し、ダンプ内のエントリポイント 0x1020 (SetUserProcessPriorityBoost エクスポート) にジャンプします。
サイドローディングコンポーネントの実行チェーンは、次のとおりです。
SystemSettings.exe -> sideloads SystemSettings.dll -> unpacks, loads and calls SetUserProcessPriorityBoost export DscCoreR.mui -> unpacks, loads and calls StartEngineData export SyncRes.dat
DscCoreR.mui
このコンポーネントの内部名は StartRun.dll です。このコンポーネントは、SetUserProcessPriorityBoost 関数をエクスポートしています。
メモリダンプには、圧縮画像が 2 つ含まれています。解凍すると、1 つは Minhook DLL、もう 1 つは Cobalt Strike ビーコンです。SyncRes.dat (次のセクションを参照) をロードした後、StartEngineData エクスポートを検索して呼び出します。Minhook DLL をロードした後、この DLL を使用して、以下の API 関数をフックします。
VirtualAlloc Sleep
図 10: VirtualAlloc 関数のフック
ここでフックされた API 関数は、DscCoreR.mui 内の悪意のあるコードにリダイレクトされます。
図 11: 改変された VirtualAlloc 関数
(迂回関数は何もしていないようです。)フックが成功すると、Cobalt Strike のビーコンを解凍して実行します。
図 12: 実行中
構成データ:
C2Server - bostik.cmsnet.se,/claim/data/jquery-3.3.1.min.aspx HttpPostUri - /claim/data/jquery-3.3.2.min.aspx
SyncRes.dat
このコンポーネントの内部名は Behavior.dll です。StartEngineData 関数をエクスポートしています。
このコンポーネントには、MZ ヘッダーが欠落していると思われる埋め込み圧縮 PE が含まれています。
結論
2024 年初頭にソフォスが記録した一連の事例以降、継続的な活動は確認されませんでした。ここから明確な結論を導き出すことはできませんが、この攻撃が地理的に移動した点、および他の攻撃試行からコンポーネントを再利用している点がは、脅威アクターが目標達成のための新たな手法を模索している可能性を示唆しています。保護策の策定・導入に追われる日常業務の中で、このような一連のイベントを継続的に分析することは容易ではありません。しかし、このような小さな出来事を振り返り、そこから学ぶことは常に役立ちます。