Rubrik Zero LabsのAI支援型マルウェア解析パイプラインが最近、オープンソースのDcRATフレームワークをカスタマイズした亜種を発見しました。同社はこれをBeepRATとして追跡しています。このマルウェアは、HFY 号码魔方.zipというパッケージに含まれる中国の電話番号管理ユーティリティを通じて配布されていました。アーカイブには、データベース駆動型アプリケーションでよく見られるサードパーティ製ライブラリとともに、HFY.exeという名称の.NETアプリケーションが含まれていました。このアプリケーションは電話番号管理ツールとして機能しているように見えましたが、詳細な解析により、最終的にカスタマイズされたBeepRATペイロードを展開する高度な多段階感染チェーンであることが判明しました。
図1:Zipアーカイブの内容
実行されると、このアプリケーションは%LOCALAPPDATA%\TCCに作業ディレクトリをひそかに作成し、tcc.exe、temp.bin、config.ini.cといった追加コンポーネントを複数投下します。tcc.exeはTiny C Compilerの実行ファイルで、被害者システム上でC言語コードを直接コンパイル・実行するために使用されます。解析の結果、config.ini.cにはtemp.bin内に格納されたシェルコードペイロードを読み込んで実行するためのC言語ソースコードが含まれていることが判明しました。
シェルコードローダー
config.ini.cファイルは、temp.binの内容をメモリから直接実行する軽量なシェルコードローダーとして機能します。このローダーはプロセス環境ブロック(PEB)をたどってロード済みモジュールを列挙し、必要なAPIを実行時に動的に解決します。ROR13(Rotate-Right-13)ハッシュアルゴリズムを使用し、算出したハッシュ値をkernel32.dll、LoadLibraryA、GetProcAddressに対応するハードコードされたハッシュ値と照合します。
図2:動的なAPI解決
続いてこのローダーは、動的に解決したCreateFileA APIを使ってtemp.binを開こうとします。ファイルが存在しない場合、処理は即座に終了します。ファイルのオープンに成功すると、ローダーはGetFileSizeを使ってファイルサイズを取得し、VirtualAllocを通じて同サイズのメモリ領域を確保した上で、ReadFileを使ってtemp.binの内容を直接そのメモリ領域に読み込みます。
シェルコードを確保したメモリ領域に読み込んだ後、そのバッファは関数ポインタにキャストされて直接呼び出され、ペイロードの先頭バイトに実行が移り、感染チェーンの次の段階が始まります。
図3:シェルコードの読み込み
シェルコード
temp.binペイロードには、埋め込まれたポータブル実行形式(PE)ファイルが含まれています。この埋め込み実行ファイルを読み込む前に、シェルコードはAntimalware Scan Interface(AMSI)、Event Tracing for Windows(ETW)、Windows Lockdown Policy(WLDP)といったセキュリティ機構を回避する機能を含む、いくつかの初期化処理を実行します。
これらの準備を終えると、シェルコードはメモリ内から埋め込まれたPEイメージの位置を特定し、リフレクティブローディング処理を行います。埋め込み実行ファイルはメモリにマッピングされ、実行環境が初期化された後、ペイロードのエントリポイントに制御が渡されます。
図4:シェルコード
サービスベースの実行
実行は.NETペイロードのMain()関数から始まり、マルウェアは-serviceというコマンドライン引数付きで起動されたかどうかを確認します。この引数が存在する場合、処理はWindowsサービスコンポーネントに転送されます。サービスオブジェクトが生成され、それに伴いコンストラクタが実行されてInitializeComponent()関数が呼び出され、必要なサービス初期化処理と内部サービス名の登録が行われます。
Windowsによってサービスが開始されると、OnStart()ルーチンが呼び出され、マルウェアの主要な初期化関数へと処理が移ります。このルーチンは、実行環境の準備、設定情報の読み込み、通信コンポーネントの初期化、コマンド&コントロール(C2)接続の確立、そして動作に必要な追加機能の起動を担っています。
環境検証とHWID生成
-serviceというコマンドラインパラメータが存在しない場合、マルウェアは主要な実行フローに従って動作します。インストール作業を進める前に、Windows Management Instrumentation(WMI)クエリをWin32_OperatingSystemクラスおよびCIM_Memoryクラスに対して実行し、仮想化環境によく見られる特徴を検出する解析対策ルーチンを実行します。マルウェアはオペレーティングシステムの属性やインストールされているメモリデバイスの情報を評価した上で、処理を続行すべきかどうかを判断します。
次に、マルウェアはプロセッサ数、ユーザー名、コンピュータ名、OSバージョン、システムドライブのサイズなど複数のシステム属性を使って、一意のハードウェア識別子(HWID)を生成します。これらの値は組み合わされ、MD5ハッシュアルゴリズムで処理されて被害者識別子が生成され、これがその後のC2通信やホスト登録時に使用されます。
図5:HWIDの生成
UACバイパスによる権限昇格
続いてマルウェアは、ローカルAdministratorsグループへの所属を確認することで、管理者権限で実行されているかどうかを検証します。昇格した権限が得られていない場合、マルウェアはユーザーアカウント制御(UAC)バイパス処理を開始します。
権限昇格を実現するため、マルウェアはOSのアーキテクチャを判定し、埋め込みリソースからUAC_x86またはUAC_x64のいずれかのコンポーネントを直接メモリに読み込みます。その後、Appinfoというエクスポート関数を呼び出し、Tiny C Compiler(TCC)のローダーチェーンを実行するために必要なパラメータを含むコマンドラインを渡します。
その結果、マルウェアは-nostdlib -run “%LOCALAPPDATA%\TCC\config.ini.c”という引数付きで再起動され、temp.binに格納されたシェルコードの読み込みと実行を担うTCCベースの実行フローが直接呼び出されます。昇格したインスタンスを起動した後、元のプロセスは終了し、新たに生成されたプロセスが管理者権限で処理を続行します。
スケジュールタスクによる永続化
管理者権限を取得すると、マルウェアはInstallEx()関数を呼び出し、侵害したシステム上に永続化機構を確立します。
マルウェアはWindowsタスクスケジューラのCOMインターフェースを使用して、WindowsUpdateTempFileCleanUpという名前のスケジュールタスクを検索または作成します。既にこのタスクが存在する場合、マルウェアは被害者のハードウェア識別子(HWID)に基づくミューテックスチェックを行い、別のインスタンスが既に稼働しているかどうかを判定し、稼働中であれば処理を終了します。
タスクが存在しない場合、マルウェアはタスクの登録処理を進めます。この過程で、WMI経由でWindowsタスクスケジューラサービスとやり取りし、埋め込みリソースから直接読み込んだアーキテクチャ固有のタスク管理コンポーネント(SchTask_x86またはSchTask_x64)を利用します。生成されるスケジュールタスクは、利用可能な最高権限で実行されるよう設定され、次のコマンドラインでマルウェアを起動します。
- -nostdlib -run “%LOCALAPPDATA%\TCC\config.ini.c”
ランタイム初期化とC2セットアップ
永続化を確立した後、マルウェアは主要なランタイム初期化ルーチンに移行します。この段階では、実行環境の準備、インストールされている.NET CLRバージョンの判定、およびC2通信に必要な内部コンポーネントの初期化が行われます。マルウェアはまた、検出したCLRバージョンを活用してオペレーターが提供する.NETアセンブリの読み込み時に互換性を確保する、プラグインフレームワークにも対応しています。
続いてマルウェアは、DPI認識設定、C2アドレスの初期化、オフラインキーロガーの任意起動など、いくつかの準備作業を行います。解析の結果、マルウェアはHKCU\Software\Creeperというレジストリパスから代替のC2アドレスを取得できることが判明しており、これによりオペレーターは埋め込み設定を変更することなくインフラを更新できます。
次に、マルウェアはC2通信にTCPとUDPのどちらを使用するかを判定します。今回解析したサンプルではTCP通信が設定されており、感染ライフサイクル全体を通じて使用されていました。
図6:Start()関数
接続を確立するため、マルウェアはdoh.pubに対してDNS over HTTPS(DoH)リクエストを送信し、設定されたC2インフラを解決します。DoHによる解決処理が失敗した場合、マルウェアは標準のWindows DNSリゾルバーにフォールバックします。解析中、マルウェアはC2ドメインspasss.orgを207.56.8.166に解決し、続いてポート18848経由でTCP接続を確立しました。
接続確立後、マルウェアは通信構造を初期化し、被害者の登録情報をC2サーバーに送信した上で、オペレーターからのコマンド処理を開始します。
被害者の登録
C2サーバーとの接続を確立した直後、マルウェアはClientInfoと識別される初期登録パケットを送信します。このパケットは被害者環境のプロファイリング機構として機能し、システム情報、ユーザーコンテキスト、セキュリティ製品、実行に関する詳細、マルウェアのメタデータなど、侵害された環境に関する詳細な概要をオペレーターに提供します。解析対象のサンプルでは、マルウェアはバージョン0.0.1を報告していました。
典型的なClientInfoパケットには、以下のフィールドが含まれます。
- Packet — ClientInfo
- HWID — 一意の被害者識別子
- User — ログイン中のユーザー名
- OS — OSのバージョンとアーキテクチャ
- Camera — 検出されたウェブカメラデバイスの数
- Path — マルウェアの実行ファイルパス
- Version — マルウェアのバージョン
- Admin — 現在の権限レベル
- Active — 現在アクティブなフォアグラウンドウィンドウのタイトル
- AV — インストールされているアンチウイルス製品
- Install-Time — マルウェアのインストール日時
- Group — オペレーターが定義したグルーピング識別子
- ClrVersion — インストールされている.NET CLRバージョン
- LoadedPlugins — 現在ロードされているプラグインモジュール
登録パケットにはLoadedPluginsフィールドも含まれており、現在メモリにロードされているオペレーター提供のモジュールが報告されます。マルウェアは、C2サーバーから配信される.NETアセンブリを通じて動的に機能を拡張できます。これらのアセンブリはディスクに書き込まれることなく直接メモリにロードされ、コアインプラントの機能を拡張します。
収集した情報は送信前にMessagePack形式でシリアライズされ、PKCS#7パディングを伴うECBモードのRijndael(AES)アルゴリズムで暗号化されます。マルウェアはC2通信の保護に”Qi_An_Xin_Niu_Bi”というハードコードされた暗号鍵を使用しています。注目すべき点として、この鍵には「QiAnXin(奇安信)は素晴らしい」あるいは「QiAnXinはすごい」といった意味に大まかに翻訳できる中国語のフレーズが含まれており、開発者が中国のサイバーセキュリティ業界に精通していた可能性を示唆しています。
暗号化されたMessagePack構造には長さフィールドが付与され、確立済みのTCP接続を通じてC2サーバーに送信されます。これにより、オペレーターは追加のコマンドを発行する前に、被害者環境を迅速に評価できます。
ハートビート通信
被害者の登録後、マルウェアは約10秒から15秒のランダムな間隔でKeepAlivePacket()ルーチンを実行する定期タイマーを作成します。このルーチンはClientPingと識別されるハートビートパケットを生成し、C2通信を維持するとともに、被害者の活動状況をオペレーターに継続的に可視化します。
各ハートビートパケットには、被害者のHWID、現在アクティブなフォアグラウンドウィンドウのタイトル、計測されたネットワークの往復遅延、そしてユーザーが最後にキーボードまたはマウスを操作してから経過した時間が含まれます。パケット構造は以下のフィールドで構成されています。
- Packet — ClientPing
- HWID — 被害者識別子
- Message — アクティブなフォアグラウンドウィンドウのタイトル
- Roundtrip — ネットワーク遅延の計測値
- LastInput — ユーザーのアイドル時間
アクティブウィンドウのタイトルはGetActiveWindowTitle()関数を通じて取得され、オペレーターは被害者が現在使用しているアプリケーションを把握できます。
ネットワーク遅延の値はpingRoundtrip()ルーチンによって生成され、下図に示すように”BEEP”という文字列を含むICMPエコーリクエストを送信し、計測された応答時間を記録します。ユーザーのアイドル時間はGetLastInputTime()ルーチンを通じて取得され、被害者がシステムを実際に操作中かどうかを示す指標となります。
図7:BeepのICMPパケット
登録パケットと同様、ハートビートメッセージもMessagePackでシリアライズされ、PKCS#7パディングを伴うECBモードのRijndael(AES)で暗号化された上でC2サーバーに送信されます。
図8:データ窃取
コマンド処理と侵害後の機能
C2通信を確立し被害者登録を完了した後、マルウェアはリモートサーバーとの永続的な通信チャネルを作成し、受信コマンドがないか接続を継続的に監視します。C2サーバーから受信したデータは、マルウェアのRijndael(AES)通信ルーチンで復号され、MessagePack形式でデシリアライズされます。マルウェアはその後、Packetフィールドに格納されたコマンド識別子を抽出し、該当するハンドラーにリクエストを振り分けます。
このコマンドフレームワークにより、オペレーターは侵害したホストに対して広範な制御権を得ることができ、長期的なアクセス、システム監視、監視・偵察、リモート管理といった機能が可能になります。対応するコマンドとその機能の概要は、以下の表にまとめられています。
その他の発見事項
過去のテレメトリからは、LuaJITベースの実行チェーンを利用していたこのフレームワークの初期の亜種が確認されています。SHA-256ハッシュ値がaecc807b09025bc39800403f866c964dfaf2ee6104600dfad3e26edd4b115440および4ca2c99995daaabeebca8d86052c3467a3798d0fb73eb8a7e130431e1dcaf6ebのサンプルを解析したところ、temp.bin内に格納されたシェルコードを実行するためにLuaJITランタイムが使用されていることが分かりました。これらの亜種では、Windowsのメモリ確保・スレッド生成APIを使ってLuaスクリプト(config.ini)がシェルコードをメモリに読み込み、その後次段階のペイロードへ実行を移していました。
図9:Config.ini
今回解析したサンプルでは、シェルコード実行アーキテクチャ全体は維持しつつ、LuaJITランタイムをTiny C Compiler(TCC)ベースのローダーに置き換えています。この変化は、メモリ内実行とペイロード配信という中核メカニズムを維持しながら、マルウェアフレームワークの開発が継続していることを示唆しています。
被害の傾向
元となったHFY 号码魔方.zipアーカイブを解析したところ、data.dllという名前のファイルが確認されました。DLLを装ってはいるものの、実際にはこのファイルは、中国の携帯電話番号の接頭辞情報517,154件を含むSQLiteデータベースです。
このデータベースは、携帯電話番号の接頭辞を、対応する省、市、通信キャリア、市外局番、郵便番号のデータにマッピングしています。サンプルレコードは、中国聯通(中国联通)や中国電信(中国电信)といった中国の主要通信事業者を参照しています。
この大規模な通信事業者向け照合データベースの存在は、HFY.exeが大規模な電話番号データセットを管理するために設計されていたことを示しています。このアプリケーションが持つ電話番号管理機能と合わせて考えると、このソフトウェアは通信事業者関連の環境向けに調整されていたと見られ、通信事業者やそれに類する組織が本キャンペーンの標的である可能性を示唆しています。
アトリビューション評価
BeepRATの実行チェーンを解析したところ、Tiny C Compiler(TCC)を使ってメモリからシェルコードを読み込み実行していることが判明しました。TCCをシェルコード実行環境として利用する同様の手法は、Rapid7がLotus Blossom脅威グループに関連するChrysalisバックドアを解析した際に以前報告しています。いずれのケースでも、TCCは後続のメモリ内ペイロードを起動する中間実行レイヤーとして機能しています。
インフラの解析により、BeepRATのC2活動に関連する3つのドメイン、spasss.org、liebian.org、svip88.orgが特定されました。関連インフラから調査を広げたところ、AS54801(Zillion Network Inc.)内でホストされている追加のシステムが判明し、その中にはValleyRAT、VShell、Cobalt Strike、その他のリモートアクセスフレームワークに関連するインフラが含まれていました。
注目すべき点として、ValleyRATは以前からSilver Foxクラスターに帰属するとされる活動と関連付けられており、一方でVShellはUNC5174に関連するキャンペーンで観測されています。これらのツールと並んでBeepRATのインフラが存在することは、このマルウェアが動作するより広範なエコシステムを評価する上で追加の手がかりとなります。
Seqriteによる最近の報告では、中国の通信事業者を標的とし、侵害後のアクセスにVShellを利用する中国系キャンペーンが報告されています。直接的な運用上の重複は確認されていないものの、両キャンペーンがともに通信事業者を標的としている点は、BeepRATの想定される標的を評価する上で追加の手がかりを提供しています。
マルウェアの配布手段として中国の電話番号管理ユーティリティが使われていること、そしてフレームワーク全体に複数の中国語要素が存在することを合わせて考えると、観測されたトレードクラフトとインフラの関連性は、BeepRATがより広範な中国系エコシステムの中で運用されていることを強く示唆しています。Rubrik Zero Labsは、このマルウェアが同クラスターに関連しているとの評価に対し、中程度の確信度を持っています。
結論
BeepRATは、DcRATのような一般公開されているマルウェアが、標的型侵入キャンペーンにおいて今なお活用され続けていることを示しています。通信事業者をテーマにしたアプリケーションを通じて配布され、多段階の感染チェーンによって支えられているこのマルウェアは、広範なリモート管理機能と、検知や解析を困難にする各種の手法を組み合わせています。
組織は、従来のファイルベースの指標ではなく多段階実行とメモリ内でのペイロード配信に依存する同種の脅威を特定するため、振る舞い監視、メモリベースの検知、脅威ハンティング戦略を優先すべきです。
侵害指標(IOC)
ファイル指標
翻訳元: https://zerolabs.rubrik.com/blog/beeprat-behind-telecom-utility-lies-china-nexus-toolset