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を動的に解決します。Rotate-Right-13(ROR13)ハッシュアルゴリズムを使用し、算出した値を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というコマンドラインパラメータが存在しない場合、マルウェアは主要な実行フローに従って動作します。インストール作業に進む前に、Win32_OperatingSystemおよびCIM_MemoryクラスへのWindows Management Instrumentation(WMI)クエリを使用する解析対策ルーチンを実行し、仮想化環境によく見られる特徴を識別します。マルウェアはオペレーティングシステムの属性とインストールされているメモリデバイスの情報を評価した上で、実行を継続すべきかどうかを判断します。
続いてマルウェアは、プロセッサ数、ユーザー名、コンピュータ名、オペレーティングシステムのバージョン、システムドライブのサイズなど、複数のシステム属性を用いて一意のハードウェア識別子(HWID)を生成します。これらの値は結合され、MD5ハッシュアルゴリズムで処理されて被害者識別子が生成されます。この識別子はその後、C2通信やホスト登録の際に使用されます。
図5: HWID生成
UACバイパスによる権限昇格
次にマルウェアは、ローカルのAdministratorsグループへの所属を確認することで、管理者権限で実行されているかどうかを検証します。昇格した権限が利用できない場合、マルウェアはユーザーアカウント制御(UAC)バイパス手続きを開始します。
権限昇格を実現するため、マルウェアはオペレーティングシステムのアーキテクチャを判定し、埋め込まれたリソースから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”
ランタイム初期化とコマンド&コントロールの確立
永続性を確立した後、マルウェアは主要なランタイム初期化ルーチンに移行します。この段階で、実行環境を準備し、インストールされている.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 — オペレーティングシステムのバージョンとアーキテクチャ
- 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”というハードコードされた暗号化キーを使用します。注目すべきは、このキーに「奇安信は素晴らしい」あるいは「奇安信はすごい」という意味に大まかに訳せる中国語のフレーズが含まれている点で、開発者が中国のサイバーセキュリティエコシステムに精通していた可能性を示唆しています。
生成された暗号化済み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ランタイムが使用されていることが判明しました。これらの亜種では、Luaスクリプト(config.ini)がWindowsのメモリ確保・スレッド生成APIを使ってシェルコードをメモリに読み込んだ後、実行を次の段階のペイロードに渡していました。
図9: Config.ini
今回解析したサンプルでは、シェルコード実行アーキテクチャ全体は維持しつつ、LuaJITランタイムをTiny C Compiler(TCC)ベースのローダーに置き換えていました。この変化は、インメモリ実行とペイロード配信という中核メカニズムを維持しながら、マルウェアフレームワークの開発が継続していることを示唆しています。
被害者像
元となったHFY 号码魔方.zipアーカイブの解析では、data.dllという名前のファイルが確認されました。DLLを装っていますが、このファイルは実際にはSQLiteデータベースであり、中国の携帯電話番号プレフィックス情報を517,154件含んでいます。
このデータベースは、携帯電話番号のプレフィックスと、対応する省、市、通信キャリア、市外局番、郵便番号のデータを紐づけています。サンプルレコードには、中国聯通(China Unicom、中国联通)や中国電信(China Telecom、中国电信)といった中国の大手通信事業者への参照が含まれています。
この大規模な通信情報検索データベースの存在は、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