脅威の調査

悪意のあるコンテンツを配信する Gootloader の中央サーバーが確認される

ソフォスが 3 月に最初の調査結果を発表してからも、Gootloader の攻撃は一向に収束していません。今回の記事では、ソーシャルエンジニアリングや悪質な SEO 対策の大部分を占める WordPress サイトのサーバー側の動作について紹介します。

** 本記事は、Gootloader’s “mothership” controls malicious content の翻訳です。最新の情報は英語記事をご覧ください。**

以前の記事では、Gootloader がいかにしてビジネスに関連する用語 (英語、ドイツ語、フランス語、韓国語) を Google 検索したユーザーを危険な WordPress Web サイトのネットワークに誘導するかについて紹介しました。これらの Web サイトは、ソーシャルエンジニアリングの巧妙な手法を用いてユーザーに悪意のあるファイルを配信します。悪意のあるファイルをダブルクリックしてしまうと、コンピュータはマルウェアに感染します。このマルウェアはファイルシステムを操作せず、悪意のあるコードを Windows のレジストリに保存する複雑なプロセスを経て、感染を継続させます。

ソフォスが 3 月に最初の調査結果を発表してからも、Gootloader の攻撃は一向に収束していません。今回の記事では、ソーシャルエンジニアリングや悪質な SEO 対策の大部分を占める WordPress サイトのサーバー側の動作について紹介します。Gootloader のコードをホスティングしている Web サイトは常時数百にのぼり、攻撃者がどのようにして個人や企業の Web サイトへのアクセス権限を最初に獲得しているのかはいまだ不明です。しかし、ソフォスでは今回ソースコードの一部を入手したので分析しました。

Gootloader が悪意のあるファイルを提供するために使用する、偽「メッセージボード」の一例

ここから、侵入されたサイトで実行されている悪意のあるコードが、どのようにして標的となる可能性のある一部のユーザーだけを絞り込んでいるのか、また、どのように高度な外観の偽の掲示板ページを作成して、ユーザーが元々検索していたコンテンツを提供しているのかについて説明します。

検索エンジンの最適化解除

この攻撃の第 1 段階は、Google を騙すことです。汚染 (ポイズニング) された検索結果は Google 以外の検索エンジンの検索結果ページには表示されないため、明らかに Google が主要なターゲットになっています。この段階では、Google の検索エンジンを騙し、攻撃者が選択したいくつかの用語の情報ソースとして、セキュリティが侵害された Web サイトを最適な検索結果のようにインデックスさせます。

Gootloader のページが表示される検索結果は、特定のクエリの結果として上位に表示されることが多く、標的ユーザーを誘導しやすいことから、効果的な手法と言えるでしょう。

たとえば、 MIDI 音楽ファイルのダウンロードに関する検索クエリ (ドイツ語) を例に挙げてみましょう。この検索結果のスクリーンショットは、micbd.com という Web サイトを示しています。

MICBD Web サイトのフロントページ

Google の検索結果からではなく、手動でアドレスバーにドメインを入力してこの Web サイトを閲覧した場合、このページは米国ミシガン州の大麻ビジネスを代表する業界団体のものであることがわかります。ドイツ語の MIDI ファイルをダウンロードするという検索結果とは何の関係もありません。

悪意のある SEO はスクリプト化されており、サイトにアクセスする一般ユーザーは見ることができず、検索エンジンからしか見えないようになっている

しかし、このページのソースコードを見てみると、誰かが大量の検索キーワード ( 緑枠内 ) を作成し、Web サイト内でホストされていると偽る実在しないページを指すリンク (赤枠内) として、Web サイトのフロントページ内に埋め込んでいることがわかります。これらのリンクは、ユーザーがページを閲覧する際には表示されませんが、検索エンジンはこれらのリンクをインデックス化します。攻撃者はこのようにして検索結果に影響を与えています。また、ページの約 3 分の 2 を占める document.getElementById(“a47ec48”) という JavaScript もありますが、これも攻撃者によって Web ページ内に設置されています。

攻撃者がどのようにしてこれらの Web サイトにアクセスし、サイト内のページにこのコードを埋め込んでいるのかは正確にはわかっていませんが、マルウェア自体にパスワードを盗む機能があるため、パスワードを入手できた Web サイトを手当たり次第に攻撃している可能性は十分にあります。また、他のサイバー犯罪者がフィッシングやその他の方法で盗んだ Web サイトの管理者の認証情報を利用している可能性もあります。

単純かつ効果的なコマンドシェルスクリプト

悪質な SEO 用語に加えて、攻撃者は PHP スクリプトコードを WordPress のバックエンドに埋め込み、どのページでもスクリプトが実行できるようにしています。攻撃者が Web サイトに追加した悪意のあるPHPスクリプトのうちの 1 つは簡易な PHP コマンドシェルで、これは、攻撃者が別のアクセス権を失った場合に、侵害されたページに引き続きアクセスできるようにする働きがあります。攻撃者は、base64 でエンコードされた文字列のコマンドを含む HTTPS POST リクエストを実行し、WordPress のインストールはサーバー上のプロセスのコンテキストで実行されます。変数 $pposte には、実行されるパラメータの名前が格納されています。

また、攻撃者は、この正規表現フィルタに一致する文字列をページに配置します。/j\$k([0-9]{1,10})j\$k/.

このマーカーは、悪意のあるページをレンダリングするスクリプトへのリンクを後から挿入するためのプレースホルダーとして機能します。このマーカーは、後でこのコマンドを使用してページソースから削除されます。

preg_replace("/j\$k([0-9]{1,10})j\$k/", ''

さらにこのスクリプトでは、 WordPress のイベントに対するフィルタを定義し、特定の条件でハンドラ関数の実行をトリガーしています。たとえば、次のトリガーは、WordPressの環境が整った時点で起動します。起動したコードは、起動時にデータベーステーブル backupdb_wp_lstat を初期化します。

add_action("wp", "qvc5");

これは、Gootloaderが使用するバックエンド・データベースを初期化するコードフォームqvc5()の一部です。

if ($table_prefix < > "backupdb_".$qvc4) {
  $table_prefix = "backupdb_".$qvc4;
  wp_cache_flush();
  $qvc5 = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
  $qvc5 - > set_prefix($table_prefix);

VirusTotalで content:”SELECT * FROM backupdb_” を検索すると、このエラーメッセージを含むいくつかのファイル ( interfree.ca のもの ) が見つかります。

Gootloader のエラーメッセージ

これを見ると、攻撃者は backupdb_wp_lstat というデータベースを使っている可能性が高く、このデータベースはその後サーバーから削除されているはずです。

また、qvc5 という手順では、is_404 という存在しないサブページのフィルタリングを行っています。

サブページはサーバー上に物理的には存在しませんが (攻撃者は侵害されたサーバー上のファイルやディレクトリを管理しておらず、 WordPress データベースのコンテンツのみを管理しているようです) 、このハンドラはページ自体を通して悪意のあるコンテンツをまき散らします。

このスクリプトは、投稿内容がデータベースから取得された後、画面に出力される前にフィルタリングするために使用され、ソース内の j$k…j$k マーカーの代わりに悪意のある Javascript タグを挿入します。下記はその一例です。

add_filter('the_content', 'qvc0');

次の 2 つの値は、ヘッダーとフッターがあるまで出力バッファの内容を保持し、その後 j$k…j$k マーカーを削除して、最新の 20 件の投稿に SEO ポイズニングの div 要素を挿入します。

add_action("wp_head", "qwc7");
add_action("wp_footer", "qwc5");

その結果、悪意のあるコードが SEO 対策されたページに表示され、さらに、最新のページには隠し要素が含まれることになります。これらにより、Web 検索結果でのこの Web サイトが上位に表示されるようになります。

マザーシップ (中央サーバー) への連絡

これまでのところ、これらの動作はすべて、侵害されたサイトの WordPress データベースにインストールされたコードのみに依存しています。しかし、この攻撃にはもう 1 台のマシンが関与しており、これをマザーシップ (中央サーバーのこと) と呼んでいます。マザーシップは、トラフィック整理と、掲示板の投稿のようなページをレンダリングする、悪意のあるコードを配信する役割を果たしています。

トラフィック整理役としてのマザーシップは、 (a) Google の検索結果をクリックした人、 (b) 地理的に対象となる地域にいる人、 (c) Windows ブラウザのユーザーエージェントを使用している人にのみ、悪意のあるコードを配信します。Gootloader は、米国、カナダ、ドイツ、フランス、韓国を標的とし、地域ごとに異なったペイロードを配信することが確認されています。

要求された Web ページを準備すると、悪意のあるイベントハンドラがマザーシップへのリクエストを構築し、最初のリクエストの以下のパラメータを、すべて base64 でエンコードした形で報告します。

  • a: 固有のサーバー ID
  • b: IP アドレス
  • c: ユーザーエージェント
  • d: リファラー文字列
Gootloader のターゲットプロファイリングコード

リクエスト元の IP アドレス (被害者の PC のアドレス) は、不要な国を除外するために使用されます。リファラー文字列には、クリックスルーの際に渡された、当初の検索語句が含まれます。

これにより、クエリは以下のようになります。

(このケースでは、リファラー文字列は以下のように base64 エンコードされた値になります。“google/?q=cisco_wpa_agreement”)

その後、サーバーからのレスポンスが処理されます。

マザーシップレスポンスには、2 つのセグメントがあります。1 つは HTML ヘッダー要素、もう 1 つは本文です。この 2 つは <sleep> マーカーで区切られています。ヘッダー部分には複数の要素が含まれており、それらは |で区切られています。返信されたコンテンツを使って、ランディングページのコードが HTML コンテンツを収集します。

このスクリプトは、訪問者が初めて Web ページにアクセスしたときに、その場でブロックリストを生成します。この機能は、リクエストが送られてきた IP アドレスをブロックします (たとえば、研究者が同じマシンから 同じサイトに 2 度訪れることが簡単にはできないようにします) 。しかし、1 つの IP アドレスだけをブロックするのではなく、訪問者と同じサブネット内の一連の IP アドレスによる繰り返しの訪問もブロックします。

偽のフォーラムページのレンダリング

ソースコードが侵害されたランディングページで目に見える悪意のあるコンテンツは、以下の例のような、安易に挿入された JavaScript タグだけです。

https://powerstick[.]com/main/?ad94610=1174868

パラメータの値である数字 (上記の例では 1174868) は、ページのソース内の多くの場所 (プレースホルダー変数など) で使用されており、感染したサーバーの固有のキーである可能性があります。

このスクリプトタグは、ランディングページのレンダラーコードを呼び出します。

このリンクされたスクリプトは、 HMTL ページの元のコンテンツを削除します。

そして、偽のフォーラムテキストと置き換えます。

偽のフォーラムテキストには第一段階の Javascript のダウンロードリンクが含まれています。

結果として、ページはブログ上の会話のような外観になります。そこには検索された語句 (この例では kostenlos midi songs herunterladen) のリンクと、満足げな顧客のコメントと、第 1 段階の JavaScript ダウンローダーのダウンロードリンクが見て取れます。

偽の Gootloader フォーラムページと、それに付随するソースコード

このリンクは、第 1 段階のダウンロードスクリプトをホストしているサーバーに接続されます。このサーバーは通常、偽のフォーラムページのコンテンツをホストしている危険な WordPress サイトとは別の場所にあります。

第 1 段階のダウンロードスクリプトの仕組み

第 1 段階のダウンロードスクリプト (down.phpjoin.phpthank.phpabout.php などのファイル名を持つリンクでホストされています) は、受信したリクエストをマザーシップに中継します。

ソフォスが見つけた検体では、5.8.18[.]7my-game[.]biz という 2 つのマザーシップのアドレスが確認されました (my-game の Web サイトはこの IP アドレスでホストされています)。この 2 つのアドレスは同じ場所を参照していますが、ドメイン名で参照しているのは侵害されたランディングページのコードのみで、第 1 段階のダウンローダーは IP アドレスで参照していることがわかります。

マザーシップに送信されたリクエストは、第 1 段階のダウンローダーの Javascript を ZIP 形式のパッケージにして返します。元のリファラー文字列がマザーシップにずっと渡されるため、マザーシップは元の検索語を受け取り、その検索語に一致するファイル名を持つ Javascript のペイロードを返します。

ファイル名をよく観察した結果、最も頻繁にポイズニングされた検索語が何であるかが解ってきました。下図はドイツで多くポイズニングされてい用語の例です。

マザーシップサーバーは、感染プロセスの初期段階で中心的な役割を果たします。つまり、被害者のコンピュータに配信するためのコンテンツを感染したサイトに届けるのです。

このサーバーは、 2018 年に観測された初期の攻撃から、最新の攻撃まで、 Gootloader の活動期間全体を通じてマザーシップとして機能してきました。2014 年から 2018 年まで、このドメイン名は、ロシアを拠点とするビデオゲームプレイヤーのグループに属していました。この 3 年間、このサイトは悪意のある目的で使用されてきましたが、 Counterstrike プレイヤーグループの公開プロフィール中には、まだこのサイトが掲載されているものもあります。

Gootloader への対策

Windows コンピュータに最新のエンドポイントプロテクションツールをインストールする以外にも、 Gootloader 攻撃に巻き込まれるリスクを最小限に抑えるための対策がいくつかあります。

残念ながら、これから説明する対策にはいくつかの注意点があり、また問題をすぐに解決できるようなものでもありません。

どの Gootloader 対策も、簡単かつ効果が充分であるとは言えない

誰もが Gootloader の偽フォーラムページの外観に精通しているわけではありませんが、もし外観の変化に気が付くことができれば、コンピュータ上で何か問題が起こる前に攻撃を認識することができます。スクリプトブロッカーのようなツールは、ある程度の防御効果はあるものの、一部の人にとっては使いづらく、また一般的に Web 操作のエクスペリエンスを損なってしまう面があるのは否めません。

真の問題は、攻撃者が悪意のある検索結果を Google 検索の上位に容易に表示させることができてしまうことにあります。Google が Gootloader による検索結果の悪質な操作の対処に乗り出さない限り、この問題はいつまでも解決しないでしょう。

セキュリティ侵害の痕跡 (IoC)

SophosLabs は、Gootloader によるセキュリティ侵害の痕跡 (IoC) を Github ページで公開しています。