** 本記事は、“Gootloader” expands its payload delivery options の翻訳です。最新の情報は英語記事をご覧ください。**
韓国、ドイツ、フランス、北米でマルウェアペイロードの展開に用いられている手法がテレメトリから明らかになり、ランサムウェア「REvil」やバンキング型トロイの木馬「Gootkit」の攻撃において、最新のマルウェア配信方法が採用されていることが確認されました。
Gootkit マルウェアファミリは 5 年以上前から存在しているトロイの木馬で、銀行の認証情報の窃取が主な機能です。近年では、NodeJS ベースのマルウェアと同様に、その配信方法の改良に多くの労力が注がれてきました。
これまでソフォスをはじめとするセキュリティ専門家は、Gootkit マルウェアそのものについて議論するのと同時に、その配信メカニズムの分析も行ってきました。しかし、より広範な悪意のあるコードを配信できるように変化してきていることから、ソフォスはペイロードとは切り離してこの配信方法を精査する必要があると判断し、「Gootloader」と命名しました。
Gootloader は、最近では REvil と Gootkit のペイロードのほかに、トロイの木馬「Kronos」や Cobalt Strike の配信にも使用されています。
また、エンドポイントセキュリティツールによる検出を回避する目的で、Gootloader の感染インフラストラクチャの大部分が「ファイルレス」な方法に移行しています。完全なファイルレス型にはなっていませんが、悪意のあるアクティビティが挙動検出ルールに引っ掛からない限り、こうした手法はネットワーク上での検出を回避するのに効果的です。
根本原因は検索エンジンの脱最適化
Gootloader は、悪意のある検索エンジン最適化 (SEO) のテクニックを使って、Google の検索結果に潜り込んでいます。これは人間の心理につけこむだけでなく、技術的な方法でもあるため、説明しておく必要があります。
Gootloader のオペレーターがこの攻撃段階を完遂するには、ハッキングされた正規の Web サイトをホストするサーバーのネットワークを保持する必要があります (ソフォスの推定では、そうしたサーバーが常時約 400 台稼働しています)。上記の例は、実在するカナダの新生児医療機関のサイトです。このサイトの本物のコンテンツは、不動産取引とは一切関係がないにもかかわらず、非常に狭義の不動産契約に関する検索結果として最初に表示されます。Google 自身が、この検索結果は広告ではないこと、および、約 7 年前からこのサイトが存在していることを示しています。エンドユーザーにとっては、信頼できる正規サイトのように見えます。
ユーザーがこの検索結果のリンクをクリックすると、検索クエリとまったく同じ語句が使用され同じ質問に回答しているように見える別のページが表示されます (そのため、時に非常に奇妙な感じを受けます)。
そして、同じユーザーがこのページに表示されている「直接ダウンロードリンク」をクリックすると、最初の検索で使用された検索クエリの語句と完全に一致するファイル名の .zip アーカイブファイルが送られてきます。そして、このファイルには、まったく同じ名前が付けられた「別の」ファイルが格納されています。この .js ファイルが最初の感染元であり、この段階においてのみ悪意のあるファイルがファイルシステムに書き込まれます。標的ユーザーがこのスクリプトをダブルクリックした後に起こることは、すべてメモリ内で実行されるため、従来のエンドポイント保護ツールでは対応できません。
ハッキングされ、偽の掲示板を表示しているこれらのサイトの多くでは、有名なコンテンツ管理システムが実行されています。攻撃者はそうしたコンテンツ管理システムに対し、アクセスしてきた各ユーザーの特徴 (ハッキングされたサイトにどのようにアクセスしてきたか、など) に基づいて、Web サイトのコンテンツの表示方法を微妙に書き換えています。
攻撃者がどのような方法でこれらのサイトのバックエンドにアクセスしたのかは明らかになっていませんが、この種のサイト乗っ取りにはいくつかの方法があります。たとえば、攻撃者がサイトのパスワードを Gootkit マルウェア自体から取得したり、盗まれた認証情報を取引する闇市場で入手したり、CMS ソフトウェアのプラグインやアドオンのエクスプロイトを通じて入手したりする方法が考えられます。Web サイトの運営者は、自分のサイトが悪用されていることに気付いていないようです。
Web サイトにアクセスした方法が何であっても、攻撃者が次に行うのは、Web ページの本文に数行のコードを追加することです。攻撃者がコードを挿入する要素は、以下の div タグのいずれかです。
改ざん後のコードは、次のような単純なスクリプトタグです。
サーバーは、ページが読み込まれる条件が Gootloader が求める基準を満たしているかどうかをチェックします。注目すべきは、このスクリプトが GET 要求ヘッダー情報の User-Agent 文字列を検査して、アクセスしたユーザーのコンピュータが特定の言語/ローカライゼーション設定でオペレーティングシステムを実行しているかどうかを判断していると思われる点です。また、IP ジオロケーションを使用して、サイトを閲覧しているユーザーが、攻撃者が標的としている地域内にいるかどうかを判断している可能性もあります。
サーバー側では、攻撃者は要求の Referrer: ヘッダーをチェックして、ユーザーが Google の検索結果をクリックした後にページが読み込まれたかどうかを確認しています。(ソフォスが他の検索エンジンについてもテストしたところ、標的になっていなかったか、あるいは Google の検索エンジンほど高い頻度では標的になっていませんでした。)このようなチェックが行われていると、サイトオーナーは自分のサイトで発生している問題を特定することが難しくなります。
基準を満たしていない場合、ブラウザには次のブログ記事のように、一見すると普通に見えるが、実際には意味不明な単語の羅列になっている偽の Web ページが表示されます。
一方、基準を満たしている場合 (ユーザーの IP アドレスからその Web サイトに訪問したことが一度もない場合)、サーバー側で実行されている悪意のあるコードがページを再表示して、ユーザーが検索で使用したのとまったく同じ語句を使用して、同じトピックについて議論が交わされている掲示板やブログのコメント欄であるかのように見せかけます。
偽掲示板の投稿の中には、あたかもユーザーの検索ワードへの回答になるかのようなドキュメントをダウンロードするように勧めるサイト管理者からの投稿が含まれています。
興味深いことに、そうした偽のコメント欄や掲示板はどれも見た目が同じです。
改ざんされたページのソースコードには、別の Web サイトでダウンロードされたファイルへのリンクが含まれています。このダウンロードは通常 .zip アーカイブとして表示され、その中には 1 個の悪意のある Javascript ドキュメントが含まれています。アクセスしたユーザーが、このドキュメントを解凍してダブルクリックした場合には、残りの感染プロセスが実行されます。
要求のパラメーターには、偽の掲示板ページを表示させる検索ワードも含まれており、ダウンロードサイトはこれを使用して、元の検索ワードと一致するファイル名を持つペイロードをその場で作成します。ソフォスが収集したサンプルのファイル名を調査した結果、Gootloader が仕掛けた SEO の罠に遭遇したユーザーが、その時何を検索していたのかが明らかになりました。
マルウェアのリポジトリには、(北米のユーザーを標的にした) 英語のペイロードに加えて、ドイツ語、フランス語、韓国語のファイル名が付けられた Gootloader のサンプルが多数含まれており、これらの国を標的にした攻撃キャンペーンで使用されているものだと考えられます。たとえば、次の偽掲示板はドイツ語圏を標的にしたものです。
フランス語のものでは、exemple de dédicace à une amie (「友人への献辞の例」) という検索ワードが、投稿の件名と Gootloader ペイロードへのリンクの両方で使われています。この「フランス語」の Web サイトでは、メニュー項目やその他の要素のラベルに英語の単語が使用されている点に注目してください。偽ページのヘッダーには通常、「Questions And Answers」というフレーズが表示されます。
さらに、韓国語の偽掲示板もあります。韓国語で「ダウンロードリンクはこちら」と書かれており、URL はフランス語やドイツ語の話者を標的にした Gootloader のペイロードをホストしている同じドメインを指しています。
これらのページの共通点は明白です。すべての言語で、花びらが 5 つある花をユーザーアイコンにした新規ユーザーが「投稿」をしており、砂時計をユーザーアイコンにしている「Admin」というアカウントが返信しています。Google の検索クエリのテキストは、ページ上部と偽の「掲示板」の投稿の中で繰り返されています。
言うまでもありませんが、上記のようなページからファイルをダウンロードするのは避けた方が賢明です。
第 1 段階のペイロード: 二重の難読化
Gootloader の最初のペイロードは、拡張子が .js であるファイルを含む .zip アーカイブです。拡張子が .js のファイルは、通常、実行時に Windows Scripting Host (wscript.exe) を呼び出します。
この「第 1 段階」のスクリプトは、ファイルシステムに書き込まれた攻撃の唯一のコンポーネントです。このスクリプトは従来の AV スキャンで唯一検出されるものであるため、作成者はスクリプトを難読化したうえに、攻撃の次の段階で使用される文字列とデータブロブに二重の暗号化レイヤーを追加しています。
Gootloader は、変数名をランダムに生成し、その復号化コードを複数の小さなコンポーネント関数に分割します。たとえば、上記のコードの最初の 2 行は、2 つの小さなタスクを実行します。1 つは単純な足し算で、もう 1 つは文字列分割関数です。このように不要かつ予想外の方法で分割することによって、スクリプトファイルの静的解析が困難になります。
この段階では、データブロックに対して最初の復号化方法が実行されます。その結果、それ自体が難読化・暗号化され、自身を復号化するための関数が埋め込まれた第 2 のデータブロックが出力されます。この第 2 の復号化ルーチンを通過した後に限って、スクリプトの最終的な命令が明らかになります。
難読化技術は、時間の経過とともに進化してきました。上記の例の変数は、ランダムな英数字の文字列で構成されています。新しいバージョンでは、ランダムに選択された辞書の単語から変数に名前が付けられ、単語を羅列しただけの意味不明な「コメント」が含まれることもあります。
第 1 段階のスクリプトは、ハードコードされた 3 つの異なる Web ドメインを必要に応じて巡回して、第 2 段階のコードを取得するためだけに存在します。
Gootloader はさらに、第 2 段階を取得する URL にさらに複雑な機能を追加しています。つまり、ランダムに見える文字列 (上記の黄色で強調表示した部分) から成る一意のパラメーターとランダムな長さの数字を URL クエリ文字列に追加します。上記のスクリプトでは、処理を遅くするために、いくつかのステップ間に 22 秒以上の「スリープ」期間が指定されています。また、一部の Gootloader スクリプトの中には、おそらくサンドボックスを迂回する目的で、DNS からのペイロードをホストしているドメイン名を解決してから C2 と通信しようとするものがあります。
第 2 段階のペイロード: レジストリスタッフィング
第 1 段階で C2 との通信に成功すると、長い数字の文字列を返信として受け取ります。これらの数字は、ASCII テキスト文字を表す 10 進数の値 (数値) であり、第 1 段階でメモリに直接ロードされ、ファイルシステムには痕跡が残りません。
この段階には、最初にその数値からテキストにデコードし、次に HKCU\Software ハイブの下の Windows レジストリ内の一連のキーに直接書き込む大きなデータブロブが含まれています。キー名はサンプルごとに異なります。
次に、この段階では、PowerShell スクリプトの自動実行エントリが作成されます。このスクリプトは、(その後の起動時に) 実行されると、前の段階で書き出したレジストリキーの内容をデコードします。(また、この自動実行エントリには、レジストリキー名として使用したランダムなテキストと同じ文字列が名前として付けられます。)
この次の段階は、コンピュータが次に再起動されるまで完全には実行されないため、標的ユーザーが感染に気付くのは、Windows を完全に再起動する数時間後あるいは数日後になる可能性があります。
再起動後: 最後のドミノ倒し
コンピュータが再起動すると PowerShell スクリプトが実行されるため、一連のイベントが開始され、最終的には Gootloader が最後のペイロードのダウンロードを試みます。しかし、Gootloader が引き起こす問題はこれで終わりではありません。
最新の Gootloader は、1 つのペイロードではなく、一対のペイロードをレジストリに保存しています。そのペイロードのペアとは、小さな C# 実行ファイルと、レジストリに保存されている奇妙な方法に基づいて 1 つ目のペイロードによってデコードされる 2 つ目の実行ファイルです。
1 つ目のペイロードである C# の実行ファイルは、最初の 2 バイトとして Windows の「MZ」ヘッダー (16 進数で 4d5a) が使用されていることで識別可能です。
そして、こちらが 2 つ目、つまり最後のペイロードです。見た目からはわかりにくいですが、こちらも実行ファイルです。このペイロードの作成者は、16 進数の ASCII 値を構成する数字を、文字のシーケンスとしてエンコードしています。
このデータブロブを解析するためのシークレットデコーダーリングは、次のようになっています。スクリプトは、この置換スクリプトを通してレジストリキーのデータを実行し、2 つ目の実行ファイルが 16 進表現に変換されたら、それを実行します (これも直接メモリで実行されます)。すべての文字が置換されるわけではありません。したがって、上記の最初の 4 バイト ydua は、MZ ヘッダーの 4d5a を表しています。
続いて、スクリプトはペイロードを実行します。そして、再起動後に常駐できるようにするため、下図のように次回起動時にペイロードを実行するレジストリ実行キーを (PowerShell コマンドの助けを借りて) 作成します。
これはレジストリローダーによって登録されたコマンドであり、再起動後に Gootloader の感染プロセスが生き残るためのフェイルセーフ機構として機能します。
巧妙な .NET インジェクター
この複雑な感染プロセスの最終段階では、.NET インジェクターが使用されます。レジストリローダーまたはフェイルセーフ機構を持つ PowerShell スクリプトのどちらによって実行されても、結果は同じです。その結果とは、次の段階の攻撃である Delphi ベースのローダーマルウェアがデータブロブの形で格納された単純な .NET ローダーです。感染プロセスのこの部分は、時間の経過とともに進化してきました。
当初の .NET コンポーネントは、ペイロードをドロップして実行する Delphi の実行ファイルを復号化するだけのものでした。その後、攻撃者によって中間のステップが追加され、改良されました。追加されたステップでは、.NET コンポーネントは Windows オペレーティングシステムにデフォルトでインストールされている無害なシステムコンポーネントである ImagingDevices.exe を起動し、そこにプロセスハロウイングの手法を使って Delphi の実行ファイルを挿入します。
この攻撃の最新バージョンで .NET コンポーネントは、商用ソフトウェアパッケージ「Embarcadero External Translation Manager」の一部である別の無害な実行ファイルをファイルシステムに書き出しています (この時、現在ログインしているユーザーのユーザー名がファイル名として使用されます)。次に、その実行ファイル上でプロセスハロウイングを実行して、Delphi コンポーネントをロードします。
この機能は、無害なペイロードと悪意のあるペイロードの両方のコピーを、自身の内部に保持することによって実行されます。
1 つ目 (変数 text2 に格納されている) は、パブリッシャーによってデジタル署名された無害なアプリケーションです。感染したコンピュータのユーザーが不正行為を疑い、システム内での不審なネットワークトラフィックや CPU の高負荷の原因となっているプログラムを調査した場合、発見されるのは Windows が信頼できるアプリケーションとみなしているアプリケーションです。
このクリーンなアプリケーションはドロップされて実行され、プロセスハロウイングの手法を用いてメモリ内のコードを、2 番目の PE ファイル (変数 text3 に格納されている) の内容に置き換えます。
Delphi ローダーには、最終ペイロードである Kronos、REvil、Gootkit、または Cobalt Strike が暗号化された形で格納されています。そのような場合、Delphi ローダーはペイロードを復号化した後、独自の PE ローダーを使用してメモリ内でペイロードを実行します。
この感染プロセスの初めから終わりまで、悪意のあるコードがディスクに書き込まれることは一切なく、ファイルレスの実行スキームが最後まで継続します。
因果関係
手の込んだ難読化や、1 つのスクリプトプラットフォームから別のスクリプトプラットフォームへの移動、ばかばかしいほど複雑なマルウェア配信の方法は、一体何が目的なのでしょうか?
アナリストがこの攻撃の各段階を完全に解明して理解しようとするならば、数時間はかかるかもしれません。本記事では、Gootloader が最終ペイロードの配信方法として使用している可能性のあるすべてのバリエーションさえも網羅できていません。なぜなら、Gootloader はコードを挿入する .NET ベース/Delphi ベースの実行ファイル、別の PowerShell スクリプト、Cobalt Strike モジュールなども配信可能であるからです。
しかし、結局のところ攻撃者は、エンドポイント保護ソフトウェアに邪魔されずに攻撃を続行するために、数分から数時間検出を回避しようとしているに過ぎません。Gootloader を作成した攻撃者は、他の攻撃者のようにエンドポイントツールを積極的に攻撃するのではなく、大規模なドミノ倒しによって最終的な攻撃の結果を隠蔽するアプローチを取っています。
エンドユーザーがその兆候に気付けば、いくつかのポイントで感染を回避することが可能です。問題は、訓練を受けた人でさえ、Gootloader の作成者が仕掛けたソーシャルエンジニアリングにやすやすと騙されてしまうことです。Firefox 用の NoScript のようなスクリプトブロッカーは、ハッキングされた Web ページが別のものに置き換えられるの防ぐことはできますが、誰もがこのようなツールを使用しているわけではありません。偽の掲示板を使った攻撃に用心している注意深いユーザーであっても、気付いた時には手遅れになっているかもしれません。
つまるところ、マルウェアが検索結果で上位に表示されるようにアルゴリズムが操作されている検索エンジンが、この攻撃の最初の段階に対処するかどうかにかかっています。ユーザーにトレーニングを施して、拡張子 .js のファイルをクリックしていることに気付けるように Windows でファイル拡張子を表示させることはできても、検索結果の上位に何が表示され、それらのサイトが攻撃者によってどのように操作されるのかをコントロールすることはできません。
保護と IoC (侵害の痕跡) について
Sophos Intercept X は、Gootloader のようなマルウェアによる迷惑な動作・挙動 (Cobalt Strike の配信など) や、実行中のシステムへのマルウェア挿入を目的としたプロセスハロウイング手法の使用を検出することで、ユーザーを保護します。悪意のある javascript ファイルは、AMSI/GootLdr-A として検出されます。また、PowerShell コンポーネントは、AMSI/Reflect-H または Exec_12a として検出されます。その他の挙動検出ルールによって、最終ペイロードが配信される前の中間段階で感染がブロックされることもあります。
インシデント対応担当者が類似した Javascript ファイルを検出するのに役立つ可能性のある Yara 脅威ハンティングルールなど、今回の分析で使用した IoC は、SophosLabs Github に投稿されています。Gootkit やその他のトロイの木馬のサンプルをテスト環境で実行したいアナリストの方は、Felix Weyne が作成した Python ツール imaginaryC2 の使用を検討してください。このツールを使用すると、マルウェア (Gootkit を含む) がインターネットに侵入することなく、マルウェアが C2 から受信する応答をシミュレートできます。
謝辞
SophosLabs は、今回の分析調査と Gootloader の検出に貢献した Fraser Howard、Mark Loman、Peter Mackenzie、Vikas Singh、Felix Weyne に謝意を表します。