NUCLEAR BOTを解体

投稿者:Dennis Schwarz
投稿アーカイブ:analysis、Botnets、Interesting Research、Malware、Reverse Engineering、threat analysis.

最近のあるツイートによると、「Nuclear Bot」と呼ばれる新しいバンキングマルウェアがアンダーグラウンド市場で販売され始めたそうです。Nuclear Botの最低取引価格は約2,500ドルと、昨今市場に登場した別のマルウェアの2倍の価格です。本稿では、『Duck and Cover』に登場する亀のBertのアドバイスさながら、Nuclear Botに備えるアドバイスを受け入れる必要があるか否かを判断するために、このマルウェアのサンプルを解体してみます。

サンプル

本稿で分析したサンプルは、VirusTotalから入手可能です。サンプルには、有用なデバッグ用の文字列(E:\Nuclear\Bot\Release\Dropper.pdb)が含まれています。

また、ID入力用のログインパネルで、コマンド&コントロール(C2)サーバーと通信を開始します。

以下本稿では、Nuclear Botのドロッパー、ボット、Webinjectの各コンポーネントについて解説します。

ドロッパーコンポーネント

まず、ドロッパーコンポーネントです。大量のWindowsライブラリを手動でロードすることで、ドロッパーコンポーネントを開始します。ライブラリ名は、XORとハードコードされたキーによって難読化されます。以下のPythonスニペットは、「ntdll.dll」の難読化された文字列の例を復号します。

key = "\x03\x0E\x18\f\x1A\x1F"
encbuf = "mz|`v1gbt"
plainbuf= []

for i, c in enumerate(encbuf):
   plain = ord(c) ^ ord(key[i % len(key)])
   plainbuf.append(chr(plain & 0xff))
print "".join(plainbuf)

ライブラリがロードされると、APIハッシュを使用してライブラリから大量の機能を解決します。以下のPythonスニペットは、「LoadLibraryA」機能の例を「0x3b7225fc」というハッシュに変換します。

name = "LoadLibraryA"
hash_val = 0

for i, c in enumerate(name):
   if i & 1:
       v6 = (~(ord(c) ^ (hash_val >> 5) ^ (hash_val << 11))) & 0xffffffff
   else:
       v6 = (ord(c) ^ (hash_val >> 3) ^ (hash_val << 7)) & 0xffffffff
   hash_val ^= v6

hash_val = hash_val & 0x7fffffff
print hex(hash_val)

次に、ルートボリュームのシリアル番号に基づいてボットIDを生成します。以下がその例です。

{496E9266-9266-1717986918}

続いて、3種類の解析妨害を実行します。

  1. IDA ProやSysinternalsなどの一般的な解析ソフトウェアを検出
  2. 一般的なサンドボックスや仮想マシンを検出
  3. タイミングチェックを介してデバッグを検出

解析環境において稼働していることが検出された場合、ドロッパー自身を削除します。ドロッパー自身を「%appdata%」ディレクトリにコピーすることで、パーシスタンスが設定され、ユーザーのレジストリ内に「Software\Microsoft\Windows\CurrentVersion\Run」エントリを設定します。

これらの設定が完了すると、svchost(-k netsvcs)プロセスが開始し、ドロッパーの内部にDLLが注入されます。DLLはドロッパーにおいて保存・圧縮され、RtlDecompressBuffer Windows APIを使用して展開されます。

次のコンポーネントに移る前に、一部のシステム情報が「%appdata%」内の「.txt」テキストファイルに書き込まれます。「」はボットIDに置き換えられます。システム情報はパイプで区切られており、以下の要素で構成されます。

ボットコンポーネント

注入されたDLLまたは「ボット」コンポーネントは、VirusTotalから入手可能です。ボットコンポーネントは、ドロッパーと同様の方法でライブラリをロードし、機能を解決します。最初のセットアップが終了すると、空のHTTP POSTリクエストをC2サーバーに送ります。

C2からの応答は16進法の文字列で、これがC2コミュニケーションをさらに難読化するためのXORキーとして使用されます。以下のPythonのスニペットは、難読化されていることを示しています。

key = "920e9b92bb97c06fbaf1c4854db682898a85cb1e"
inbuf = "ping"
outbuf = []

for i, c in enumerate(inbuf):
   b = ord(c) ^ ord(key[i % len(key)])
   outbuf.append(chr(b & 0xff))

print "".join(outbuf)

次に、「<botid>.txt」ファイルからシステム情報を読み取り、C2サーバーに送ります。

コマンドは、「ping」コマンドでポーリングされます。レスポンスはパイプで区切られており、最初のフィールドがコマンド番号を、その他はコマンド引数を表しています。以下のコマンドが特定されています。

上記のコマンドに加え、Nuclear Botにはマン・イン・ザ・ブラウザ(MitB)機能があり、Webinject(どのWebサイトをどのように標的にするかを表す規則)と連動してなりすましを可能にし、金融機関その他のWebサイトから認証情報を盗みます。MitBコードは圧縮されたDLLとして、ボットファイルの「.x86」または「.x64」PEファイルセクションに保存されます。

これはRtlDecompressBufferを用いて元の形式に展開できます。今回の解析に使用したx86 DLLもVirusTotalから入手可能です。デバッグ文字列に基づいて、開発者はこのDLLを「Engine32」と呼んでいます。

エンジン

「engine」DLLは、最初にexplorer.exeに注入されます。explorer.exe内で、将来的なプロセス作成を管理できるようCreateProcessW Windows APIをフックします。機能フックは初めに、どのようなプロセスを作成するかを決定します。次にプロセスを作成するために、実際のCreateProccessW機能にexeファイルを渡します。最後に、例えばWebブラウザ(Internet Explorer、Firefox、Chrome、Opera)のプロセスである場合は、ボットIDをパイプ名として名付けたパイプをオープンし、新たに作成されたWebブラウザのプロセスID(PID)を書き込みます。パイプの反対の端は上述のボットコンポーネントによってオープンされ、PIDを受け取ってから「engine」コンポーネントを当該プロセス内に注入します。このようにして、MitBコンポーネントはWebブラウザに侵入します。

いったんWebブラウザに注入されると、どのブラウザであるかを判断し、適切な機能をフックします。例えば、Internet Explorer内のInternetConnectW、HttpOpenRequestW、InternetReadFileなど、またはFirefox内のPR_ReadやPR_Writeなどです。これらのフックは、被害者のWeb閲覧を監視し(通信のこのレイヤではHTTPSは重要ではない)、継続的にトラフィックとWebinjectのリストを比較します。合致するものが見つかると悪意のあるWebinjectコードがWebページに注入され、改ざんされたWebページを被害者に表示し、認証情報の盗難が発生します。

Nuclear Botは「injects」コマンドを送信し、C2サーバーからWebinjectをダウンロードします。戻りデータは、以下のようなJSONファイルです。

結論

本稿では、Nuclear Botとして知られる新しいバンキングマルウェアを解体しました。新しいマルウェアについて常に言えることですが、この新しいファミリーがどれほど活発に広まるかを評価するのは時期尚早です。さらに、今回のサンプルは粗暴な兵器として拡散させることが目的ではなく、開発に利用される「テスト用ボットネット」である可能性が高いため、このサンプルに基づいて評価し、対策を講じることはいっそう困難です。その根拠は、Nuclear Botが「Hello World」型のWebinjectを使用している上、マルウェアの実行中に多数のMessageBox機能が呼び出され、ポップアップ表示されていることにあります。

亀のバートのアドバイスに従うにはまだ早過ぎるかもしれませんが、最近のボットの広告ではバグの修正と更新バージョンが示唆されているため、今後も注意する必要があるといえます。