マルウェア
ペイ・パー・インストールサービスを用いたPrivateLoaderから拡散するマルウェアフレームワーク「NetDooka」
トレンドマイクロは最近、高度な機能を備えたマルウェアフレームワーク「NetDooka」を発見しました。NetDookaの名称は、本マルウェアが使用するコンポーネント名から付与されたものです。
トレンドマイクロは最近、高度な機能を備えたマルウェアフレームワーク「NetDooka」を発見しました。NetDookaの名称は、本マルウェアが使用するコンポーネント名から付与されたものです。このマルウェアフレームワークは、ペイ・パー・インストール(PPI:Pay-Per-Install)サービスによって配布され、ローダ、ドロッパ、保護用ドライバ、独自の通信プロトコルを搭載した多数の機能を備えたRAT(Remote Access Trojan)など、複数のコンポーネントから構成されます。感染経路を調査したところ、Netdookaの拡散元は、インストール後に大規模な感染チェーンを引き起こすローダ型マルウェア「PrivateLoader」であることが判明しました。
Intel471で報告されている通り、マルウェア「PrivateLoader」は、PPIサービスの一環として、感染したシステム内に複数のマルウェアをダウンロード、インストールする役割を担います。PPIサービスの仕組み上、実際にインストールするペイロードは、PrivateLoaderのバージョンによって異なる可能性があります。PPIサービスで配布される既知のマルウェアファミリとして、SmokeLoader、RedLine、Anubisなどが挙げられます。
本ブログ記事では、NetDookaフレームワークを構成する各コンポーネントと、感染チェーンについて解説します。取り扱う範囲は、アンチウイルスのアンインストールを行う初期ペイロードから、最終段階のペイロードRATまでを含みます。このうち、初期ペイロードは、感染端末内で仮想デスクトップ環境を新規作成し、そこでマウスポインタの位置などをプログラム操作することによって、アンチウイルスソフトのアンインストールや他のコンポーネントの実行に必要な環境の整備を行います。また、最終段階のRATは、カーネルドライバによってプロセス停止やファイル削除を阻止する機能を備えています。
なお、NetDookaは現時点でまだ開発段階にあるため、バージョンによっては機能や挙動が今回の報告と異なる可能性があることをご認識ください。
攻撃の概要
一連の感染は、通常、海賊版ソフトのダウンロード(Intel471で報告されている通り)を期待するユーザが気づかないままPrivateLoaderをダウンロードするところから始まります。続いて、最初のNetDookaマルウェアであるドロッパ・コンポーネントがPrivateLoaderによってインストールされます。このドロッパは、ローダ・コンポーネントの復号と実行を担います。
上述のローダ・コンポーネントは、まず標的システムが仮想環境で動いていないかチェックを行います。続いて、リモートサーバから追加のドロッパをダウンロードして実行します。この際、将来的な利用に備えて、カーネルドライバをインストールする可能性もあります。
上述した追加のドロッパは、最終段階のペイロードであるRATの復号と実行を担います。RATは、リモートシェルの実行、ブラウザデータの収集、スクリーンショットの取得、システム情報の窃取を含む多くのリモートアクセス機能を提供します。また、当該ドロッパは、ドロップしたRATを保護するため、先にインストール済みのカーネルドライバ・コンポーネントを開始する場合もあります。
ローダの分析
本ローダが起動すると、まず、コマンド・コントロール(C&C)サーバのアドレスなど、難読化された文字列を復号します。続いて、起動時に渡されたコマンドライン引数のチェックを行います。引数は、ローダとしての処理内容を指示するために用いられ、複数指定が可能です。
引数 |
機能 |
001 |
「Avira」のプログラムをアンイストール |
004 |
「Viper」のプログラムをアンインストール |
006 |
「Total 360」のプログラムをアンインストール |
007 |
「ESET」のプログラムをアンインストール |
008 |
「GData」のプログラムをアンインストール |
embedded |
ドロッパ・コンポーネントをダウンロードして「reloadbitex.exe」にリネーム |
correct |
アンチウイルス製品ベンダのドメインをブロック、ドライバをインストール、ローダ自身を削除 |
引数なし |
ドロッパ・コンポーネントをダウンロード、続いて、「embedded」、「corrected」の引数で自身(ローダ)を起動、さらに、ダウンロードしたNetDookaドロッパ用のタスクスケジュールを登録 |
引数が指定されなかった場合、ローダは「DetectAV」の名前で定義された関数を呼び出します。当該関数は、システム上にインストールされているアンチウイルス製品をレジストリ値から自動検知することにより、アンインストール対象を識別します。対象製品のアンインストールを行うため、ローダは、API「CreateDesktopA」を用いて仮想デスクトップを作成し、その仮想デスクトップ上で適切なバイナリ・アンインストーラを起動、実行します。この過程で、API「CreateProcessA」をフラグ「create_no_window」で呼び出す他、マウス操作などの人的操作をプログラムで模擬的に実施します。こうしたアンインストール処理は、対象とするアンチウイルス製品ごとに適した独自の技法が用意されています。図4に、例として、アンチウイルスソフト「GData」のアンインストールに対応するコードを示します。
続いてローダは、 %ProgramFiles%配下に「ReservHardwareUpdater」や「ExMultimediaStorage」などの名前(検体によって異なる場合がある)で作業ディレクトリを作成します。この作業ディレクトリは、ローダ自身をコピーしたり、次の段階で用いるペイロードファイルを格納するために使用されます。この後、ローダは、引数「embedded/delected」を指定して自身のコピーを起動します。
ローダのバージョンによっては、次の段階で使用するペイロードを2回ダウンロードする場合もあります。1度目は、引数なしで起動した時(「rsvr_updldr.exe」などの名前で保存されるが、実行されることはない)であり、2度目は、自身からの呼び出しによって引数「embedded/delected」で起動した時(後にタスクスケジューラによって実行される)が該当します。
自身の呼び出しによって、引数「embedded」で起動したローダは、ドロッパ・コンポーネントを下記の場所にダウンロードして保存します。
%ProgramFiles%\ReservHardwareUpdater\reloadbitex.exe
続いてローダは引数「correct」を指定して、再度自身を起動します。この引数で起動したローダは、アンチウイルス製品ベンダのドメインを「0.0.0.0」のIPアドレスにリダイレクトするように、hostsファイルを書き換えることで無効化します。さらに下記コマンドを実行してローダ自身を削除します。
ローダのバージョンによっては、ドライバ・コンポーネントをインストールして、最終段階のペイロード(RATコンポーネント)をカーネルモードで保護するものもあります。こうした保護機能は、ドライバを「ミニフィルタ・ドライバ」として登録し、さらにRATコンポーネントに対するファイル削除やプロセス停止を阻止するコールバック・ルーチンを設定することによって実現されます。
上述したドライバのバイナリはローダ内部にbase64でエンコードされて埋め込まれています。デコードされ次第、その結果は下記ファイルに保存されます。
C:\Program Files\SolidTechnology\protdrv.sys
また、ローダはドライバをインストールするためのサービスを作成します。ただしサービスの開始はローダではなく、ドロッパ・コンポーネント側で行います。
最後に、ローダは先にダウンロードしたドロッパ用のタスクスケジュールを登録します。
ドロッパの分析
NetDookaの攻撃では、2種類のドロッパが使用されていることが分かりました。1つ目はPrivateLoaderからインストールされ、NetDookaローダをドロップします。2つ目は最終段階のRATペイロードをドロップします。
ドロッパ・コンポーネントは小さな.NETバイナリであり、埋め込まれているペイロードの復号と実行を担います。ドロッパの処理は、自身のファイル内から特定のバイト列(今回調査した検体では「\x11\x42\x91\x50\x7F\xB4\x6C\xAA\x75\x5E\x8D」)を探すところから始まり、その後に続くバイト列の読み取りを行います。
ペイロードの復号は、暗号化されたバイナリ列について、1バイトずつループ処理で行います。具体的には、各バイトについて、1バイト長の鍵とのXORを算出し、そこから、0オリジンのループ・インデックス値を減算します。鍵を生成する手順として、まず、特定長の素数列を準備しておき、各素数についてSHA-256ハッシュ値を算出し、それぞれ先頭1バイト目を抽出します。このように抽出されたバイト値の和を、1バイト変数に格納した結果が、XORの計算に使用する鍵となります。一連の処理に該当するコードを、図10に示します。
復号されたペイロードの内容は、%Temp%配下のファイルに保存され新しいプロセスとして実行されます。なお保存先やファイル名は、NetDookaマルウェアのバージョンによって異なる可能性があります。
XOR鍵や検索するバイト列など、ドロッパの細かな挙動は、バージョンによって差異があります。しかし、ドロッパの目的はNetDookaの全バージョンを通して同じであり、それは、埋め込まれたペイロードを実行することです。今回の調査にあたり、トレンドマイクロでは、ドロップされるペイロードを自動抽出するPythonスクリプトを作成しました。スクリプトはこちらからダウンロードいただけます。
「ローダ分析」の項で述べたように、ドロッパ・コンポーネントのバージョンによっては、ドライバ・コンポーネントのサービスを開始するものもあります。なお、サービス開始処理(最終ペイロードの復号や実行の前に実施)のバイナリが、最終ペイロード用のドロッパ内に同梱されている点は特記に値します。
ドライバの分析
ドライバ・コンポーネントは、RATコンポーネントに対するファイル削除やプロセス停止をカーネルレベルで阻止します。これを実現するため、本ドライバ・コンポーネントは、自身を「ミニドライバ・フィルタ」としてOSに登録します。この際、OSの機能を利用して、ファイルへのI/Oリクエストやプロセス作成状況を監視し、必要に応じてRATを保護するコールバック・ルーチンが呼び出されるように設定、登録を行います。
本ドライバ・コンポーネントの実装について調査したところ、プロセス停止を阻止する機能は、マイクロソフトのドライバ実装サンプルを参照して、ファイル削除を阻止する機能は、「Prevent_File_Deletion」というオープンソースプロジェクトを参照して作られていることが分かりました。
ドライバ・コンポーネントは、API「FltRegisterFilter」と「FltStartFiltering」を使用して自身をミニフィルタ・ドライバとして登録、開始します。
ファイルのI/O操作は、通常OSが提供する「ファイルシステム」を通して行われます。そして、「ファイルシステム・フィルタ」として登録されたドライバは、さまざまなアプリケーションによるファイルシステムへのアクセスを検知し、あらかじめ設定したコールバック・ルーチンを呼び出すことが可能です。さらに、Windowsのレガシーなファイルシステム・フィルタよりも記述が容易であるという点で、実装しやすい「ファイルシステム・ミニフィルタ」も存在し、上述の目的に合致するドライバの開発手段として頻繁に用いられます。
ミニフィルタ・ドライバの登録時は、特定の種類のI/Oリクエストが発生する前後に呼び出すコールバック・ルーチン(PreOperationとPostOperation)をそれぞれ設定できます。今回のドライバ・コンポーネントは、RAT関連ファイルの削除を阻止する目的から、特に「ファイル削除」の「発生前」に呼び出されるコールバック・ルーチン「PreOperation」を設定します。
上述のコールバック・ルーチン「PreOperation」が呼び出されると、ドライバ側の処理が起動し削除対象のファイルがRATペイロード(ougdwieue.exe)であるかを判定します。RATペイロードと判定した場合、ファイルが削除されないようにするため当該削除リクエストの権限を変更します。
プロセス停止の阻止については、API「PsSetCreateProcessNotifyRoutine」を用いて、新規プロセスが生成される度に呼び出されるコールバック・ルーチンを登録します。このコールバック・ルーチンが実行されると、本ドライバは「ougdwieue.exe」の文字列をプロセス・コマンドラインから検索し、保護対象のプロセスであるかどうかを判定します。
ドライバはさらにAPI「ObRegisterCallback」を用いて、プロセス・ハンドルの作成、複製を伴う操作が行われたかを判定するコールバック・ルーチンを別途登録します。
上述した2つのコールバック・ルーチンが登録された状態で任意のプロセスが新規作成されると、ドライバはそのプロセスがRATペイロードであるか、またはプロセス・ハンドルの作成または複製が行われたかを判定できます。どちらの判定結果も真である場合、対象のプロセス・ハンドルが他のアプリケーションに取得され、停止されることを阻止できるように、アクセス権限を変更します。
RATの分析
最終段階のペイロードであるRATは、リモートサーバからコマンドを受信して、シェルコマンドの実行、DDoS(Distributed Denial-of-Service)攻撃の実施、ファイルのダウンロードと実行、感染端末上でのキーストローク窃取、さらにリモートデスクトップまでを含むさまざまな機能をカバーします。図18に、機能一覧を示します。
RATは、まず起動時にさまざまなシステムチェック処理を行い、検証用環境を検知して回避しようとします。
RATは、下記名称のミューテックス・オブジェクトを生成して、システム上で起動中であることが分かるようにします。すでに同じミューテックスが存在していた場合は、処理を終了します。
3f0d73e2-4b8e-4539-90fd-812330bb39c8
C&Cサーバと通信する前に、NetDookaは16バイトのランダムなセッションIDを生成して「config.cfg」ファイルに保存します。
セッションIDの生成後、ネットワーク通信コンポーネントの初期化を行い、感染端末情報をC&Cサーバに登録した上で、コマンドの受け付けを開始します。
NetDooka RATはC&Cサーバと通信する際に、図23の形式を持つ独自のプロトコルを使用します。
RATがC&Cサーバに返却する個々のメッセージは、ヘッダー部とデータ部で構成されます。さらに、ヘッダー部は、リクエスト種別、データ部のサイズ、データ送信に関するオプション設定の3要素に分割されます。一方、データ部には、個々のリクエスト種別に応じた内容が含まれます。
種別値(10進数) | 種別値(16進数) | 機能 |
400 |
0x190 |
システム情報を窃取 |
1000 |
0x3E8 |
セッションIDを送信 |
10 |
0x0A |
メッセージを送信 |
8 |
0x08 |
リバースシェル |
16 |
0x10 |
DDoS攻撃 |
19 |
0x13 |
ファイルを送信 |
5 |
0x05 |
ファイルをダウンロード |
20 |
0x14 |
ブラウザデータをコピー |
9 |
0x09 |
ブラウザデータをコピー |
18 |
0x12 |
HVNCを開始 |
15 |
0x0F |
ログ情報を送信 |
14 |
0x0E |
マイク音声を取り込む |
17 |
0x11 |
バーチャル・ネットワーク・コンピューティング(VNC)を開始 |
13 |
0x0D |
Webカメラの映像を取り込む |
上表に記載したリクエスト応答情報をRATが作成、送信する際のコードを図24に示します。
次にRATは、TCP通信でC&Cサーバからコマンドを受信します。コマンドを受け取ると、感染した端末上でその内容を解析し対応する処理を実行します。図25にRATがサポートするコマンドを、図26にコマンド実行に関わるコードを示します。
結論
マルウェア製作者は、PPIマルウェアサービスを用いることでペイロードを容易に拡散することが可能です。不正なドライバを用いることで、標的の攻撃対象領域が広がるだけでなく、プロセス停止やファイル削除の阻止、アンチウイルスによる検知のすり抜け、マルウェア本体やネットワーク通信の隠蔽など、ドライバとしての特性を生かした手口が生み出されます。さらにはRATペイロードを標的にインストールした攻撃者は、感染した端末に保存されている多様な機密情報の窃取、システムへのリモートアクセス権限の取得、ボットネットの構築をはじめとするさまざまな攻撃活動を行えるようになります。また、NetDookaが持つ機能は、他のマルウェアを送り込む手段として利用される可能性もあります。
侵入の痕跡(Indicators of Compromise、IoC)
侵入の痕跡(IoC)はこちらで確認してください。
テキスト形式もこちらからご参照いただけます。
参考記事:
• 「NetDooka Framework Distributed via PrivateLoader Malware as Part of Pay-Per-Install Service」
By: Aliakbar Zahravi, Leandro Froes
翻訳:清水 浩平(Core Technology Marketing, Trend Micro™ Research)