Symantec Security Response Weblog
Qakbot, Data Thief Unmasked: Part I」より
December 20,2009 Posted by Shunichi Imano

目的

 最近あるマルウエアを再調査する機会に恵まれた。我々がこの「W32.Qakbot」(以下「Qakbot」と呼ぶ)という無害なワームの存在に初めて気付いたのは2009年5月である。Qakbotは最終的な目的を達成するための手段として、ネットワーク共有経由の感染拡大、追加ファイルのダウンロード、感染パソコンでのバックドア生成といった機能を備えている。このワームが無害だと言っているのは、攻撃対象に被害を与えないからではない(ログイン情報を不正取得したり、キー入力のデータやデジタル証明書の情報を外部に送信したりする行為はもちろん悪いことだが、直接的な被害は発生しない)。無害なのは、存在に気付かれないよう注意深くひっそりと動くからだ。以下の解説を読み進めれば、この点を理解してもらえるだろう。

 Qakbotの目的ははっきりしている。情報を盗むことである。この当たり前の目的の背後には、実現に必要な作業を担当する以下のようなコンポーネントが隠れている。

・_qbot.dll
・_qbotinj.exe
・msadvapi32.dll
・_qbot.cb
・seclog.txt
・_qbotnti.exe
・sconnect.js
・webfix.txt

 各コンポーネントについて、提供される様々な機能とデータ不正取得という悪事の実行手段を順番に説明していこう。

感染

 Qakbotは、まずWebページに仕込んだJavaScriptコードで「Microsoft Internet Explorer(IE)ADODB.Stream Object File Installation Weakness」や「Apple QuickTime Real Time Streaming Protocol(RTSP)URI Remote Buffer Overflow」といったセキュリティ・ホールを突き、パソコンへの感染を試みる。感染に成功すると、攻撃用のファイルをダウンロードする。Qakbotは、自分のファイルをすべて感染パソコンのユーザー・プロファイル・データ用フォルダ(通常「C:\Documents and Settings\[ユーザー名]\_qbothome」)に保存する。こうしてダウンロードしたファイルのうち、まず「_qbot.dll」および「_qbotinj.exe」を説明しよう。

 _qbot.dllはQakbotの中心的なコンポーネントで、感染パソコンからの情報収集と、盗んだデータを作者の管理下にあるFTPサーバーへ送信するという役割を担当している(なお、FTPサーバーのありかは頻繁に変わる)。_qbot.dllについては後で改めて解説する。

コード挿入

 _qbotinj.exeは_qbot.dllの付属コンポーネントとして機能する。Windowsが常にメモリー上で動かす数少ない実行ファイルの一つで、Windowsの中核プロセスである「explorer.exe」に対し、_qbot.dllを挿入して感染する。つまり、_qbot.dllはメモリー上で動くのだ。_qbotinj.exeは、IEの動きをつかさどる「iexplore.exe」のプロセスにもコードを挿入する。

 このコード挿入によって、Qakbotでは、これ以降の行為をWindowsの正当なプロセスの動きに見せかける、という離れ業が可能になる。もっとも、この手口は多種多様な脅威でよく使われている。というのも、ウイルス対策ソフトやファイアウォール、その他セキュリティ製品の多くが、大抵の場合こうしたWindowsの通常プロセスにインターネットやパソコン内のその他アプリケーションへのアクセスをすべて許可するからだ。

 上の図は、Qakbotがコード挿入済みIEプロセスで実行した指令センターとのやり取りの様子である。どこから見ても、正常なWebブラウザの通信としか思えない。

 ただし興味深いことに、_qbotinj.exeは以下に挙げたある種のプロセスに対し_qbot.dllを挿入しない。おそらく検出されるのを避けるためだろう(デバッグされることを避ける意味もある。いずれにしろ、検出もデバッグも最終的には同じような結果をQakbotにもたらす)。

・msdev.exe
・dbgview.exe
・mirc.exe
・ollydbg.exe
・ccApp.exe
・R&Q.exe
・photoed
・outlook.exe
・mmc.exe
・ctfmon.exe

生き残り作戦

 さらに_qbot.dllは、「Watchdog」と「Swatcher」という二つのスレッドを追加実行する。WatchdogはWindowsのユーティリティ・ソフト「Dr.Watson」のインスタンスがメモリー上で動いているどうか監視し、見つけ次第停止させる。これに対しSwatcherは30秒ごとにレジストリのサブキー「Run」と「RunOnce」を確認し、必要に応じて更新する。QakbotはRunやRunOnceそのものにレジストリ値を追加しないが、両サブキー配下の最終エントリに自分の実行可能ファイルを加え、その後ろにパラメータ「/C」と元々あった正当なレジストリ値を付ける。

Runレジストリ・キーのエントリの例(Qakbotに改変される直前の正常な状態):


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"Test Program" = "C:\Program Files\Test Program\testprogram.exe"

Runレジストリ・キーのエントリの例(Qakbotに改変された後の状態):


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\"C:\Documents and Settings\All Users\_qbothome\_qbotinj.exe" " C:\Documents and Settings\All Users\_qbothome\_qbot.dll" /C "C:\Program Files\Test Program\testprogram.exe"

 Qakbotは、悪事に使う内部コマンドをいくつか備えている。そうしたコマンドの一つ「getip」はレジストリ・キー「key HKEY_CLASSES_ROOT\Installer\Products」を調べ、仮想化技術を手がける米シトリックス・システムズの製品や、「Microsoft Office」または「Microsoft Project」がインストールされているかどうか確認する。インストールされていた場合、getipはそれ以上何もしない。インストールされていなければ、getipは次に自分が仮想マシン(VM)上で動いているかどうか調べる。VMを見つけると、QakbotはPOSTリクエストでVMの情報を「(http://)hostrmeter.com/cgi-bin/exha[削除済み]」へ送信し、感染パソコン内で「c:\irclog.txt」というファイルの有無を調べる。c:\irclog.txtがあれば、Qakbotは「uninstall」コマンドを使って自らアンインストールしてしまう。この動きについては、パート2で触れる。

感染拡大

 Qakbotには、ネットワーク共有経由で感染を広げる内部コマンド「nbscan」もある。このコマンドはネットワーク共有フォルダを偽装し、「%CurrentFolder%\nbl_[ユーザー名].txt」というファイル内に偽装した際の共有名とユーザー名が含まれていないかどうか調べる。含まれている場合はそのネットワーク共有を止める。含まれていない場合は(接続先マシンの共有フォルダへファイルをコピーする前に)接続先マシンに「%CurrentFolder%\_qbot[ランダムな文字]」および「%CurrentFolder%\q1.dll」というファイルがあるかどうか確かめ、両ファイルがなければダウンロードする。続いてq1.dllを「[接続先マシン]\C$\windows\q1.dll」または「[接続先マシン]\ADMIN$\q1.dll」として、_qbot[ランダムな文字]を「[接続先マシン]\C$\windows\_qbot[ランダムな文字].exe」または「[接続先マシン]\ADMIN$\_qbot [ランダムな文字].exe」としてコピーする。そしてコピー後、ローカル・マシン側の%CurrentFolder%\nbl_[ユーザー名].txtにその共有名とユーザー名を書き込む。もちろん書き込み先のこのファイルはQakbotがネットワーク共有の最初の段階で調べたものであり、この中に共有名/ユーザー名が含まれていれば既にネットワーク共有処理を終えていると分かる(つまり、感染済みということが分かる)。

 Qakbotは「_qbotnti.exe」を使ってメモリーに「msadvapi.dll」をロードし、そのmsadvapi.dllを使って作動中の全プロセスのAPIにフックを設ける。これには二つの目的がある。一つ目の目的はクローキング(隠ぺい工作)であり、msadvapi.dllは「_qbot」という文字の入ったファイル名およびレジストリ・エントリと、TCPの16666~16669番ポートに対するインターネット接続を隠す。二つ目の目的は、21番(FTP用)、110番(POP3用)、143番(IMAP用)というポート用のソケットと、「webfix.txt」という設定ファイルであらかじめ指定されているWebサイトに対するログイン情報を取得することだ。こうしてQakbotは、感染パソコンのユーザーがwebfix.txtに書かれたURLにアクセスする際を狙ってログイン情報の不正取得を図る。

 当特集記事は続くパート2でQakbotの盗む情報とアップデート機構を簡単に説明して終えるので、そちらも読んでほしい。

 Qakbotを分析してくれたMasaki Suenaga氏とTakayoshi Nakayama氏に感謝する。


Copyrights (C) 2009-2010 Symantec Corporation. All rights reserved.
本記事の内容は執筆時点のものであり,含まれている情報やリンクの正確性,完全性,妥当性について保証するものではありません。
◆この記事は,シマンテックの許可を得て,米国のセキュリティ・ラボの研究員が執筆するブログSecurity Response Weblogの記事を抜粋して日本語化したものです。オリジナルの記事は,「Qakbot, Data Thief Unmasked: Part I」でお読みいただけます。