脅威の調査

ランサムウェア攻撃の前兆「Qakbot」ボットネットによるペイロード配信と脆弱性探索

大規模に展開されたボットネットが多種多様なペイロードを配信し、ネットワークの脆弱性をスキャンしています。

** 本記事は、Qakbot injects itself into the middle of your conversations の翻訳です。最新の情報は英語記事をご覧ください。**

電子メールはもともとわずらわしいものですが、Qakbot (別名 Qbot) が使用する手法には特に注意が必要です。このマルウェアは電子メールから感染します。侵入後は、他の感染者の侵害されたアカウントを使用し、既存の電子メールのやりとりの途中に悪意のある返信を挿入することによって拡散する傾向があります。挿入される返信メッセージは「全員に返信」の形で行われ、短い文章と、悪意のある Office 文書をダウンロードするためのリンクが記載されています。このリンクを開くと、マルウェアがダウンロードされます。

Qakbot は、この手法に非常に長けています。悪意のあるメッセージの後に元のメッセージを引用するのです。そのため、この種の攻撃を受けた標的が、受信したメッセージが送信元本人から送られたものではないことを認識するのが困難な場合があります。この種の攻撃は日常的に起こっており、筆者が購読しているメーリングリストにおいても発生しました。

悪意のあるメッセージには通常、簡単な文章の後に zip アーカイブをダウンロードするためのリンクが続きます。これらのリンクは、上記のような「素の URL」であったり、以下の例のようにメッセージの本文中にホットリンクされたテキストだったりします。

Qakbot によって送られるスパムメッセージの英語バージョン

悪意のある返信メッセージは、受信者の言語だと推定される言語で送られることがあります。以下の例はドイツ語のものです。

Qakbot は最近数か月で再度流行しています。Emotet や Trickbot といった競合する電子メール主導型のボットネットが、法執行機関や IT 企業による対策 (および最近では、不満を抱いた元犯罪者による内部データの流出) によって勢いを落としているためです。

これらのマルウェアファミリと同様、Qakbot マルウェアはモジュール型で、コアであるエンジンコンポーネントと、状況に応じてダウンロードした後システムプロセスに注入される、複数の悪意のあるプラグインやコンポーネントから構成されます。Qakbot による攻撃では、多くの機能が用いられるため、全容の把握のために動作を調査する価値があります。

今回のインシデントにおいて興味深かったのは、音楽の演奏会に関するメーリングリストの告知に対して攻撃者が返信を送った際に、このマルウェアが少なくとも 3 種類のペイロードを配信したことです。確認されたのは、ログイン情報を窃取するための Web インジェクターや、実行中のネットワークのプロファイリングを試みる ARP スキャンコンポーネントなどです。10 月に筆者がテスト機に感染させた同マルウェアはまだ機能しており、C2 サーバーとの通信が可能です。また、このマルウェアは 5 か月経ってもなお、ペイロードのアップデートを取得し続けています。

Qakbot の感染手法

筆者が受信したメッセージには、
「こんにちは。もしご迷惑でなければ、前回お送りした書類への返事をお願いします。お送りした書類が届いてないことがありますので、早急に行ってください。」という内容のシンプルな文章が記されていました。このメッセージを受信する前に、近くの大学の学生から音楽公演に関するお知らせが来ていましたが、このように大規模なメーリングリストの一般的なお知らせに誰かが返信するのは珍しいので、確認してみました。

Qakbot の悪意のある Excel .xlsb ファイルは、一定の期間、同じ見た目をしていました。

今回受信したメッセージは、ソフォスがスパムのサンプルを追跡するために利用しているテストシステム上に存在する何百もの亜種のうちの 1 件に過ぎないことがわかりました。メッセージはいずれも URL (ホットリンクされていないため、メッセージからリンクをコピーしてブラウザのアドレスバーに貼り付ける必要があります) を含んでおり、URL 自体にラテン語の単語がいくつか (「だからではない」という意味を持つ nulla quia) 含まれているという特徴を持っています。また、ペイロードのファイル名にもラテン語 (「彼に」という意味の eum) が使われています。同時期に流行した他のスパムメッセージにおいても、URL にはラテン語のフレーズが使われていました。

eum.zip と題されたファイルには、.xlsb (Excel バイナリブック) という拡張子を持つ悪意のある Excel スプレッドシートが含まれていました。このスプレッドシートを開く (そして Excel で「コンテンツの有効化」ボタンをクリックする) と、.xlsb ファイルに埋め込まれたペイロードが実行されます。このペイロードは、ボットが C: ドライブのルートに作成したランダムな名前の (5 文字の) フォルダにドロップされ、Edge ブラウザを使用して感染した Web サイトに短時間アクセスします。その後、Edge や Explorer、あるいはその両方に自身を注入します。

悪意のある .xlsb ファイルは、C: ドライブのルート上の 5 文字のフォルダにドロップする DLL ペイロードをロードさせるために regsvr32 を起動します。

このマルウェアは、実行されているマシンのプロファイリング、公開 IP アドレスの取得、テスト機上で確認された他のものと同じ動作を行う一連のペイロードのダウンロードなど、さまざまな悪質な動作を続けました。

Qakbot の目的

Qakbot は Explorer.exe と Msedge.exe のインスタンスに注入され、システム上に基盤を固めると、さまざまな悪意のあるペイロードを取得し、この 2 件のシステムプログラムに新しく追加されるインスタンスに注入します。Explorer.exe に注入されたメインのマルウェアペイロードは、およそ 5 分ごとに C2 サーバーにビーコンを発信していました。この C2 アドレスは、少なくとも 5 か月の間、アクティブで利用可能な状態を維持しています。

Qakbot が Excel を悪用して「Jambo」ディレクトリ内のペイロードを取得し、実行している様子です。

しかし、本当に興味深いのは、ボットが 1 件の、または複数のペイロード DLL をアクティブにした際の動作です。その際、マルウェアは窃取したと思われる認証情報を使って Web サイトの管理インターフェイスへのセッションを開き、Web サイトのホスティングストレージ領域に複数のファイルをアップロードしました。そのため、これらのペイロードのうちの 1 つは Web プロキシとして使用されたと見られています。また、別のペイロードは、12 台の SMTP サーバーのアドレスを名前解決し、各サーバーに接続してスパムメッセージの送信を試みました。

Qakbot に感染したコンピューターは、内部ネットワークの ARP スキャンを実行します。

さらに、最も厄介なペイロードが目を引きました。このペイロードは、テスト機の NAT ネットワークアドレス空間の IP アドレスの範囲全体を ARP スキャンし、おそらくネットワーク上の他のマシンに水平移動する方法を探していました。

Qakbot に感染することは一般的に、ランサムウェア攻撃が程なくして開始される前兆とも言われています。また、Cobalt Strike ビーコンを感染したホストに直接配信し、ボットネットのオペレーターに 2 つ目の「収入源」を提供する Qakbot のサンプルも確認されています。Qakbot のオペレーターは、感染したコンピューターを自分たちの攻撃のために悪用した後、これらのビーコンへのアクセスを他の攻撃者に転送することで、感染したネットワークへのアクセス権を貸し出したり、販売したりできるのです。

Qakbot の動作の分析

Qakbot には、マルウェア本体とその C2 メッセージの両方に、非常に精緻な難読化と暗号化が施されています。このマルウェアの製作者は、機密性の高い文字列、設定データ、および C2 アドレスの隠蔽に多大な努力を払っています。また、このマルウェアは、感染プロセス中に作成したキーを使い、Windows のレジストリに暗号化された形式でデータをキャッシュします。

C2 サーバーとの通信では、各 C2 通信がそれぞれに固有のキーで暗号化されています。この手の込んだ仕組みにより、感染したシステムに関してボットがオペレーターに何を伝えているかを解析するのが困難になっています。また、Dridex と同様に、Qakbot はハッシュ表のルックアップ機能を利用して、どの OS の API コールを利用しているかを隠蔽しています。

これらのボットによる通信の仕組みを理解するために多くの時間を要しましたが、分析の結果、ボットが送受信するメッセージの解読に成功しました。

感染したホスト上で WMI コマンドを実行するための Qakbot コード

Qakbot は、さまざまな機能に WMI コマンドを使用しています。このコマンドは、感染したマシンのプロファイルの作成のため、OS にクエリを送信し、さまざまなコンポーネントのフィンガープリントを作成することなどに用いられます。また、ファイルやフォルダのコピー、他の Windows 実行ファイルの呼び出しなどにも WMI コマンドが使われます。たとえば、ボットは WMI コマンドを使用して OS にクエリを送信し、どのエンドポイント保護ソフトがインストールされているかを確認します。実際の WMI コマンドは、XOR で難読化されています。

ボットとそのオペレーターとの間の C2 通信は HTTPS の POST および GET リクエストで行われ、データは TLS 内にラップされて暗号化された形式で送信されます。TLS レイヤーを取り除けば、通信プロトコルが出現しますが、トラフィックは暗号化されたままです。Qakbot は、複数の IP アドレスに対して通常の HTTPS POST を実行しており、(少なくとも我々がテストしたサンプルでは) 常に /t4 というパスと、Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko というユーザーエージェント文字列を使っていました。

Qakbot による HTTPS POST リクエスト (赤色部分) と C2 サーバーの応答 (青色部分)

この暗号化されたデータは、Base64 でエンコードされた文字列の blob (バイナリラージオブジェクト) として表示されます。Qakbot はメッセージごとに暗号化キーを生成しますが、キーの一部はメッセージの最初の数文字および一定のソルト値であるため、解読は困難な場合があります。

Qakbot は Windows レジストリ内のランダムに生成されるキーの中に暗号化されたデータを保存します。

また、Qakbot はボット本体に格納される情報と Windows レジストリに格納される情報に対して、感染したコンピューターごとに固有のキーを生成します。このキーの生成は、感染したコンピューターと OS の特徴を利用して動的に行われます。

詳細は省きますが、ソフォスではボットのメッセージを解読し、内容を明らかにすることに成功しました。解読すると、データは JSON 形式で表示されます。

たとえば、ボットから送信されるメッセージ (上記の赤色部分) をデコードすると次のようになります。

{"2":"pqqjdl158536","8":9,"1":18}

また、サーバーからの応答は以下のようになります (上記の青色部分)。

{"8":5,"16":2920293983,"39":"1KGiN4q75fpImffmxkv6e0zncFjN6IzvT6Qkz8gtcI2BnTnb5USUUH8xNhAI","38":1}

この文字列も明らかに別の方式でエンコードされていますが、我々が発見したキーを使えば解読できます。上記の文字列は、引用符 (“”) でくくられた数値、コロン (:)、そして 2 つ目の数値というパターンの繰り返しになっています。通信フローには、このようなメッセージのペアが含まれることがよくあります。

引用符の中の数字は、以下の「メッセージ型」表を用いて変換できます。この表は発見したキーを用いてメッセージを解読し、得られたものです。

'1' : 'PROTOCOL VERSION',
'2' : 'BOTID',
'3' : 'CAMPAINGID',
'4' : 'BOT VERSION HI',
'5' : 'BOT VERSION LOW' ,
'6' : 'BOT UPTIME',
'7' : 'SYSTEM UPTIME',
'8' : 'MSGTYPE',
'9' : '[TBD]',
'10': 'SYSTEM TIMESTAMP',
'15': 'SIGNED (SALT|CMDID|MODULEID)',
'16': 'EXTERNAL IP',
'18': 'MODULE ID',
'19': 'COMMAND ID',
'20': ['MODULETYPE', Base64 PAYLOAD],
'38': 'ACK [TBD]',
'39': 'RND STRING'

つまり、上記の最初の通信ではボットは、BOTID が pqqjdl158536 であること、MSGTYPE が 9 であること、および PROTOCOL VERSION が 18 であることを C2 サーバーに伝えているのです。

サーバーからの応答は MSGTYPE が 5 であること、感染したマシンの EXTERNAL IP が 174.16.38.95 であること (上記に置いてはドットを含まない表記で 2920293983 と表されています) を示しています。最後の部分の文字列は備考だと考えられます。

この解読法を用いれば、ボットと C2 サーバーの間のやり取り全体を読み、追跡することができます。「MSGTYPE 5」が何を意味するのか正確にはわかりませんが、文脈から通常のチェックインを指すと推測できます。

解読したメッセージを JSON 形式のデータの束のままにしておくのではなく、ボットと C2 サーバーとのやり取りをもう少しわかりやすく表現することにしました。以下の動画は、ボットがオペレーターにビーコンを発信し、指示を受けるまでの最初の数分間のやり取り (サーバーが応答した場合、定期的に応答しなかった場合のそれぞれ) を解釈したものです。

 

C2 サーバーへの最初の接続で、ボットは非常に大きなサイズのデータ blob をサーバーに送信します。この blob を解読したところ、感染したマシンの極めて詳細なプロファイルであることが判明しました。ネットワークの速度やフィードだけでなく、存在するユーザーアカウント (とその権限)、インストールされたソフトウェア (とそのソフトウェアの関連レジストリキー)、ロードされたドライバー (とそのレジストリキー)、実行中のサービスおよびスケジュールされたタスクのリスト、netstat コマンドの出力データ、実行中のプロセスのリストなども含まれています。

このデータは平文に直すと 1.4MB 以上もの大きさになり、今回用いたテスト機についてかなり多くの情報を提供していました。中には、筆者の知らない情報さえ含まれていました。

また、C2 サーバーからボットに対しても大きなサイズのデータ blob が送信されます。これらのほとんどは DLL ペイロードで、ボットはこの blob を解読し、中身を取り去ったシステムプロセスにロードし、ファイルレスで実行します。これらの blob の中には、「webinjects (Web インジェクション)」と呼ばれる攻撃のファイルも含まれていました。このファイルは、人気のある Web サイトの、Web ベースのログインフォームに入力されたユーザー名とパスワードをボットが窃取する方法を定めた一連の大容量データファイルです。さまざまな Web サイトに対応していました。

Qakbot が悪用を試みる Web サイトのリストには、いつもの顔ぶれ (Facebook、Microsoft、Google) だけでなく、銀行や金融機関のものも含まれていました。

検出とアドバイス

Qakbot は、多種多様な犯罪集団の間で人気が高まっている、汎用性の高いマルウェアファミリです。犯罪集団は自らの攻撃を成功させるために Qakbot 自体、あるいはそのペイロードを利用します。電子メールスレッドの悪用は特に危険です。メールの受信者が複数の当事者間で進行中の会話の中に Qakbot を拡散するメールが紛れ込んでいることに気づかない可能性があるからです。

最も簡単なアドバイスは、たとえ既存のメールスレッドに対する返信であるように見えるメッセージであっても、確認が取れない限り常に警戒心を持ってメールを扱うことです。攻撃者は URL にラテン語のフレーズを用いるのをやめたようですが、「Caveat lector (読者は用心せよ)」というラテン語の格言は今日においても有用なアドバイスです。

既存の動作保護機能により、ソフォスのエンドポイント製品で保護されたマシンは Qakbot に感染することはありません。また、感染したユーザーが既知の C2 アドレスまたはドメインに接続しようとすると、ネットワーク機器が管理者に通知します。今回のインシデントに関係するサンプルは Mal/EncPk-AQC として検出され、一部のペイロード (特に webinjects コード) は Mal/QbotDat-A として検出されます。

SophosLabs は、本記事で分析した Qakbot のサンプルに関連するセキュリティ侵害の痕跡 (IoC) を Github のリポジトリに掲載しています。