ESET 研究人员发现了 Evasive Panda 以前未记录的工具集,该工具集用于访问和检索云服务中的数据

CloudScout: Evasive Panda scouting cloud services

在这篇博文中,我们提供了对 CloudScout 的技术分析,CloudScout 是 Evasive Panda 在 2022 年至 2023 年期间用于针对台湾政府实体和宗教组织的入侵后工具集。CloudScout 工具集能够利用被盗的 Web 会话 cookie 从各种云服务中检索数据。通过插件,CloudScout 与 Evasive Panda 的标志性恶意软件框架 MgBot 无缝协作。本博文的要点:

  • CloudScout 工具集于 2022 年至 2023 年间在台湾的一家宗教机构和政府实体的网络中被检测到。
  • CloudScout 利用 MgBot 插件提供的被盗 cookie 来访问和泄露存储在各种云服务中的数据。
  • 我们分析了三个 CloudScout 模块,这些模块旨在从 Google Drive、Gmail 和 Outlook 中窃取数据。我们认为至少存在 7 个额外的模块。
  • CloudScout 窃取 Outlook 电子邮件的 Web 请求中的硬编码字段表明,所涉及的样本是针对台湾用户精心设计的。
  • 每个 CloudScout 模块都使用 C# 编程,由一个用 C++ 编程的 MgBot 插件部署。

Evasive Panda 个人资料

Evasive Panda(也称为 BRONZE HIGHLAND、Daggerfly 或 StormBamboo)是一个与中国结盟的 APT 组织,至少从 2012 年开始运营。Evasive Panda 的目标是通过独立运动对反对中国利益的国家和组织进行网络间谍活动,例如散居海外的藏人、台湾和香港的宗教和学术机构以及中国的民主支持者。有时我们还观察到其网络间谍活动延伸到越南、缅甸和韩国等国家。

Evasive Panda 积累了大量令人印象深刻的攻击媒介。我们已经看到其运营商进行复杂的 TTP,例如供应链和水坑攻击以及 DNS 劫持;此外,他们还滥用了影响 Microsoft Office、Confluence 和 Web 服务器应用程序的最新 CVE。该组织还展示了强大的恶意软件开发能力,这在其适用于 Windows、macOS 和 Android 的大量多平台后门程序中得到了展示。对于 Windows,它最常用的工具是 MgBot(自 2012 年以来;一个自定义恶意软件框架,由一个主要植入物和八个当前已知的插件组成,详见我们的 WLS 博客文章)和最近开发的 Nightdoor(在另一篇 WLS 博客文章中描述;一个功能丰富的后门,利用公共云服务进行 C&C 通信)。

概述

2023 年初,我们检测到 Evasive Panda 在台湾的一家政府实体部署了三个以前未知的 .NET 模块(内部命名为 CGD、CGM 和 COL)。这些模块旨在通过劫持经过身份验证的 Web 会话来访问 Google Drive、Gmail 和 Outlook 等公共云服务。这种技术依赖于从 Web 浏览器数据库中窃取 cookie,然后在一组特定的 Web 请求中使用它们来访问云服务。与被盗的凭据不同,被盗的凭据可能会被双因素身份验证 (2FA) 和 IP 跟踪等安全功能阻止,而被盗的 Web 会话 Cookie 允许攻击者直接从受害者的机器中检索存储在云中的数据。2023 年,谷歌在 GitHub 上发布了设备绑定会话凭证 (DBSC) 项目,并于 2024 年在 Chrome 127 更新中发布了应用绑定加密功能。这些是针对 Cookie 盗窃恶意软件(例如 CloudScout)的保护措施,可能会使此工具集过时。

对这三个模块的进一步代码分析揭示了一个底层开发框架,其开发人员将其代号为 CloudScout。在这篇博文中,我们详细分析了这个用 C# 编程的模块化框架。据我们所知,CloudScout 工具集以前从未公开记录过。

受害者学

根据 ESET 遥测,在针对台湾的两个事件中观察到 CloudScout:

  • 2022 年 5 月,一家台湾宗教机构的网络遭到 MgBot 和 Nightdoor 的入侵。在这次事件中,MgBot 被用来安装一个部署 CloudScout 模块的插件。
  • 2023 年 2 月,在我们怀疑是台湾政府实体的地方检测到 CloudScout 模块和 Nightdoor 植入物。

此外,我们发现在一些硬编码的 HTTP 请求中包含台北标准时间作为时区,将 zh-CN 作为语言包(如图 1 所示)。两者都表明这些样本是针对台湾用户制作的。

Figure 1. HTTP request from COL to Outlook Web Access
图 1.从 COL 到 Outlook Web Access 的 HTTP 请求

技术分析

CloudScout 是一个 .NET 恶意软件框架,由针对不同云服务的多个模块组成。CloudScout 这个名字源于所获得的模块的 PDB 路径:

  • E:\project\git_new\MProjects\Code\CloudScout\GoogleDriver\CGD\obj\Debug\CGD.pdb
  • E:\project\git_new\MProjects\Code\CloudScout\Gmail\CGM\obj\Debug\CGM.pdb
  • E:\project\git_new\MProjects\Code\CloudScout\Outlook\COL\obj\Debug\COL.pdb

我们还发现框架中提到了其他 7 个模块(参见 CommonUtilities:CloudScout 的心脏部分);在撰写本文时,我们还没有观察到它们部署在受感染的机器上,这表明攻击者有选择地部署它们。总而言之,CloudScout 模块的完整列表是:

  • CGD
  • CGM 公司
  • 山坳
  • CTW
  • CFB 系列
  • 通用数据
  • MEXC的
  • 中国电子城
  • CNE

根据命名约定(例如,针对 Google Drive 的模块称为 CGD,针对 Gmail CGM 的模块,以及针对 Outlook COL 的模块),我们推断 CTW 和 CFB 可能针对 Twitter 和 Facebook。然而,其他模块的用途仍未确定。

开发时间

如图 2 所示,CloudScout 模块的 .NET 清单中 AssemblyCopyright 字段的值 Copyright © 2020 表明 CloudScout 工具集可能是在 2020 年左右开发的。尽管 .NET 清单的合法性值得怀疑,但它在我们找到的所有样本中都是一致的。此外,CGD 和 CGM 的 AssemblyVersion 中声明的不同版本反映了添加到其代码库中的更改。

Figure 2. Manifest of CGD module
图 2.CGD 模块清单

我们还发现了不同版本的嵌入式内部定制库包 CommonUtilities。表 1 显示了 CGD、CGM 和 COL 的不同版本,其中包含不同版本的 CommonUtilities。

表 1.CloudScout 模块的版本

模块版本SHA-1CommonUtilities 版本
CGD1.0.1167028AEB095189FDF18B2D7B775B62366EF224A91.0.08
1.0.14B3556D1052BF5432D39A6068CCF00D8C318AF1461.0.10
1.0.1784F6B9F13CDCD8D9D15D5820536BC878CD89B3C81.0.11
CGM 公司1.0.114A5BCDAAC0BC315EDD00BB1FCCD1322737BCBEEB1.0.08
1.0.13C058F9FE91293040C8B0908D3DAFC80F89D2E38B1.0.10
1.0.14621E2B50A979D77BA3F271FAB94326CCCBC009B41.0.11
山坳1.0.1093C1C8AD2AF64D0E4C132F067D369ECBEBAE00B71.0.08

假设 .NET 清单是准确的,仅在 2020 年,我们就观察到了来自 Evasive Panda 的三个新工具集。另外两个实例是 Nightdoor 的首次出现和 MgBot 的新 UDP 变体(继 UDT 变体之后)。

老狗,新把戏

从三个模块共享的通用 RC4 加密密钥中,我们进行了一次逆溯搜索,发现 CGM 是由一个名为 Gmck.dll 的 MgBot 插件部署的,该插件是用 C++ 编程的。该插件是在 2022 年的一次事件中检测到的,当时上述台湾宗教机构的两台机器被 Evasive Panda 入侵。在该事件中(如图 3 所示),MgBot 安装了 CGM 模块,该模块反过来访问受害者的 Gmail 帐户以下载电子邮件和个人信息。

Figure 3. Compromise chain
图 3.在台湾一家宗教机构的上述网络中观察到的泄露链

Gmck.dll(我们将其称为 Gmck)在其二进制文件中携带 .NET 模块 CGM。为了执行 CGM,Gmck 首先将模块放在硬编码路径的磁盘上,然后使用 ICLRMetaHost 和 ICLRRuntimeHost 启动公共语言运行时 (CLR)。最后,它使用对 CGM 的入口点函数 (ModuleStart) 的引用来调用 ExecuteInDefaultAppDomain,如图 4 所示。

Figure 4. Code to load the CGM DLL
图 4.用于加载 CGM DLL 的代码

根据我们的遥测数据,CGD 和 COL 模块也被写入同一个暂存文件夹,如表 2 所示。

表 2.CloudScout 模块的部署路径

MgBot 插件部署路径CloudScout 模块
Gmck.dll%ProgramData%\NVIDlA\gmck\msvc_4.dllCGM 公司
不适用%ProgramData%\NVIDlA\olck\msvc_4.dll山坳
不适用%ProgramData%\NVIDlA\dankdh\msvc_4.dllCGD

暂存文件夹 NVIDlA 使用一个简单的同形异义词故意拼写错误:除了 D 后面的字母是小写字母 el 之外,它都是大写字母。子文件夹(如突出显示的)似乎以 MgBot 插件命名。很遗憾,我们无法获得 olck 和 dankdh 插件。

CGM 模块部署成功后,Gmck 插件需要以配置文件的形式向 CGM 提供浏览器 Cookie。Gmck 从表 3 中列出的 Web 浏览器数据库文件中提取这些 Cookie。随着 Chrome 127 和 Edge 128 中应用绑定加密的发布,Gmck 无法再从 Chrome 和 Edge 解密 Cookie 数据库文件。

表 3.Gmck 从中提取 Cookie 的数据库文件

目标浏览器数据库文件
%localappdata%\Google\Chrome\User Data\Local State
%localappdata%\Google\Chrome\User Data\<用户名>\Network\Cookies
边缘%localappdata%\Microsoft\Edge\User Data\Local State
%localappdata%\Microsoft\Edge\User Data\<用户名>\Network\Cookies
火狐浏览器%AppData%\Mozilla\Firefox\profiles.ini
%AppData%\Mozilla\Firefox\<profile_name>\cookies.sqlite

配置文件必须具有 .dat 扩展名,并使用密钥 0dda5a8d-e4c2-477d-85df-fcb611a62ffe 进行 RC4 加密,以便被 CGM 识别。所有三个 CloudScout 模块都使用这个 RC4 密钥来解密配置文件,这意味着 MgBot 插件也必须使用此密钥进行加密。

图 5 总结了 Gmck 和 CGM 之间的关系。

Figure 5. Interactions between Gmck and CGM
图 5.Gmck 和 CGM 之间的交互

配置

图 5 中的配置文件 cm_cke_<yyyyymmdd>_<hhmmss>.dat 是 MgBot 插件在 Web 浏览器的数据库中提取 cookie 后提供的。CloudScout 模块通过持续监控其工作目录来获取新配置,查找具有.dat扩展名的文件。对于找到的每个 .dat 文件,CloudScout 模块都会生成一个新线程来处理该文件,这意味着它可以同时处理多个配置文件。新生成的线程处理一个完整的收集周期,从解析配置到下载所有目标数据。在循环结束时,将从磁盘中删除配置文件,以防止意外重复相同的循环。

配置文件为 JSON 格式。它包含两个主要的数据结构:token 和 config。令牌结构包含按域名组织的 Cookie。并且 config 包含用于下载和暂存收集的数据以进行泄露的设置,以及用于在成功循环后保持程序运行或退出的设置(dealone 字段)。图 6 中包括一个配置文件示例。

Figure 6. An example of a configuration generated by the Gmck plugin for the CGM module
图 6.由 Gmck 插件为 CGM 模块生成的配置示例

CommonUtilities:CloudScout 的核心

CloudScout 的核心是 CommonUtilities 包,它为模块运行提供了所有必要的低级库,如图 7 所示。此包存储在 CloudScout 模块的 resources 部分中,并在 ModuleStart 函数开始时加载。

Figure 7. Overview of the design of CommonUtilities
图 7.CommonUtilities 设计概述

如图 8 所示,CommonUtilities 的 .NET 清单显示了其所有客户端模块。

Figure 8. Manifest of CommonUtilities
图 8.CommonUtilities 的清单

CommonUtilities 包含相当多的自定义实现的库,尽管网上有大量类似的开源库。与开源替代方案相比,这些自定义库为开发人员提供了更大的灵活性和对植入物内部工作原理的控制。它们还表现出某些不可预测的行为,迫使我们深入挖掘代码以理解。这些自定义库的示例包括 HTTPAccess 和 ManagedCookie。

HTTPAccess 提供了必要的函数来处理 CloudScout 模块的所有 HTTP 通信。它具有修改 HTTP 标头的功能,如图 9 所示。

Figure 9. Code in HTTPAccess to modify HTTP headers
图 9.HTTPAccess 中用于修改 HTTP 标头的代码

如此代码段中突出显示的,this.mngCk 对象(ManagedCookie 类的一个实例)用于将 Cookie 集成到构建的 HTTP 标头中。顾名思义,ManagedCookie 提供了管理 CloudScout 和目标云服务之间 Web 请求的 Cookie 的功能。此类的特别之处在于其 cookie 解析器的完整列表,这些解析器能够将大多数 cookie 转换为默认的 .NET cookie 对象。图 10 显示了为匹配 cookie 中属性-值对的各种组合而创建的不同正则表达式。

Figure 10. Different regexes to handle various combinations of attribute-value pairs in cookies
图 10.用于处理 Cookie 中属性-值对的各种组合的不同正则表达式

CloudScout 的框架

所有 CloudScout 模块都共享一个统一的架构,如图 11 所示。该模块的核心功能位于 Cloud 命名空间中,每个模块中的名称空间几乎相同。该实现仅在与身份验证和数据检索相关的功能上有所不同,其中每个模块都需要生成特定的 Web 请求或根据其目标云服务解析某些 Web 响应。

Figure 11. Common design shared by three CloudScout modules
图 11.三个 CloudScout 模块共享的通用设计

CloudScout 的简化设计和 Cloud 命名空间的核心逻辑如图 12 所示。

Figure 12. Overview of the design of a CloudScout module
图 12.CloudScout 模块设计概述

认证

一般来说,Web 平台没有很好地记录 Cookie。身份验证 cookie 的生命周期往往很短,并且随着用户通过 Web 浏览器与平台交互而频繁更新。但是,只要会话仍然有效,CloudScout 就可以滥用表 4 中列出的 cookie 来访问和下载云服务中的有价值数据。

表 4.由 CloudScout 模块处理的身份验证 Cookie

服务必需的 Cookie
Google 云端硬盘
drive.google.com accounts.google.com
OSID、HSID、SID、SSID、APISID、SAPISID、SAPISID、LSID
Gmail 格式
mail.google.com accounts.google.com
展望
outlook.live.com login.live.com
X-OWA-CANARY、RPSSecAuth、ClientId

X-OWA-CANARY 是 Microsoft Outlook Web Access (OWA) 用来防止跨站点请求伪造攻击的安全 cookie。它是在每个会话开始时对用户进行身份验证时分配的。CloudScout 的 COL 模块实现了一种机制,通过使用 RPSSecAuth 和 ClientId cookie 建立新会话来重新进行身份验证,从而在它不可用时检索此 cookie,如图 13 所示。

Figure 13. Code to get the X-OWA-CANARY cookie
图 13.用于获取 X-OWA-CANARY Cookie 的代码

数据检索

身份验证后,CloudScout 模块以类似于普通用户使用 Web 浏览器的方式浏览受感染的云服务帐户。为了实现这一点,每个 CloudScout 模块都配备了一组要执行的硬编码 Web 请求,以及复杂的 HTML 解析器,这些解析器可以从 Web 响应中识别和提取感兴趣的数据。

例如,CGM 和 COL 模块分别针对 Gmail 和 Outlook 的邮件文件夹列表和电子邮件感兴趣。图 14 显示了 CGM 从 Gmail Web 服务器提供的 HTML 内容中提取电子邮件标题、电子邮件正文和附件的步骤。

Figure 14. Code to parse an HTML page to extract email message data
图 14.用于解析 HTML 页面以提取电子邮件数据的代码

另一方面,CGD 对 Google Drive 中的用户信息感兴趣;完整的目录层次结构;以及扩展名为 .doc、.docx、.xls、.xlsx、.ppt、.pptx、.pdf 和 .txt 的文件。图 15 是 CGD 中用于生成文档下载 URL 的代码片段。

Figure 15. Code to generate a download URL from Google Drive
图 15.用于从 Google Drive 生成下载 URL 的代码

该模块将自定义标头附加到每个下载的项目,无论是文件还是电子邮件。此自定义标头包括项目的元数据,例如客户端 ID(由恶意软件分配)、电子邮件主题或文件名,以及云服务的用户名(表 5)。添加的标头很可能允许自动化系统大规模处理被盗数据,以便快速索引或执行分析。

表 5.下载的电子邮件和文件的自定义标头

邮件标题文件头
tasktype:
taskid:
clientid:
objectname:
mailid:
username:
subject:=?utf-8?b?<base64_encoded_data>?=
froms:=?utf-8?b?<base64_encoded_data>?=
tos:=?utf-8?b?<base64_encoded_data>?=
type:
sourceflag: {展望|Gmail}
filepath:
mailcountry:
attachment:
mailboxtype:{outlook|gmail}
folder:=?utf-8?b?<base64_encoded_data>?=
时间: <yyyy-MM-dd HH:mm:ss>
captime: <yyyy-MM-dd HH:mm:ss>
tasktype:
taskid:
clientid:
objectname:
username:
skydrivetype:googledrive
path:=?utf-8?b? ?<base64_encoded_data>?=
source:googledrive
filename:=?utf-8?b? ?<base64_encoded_data>?=
key:
filetime: <yyyy-MM-dd HH:mm:ss>
大小:
类型:googledrive
captime: <yyyy-MM-dd HH:mm:ss>

添加标头后,每个项目都使用与配置文件相同的 RC4 密钥进行加密,并以文件名 <pseudorandom_GUID>.<custom_extension> 存储,其中 <custom_extension> 表示被盗数据类型,如 表 6 所示。

表 6.每个数据类别的文件扩展名

数据类别CGDCGM 或 COL
个人信息.pc_plug_googledrive_profile不适用
电子邮件不适用.pc_plug_gmck_email
目录列表.pc_plug_googledrive_filelist.pc_plug_gmck_email_list
文件.pc_plug_googledrive_file不适用

接下来,所有项目都压缩到名为 <pseudorandom_GUID>.hxkz_zip 的 ZIP 存档中,并放置在配置的 datapath 字段指定的目录中以进行渗透。此存档稍后可以由 MgBot 或 Nightdoor 泄露。在最后一步中,CloudScout 模块执行完全清理,删除收集周期中生成的所有构件(要泄露的文件除外),然后检查 dealone 标志以退出或继续并等待新的配置文件启动新的收集周期。

结论

CloudScout 是 Evasive Panda 用来窃取存储在云服务中的数据的 .NET 工具集。它是作为 MgBot 的扩展实现的,并使用 pass-the-cookie 技术从 Web 浏览器劫持经过身份验证的会话。

在这篇博文中,我们重点介绍了 CloudScout 框架背后的专业设计,以展示 Evasive Panda 的技术能力以及云存储的文档、用户资料和电子邮件在其间谍活动中发挥的重要作用。