Mustang Pandaは、偽の「Browser Updater」と多段階LNK–PowerShellローダーを組み合わせ、正規のG DATAアンチウイルスバイナリを悪用してPlugXをサイドロードする攻撃を行っています。最終的にはハードコードされたC2サーバーにHTTPS経由でビーコン通信を行い、多層暗号化とAPIハッシュを駆使して設定情報や文字列を隠蔽しています。
Mustang Pandaは中国系のAPTグループであり、政府機関や外交機関を標的としたスパイ活動においてPlugXリモートアクセス型トロイの木馬(RAT)との関連で長く知られています。
PlugXはプラグインベースの拡張機能、リフレクティブローディング、暗号化された設定ブロブをサポートするモジュール型RATであり、各キャンペーンで高い適応性を発揮します。
今回確認された侵害チェーンでは、攻撃者がまずWindowsショートカット(LNK)を武器化しています。このLNKはPowerShellを隠しモードで起動し、%LOCALAPPDATA%などユーザーが書き込み可能なパスにペイロードを展開します。
PowerShellはアーカイブ(例:ZIPや無害なドキュメントに偽装した圧縮ファイルなど)を解凍し、偽のブラウザ更新プログラム(Browser_Updater.exe)をドロップした上で、実行を正当化するための偽のUIを被害者に表示します。
この「ブラウザ更新」テーマは、Mustang Pandaグループが繰り返し使用する誘い文句として記録されており、多くの場合、会議招待状やポリシーをテーマにしたフィッシングコンテンツと組み合わされています。
ユーザーが偽のアップデーターの「インストール」をクリックすると、Browser_Updater.exeはステージングサーバーにHTTP GETリクエストを送信し、実際はMSIインストーラーであるにもかかわらず「iis.jpg」のような紛らわしい名前で提供されるペイロードを取得します。

Blue CyberがGBhackersと共有したレポートによると、同グループはLNKファイル、PowerShell、DLLサイドローディング、偽のソフトウェアアップデーターなど、配信メカニズムを継続的に変化させていることが示されています。
MSIは%LOCALAPPDATA%配下のユーザーごとのディレクトリに3つのファイルセットをドロップします。内訳は、正規の署名済み実行ファイル、悪意のあるDLL、そしてPlugXのコアとなる暗号化された.datペイロードです。
Mustang PandaによるLNKの悪用
検知を回避するため、Mustang PandaはPlugXの長年の手法であるDLLサイドローディングに依存しています。ドロップされる実行ファイルは、完全な電子署名を持つ正規のG DATAアンチウイルスコンポーネント(Avk.exe)です。これはコアインプラントとしてではなく、純粋にローダーのホストとして悪用されています。
Avk.exeは同じディレクトリ内のコンパニオンDLL(Avk.dll)を見つけてロードし、そのエクスポートされたエントリーポイントの一つを呼び出します。これにより、悪意のあるライブラリが完全な制御を握りながら、外部から見たプロセスチェーンは表面上は無害に見えます。
Avk.dllはチェーンを継続するために最低限のロジックのみを実装しています。具体的には、DJB2スタイルのハッシュを使って実行時にWindows APIを解決し、隣接する.datファイルへの難読化されたパスを読み取り、そのファイルを読み取り・書き込み・実行(RWX)権限を持つバッファにロードします。

このDLLはバッファを直接呼び出す代わりに、RtlRegisterWait経由でスレッドプールコールバックとして登録した後、イベントをシグナルします。これにより、ntdllのワーカースレッドが攻撃者の制御するコードにジャンプし、RWX実行の真の起源を隠蔽します。
AVKTray.datファイルは暗号化されたシェルコードコンテナであり、.dat「データ」ファイルが実際には次の段階のローダーを保持するというPlugXに共通のパターンです。初期スタブはシングルバイトXORキーでファイルの大部分を復号し、その後、制御フローフラット化によって保護された複雑なルーチンに実行を引き渡します。これにより静的逆コンパイルが困難になっています。
そのルーチンは埋め込まれたペイロードに対してさらなる変換を実施し、ハッシュの組み合わせとローテート左のような単純な演算を使用することで、インポートや文字列を平文で露出させることなくヘルパー関数を解決します。
設定情報とC2の文字列はマッピングされたイメージ内に平文で保存されているのではなく、実行時にのみ復号される専用ブロブとしてエンコードされています。
fn_worker_thread_entry_10001290内では、マルウェアは現在のコマンドラインを取得し、argv/argcに分割した後、引数の数に基づいて実行ブランチを選択します。


アナリストは、短いASCIIパスフレーズをキーとするRC4暗号化された設定領域を確認しています。RC4レイヤーの後、個々のワイド文字列フィールドにはさらにXORパスが適用されます。このため、初期復号後のメモリスキャンでも、ドメイン、ミューテックス名、インストールパスが即座に判明することはありません。
PlugXのコアローダーはマニュアルPEマッパーとして機能し、ユーザー空間でWindowsローダーの役割を再現しています。
現在の戻りアドレスから後方にスキャンしてMZおよびPEシグネチャを検索することで自身のインメモリPEイメージを特定し、新しい領域を割り当て、ヘッダーとセクションをコピーし、インポートを解決し、再配置を適用した後、マッピングされたエントリーポイントを異なる理由で2回呼び出してランタイムに移行します。
分析をさらに困難にするため、この段階ではDJB2ハッシュから19ビット左ローテートベースのハッシュに切り替えてKERNEL32、NTDLL、および重要なAPIを解決します。これにより、それ以前のハッシュスキームに基づく単純なシグネチャ検出が無効化されます。
割り当てられる領域は実際のイメージサイズよりも意図的に大きくなっており、厳密なサイズの実行可能マッピングを検索するヒューリスティックを妨害する効果があります。
マッピング後、ローダーは命令キャッシュをフラッシュし、永続化とC2通信を担う長期稼働のコントローラーとなるワーカースレッドを確立します。
マッピングされたPlugXペイロードは初回起動時にプロセスのコマンドライン引数を確認し、単一の引数を伴ってステージングディレクトリから起動された場合、3つのファイルセットを%PUBLIC%\GData配下のより安定したパスにコピーします。
このフォルダにG DATAのブランド名を使用するのは、「名前空間に寄生する」手法(living-off-the-namespace)です。管理者がざっと確認した際に、そのフォルダが正規のアンチウイルスソフトウェアに関連するものと思い込む可能性があります。
インストール後、マルウェアはHKCU\Software\Microsoft\Windows\CurrentVersion\RunにRunキーを書き込み、値名にはG DATAのブランドに合わせた名前を設定します。
このコマンドは%PUBLIC%\GData内に再配置されたAvk.exeを2つの追加数値引数付きで指定しており、自動起動時の実行ブランチが初回インストール実行とは異なるものになるよう設定されています。これにより、自身の重複インストールも回避されます。
ログオン時、インプラントはミューテックスを作成して単一インスタンスの実行を強制し、SetUnhandledExceptionFilterにパッチを当てて外部の例外処理や監視メカニズムを無力化します。
コントローラーへの接続前に、PlugXランタイムはHKCU\Software\Classesのサブキーにクライアント識別子を初期化して保存し、この値をセッションをまたいで安定した被害者IDとして再利用します。
次にHKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settingsからユーザーのプロキシ設定を読み取り、既存のネットワーク設定に合わせることで異常を目立たなくします。
アウトバウンド接続の構築時には、最新のEdge/Chromeに似たUser-Agent文字列を生成し、WinHTTPセッションをHTTPS経由でハードコードされたC2ドメインに対して開きます。
今回のキャンペーンでは、アナリストがポート443経由でfruitbrat[.]comへの繰り返し接続を確認しており、C2に到達できない場合はインプラントが遅延後にリトライを行います。
各リクエストには、ビーコンまたはセッション識別子として機能するCookieパラメーターが含まれており、保存されたクライアントIDとリクエストごとのデータから導出されます。これにより、レジストリの生の値がネットワークトラフィックに直接現れることはありません。
C2のレスポンスはパースされ、ファイルのダウンロードと実行、出力取得を伴うプロセス起動、ファイルシステム操作、モジュール型プラグインのロードなどをサポートするハンドラーに振り分けられます。これはPlugXの広く記録されたリモートアクセス機能と一致しています。
翻訳元: https://gbhackers.com/mustang-panda-uses-lnk/