CloudScoutツールセットを発見 :中国とつながりのあるEvasive Pandaによるクラウドサービスの情報収集
ESETは、Evasive Pandaがクラウドサービスにアクセスしてデータを取得するために使用している、これまで検出・文書化されていなかったツールセットを発見しました。
ESETは、Evasive Pandaがクラウドサービスにアクセスしてデータを取得するために使用している、これまで検出・文書化されていなかったツールセットを発見しました。
このブログでは、2022年から2023年にかけて、Evasive Pandaが台湾の政府機関と宗教団体を侵害した後に使用していたツールセットであるCloudScoutを、ESETが技術的に分析した結果をお伝えします。CloudScoutツールセットは、窃取したWebセッションCookieを悪用し、さまざまなクラウドサービスからデータを取得できます。CloudScoutはプラグインを通じて、Evasive Pandaの代表的なマルウェアフレームワークであるMgBotとシームレスに動作します。
本ブログの要点:
Evasive Pandaは、少なくとも2012年から活動を開始している中国とつながりのあるAPTグループであり、BRONZE HIGHLAND、Daggerfly、またはStormBambooとも呼ばれています。Evasive Pandaの目的は、チベットの独立運動、台湾や香港の宗教・学術機関、中国の民主化運動の支持者など、中国共産党政府の利益に反する国や組織に対してサイバースパイ活動を行うことです。ESETは、Evasive Pandaがベトナム、ミャンマー、韓国などの国々に対してもサイバースパイ活動を行っていることも観察しています。
Evasive Pandaは、これまで新しい多くの攻撃手法を編み出しています。ESETは、Evasive Pandaのオペレーターがサプライチェーン攻撃や水飲み場攻撃、DNSハイジャックなど、高度なTTP(戦術、技術、手順)を利用していることを確認しています。さらに、Microsoft Office、Confluence、Webサーバーアプリケーションに影響を与える最新の脆弱性(CVE)を悪用しています。このグループはまた、強力なマルウェア開発の能力を有しており、Windows、macOS、Androidに対応する多くのマルチプラットフォームバックドアを開発しており、その高度な能力を誇示しています。Windowsを攻撃するために最も使用されているのがMgBotツールです。MgBotは、2012年から利用されており、ESETのブログで詳述しているように、メインのインプラントと現在までに特定されている8つのプラグインから構成される独自のマルウェアフレームワークです。また、最近ではNightdoorも開発されています。Nightdoorは、別のESETのブログで説明しているように、C&Cとの通信にパブリッククラウドサービスを利用する、多機能なバックドアです。
2023年の初めにESETは、台湾の政府機関において、Evasive Pandaが3つの未知の.NETモジュール(ESETはそれぞれCGD、CGM、COLと命名)を展開していることを検出しました。これらのモジュールは、認証されたWebセッションを乗っ取り、Google Drive、Gmail、およびOutlookなどのパブリッククラウドサービスにアクセスするように設計されています。WebブラウザデータベースからCookieを窃取し、特定のWebリクエストにおいて窃取したCookieを使用してクラウドサービスにアクセスする手法が取り入れられています。窃取された認証情報は、二要素認証(2FA)やIPアドレスの追跡などのセキュリティ機能によってブロックされる可能性がありますが、攻撃者がWebセッションクッキーを窃取して利用する場合、これらのセキュリティ機能を回避し、クラウドに保存されているデータを被害者のマシンから直接取得できます。2023年、GoogleはGitHubでデバイスバウンドセッション認証情報(Device Bound Session Credentials:DBSC)プロジェクトをリリースし、2024年にはChrome 127のアップデートでアプリケーションバウンド暗号化(App-Bound Encryption)機能をリリースしました。これらはCloudScoutのようなCookieを窃取するマルウェアへの防御策であり、このツールセットを無力化できる可能性があります。
3つのモジュールのコードを詳細に分析したところ、開発者からCloudScoutというコードネームが付けられている、開発フレームワークの基盤が明らかになりました。このブログでは、C#でプログラムされたこのモジュラーフレームワークの詳細な分析結果をお伝えします。ESETが知る限り、CloudScoutのツールセットはこれまで検出や文書化されていません。
ESETのテレメトリ(監視データ)によると、CloudScoutは台湾を標的とする2つのインシデントで観測されました。
さらに、いくつかのハードコードされたHTTPリクエストに、タイムゾーンとしてTaipei Standard Time、言語パックとしてzh-CNが含まれていました(図1を参照)。両方ともに、これらの検体が台湾のユーザーを標的に作成されたことを示しています。
CloudScoutは.NETで開発されたマルウェアフレームワークで、さまざまなクラウドサービスを標的とする複数のモジュールで構成されています。CloudScoutという名前は、入手したモジュールのPDBパスから付けられています。
また、フレームワークの他の7つのモジュール関する記載も見つかっています(「CommonUtilities:CloudScoutの中核」セクションを参照)。このブログの執筆時点では、ESETはこれらのモジュールが侵害されたマシンに展開されているのを確認しておらず、攻撃者がこれらのモジュールを標的に応じて展開している可能性があります。すべてのCloudScoutモジュールを以下に示します。
Google Driveを標的にするモジュールはCGD、Gmailを標的にするモジュールはCGM、Outlookを標的にするモジュールはCOLと呼ばれているように、命名に規則性があるため、CTWとCFBはそれぞれTwitterとFacebookを標的にしている可能性があります。しかし、その他のモジュールの目的は明らかになっていません。
図2に示すように、CloudScoutモジュールの.NETマニフェストのAssemblyCopyrightフィールドの値がCopyright © 2020となっており、CloudScoutツールセットが2020年頃に開発された可能性があります。.NETマニフェストには正しい情報が記載されていない可能性もありますが、ESETが検出したすべての検体でこの値は同じになっています。さらに、CGDとCGMのAssemblyVersionには異なるバージョンが記載されており、これらのバージョンは、コードベースに追加された変更を反映しています。
また、ESETは、埋め込まれている内部のカスタムライブラリパッケージCommonUtilitiesのバージョンが異なっていることも発見しました。表1に、CommonUtilitiesの異なるバージョンが含まれているCGD、CGM、COLの異なるバージョンを示します。
モジュール | バージョン | SHA-1 | CommonUtilitiesのバージョン |
---|---|---|---|
CGD | 1.0.11 | 67028AEB095189FDF18B2D7B775B62366EF224A9 | 1.0.08 |
1.0.14 | B3556D1052BF5432D39A6068CCF00D8C318AF146 | 1.0.10 | |
1.0.17 | 84F6B9F13CDCD8D9D15D5820536BC878CD89B3C8 | 1.0.11 | |
CGM | 1.0.11 | 4A5BCDAAC0BC315EDD00BB1FCCD1322737BCBEEB | 1.0.08 |
1.0.13 | C058F9FE91293040C8B0908D3DAFC80F89D2E38B | 1.0.10 | |
1.0.14 | 621E2B50A979D77BA3F271FAB94326CCCBC009B4 | 1.0.11 | |
COL | 1.0.10 | 93C1C8AD2AF64D0E4C132F067D369ECBEBAE00B7 | 1.0.08 |
表1. CloudScoutモジュールのバージョン
.NETマニフェストが正確であるならば、2020年だけでEvasive Pandaの3つの新しいツールセットが観測されていることになります。他の2つのバージョンは、初めて登場したNightdoorとMgBotの新しいUDPの亜種(UDT亜種の後継)です。
3つのモジュールで共有されている共通のRC4暗号化キーから、過去に遡って調査したところ、CGMはGmck.dllというMgBotプラグインによってデプロイされ、C++でプログラムされていることが分かりました。このプラグインは、2022年に先に説明した台湾の宗教団体にある2台のマシンがEvasive Pandaによって侵害されたインシデントで検出されました。このインシデント(図3に図示)では、MgBotはCGMモジュールをインストールし、被害者のGmailアカウントにアクセスしてメールや個人情報をダウンロードしました。
Gmck.dll(このブログではGmckと呼びます)は、.NETモジュールのCGMをバイナリに入れて配信します。CGMを実行するために、Gmckは最初にハードコードされたパスにあるディスクにモジュールをドロップし、ICRMetaHostとICRRuntimeHostを使って共通言語ランタイム(CLR)を開始します。最後に、図4に示すように、CGMのエントリポイント関数(ModuleStart)を参照して、ExecuteInDefaultAppDomainを呼び出します。
ESETのテレメトリによると、CGDとCOLモジュールも同じステージングフォルダに書き込まれています(表2を参照)。
MgBotプラグイン | 展開パス | CloudScoutモジュール |
---|---|---|
Gmck.dll | %ProgramData%\NVIDlA\gmck\msvc_4.dll | CGM |
N/A | %ProgramData%\NVIDlA\olck\msvc_4.dll | COL |
N/A | %ProgramData%\NVIDlA\dankdh\msvc_4.dll | CGD |
表2. CloudScoutモジュールを展開するパス
ステージングフォルダNVIDlAは、単純なホモグラフを使用して意図的にスペルを変更しています。Dの後の文字は小文字のlですが、その他の文字はすべて大文字です。強調表示しているサブフォルダは、MgBotプラグインにちなんで命名されていると考えられます。残念ながら、olckとdankdhプラグインは入手できていません。
CGMモジュールが正常に展開された後に、Gmckプラグインは設定ファイルとしてCGMにブラウザCookieを提供する必要があります。Gmckは、表3に示すWebブラウザのデータベースファイルからこれらのCookieを抽出します。Chrome 127およびEdge 128でアプリケーションバウンド暗号化(App-Bound Encryption)がリリースされたことで、GmckはChromeおよびEdgeからCookiesデータベースファイルを復号化できなくなりました。
標的ブラウザ | データベースファイル |
---|---|
Chrome | %localappdata%\Google\Chrome\User Data\Local State %localappdata%\Google\Chrome\User Data\< username>\Network\Cookies |
Edge | %localappdata%\Microsoft\Edge\User Data\Local State %localappdata%\Microsoft\Edge\User Data\ |
Firefox | %AppData%\Mozilla\Firefox\profiles.ini %AppData%\Mozilla\Firefox\ |
表3. GmckがCookieを抽出するデータベースファイル
この設定ファイルには、.dat拡張子が付けられ、CGMが認識できるように、0dda5a8d-e4c2-477d-85df-fcb611a62ffeキーを使用してRC4で暗号化されている必要があります。このRC4キーは3つすべてのCloudScoutモジュールで設定ファイルの復号に使用されており、MgBotプラグインも暗号化にこのキーを使用する必要があります。
図5に、GmckとCGMの関係をまとめます。
図5に示す設定ファイルcm_cke_<yyyyymmdd> _<hhmmss> .datは、MgBotプラグインがWebブラウザのデータベースからCookieを抽出した後に、このプラグインによって提供されます。CloudScoutモジュールは、作業ディレクトリを継続的に監視し、.dat拡張子があるファイルを検索して新しい設定を取得します。.datファイルが見つかると、CloudScoutモジュールはそのファイルを処理するために新しいスレッドを毎回生成します。つまり、同時に複数の設定ファイルを処理することが可能です。新しく生成されたスレッドは、設定の解析からすべてのターゲットデータのダウンロードまで、すべてのデータ収集サイクルの処理を行います。このサイクルが終了すると、同じサイクルを誤って繰り返さないように、設定ファイルはディスクから削除されます。
設定ファイルはJSON形式になっています。この設定ファイルには、tokenとconfigの2つの主要なデータ構造が含まれます。token構造には、ドメイン名別に整理されたCookieが含まれます。configには、収集したデータをダウンロードし、外部に送信するためにステージングするための設定と、プログラムを実行し続けるか、データ収集サイクルの後に終了するかを決定する設定(dealoneフィールド)が含まれます。設定ファイルの例を図6に示します。
CommonUtilitiesパッケージは、CloudScoutの中核であり、図7に示すように、モジュールを実行するために必要なすべての低レベルのライブラリを提供します。このパッケージはCloudScoutモジュールのリソースセクションに格納され、ModuleStart関数を実行するときに最初にロードされます。
図8に示すように、CommonUtilitiesの.NETマニフェストには、すべてのクライアントモジュールが記載されています。
同様のオープンソースライブラリがオンラインで豊富に利用可能であるにもかかわらず、CommonUtilitiesには独自のライブラリが多く実装されています。オープンソースのライブラリと比較すると、開発者はこのような独自のライブラリを柔軟に利用することができ、インプラントの内部的な動作を容易に制御できるようになります。また、独自のライブラリは予測不能な挙動を示すことがあるため、ESETはこれらの動作を理解するためにコードを詳細に分析しなければなりませんでした。これらの独自ライブラリの例として、HTTPAccessとManagedCookieがあります。
HTTPAccessは、CloudScoutモジュールのすべてのHTTP通信を処理するために必要な関数を提供します。図9に示すように、HTTPヘッダーを修正する機能があります。
このコードスニペットで強調表示しているManagedCookieクラスのインスタンスであるthis.mngCkオブジェクトは、巧妙に作成したHTTPヘッダーにCookieを統合するために使用されています。名前が示しているように、ManagedCookieはCloudScoutと標的のクラウドサービス間のWebリクエストのCookieを管理する関数を提供します。このクラスが特殊であるのは、多くのCookieをデフォルトの.NETのCookieオブジェクトに変換できるCookieパーサーの包括的なリストとなっていることです。図10には、Cookieの属性と値のペアの各組み合わせを一致させるために作成されたさまざまな正規表現を示します。
すべてのCloudScoutモジュールは、図11に示すように、アーキテクチャが共通しています。モジュールのコア機能はCloud名前空間にあり、各モジュールでほぼ同一になっています。実装が異なっているのは、認証とデータの取得に関する機能のみです。この理由は、各モジュールが、標的とするクラウドサービスに応じて、特定のWebリクエストを生成し、特定のWeb応答を解析する必要があるためです。
CloudScoutの合理的な設計とCloud名前空間の重要なロジックを図12に示します。
一般的にWebプラットフォームはCookieの詳細について詳しく文書化していません。認証クッキーは有効期限が短い傾向にあり、ユーザーがWebブラウザを介してプラットフォームとやりとりするときに頻繁に更新されます。しかし、セッションが有効である限り、表4に記載されているCookieはCloudScoutによって悪用され、クラウドサービスから重要なデータにアクセスされダウンロードされる恐れがあります。
サービス | ドメイン | 必須のCookie |
---|---|---|
Google Drive | drive.google.com accounts.google.com | OSID、HSID、SID、SSID、APISID、SAPISID、LSID |
Gmail | mail.google.com accounts.google.com | |
Outlook | outlook.live.com login.live.com | X-OWA-CANARY、RPSSecAuth、ClientId |
表4. CloudScoutモジュールによって処理される認証用Cookie
X-OWA-CANARYは、クロスサイトリクエストフォージェリ攻撃を防ぐためにMicrosoft Outlook Web Access(OWA)が使用するセキュリティCookieです。このCookieは、ユーザーを認証するために各セッションが開始される時に割り当てられます。図13に示すように、CloudScoutのCOLモジュールは、RPSSecAuthとClientId Cookieを使用して新しいセッションを確立し、再認証することで、X-OWA-CANARY Cookieを利用できないときに取得する仕組みを実装しています。
CloudScoutモジュールは、認証が完了すると、一般のユーザーがWebブラウザを使用するのと同じ方法で、侵害したクラウドサービスのアカウントを参照します。各CloudScoutモジュールは、この操作を行うために、複雑なHTMLパーサーと、実行するWebリクエストセットをハードコードして装備しており、Web応答から重要なデータを識別して抽出します。
たとえば、CGMモジュールとCOLモジュールは、それぞれGmailとOutlookを標的としており、メールフォルダのリストとメールメッセージを取得します。Gmail Webサーバーが提供するHTMLコンテンツからメールヘッダー、メール本文、添付ファイルを抽出するためにCGMが実行する手順を、図14に示します。
一方、CGDはGoogle Driveのユーザー情報、完全なディレクトリ階層、および拡張子が.doc、.docx、.xls、.xlsx、.ppt、.pptx、.pdf、.txtのファイルを取得します。ドキュメントのダウンロードURLを生成するCGDのコードスニペットを図15に示します。
このモジュールは、ファイルまたはメールであっても、ダウンロードした各アイテムに独自のヘッダーを追加します。この独自のヘッダーには、マルウェアによって割り当てられるクライアントID、メールの件名、ファイル名、クラウドサービスのユーザー名などの項目のメタデータが含まれます(表5)。ヘッダーを追加しているのは、自動化システムによって窃取したデータを大規模に処理し、インデックスをすばやく作成して分析している可能性が高いと考えられます。
ヘッダーが追加されると、各項目は設定ファイルに使われたのと同じRC4キーで暗号化され、<pseudorandom_GUID>.<custom_extension>というファイル名で保存されます。 は窃取したデータのタイプを示します(表6を参照)。
データカテゴリ | CGD | CGMまたはCOL |
---|---|---|
個人情報 | .pc_plug_googledrive_profile | N/A |
メール | N/A | .pc_plug_gmck_email |
ディレクトリ一覧 | .pc_plug_googledrive_filelist | .pc_plug_gmck_email_list |
ファイル | .pc_plug_googledrive_file | N/A |
表6. 各データカテゴリのファイル名に付けられる拡張子
次に、すべての項目は<pseudorandom_GUID> .hxkz_zipという名前のZIPアーカイブに圧縮され、設定ファイルのdatapathフィールドで指定される外部に送信するためのディレクトリに保存されます。このアーカイブは後でMgBotかNightdoorのいずれかによって送信されます。最後のステップで、CloudScoutモジュールは、dealoneフラグをチェックして、終了するか、実行を継続して新しいデータ収集サイクルを開始する新しい設定ファイルを待機する前に、データ収集サイクルで生成された送信するファイル以外のすべてのアーティファクトを削除して、完全にクリーンアップします。
CloudScoutは、Evasive Pandaがクラウドサービスに保存されているデータを窃取するために使用している.NETのツールセットです。CloudScoutは、MgBotの拡張機能として実装され、Webブラウザから認証セッションを乗っ取るためにパス・ザ・クッキーの手法を使用します。
このブログでは、CloudScoutフレームワークの高度な設計について解説し、Evasive Pandaの高い技術力と、クラウドに保存されているドキュメント、ユーザープロファイル、メールがスパイ活動で重要な役割を果たしていることを説明しました。
SHA-1 | ファイル名 | 検出 | 説明 |
---|---|---|---|
C70C3750AC6B9D7B033ADDEF838EF1CC28C262F3 | pmsrvd.dll | Win32/Agent.AELQ | MgBotのローダー。 |
812124B84C5EA455F7147D94EC38D24BDF159F84 | pmsrvd.dll | Win32/Agent.AELQ | MgBotのローダー。 |
AD6C84859D413D627AC589AEDF9891707E179D6C | 3.exe | Win32/Agent.ADJV | MgBotのドロッパー。 |
3DD958CA6EB7E8F0A0612D295453A3A10C08F5FE | 1.exe | Win32/Agent.ADJV | MgBotのドロッパー。 |
547BD65EEE05D744E075C5E12FB973A74D42438F | doc.exe | Win32/Agent.AFXX | Nightdoorのドロッパー。 |
348730018E0A5554F0F05E47BBA43DC0F55795AC | DJCU.dll | Win32/Nightdoor.A | Nightdoorのローダー。 |
9B6A473820A72111C1A38735992B55C413D941EE | CommonUtilities.dll | MSIL/Agent.UEK | CloudScoutの内部ライブラリパッケージバージョン1.0.0。 |
621E2B50A979D77BA3F271FAB94326CCCBC009B4 | CGM.dll | MSIL/CloudScout.A | CloudScout Gmail Stealerバージョン1.0.14。 |
C058F9FE91293040C8B0908D3DAFC80F89D2E38B | CGM.dll | MSIL/CloudScout.A | CloudScout Gmail Stealerバージョン1.0.13。 |
4A5BCDAAC0BC315EDD00BB1FCCD1322737BCBEEB | CGM.dll | MSIL/CloudScout.A | CloudScout Gmail Stealerバージョン1.0.18。 |
67028AEB095189FDF18B2D7B775B62366EF224A9 | CGD.dll | MSIL/CloudScout.A | CloudScout Google Drive Stealerバージョン1.0.11. |
B3556D1052BF5432D39A6068CCF00D8C318AF146 | CGD.dll | MSIL/CloudScout.A | CloudScout Google Drive Stealerバージョン1.0.14. |
84F6B9F13CDCD8D9D15D5820536BC878CD89B3C8 | CGD.dll | MSIL/CloudScout.A | CloudScout Google Drive Stealerバージョン1.0.17. |
93C1C8AD2AF64D0E4C132F067D369ECBEBAE00B7 | COL.dll | MSIL/CloudScout.A | CloudScout Outlook Web Access Stealerバージョン1.0.10。 |
8EAA213AE4D482938C5A7EC523C83D2C2E1E8C0E | CommonUtilities.dll | MSIL/CloudScout.A | CloudScoutの内部ライブラリパッケージバージョン1.0.8。 |
A1CA41FDB61F03659168050DE3E208F0940F37D8 | CommonUtilities.dll | MSIL/CloudScout.A | CloudScoutの内部ライブラリパッケージバージョン1.0.11。 |
IP | ドメイン | ホスティングプロバイダー | 最初に確認された日付 | 詳細 |
---|---|---|---|---|
103.96.128[.]44 | N/A | IRT-WUZHOUHULIAN-HK | 2022-05-26 | MgBotとNightdoorのC&Cサーバー。 |
この表は、MITRE ATT&CKフレームワークのバージョン15を使用して作成されています。
戦術 | ID | 名前 | 説明 |
---|---|---|---|
リソース開発 | T1583.004 | インフラストラクチャの取得:サーバー | Evasive Pandaは、MgBotおよびNightdoorのC&Cインフラストラクチャのためにサーバーを取得しています。 |
T1587.001 | 能力の開発:マルウェア | Evasive Pandaは、MgBot、CloudScout、Nightdoorなどの独自のインプラントを開発しています。 | |
実行 | T1569.002 | システムサービス:サービスの実行 | MgBotは、Windowsサービスとして実行されます。 |
T1106 | APIによる実行 | MgBotインストーラは、Windows APIを使用してプロセスを作成します。Gmckは、ExecuteInDefaultAppDomainを使用して、共通言語ランタイム(CLR)でCGMを実行します。 | |
常駐化 | T1543.003 | システムプロセスの作成または修正:Windowsサービス | MgBotは、既存のアプリケーション管理サービスのDLLパスを独自のパスに置き換えます。 |
権限昇格 | T1548.002 | 権限制御機構の悪用:ユーザーアクセス制御のバイパス | MgBotは、UACのバイパスを実行します。 |
防衛機能の回避 | T1140 | ファイルや情報の難読化解除と復号化 | Gmckは、Chrome、Edge、Firefox Webブラウザのデータベースを解読し、Cookieを抽出します。 |
T1112 | レジストリの変更 | MgBotは、常駐するためにレジストリを変更します。 | |
T1027 | ファイルや情報の難読化 | Gmckは、Cookieが含まれる設定を難読化します。 | |
T1550.004 | 別の認証材料の使用:Webセッションクッキーの窃取 | CloudScoutは、クラウドリソースにアクセスするために窃取したCookieを使用します。 | |
T1036.005 | なりすまし:正規のモジュールの名前や場所を模倣する | CloudScoutモジュールは、NVIDIAディレクトリに似せている%ProgramData%%NVIDlAにインストールされます。 | |
認証情報へのアクセス | T1539 | Webセッションクッキーの窃取 | Gmckは、Cookieを窃取します。 |
探査 | T1082 | システム情報の検出 | MgBotは、システム情報を収集します。 |
収集 | T1560.001 | 収集したデータのアーカイブ:ユーティリティを利用したアーカイブ | CloudScoutモジュールは、SharpZipLibを使用して、外部に送信する前にデータを圧縮します。 |
T1530 | クラウドストレージオブジェクトのデータ | CGDは、Google Driveに保存されたファイルをダウンロードします。 | |
T1114.002 | メールの収集:リモートからのメールの収集 | CGMとCOLは、それぞれGmailとOutlook Web Accessのメールにアクセスして収集します。 | |
C&C(コマンド&コントロール) | T1095 | アプリケーションレイヤープロトコル以外の手法: | MgBotは、C&CサーバーとUDPを介して通信します。 |
情報の外部への送信 | T1041 | C&Cチャネルからの送信 | MgBotは、収集したデータをC&Cに送信します。 |