Rubrik Zero Labsは、地下サイバー犯罪フォーラムで最近宣伝されていたマルウェア・アズ・ア・サービス(MaaS)「Azalea RAT」を特定し、分析しました。Azalea RATは、侵害後の幅広い機能を備えたモジュール型のマルウェアプラットフォームとして売り込まれています。リモート管理、ステルス機構、権限昇格、永続化、情報窃取、拡張可能なプラグインアーキテクチャを併せ持ちます。本レポートでは、このマルウェアの構造、実行フロー、回避技術、運用上の機能を技術的に詳しく分析します。攻撃者の手口を明らかにし、防御側が検知の糸口をつかめるようにすることが目的です。
初期感染
感染は、пропозиція.pdf.lnkという名前の悪意あるWindowsショートカットから始まります。このショートカットを開くとcmd.exeが起動し、Windows標準のcurlユーティリティで、次段のペイロードをhxxp://159.100.18.98:80/fbbef44e-51f2-4f0c-be82-09a32ddbb320から取得します。ペイロードは%TEMP%\zydrnobipiw.exeとして保存され、start /bを使ってバックグラウンドで実行されます。
第1段階ローダー
LNKが%TEMP%\zydrnobipiw.exeをダウンロードして起動すると、マルウェアは埋め込まれた小さなデータブロックを復号し、main_1.pdfというファイル名を取り出します。続いて%LOCALAPPDATA%\Tempの下にこの空のおとりファイルを作成し、explorer.exeでその場所を開きます。この動作は、注意をそらしてPDF関連の操作であるかのように見せかける狙いと考えられます。その裏で、マルウェアは本物のペイロードを復号・展開し、メモリ上に直接ロードします。
解析対策とサンドボックス回避
マルウェアは実際のペイロードを復号・ロードする前に、通常のWindowsシステム上で動作しているかどうかを3つのチェックで確認します。いずれかのチェックに失敗すると、自動化されたサンドボックスの観察時間を使い切らせるために、長時間の計算処理による遅延に入ります。
メモリ負荷チェック
マルウェアは、メモリ操作を5ラウンド実施します。各ラウンドでは、約351KBの領域を52個確保してデータを書き込み、権限を実行可能かつ書き込み可能に変更したうえで解放します。
これにより、1ラウンドあたり約18MBのメモリ負荷が同時にかかります。確保や権限変更に失敗した場合は、リソースの限られたサンドボックスである可能性を示します。
スリープ時間チェック
マルウェアはGetTickCountを使い、1秒間のスリープ呼び出し2回にかかった経過時間を測定します。合計が1〜3秒の範囲に収まることを期待します。この際、経過時間の測定前に、確保したメモリページをPAGE_NOACCESSに変更します。このルーチンは、スリープ呼び出しを加速させたり、実行に大きな遅延を持ち込んだりする解析環境を見抜くためのものです。
高分解能タイミングチェック
マルウェアは、高分解能の時間源であるQueryPerformanceCounterを使って、さらにタイミングチェックを行います。1秒間のスリープ呼び出し2回にかかった経過時間を測定し、合計が1〜3秒の範囲に収まることを期待します。高分解能タイマーで同じ検証を行うことで、観測された遅延に一貫性があるかを確認できます。スリープ呼び出しを加速させたり、タイミング動作を操作したりする環境を検知するのに役立ちます。
上記のチェックのいずれかに失敗すると、マルウェアは計算負荷の高い入れ子ループに入ってから、ペイロード処理に進みます。このルーチンは、膨大な回数の反復でバッファを繰り返し書き換え、CPUリソースを消費して、その後の悪意ある活動を大幅に遅らせます。短時間しか動作しないサンドボックスでは、マルウェアが次段のペイロードを復号して実行する前に実行が打ち切られる可能性があります。この挙動は、自動解析を妨げる意図で設計されたとみられます。
ペイロードの復号と実行
マルウェアは埋め込みペイロードを暗号化した状態で保持し、実際の中身を隠すために大量のランダムなパディングで囲んでいます。ローダーはまずこのパディングデータを取り除き、元のペイロードバッファを再構築します。次に、再構築した内容を軽量なXORベースのルーチンで復号します。復号されたデータはWindows PEファイルで、ディスクに書き込まれることなく、メモリ上で直接ロード・実行されます。
第2段階ローダー
第2段階のDLLは、まず専用のワーカースレッドを作成します。このスレッドが、次段ペイロードの取得、準備、実行を担当します。最初の動作の一つとして、このスレッドはWindows Management Instrumentation(WMI)を使い、MSFT_MpPreferenceクラスを呼び出してMicrosoft Defenderの設定を変更します。具体的には、マルウェアの作業ディレクトリをDefenderの除外リストに追加します。
除外設定を済ませると、ワーカースレッドはレジストリキーHKCU\Software\Microsoft\Windows\CurrentVersion\DefaultAppPoolを調べます。ここに、以前ダウンロードした暗号化ペイロードを格納した、GUID名のREG_BINARY値がないかを確認します。有効なレジストリ値が見つかった場合、マルウェアはコマンド&コントロール(C2)インフラに接続せず、そのまま展開・復号の段階に進みます。
レジストリ値が存在しない場合、ワーカースレッドはWinHTTP APIでHTTPS接続を確立し、hxxps://13.57.6.116:443/babe8d03-0088-4c34-b80d-6dc46f139d36にGETリクエストを送ります。暗号化されたレスポンスは動的に確保したメモリバッファにダウンロードされ、同じレジストリの場所にGUID名のREG_BINARY値として保存されます。
暗号化データがレジストリまたはリモートサーバーのいずれかから手に入ると、マルウェアはパッケージに埋め込まれたランダムなパディングを取り除いて元のペイロードを再構築し、繰り返し4バイトのXORキーで復号します。
再構築したパッケージとその内部構造を検証した後、得られた.NETアセンブリを共通言語ランタイム(CLR)経由でメモリ上に直接ロードします。このアセンブリが単体の実行ファイルとしてディスクに書き込まれることはありません。マルウェアはメモリ内にバイト配列を作成し、現在のアプリケーションドメインにアセンブリをロードして、必要な引数を渡しながらマネージドのエントリポイントを呼び出します。
プロセスインジェクション
このマルウェアには、リモートプロセスインジェクションに基づく代替の実行経路もあります。このルーチンでは、RuntimeBroker.exeを起動し、VirtualAllocExでそのプロセス内に実行可能メモリを確保します。次にWriteProcessMemoryでネイティブPEペイロードを確保した領域にコピーし、CreateRemoteThreadで実行を開始します。
RPCベースのUACバイパス
このマルウェアには、RPCベースのUACバイパスルーチンも含まれています。Windows内部のRPCインターフェースとネイティブのデバッグサブシステムを組み合わせて利用します。まず一時的な補助プロセスとしてwinver.exeを起動し、そのデバッグオブジェクトを取得します。
マルウェアはこのデバッグオブジェクトを保持したままComputerDefaults.exeを起動します。新しいプロセスのハンドルを取得した後は、ComputerDefaults.exeを親プロセスとして次段のペイロードを実行します。この手法は、標準のUACプロンプトを表示せずに、昇格した権限でペイロードを実行することを狙ったものです。
Azalea RAT
感染チェーンから回収された最終ペイロードは「Azalea Agent」です。これは多機能な.NET製のリモートアクセス型トロイの木馬(RAT)で、侵害したWindowsシステムを永続的かつ対話的に制御できるように設計されています。実行されると、オペレーターは感染ホストの管理、コマンドや追加ペイロードの実行、機密情報の収集、システムリソースの操作を行えます。さらに、広範なC2フレームワークを通じてリモートアクセスを維持できます。分析したビルドには87個の組み込みコマンドハンドラーがあり、Windows環境での利用を想定した機能もいくつか含まれています。
ランタイムの初期化
Azaleaは実行されると、まずランタイム環境を整えます。コンソール出力と一部のWindowsエラーダイアログを抑制し、プロセスのDPI awarenessを設定します。例外時とプロセス終了時のクリーンアップハンドラーを登録し、.NETのネットワーク通信で複数のSSL/TLSプロトコルバージョンを有効にします。COMベースの昇格ヘルパーを含む特殊な起動モードにも対応しており、特定の条件下では、ウィンドウを表示しない状態で自身を再起動することもあります。これらの初期化を終えると、設定を読み込み、以降の実行に必要なコンポーネントを初期化します。
埋め込み文字列テーブルの復号
Azaleaは、暗号化したランタイム文字列テーブルを、最終的な.NET RATアセンブリ内の埋め込みリソースとして保持しています。_dという名前のリソースに暗号化された文字列データが、_eに32バイトのAES-256鍵が格納されています。起動時にマルウェアは両方のリソースをアセンブリから直接読み取ります。_dの先頭16バイトを初期化ベクトルとして使い、残りのデータをAES-256-CBCで復号します。復号結果はGZipで展開され、RAT全体で使用される平文の文字列テーブルが復元されます。
復元される文字列はマルウェアの設定ではありません。インプラントが必要とするランタイム文字列です。インストールや永続化に関するメッセージ、プロセスやファイル操作の文字列、レジストリパス、HTTPビーコンのパラメーター、プラグイン管理ルーチン、リモートデスクトップ機能、SOCKS5プロキシのサポート、AMSIバイパスのメッセージ、プロセスインジェクションのルーチン、多数のデバッグメッセージやエラーメッセージなどが含まれます。Azaleaはこれらの文字列をバイナリ内に平文で保存せず、起動時に復号して必要なときに取り出します。そのため、静的解析は大幅に難しくなります。
埋め込みMsgPackライブラリのロード
ランタイム文字列テーブルの初期化後、Azaleaは埋め込まれた設定を読み込みます。設定は、最終的な.NET RATアセンブリ内にBase64エンコードされたMessagePackのブロブとして格納されています。これをデシリアライズするにはMsgPack.dllが必要ですが、このDLLも別ファイルとして配布されず、アセンブリ内部に格納されています。
起動時にAzaleaは、アセンブリから保護されたgGsIhf1Hog6AoKj2F7.STxi9BMJ3QrwFInRQ3リソースを読み取ります。そして、.NET Reactor風の独自のローリング復号ルーチンとDeflate展開によって、MsgPack.dllを再構築します。復元されたライブラリはAssembly.Load()でメモリ上に直接ロードされます。
Azaleaは、メモリ上のMsgPack.dllアセンブリを使って、Base64デコードした設定をデシリアライズします。読み込まれた設定によって、マルウェアはC2サーバー、通信設定、インストールと永続化のオプション、プラグイン設定など、実行に必要なパラメーターを得ます。
設定の分析
埋め込みMsgPack.dllライブラリがロードされると、AzaleaはBase64エンコードされたMessagePack設定をデシリアライズします。この設定はインプラントの中枢として機能し、C2サーバー、通信の挙動、インストール設定、永続化オプション、解析対策チェック、プラグイン管理、実行時に使う機能の選択を定義します。
図7に示すとおり、設定には2台のC2サーバー、ダウンロードURL、/api/healthというビーコンパス、ビーコンとハートビートの間隔、再接続のタイミング、TLSの使用、TCPキープアライブ設定、HTTP User-Agentが含まれます。インストール先のディレクトリとファイル名、スケジュールタスクおよびExplorer Policies Runによる永続化、ミューテックスのチェック、アンチデバッグ、アンチサンドボックス、アンチ仮想マシンの各チェックも定義されています。
設定はさらに、プラグインの健全性監視、復旧の試行、タスクのバッファリング、モジュールの自動起動を制御します。分析したサンプルでは、キーロガー、情報窃取モジュール、暗号資産クリッパーが自動起動に設定されていました。一方、マイナー、イベントログフック、アンチウイルス除外モジュール、AMSIパッチ、UACバイパスの各オプションは、この設定ではfalseです。
AMSIパッチ
Azaleaは、Windows Antimalware Scan Interface(AMSI)をバイパスする機能を備えています。これにより、ペイロードがセキュリティ製品に検査される可能性を下げます。この機能はPatchAmsiScanBuffer設定オプションで制御され、オプションが有効な場合にのみ実行されます。
呼び出されると、マルウェアはamsi.dllをロードしてAmsiScanBuffer関数を見つけ出し、先頭の命令を小さなパッチで上書きします。このパッチにより、AmsiScanBufferは通常のスキャン処理を実行せず、直ちにエラーコード0x80070057(E_INVALIDARG)を返します。その結果、関数が戻る時点でAMSIは渡されたコンテンツを検査しません。
単一インスタンスの強制
実行を続ける前に、Azaleaは埋め込み設定で指定されたミューテックス5c9358d1-3fec-4350-b93f-06ebc384e8e5の作成を試みます。作成に成功すると、マルウェアは初期化を続行し、同じ識別子を使ってローカルの名前付きパイプサーバーを起動します。
ミューテックスがすでに存在する場合、別のAzaleaインスタンスが稼働していることになります。新しく起動したプロセスは名前付きパイプ経由で既存のインスタンスに接続し、バージョンと整合性レベルの情報をやり取りします。分析したインプラントは、自身をバージョン1.19.1と名乗ります。
Azaleaは両インスタンスのバージョンと権限レベルを比較し、どちらを稼働させ続けるかを決めます。新しいインスタンスの優先度が高ければ、既存のプロセスを終了させて後を引き継ぎます。これにより、稼働するAzaleaインスタンスは常に1つだけになります。
アンチデバッグチェック
Azaleaは起動時に、複数のアンチデバッグチェックを実施します。.NETとWindows APIによるチェック、Process Environment Blockの直接調査、プロセスのデバッグフラグ・デバッグポート・デバッグオブジェクトハンドルの照会などです。いずれかのチェックでデバッガーを検出すると、マルウェアはただちに自身を終了させます。
アンチサンドボックスチェック
スリープを利用したサンドボックス検知
Azaleaは、長いスリープ時間を短縮またはスキップするサンドボックスを検知するため、タイミングベースのチェックを使います。まず1時間スリープするワーカースレッドを起動し、起床後にプロセスを終了させます。その間にメインスレッドは、ランダムに生成した同じ16文字の文字列のSHA-256ハッシュを、10万回繰り返し計算します。
通常のシステムでは、1時間の遅延が終わる前にハッシュ計算のループが完了します。するとAzaleaはスリープ中のワーカースレッドを中止して実行を続けます。サンドボックスがスリープを加速またはスキップした場合は、ハッシュ計算が終わる前にワーカースレッドが早く起床し、マルウェアを終了させます。
AntiSandbox設定オプションが有効な場合、Azaleaはさらに複数のアンチサンドボックスチェックを実施します。Windowsレジストリから、DADY HARDDISKやQEMU HARDDISKといった仮想ディスクの識別子を探します。SbieDll.dll、cmdvrt32.dll、cmdvrt64.dll、SxIn.dll、cuckoomon.dllなど、既知のサンドボックス監視モジュールがロードされていないかも確認します。さらに、現在のユーザー名を、解析用によく使われるアカウント名のリストと照合します。
これらの指標が一つでも検出されると、Azaleaはサンドボックスまたはマルウェア解析環境と判断し、ただちにプロセスを終了します。
アンチVMチェック
このRATは、被害者のマシンで次のアンチVMチェックを実施します。
- Windowsシステムディレクトリで、qemu-gaやqemuwmiなどQEMU関連ファイルを検索
- prl_sf、prl_tg、prl_ethなどParallels Toolsのファイルを検索
- BIOSのレジストリ値とWMI情報から、VMware、VirtualBox、VBOX、Innotekを調査
- System32\driversディレクトリで、balloon.sys、netkvm.sys、vioinput、viofs.sys、vioser.sysなど仮想マシン用ドライバーを検索
- 実行中のプロセスを列挙し、vboxservice、VGAuthService、vmusrvc、qemu-gaなど仮想化関連サービスを確認
- Cuckoo、VMware、VirtualBoxの既知の名前付きパイプとデバイスパスを確認
- BIOS、ファームウェア、SMBIOS、ACPI、ディスプレイドライバーの情報から、virtual、hyper-v、vmware、vbox、innotekなどの文字列を検索
これらの指標が一つでも検出されると、Azaleaは仮想化環境または解析環境と判断し、プロセスを終了します。
エージェントIDの生成
Azaleaは、設定されたミューテックス、被害者のコンピューター名、固定文字列を組み合わせて、感染システムごとに固定の識別子を生成します。この値のSHA-256ハッシュを計算し、先頭16バイトを取り出してGUIDに変換します。これにより、C2サーバーは複数回の実行をまたいで同じ被害者を一貫して識別できます。
インストール
Azaleaは、実行可能ペイロードを埋め込みリソース5a6b6179166849669814fc1f13d7b7e7から取得します。このリソースはDeflateで圧縮されており、マルウェアはDeflateStreamを使ってメモリ内で展開し、埋め込まれたPEファイルを復元します。
インストール先は埋め込み設定で制御されます。InstallCreateNewDirectoryが有効な場合、Azaleaは設定されたベースパスの下に新しいディレクトリを作成します。ディレクトリ名は、設定された名前かランダムな名前のいずれかです。
代わりにInstallUseRandomSubdirectoryが有効な場合は、既存のサブディレクトリを列挙し、その中からランダムに1つ選んでペイロードを書き込みます。分析した設定では、Azaleaはユーザーの一時ディレクトリ配下の既存サブディレクトリを選び、復元したペイロードをupdate.exeとして保存します。書き込みに失敗した場合は、別のディレクトリで再試行します。ペイロードの書き込みに成功すると、マルウェアは配置したupdate.exeを起動して実行を続けます。
永続化
ペイロードをupdate.exeとしてディスクに書き込んだ後、Azaleaは設定で有効になっている永続化手法を適用します。対応する手法は次のとおりです。標準のレジストリRunキーHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run(失敗時はHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runにフォールバック)、Explorer Policies RunキーHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run、そしてUpdateTaskという名前のスケジュールタスクです。いずれの手法も、先ほど配置したupdate.exeペイロードを実行するように設定されます。
COMベースのUACバイパス
インストールルーチンがペイロードのパスを返さなかった場合、AzaleaはUACバイパスのロジックを評価します。UacBypassオプションが有効なら、現在のWindows IDを取得し、WindowsPrincipal.IsInRoleでプロセスがすでに管理者権限で動作しているかを判定します。プロセスが昇格していない場合、AzaleaはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\SystemからConsentPromptBehaviorAdminの値を読み取ります。この値が2でなければ、マルウェアは特別なコマンドラインパラメーター-a1を付けて、自身の非表示コピーを起動します。-a1の後ろには、昇格させたい実行ファイルのパスと、その実行ファイルに渡すコマンドライン引数が続きます。
新しく起動したプロセスはエントリポイントから実行を始め、起動時に-a1パラメーターを検出して、COMベースのUACバイパスルーチンを呼び出します。このルーチンはCOMを初期化し、プロセスを一時的にC:\Windows\explorer.exeに偽装します。次にCoGetObjectでElevation:Administratorモニカーを使って昇格済みのCOMオブジェクトを取得し、最後にそのCOMインターフェースを呼び出して、指定した実行ファイルを昇格した権限で起動します。
昇格したプロセスが作成されると、元のプロセスは終了し、新しく昇格したインスタンスが通常のエントリポイントから再開します。その後マルウェアは、インストールや永続化のチェックを含む通常の起動シーケンスを繰り返し、管理者権限で実行を続けます。
初期C2登録
COMベースのUAC昇格段階が完了すると、Azaleaは本格的に動き出し、C2インフラとの通信を準備します。エージェントID、ユーザー名、コンピューター名、OSバージョン、実行中のプロセス、実行ファイルのパス、プロセスID、整合性レベル、マルウェアのバージョン、通信設定、TLSインターセプトの状態、パブリックIPアドレスなど、ホスト・プロセス・設定に関する広範な情報を収集します。収集したデータはシリアライズされ、設定されたTLS保護のTCPチャネルで送信されます。
C2からの受信メッセージ形式
初期登録を終えると、AzaleaはTLS over TCP接続を開いたまま、C2サーバーからの指示を待ちます。受信メッセージはそれぞれ、プロトコルヘッダーと、任意のペイロードで構成されます。ヘッダーには、Flags、MessageType、DataTypeValue、PayloadLength、AgentId、TaskId、ChannelId、PluginId、SourceAgentId、Checksumが含まれます。
ヘッダーを検証した後、AzaleaはPayloadLengthで指定されたバイト数を読み取り、圧縮フラグが立っていればペイロードを展開します。コマンドメッセージの場合、内部ルーターはDataTypeValueをコマンド識別子として使い、対応する登録済みハンドラーを見つけて、要求されたコマンドを被害者のマシン上で実行します。
エージェントが対応するC2機能
Azaleaは、従来型のリモートアクセス機能と、いくつかの特殊な機能を組み合わせた、包括的な侵害後コマンドフレームワークを実装しています。
標準的な機能には、キーロギング、クリップボード監視、プロセスとレジストリの操作、ファイルシステムへのアクセス、ペイロードの実行、永続化、画面ストリーミング、データ窃取があります。より特徴的な機能としては、キーワードベースのWindowsイベントログのフィルタリング、Active Directoryオブジェクトの探索と変更、HVNC、マウスドライバーパッケージのインストール、トランザクション型プロセスハロウイング、DLLインジェクション、トークンの偽装、UACバイパスに対応しています。
次の表は、確認されたすべてのコマンドIDと、検証済みの対応する説明の一覧です。
DarkWebInformerが共有したフォーラム広告は、AzaleaをActive Directoryとの連携やキーワードベースのWindowsイベントログ回避を備えた多機能RATとして宣伝しています。私たちのリバースエンジニアリングでも、これらの主張は部分的に裏付けられました。
コマンド17000〜17005により、オペレーターはActive Directoryオブジェクトの検索と確認、ディレクトリオブジェクトの作成や削除、グループメンバーシップの変更を行えます。侵害したセキュリティコンテキストに十分なActive Directory権限があれば、これらの機能はドメイン偵察、永続化、権限昇格に利用できます。
これとは別に、コマンド9300〜9304は、イベントログのフィルタリングサブシステムを管理します。このサブシステムは、フックの展開、ステータス確認、キーワード管理に対応しています。販売者によると、設定したキーワードを含むイベントは、Sysmonが生成したものも含めて、Windowsイベントログに記録されなくなります。
分析したエージェントには、このDLLを展開・制御するためのコードが含まれています。しかしDLL自体は入手できなかったため、フック対象のAPI、フィルタリングの段階、正確な抑制動作については、独自に検証できていません。
モジュール型プラグインの実行
Azaleaは、数値のプラグインIDでさまざまなプラグインモジュールを識別し、実行します。分析したビルドでは、これらのプラグインは、含まれている場合にエージェント内の埋め込みリソースとして格納されることが想定されています。確認されたプラグインIDは4つで、Stealer(ID 5)、Remote Injector(ID 19)、AntivirusKiller(ID 22)、Miner(ID 26)です。このペイロードに含まれていたのはStealerプラグインのリソースだけです。Remote Injector、AntivirusKiller、Minerの各プラグインのコードパスは存在しますが、対応する埋め込みリソースは含まれていません。
Stealerプラグインは、Chromiumベースのブラウザーを標的に、保存されたパスワード、Cookie、決済カード情報、閲覧履歴、ダウンロード履歴、ブックマーク、オートフィルデータを抽出します。システム、ハードウェア、ソフトウェア、ネットワークの情報も収集できます。さらに、Discord、Telegram、Steam、FileZilla、MobaXterm、RDCMan、Thunderbird、Foxmail向けのアプリケーション固有モジュールも備えています。収集したデータは、構造化されたレポートとアーカイブにまとめられ、窃取のためにAzaleaのメインエージェントへ返されます。
結論
Azaleaは、侵害後のライフサイクル全体を支えるよう設計された、完成度の高いモジュール型マルウェアフレームワークです。単一の機能に頼るのではなく、ステルス性、権限昇格、インメモリ実行、永続化、包括的なシステム偵察、拡張可能なプラグイン機能を1つのプラットフォームに統合しています。このモジュール設計により、オペレーターは作戦目的に応じて機能を選んで展開できます。Azaleaはさまざまな侵入シナリオに適応できるということです。回避性能、運用の柔軟性、拡張性を重視している点は、長期的なアクセス維持、情報収集、後続の攻撃活動を効率的に支えるマルウェアフレームワークが増えているという傾向を表しています。
侵害指標(IOC)
すべてのIOCは、Rubrik製品での検知に利用できるRZL脅威フィードで提供されています。
ファイル指標
翻訳元: https://zerolabs.rubrik.com/blog/azalea-rat-stealthy-loader-full-system-control