サイバーリーズンでは、重要な脆弱性を含む新たな脅威に関する情報をお客様に提供するために、脅威分析レポートを発行しています。同レポートは、新たな脅威に関する情報をまとめた上で、それらの脅威から身を守るための実践的な推奨事項を提供するものです。

今回の脅威分析レポートでは、現在もなお、脅威アクターによって活発に利用と開発が続けられているマルウェアであるGootLoaderを取り上げます。

■重要なポイント

  • 高い人気を維持:GootLoaderは脅威アクターによって活発に利用と開発を続けられ、その人気は今もなお衰えていません。
  • 進化を続けるマルウェア:GootLoaderペイロードのアップデートにより、いくつかのバージョンのGootLoaderが生み出されています。現時点で活発に利用されているバージョンはGootLoader 3.0です。
  • 感染戦略と全体的な機能は変化せず:GootLoaderペイロードの特殊な部分は、時間の経過と共に変化しています。その一方で、GootLoaderが備えている感染戦略と全体的な機能は、2020年に観測された時からほぼ変わっていません。

はじめに


▲GootLoaderの感染フロー

■GootLoaderとは
GootLoaderはマルウェアローダーの一種であり、JavaScriptを悪用することでポストエクスプロイテーション用のマルウェア/ツールをダウンロードし、感染先の端末内でパーシステンスを確立することで知られています。GootLoaderは、GootKitマルウェアファミリーの一部です。

Gootkitは、NodeJSで記述されたバンキング型トロイの木馬であり、2014年から利用されています。GootKitの背後にいる脅威アクターは、Mandiant社によりUNC2565として追跡されていますが、この脅威アクターはある時点で、バンキング型トロイの木馬であるGootKitの代わりに、GootLoaderを配信する方向にシフトし始めました。

マルウェアの機能におけるこのような変化は、近い将来実現されるべきものであった可能性があります。なぜなら、近年、多くの脅威アクターがRevilランサムウェアのような別のタイプのマルウェアを配信し始めていたからです。GootLoaderは初期感染にSEOポイズニングを利用することで、悪意あるJavaScriptペイロードを被害者へと配信します。配信されるファイルの多くは法的文書を装うことがよくあり、タイトルに合意、契約、フォームなどのフレーズを含んでいます。

■UNC2565
UNC2565はGootLoaderに関与していると見られる脅威アクターであり、現在、この脅威グループはGootLoaderを利用することで、各種のポストエクスプロイテーション用のマルウェアを被害者の端末に導入しています。同脅威グループは過去に、SEOを操作するタイプの悪意あるサイトを通じて、被害者の端末にCobalt Strikeを導入することで、アクセス権を不正に取得していました。侵入に成功すると、UNC2565は、KerberoastまたはBloodHoundのような手法やツールを使用して、偵察や認証情報の窃取を行っていました。

GootLoaderは主にサイバー攻撃のエントリポイントとして機能し、多くの場合、ポストエクスプロイテーション用のマルウェアの配信を容易化します。過去にGootLoaderを通じて配信されたマルウェアとしては、次のものが挙げられます。

この脅威グループの正確な動機は依然として不明ですが、ポストエクスプロイテーションのパターンにおける多様性は、金銭的インセンティブの可能性が高いことを示唆しています。なぜなら、GootLoaderの背後にいる脅威アクターは、異なる目的を持つ幅広いタイプの脅威アクターに同ローダーを提供しているように見えるからです。また、脅威アクターは、GootBotと名付けられた独自のC2およびラテラルムーブメントツールを提供し始めています。これは、同脅威グループが金銭的利益を得ることを目的として、より広範なタイプのオーディエンスを獲得するために市場を拡大していることを示唆しています。

UNC2565の被害者に関する調査によれば、UNC2565は、幅広い被害者をターゲットとしており、SEOポイズニングを活用することで、オンラインでビジネス関連文書を検索しているユーザーを惹きつけているようです。UNC2565が初期アクセスを実現するためにGootLoaderを使用していることは、この脅威グループがターゲットの選択に関して大きな区別を設けておらず、幅広い業種や地理的リージョンに影響を与えようとしていることを示唆しています。

このマルウェアの配信メカニズムは、ハッキングされたWebサイトを悪用することで、難読化されたJavaScriptファイルを含む悪意あるZIPアーカイブを配布するというものであり、これはターゲットの設定が日和見的であることを示唆しています。被害者は、特定の業界や地理的な場所に基づいて選択されるのではなく、被害者がこれらのWebサイトから、一見正規のビジネス文書であるように感じられるファイルを検索してダウンロードするかどうかの可能性に基づいて選択されるようです。

しかし、その一方で、GootLoaderの進化やGootBotのような新しいバリアントの導入は、この脅威グループが、キャンペーンの効果やさまざまなセクターで遭遇した防御策に基づいて、時間をかけて自らのターゲットの設定方法を改良するような、適応型のアプローチを採用していることを示唆しています。

テクニカル分析

このセクションでは、最新のGootLoaderバージョン3.0(これはMandiant社により名付けられた呼称です)に関する技術的な分析を紹介します。この分析は、下記の節から構成されています。

  • 概要:GootLoaderの感染チェーンに関するハイレベルな概要です。
  • GootLoader 3.0の分析:GootLoaderバージョン3.0に関する詳細な分析と、同ローダーに関するコードレベルの分析を紹介します。
  • 比較分析:GootLoaderの異なるバージョン間で、各バージョンが持つ主要な機能を比較します。

概要


▲GootLoader 3.0の実行フロー

GootLoaderの感染チェーンは、表面上は単純に見えます。脅威アクターによりハッキングされたサイトは、GootLoaderのJavaScriptペイロードを含むアーカイブをホスティングしますが、このようなアーカイブには、契約書のテンプレートや法的文書などを探している企業ユーザーをおびき寄せるような名前が付けられています。このペイロードが実行されると、パーシステンスが確立され、第2ステージのペイロードが実行されます。その後、第3ステージのペイロードがPowerShellにより実行されると、システム情報が収集され、C2通信が開始されます。 

これは単純に見えるかもしれませんが、その一方で、正規サイトの乗っ取りによりC2通信を実現していることや、JavaScriptのペイロードが高度に難読化されていることが、シグネチャベースの検知を実施することを難しくしています。さらに、難読化自体が、ペイロードの分析を実施することを難しくしています。

■初期感染
初期感染は、乗っ取られたWebサイトからユーザーがアーカイブをダウンロードし、そのアーカイブに含まれているJavaScriptファイルを実行することにより発生します。サイバーリーズンが以前観測したように、このようなアーカイブファイルをホスティングしているサイトは、検索エンジン最適化(SEO)ポイズニング手法を利用することで、契約書のテンプレートや法的文書などのビジネス関連ファイルを検索している被害者をおびき寄せます。このような感染ベクターは、サイバーリーズンが発行したGootLoaderに関する過去のレポートで観測されていたものです。同レポートが発表された当時から感染ベクターが変わっていないという事実は、脅威アクターが「この種のドライブバイ攻撃は成功率が高い」と考えていることの証拠となっています。


▲第1ステージのGootLoaderペイロード

第1ステージのGootLoaderペイロードは、そのサイズの大きさと高度な難読化で注目されており、インターネット上では3.5MBを超えるサイズのサンプルが観測されています。

■実行
ステージ1のペイロードの実行は、Windows Script Hostプロセスであるwscriptを介して行われます。実行時に、マルウェアは第2ステージのペイロード(これもまたサイズの大きな難読化されたJavaScriptファイルです)をディスク上にドロップした後、同ペイロードを実行するスケジュールタスクを登録します。この時点で、第1ステージのペイロードの実行は終了します。続いて、第2ステージのペイロードがスケジュールタスクを通じて直ちに実行されます。


▲第2ステージおよび第3ステージのペイロード実行

ステージ2のペイロードの実行はwscriptにより開始されますが、その後、子プロセスとして生成されたcscriptのインスタンスへと実行が移ります。この結果、cscriptは、PowerShellスクリプトの難読化を解除するようなPowerShellのインスタンスを生成します。この難読化解除されたPowerShellスクリプトが実行されると、検出アクティビティとC2通信の両方が開始されます。

■パーシステンス
前述したように、パーシステンスは、ステージ1のGootLoaderペイロードにより作成されたスケジュールタスクを通じて確立されます。このスケジュールタスクには、当該ペイロードにハードコーディングされているランダムな英単語からなるタスク名が付けられます。


▲第1ステージのGootLoaderペイロードにより作成されるスケジュールタスク

このタスクには、ステージ2のGootLoaderペイロードを実行するためのパラメータが含まれています。作成されると、スケジュールタスクが実行され、ステージ1の実行が終了した後、ステージ2の実行が開始されます。この後、同スケジュールタスクは、ユーザーログオン時に実行されるように設定されます。


▲第2ステージのGootLoaderペイロードのスケジュールタスクパラメータ

■データ収集
感染した端末におけるデータの収集は、PowerShellを介してステージ3のGootLoaderペイロードにより実行されます。これには、OSバージョン、実行中のプロセス、ディスク使用量、環境変数など、端末に固有のデータの収集が含まれるほか、MS-SAMR SamrLookupDomainInSamServerコールを使用した端末が属するドメインに関する情報の収集も含まれます。

■GootLoader 3.0の分析
GootLoaderの背後にいる脅威アクターは、コードを大幅に難読化した上で、実行を3つの異なるステージへと分けています。

■ステージ1
初期感染ファイルは難読化されたJavaScriptファイルです。ファイル名は、通常、法律や契約関連の文書に関連付けられたものであり、末尾にIDが付加されます。インターネット上で確認されたファイル名の例を下記に示します。

  • texas mutual combat laws 67138.js
  • common law marriage act jamaica 51570.js
  • nurse practitioner collaborative agreement template nj 8292.js
  • is samurai sword legal in uk 32330.js
  • pa collective agreement pay 97171.js

ステージ1は、ステージ2のGootLoaderペイロードの導入と実行を担当します。ステージ1は、疑惑を回避するためや、アンチ解析を目的として、正規のJavaScriptライブラリに悪意あるコードを散りばめることにより、それ自身を難読化します。ステージ1のGootLoaderの実行における重要なポイントは次の通りです。

  • 難読化されたコードを散りばめセグメント化する
  • 実行フローの難読化
  • スケジュールタスクを通じたステージ2の実行

脅威アクターは難読化されたコード/文字列を変数としてセグメント化し、それらをJavaScriptコード全体に散りばめます。ステージ1は、これらのセグメント化された変数を1つのチャンクへと連結することで、セグメント化されたコード/文字列の難読化を解除します。この連結手順は、実行フローの難読化の一環として、さまざまな関数へとホップします。
また、脅威アクターは関数をオブジェクトとして配列内に配置することで、実行フローを難読化します。この手法により、脅威アクターは、実行時に配列のインデックスを呼び出すことで特定の関数を呼び出せるようになるため、防御者による実行フローの分析を妨げることができます。


▲関数を配列内に配置することで実行フローを難読化

ステージ1は、必要な関数をすべて含むmain配列で構成されており、コードはwhileループを通して各関数を実行します。文字列/コードの難読化が完了すると、配列内のmain関数が実行されます。この関数は、さらにもう1つの文字列/コードを難読化解除します。この難読化解除されたコードが、ステージ2を実行することになります。


▲文字列/コードの難読化解除

最後の関数内にある難読化解除されたコードは、次のことを実行します。

  • ステージ2のGootLoader(JavaScript)をドロップする
  • ステージ2のGootLoaderの実行をスケジュールタスクに登録する。
  • スケジュールタスクを実行する

ステージ2のGootLoaderの作成方法はさまざまです。しかし、アウトプットの最終目標は同じです。

  • ステージ1は、ステージ2のGootLoaderコードを出力ファイルに書き出します。このファイルの拡張子は、GootLoaderのバリアントに応じて.datまたは.logになります。
  • ステージ1は、ステージ2出力ファイルのコードの末尾に文字列を追加することで、コードサイズを水増しします。サイズ水増しのプロセスは、GootLoaderのバリアントに応じて異なります。たとえば、ステージ2のコードをループで連結する場合もあれば、コードの末尾にランダムな文字を追加する場合もあります。

連結が完了すると、実行フローはGetFileメソッドを使用してファイル名を.jsファイルへとアップデートします。これが完了すると、実行フローはRegisterTaskDefinitionメソッドとRunExメソッドを使用して、ドロップされたステージ2のスケジュールタスクの実行を登録した上で、同タスクを実行します。

■ステージ2
ステージ2のGootLoaderペイロードは、同じコードを連結することでコードサイズを水増しします。これは、おそらくアンチ分析手法の一部だと思われます。難読化方法はステージ1と似ており、セグメント化された難読化コードを散りばめることで、それ自身を難読化します。ステージ2がセグメント化されたコード/文字列を連結して難読化解除を行うと、実行フローは難読化解除された関数(これは配列内に格納されているオブジェクトです)に入ります。


▲ステージ3導入前の最終関数

難読化解除された関数内において、ステージ2は下記の順序で実行されます。

  • 現在実行中のプロセスがcscriptであるかどうかをチェックします。
    ‒ cscriptである場合、ステージ2はPowerShellを起動し、難読化されたPowerShell関数をexec.StdIn.Writeline経由でインプットして実行します。
    ‒ cscriptではない場合、cscriptを使ってステージ2を再度実行します。

■ステージ3
ステージ3の最終ペイロードはPowerShellスクリプトであり、下記の処理を実行します。

  • 検出/偵察アクティビティ
  • C2通信によるターゲットマルウェアのダウンロード

検出/偵察アクティビティは、基本的なホスト情報を取得します。この情報は、C2サーバーに送信する準備として、gzipで圧縮され、base64でエンコードされます。取得される情報は次の通りです。

  • 環境変数:dir env:コマンドを利用
  • OSバージョン:GWMIコマンドを利用
  • 現在のセッションで使用されているディスクスペース:GDR(Get-PSDriveのエイリアス)を利用
  • 現在実行中のプロセス一覧:GPS(Get-Processのエイリアス)を利用


▲検出コードの断片

ステージ3は、まずホスト情報を取得します。この情報は、HTTPSリクエストのCookieヘッダーに格納され、ポストエクスプロイテーション用マルウェアの配信前に、最初のC2通信としてC2サーバーへと送信されます。

C2は、指定された区切り文字を含む文字列を連結した応答を被害者の端末へと送信します。この区切り文字は、関数の先頭にハードコーディングされています。文字列が、この区切り文字を使って配列へと分割されると、この配列内にある2番目のインデックスが実行されます。


▲応答コード取得のスニペット

比較分析

このセクションでは、GootLoaderの比較分析を取り上げます。具体的には、感染手法、難読化手法、およびポストエクスプロイトテーションの導入手法に焦点を当てます。本セクションで取り上げるGootLoaderバージョン1は、2020年のRevil攻撃で観測されたJavaScriptのGootKit Loaderを指しています。

■SEOの悪用
脅威アクターは、2020年後半から、SEOを悪用して追加のポストエクスプロイテーション用のツール/マルウェアを配信しています。2020年は、脅威アクターによるGootKitとReviランサムウェアを組み合わせた攻撃が一般的となった年です。

それ以来、この手法は常に利用されており、その人気は衰える気配を見せません。SEOポイズニングの検知にはさまざまな課題があり、脅威アクターは常にこの方法を利用することで、被害者の端末にGootLoaderを大量に導入しています。また、SEOポイズニングの使用は、特に企業ユーザーを標的にしている可能性があります。これは、ステージ1のGootLoaderには法的文書に関連するフレーズが含まれる傾向があるためです。

■ステージ1における制御フローの難読化
GootKit LoaderからGootLoaderに至るまで、すべてのバリアントは制御フローの難読化に依拠しており、さまざまなステージで難読化が利用されています。難読化は、特に次の2つの方法に依拠しています。

  • 難読化されたコードのセグメント化
  • 関数を配列内に配置し、対応するインデックスをループで実行する

コードのセマンティクスは、GootLoaderのさまざまなバリアント全体を通じて類似しています。バージョン間の主な違いとしては、GootLoader 2.0と3.0が正規のJavaScriptファイルの中に自分自身を隠すことが挙げられます。


▲ステージ1におけるmain関数のロジック

各バリアントのステージ1にはmain関数が含まれています。このmain関数は、配列を通じてループ処理を実行し、最終的にステージ1の第2フェーズを実行します。

■ステージ2における制御フローの難読化
ステージ2の制御フローの難読化は、GootLoaderのバージョンにより異なります。GootLoader 1.0および2.0は、難読化されたステージ2のペイロードをC2サーバーからダウンロードします。ダウンロードが行われるかどうかは、被害者の端末がActive Directoryドメイン内に存在するかどうかに依存します。当該端末がドメイン内に存在する場合、ステージ1がペイロードをダウンロードします。この機能はバージョン3.0では変更されています。バージョン3.0では、ステージ1は難読化解除/ドロップを行った後、スケジュールタスクを通じてステージ2のペイロードを実行します。

■ステージ2におけるペイロードサイズの水増し
アンチ分析および疑惑回避の一環として、脅威アクターはGootLoader 3において、GootLoaderのステージ2のJavaScriptファイルのサイズを水増しする機能を追加しました。どれくらいの大きさになるかはサイズの水増し方法により異なりますが、ステージ2のJavaScriptファイルは30MB以上に水増しされる傾向があります。


▲ステージ2におけるJavaScriptファイルサイズの水増し

■ステージ3におけるPowerShellの使用
バージョンによっては、ステージ3におけるPowerShellの使用方法が異なる場合があります。GootLoader 1.0と2.0はどちらも、ポストエクスプロイテーションの一環として、.NETベースのDLLマルウェアを反射的にロードして実行するためにPowerShellを利用します。一方、GootLoader 3.0は、検出アクティビティや、バックドアコマンド実行用のC2通信を行うためにPowerShellを利用します。これにより、追加のマルウェアのダウンロードなど、ポストエクスプロイテーション活動を行うコマンドが実行されます。


▲ステージ3におけるPowerShellの実行フロー

トロイの木馬化されたJavaScriptファイル

GootLoaderのバージョン2.0と3.0は、疑惑回避手法の一環として、正規のJavaScriptライブラリファイルをトロイの木馬化します。インターネット上にはさまざまなJavaScriptライブラリが存在しており、2022年以降、GootLoaderはそれらのJavaScriptライブラリを悪用していることが観測されています。GootLoaderとして特定されているトロイの木馬化されたJavaScriptファイルの一部を下記に示します。

トロイの木馬化される対象 標的
Maplace.js GoogleマップをWebサイトに埋め込むJavaScriptライブラリ
xlsx.extendscript.js PhotoShopとInDesign用のExtendedScript(スプレッドシートを管理するライブラリであるSheetJS用のJavaScriptライブラリの一部)
jit.js JavaScript Infovis ToolKit(データ可視化のためのJavaScriptライブラリ)
tui-chart TOAST UI Chart(データ可視化のためのJavaScriptライブラリ)
mdlComponentHandler.js Material Design Lite JavaScriptライブラリ
Lodash JavaScriptユーティリティーライブラリ
jQuery 人気のあるJavaScriptライブラリ
Underscore.js 関数型プログラミングのヘルパーとなるJavaScriptライブラリ
Data-Driven Document (D3) データ可視化のためのJavaScriptライブラリ

各バージョンの主な機能を比較

GootLoaderはそのライフサイクルの中で、回避や実行機能の変更を含む、いくつかのアップデートを経験してきました。各バージョンの持つ主要な機能を下記の表に示します。

機能 GootLoader 1.0 GootLoader 2.0 GootLoader 3.0
ステージ2のJavaScriptファイルの難読化解除とドロップ
ステージ3の難読化解除とドロップ
ステージ2のJavaScriptファイルをC2からダウンロード
CScriptを介してステージ2 JavaScript のmain関数を実行
環境変数を取得
最初の実行はJavaScriptファイルである
ステージ2のJavaScriptファイルのサイズを水増し
正規のJavaScriptライブラリに見せかける(例:JQuery)
レジストリ内のペイロードを難読化
ポストエクスプロイテーション用のマルウェアを反射的にロード

スケジュールタスクの使用

SEOポイズニング(ハッキングされたWordPressサイト)

USERDNSDOMAIN環境変数をチェック
WScript Sleepメソッドを使用したアンチ分析手法

サイバーリーズンによる推奨事項

サイバーリーズンは、Cybereason Defense Platform において下記の措置を実施することを推奨しています。

  • アプリケーションコントロールを有効化し、悪意あるファイルの実行をブロックすること。
  • お使いの環境のポリシーでアンチランサムウェア機能を有効にし、ランサムウェア対策モードを「実行防止」に設定し、シャドウコピー検知を有効にして、ランサムウェアに対する最大限の防御を確保すること。
  • Cybereasonの振る舞いベースのファイル実行防止(Behavioral Execution Prevention)における実行防止モードで、亜種実行防止機能(VPP)を有効にすること。

著者について


Ralph Villanueva(シニアセキュリティアナリスト、Cybereason Global SOC)
Cybereason Global SOCチームのセキュリティアナリスト。サイバーセキュリティ分野で新たな脅威をハンティングし、それらに対抗することに従事。興味のある分野は、マルウェアのリバースエンジニアリング、デジタルフォレンジック、APTの研究など。フロリダ国際大学にてネットワークセキュリティの修士号を取得。


Kotaro Ogino(CTIアナリスト)
Cybereason Security OperationsチームのCTIアナリスト。脅威ハンティングおよびXDR(Extended Detection and Response)に従事。情報およびコンピューターサイエンスの理学士号取得。

【調査結果レポート】2024年版 ランサムウェア 〜ビジネスにもたらす真のコスト〜

サイバーリーズンでは、1,008名の企業のIT担当者を対象に、2024年度のランサムウェアがビジネスに及ぼす影響に関するグローバル調査を実施しました。

本レポートでは、詳細な調査結果を紹介するとともに、企業がとるべき対策として6つの核となる課題を取り上げて、それぞれの課題に対する推奨対策について紹介しています。

https://www.cybereason.co.jp/product-documents/survey-report/11873/