在 SADBRIDGE 与 GOSAR 的背景下:QUASAR 迎来 Golang 重写

Elastic Security Labs 分享了关于 SADBRIDGE 加载器和 GOSAR 后门的详细信息,这些恶意软件被用于针对说中文的受害者的活动中。

30 分钟阅读恶意软件分析
Under the SADBRIDGE with GOSAR: QUASAR Gets a Golang Rewrite

简介

Elastic Security Labs 最近观察到一个新的入侵活动,该活动针对说中文的地区,被追踪为 REF3864。这些有组织的活动通过伪装成合法软件(如 Web 浏览器或社交媒体消息服务)来针对受害者。这些活动背后的威胁组织在跨多个平台(如 Linux、Windows 和 Android)交付恶意软件方面表现出中等的通用性。在本次调查中,我们的团队发现了一个独特的 Windows 感染链,该感染链使用了一个我们称之为 SADBRIDGE 的自定义加载器。此加载器部署了基于 Golang 的 QUASAR 重写版本,我们将其称为 GOSAR。这是我们的团队首次观察到 QUASAR 使用 Golang 编程语言进行重写。

主要要点

  • 正在进行的活动针对说中文的人群,使用伪装成合法软件(如 Telegram 和 Opera Web 浏览器)的恶意安装程序
  • 感染链采用注入和 DLL 侧加载,使用自定义加载器 (SADBRIDGE)
  • SADBRIDGE 部署了新发现的用 Golang 编写的 QUASAR 后门变体 (GOSAR)
  • GOSAR 是一个多功能后门,正在积极开发中,其功能不完整,并且随着时间的推移观察到改进的功能迭代
  • Elastic Security 提供了针对此攻击链的全面预防和检测功能

REF3864 活动概述

11 月,Elastic Security Labs 团队在引爆上传到 VirusTotal 的几个不同样本时观察到一个独特的感染链。这些不同的样本托管在伪装成合法软件(如 Telegram 或 Opera GX 浏览器)的登陆页面上。

在本次调查中,我们发现了多个涉及类似技术的感染链

  • 具有低检测率的木马化 MSI 安装程序
  • 使用与恶意 DLL 捆绑的合法软件进行伪装
  • 部署了自定义 SADBRIDGE 加载器
  • 加载了最终阶段的 GOSAR

我们认为这些活动之所以能够逃脱检测,是因为存在多个抽象层。通常,第一阶段包括打开一个包含 MSI 安装程序的存档文件 (ZIP)。合法的软件,如 Windows x64dbg.exe 调试应用程序在后台用于加载恶意、修补过的 DLL (x64bridge.dll)。此 DLL 启动一个新的合法程序 (MonitoringHost.exe),并在其中侧加载另一个恶意 DLL (HealthServiceRuntime.dll),最终执行注入并通过注入在内存中加载 GOSAR 植入程序。

恶意软件研究人员提取了 SADBRIDGE 配置,这些配置揭示了攻击者指定的活动日期,并表明自 2023 年 12 月以来,具有类似 TTP 的操作一直在进行。GOSAR 的命令和控制 (C2) 基础设施通常伪装在可信服务或软件下,以使其看起来无害并符合受害者对软件安装程序的期望。在整个执行链中,重点集中在枚举中国杀毒软件产品(如 360tray.exe)以及中文防火墙规则名称和描述。由于这些自定义设置,我们认为此威胁是针对说中文的人群的。此外,广泛使用中文日志记录表明攻击者也是说中文的人。

自 2017 年以来,QUASAR 此前曾被用于国家支持的间谍活动、非国家黑客主义和以经济利益为动机的犯罪攻击(Qualys,《Quasar RAT 的演变》),包括与中国有关联的 APT10。使用 Golang 进行重写可能会利用在此期间获得的机构知识,从而在无需对先前有效的 TTP 进行广泛再培训的情况下,实现其他功能。

GOSAR 通过附加的信息收集功能、多操作系统支持以及针对防病毒产品和恶意软件分类器的改进的规避,扩展了 QUASAR。但是,通用的诱饵网站和缺乏其他目标信息或对目标的行动,使我们没有足够的证据来确定攻击者的动机。

SADBRIDGE 简介

SADBRIDGE 恶意软件加载器打包为 MSI 可执行文件进行交付,并使用 DLL 侧加载和各种注入技术来执行恶意负载。SADBRIDGE 滥用合法应用程序(如 x64dbg.exeMonitoringHost.exe)来加载恶意 DLL(如 x64bridge.dllHealthServiceRuntime.dll),从而导致后续阶段和 shellcode。

持久性是通过服务创建和注册表修改实现的。使用滥用 ICMLuaUtil COM 接口的 UAC 绕过技术,以静默方式将权限提升为管理员。此外,SADBRIDGE 还通过 Windows 任务计划程序集成 权限提升绕过,以使用 SYSTEM 级别权限执行其主要负载。

SADBRIDGE 配置使用对配置字符串的每个字节减去 0x1 的简单减法进行加密。加密阶段都附加有 .log 扩展名,并在运行时使用 XOR 和 LZNT1 解压缩算法进行解密。

SADBRIDGE 采用 PoolParty、APC 队列和令牌操作技术进行进程注入。为了避免沙盒分析,它使用长时间的 Sleep API 调用。另一种防御规避技术涉及 API 补丁,以禁用 Windows 安全机制,如反恶意软件扫描接口 (AMSI) 和 Windows 事件跟踪 (ETW)。

以下深入研究旨在探索执行链,基于分析的样本的配置,提供对重要文件和阶段的功能的一步一步的演练。分析旨在突出每个组件之间的交互及其在达到最终负载中的作用。

SADBRIDGE 代码分析

MSI 分析

初始文件使用 Advanced Installer 打包成 MSI,其中主要关注的文件是 x64dbg.exex64bridge.dll

通过使用 MSI 工具(lessmsi),我们可以看到 aicustact.dll 中的 LaunchApp 入口点被配置为执行 AI_APP_FILE 属性中指定的文件路径。

如果我们导航到 AI_APP_FILE 属性,我们可以看到与此配置关联的文件是 x64dbg.exe。这表示安装完成后将执行的文件,而合法的 NetFxRepairTool.exe 永远不会被执行。

x64bridge.dll 侧加载

x64dbg.exe 被执行时,它会调用 x64bridge.dll 中的 BridgeInit 导出函数。BridgeInitBridgeStart 函数的包装器。

类似于 BLISTER 中观察到的技术,SADBRIDGE 会修补合法 DLL 的导出函数。

在恶意软件的初始化例程中,SADBRIDGE 首先使用主机名和一个魔术种子 0x4E67C6A7 生成一个哈希值。此哈希值用作存储加密配置文件的目录名。加密的配置被写入 C:\Users\Public\Documents\<hostname_hash>\edbtmp.log。此文件包含 FILE_ATTRIBUTE_SYSTEM、FILE_ATTRIBUTE_READONLY、FILE_ATTRIBUTE_HIDDEN 属性,以使其在普通目录列表中隐藏。

解密配置很简单,加密的块用空字节分隔。对于加密块中的每个字节,我们可以将其递增 0x1

配置包括:

  • 可能的活动日期
  • 用于创建服务的字符串
  • MonitoringHost.exe 的新名称 (DevQueryBroker.exe)
  • MonitoringHost.exe 要侧加载的 DLL 名称 (HealthServiceRuntime.dll)
  • 其他阶段的绝对路径(.log 文件)
  • 用于托管 GOSAR 的主要注入目标 (svchost.exe)

DevQueryBroker 目录 (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\) 包含所有在运行时解密的加密阶段(.log 文件)。文件 (DevQueryBroker.exe) 是 Microsoft 合法应用程序 (MonitoringHost.exe) 的重命名副本。

最后,它创建一个进程来运行 DevQueryBroker.exe,该进程会侧加载同一文件夹中的恶意 HealthServiceRuntime.dll

HealthServiceRuntime.dll

此模块在用户的 %TEMP% 目录中释放加密的和部分解密的 shellcode。shellcode 的文件名格式为:log<random_string>.tmp。然后将部分解密的 shellcode 的每个字节递减 0x10 以完全解密。shellcode 在同一进程的新线程中执行。

恶意软件利用 SonicWall 发布的研究中使用的相同算法进行 API 哈希,哈希算法在附录部分列出。shellcode 将 DevQueryBroker.log 解密为 PE 文件,然后对文件的前三分之一进行简单的单字节异或运算 (0x42),然后使用 LZNT1 算法解压缩结果。

然后,shellcode 使用 NtUnmapViewOfSection 取消 PE 文件首选基址上的所有现有映射,确保对 VirtualAlloc 的调用将从首选基址开始分配内存。最后,它将解密的 PE 文件映射到此分配的内存,并将执行权转移到其入口点。SADBRIDGE 识别和执行的所有 shellcode 都共享相同的代码结构,仅在解密和执行引用的特定 .log 文件上有所不同。

DevQueryBroker.log

恶意软件动态加载 amsi.dll 以禁用 Windows 中的关键安全机制。它通过插入修改返回值为 0x80070057 的指令来修补 amsi.dll 中的 AmsiScanBuffer,标准化的 Microsoft 错误代码 E_INVALIDARG 表示无效参数,并提前返回,从而有效地绕过扫描逻辑。同样,它修补 AmsiOpenSession 以始终返回相同的错误代码 E_INVALIDARG。此外,它还修补 ntdll.dll 中的 EtwEventWrite,将第一个指令替换为 ret 指令以禁用 Windows 事件跟踪 (ETW),从而抑制任何恶意活动的日志记录。

在修补之后,一个加密的 shellcode 被写入路径 (C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini) 中的 temp.ini
恶意软件检查当前进程令牌的组成员身份以确定其特权级别。它通过使用 SECURITY_LOCAL_SYSTEM_RID 初始化 SID 并调用 CheckTokenMembership 来验证该进程是否属于 LocalSystem 帐户。如果不是,它会尝试通过使用 SECURITY_BUILTIN_DOMAIN_RIDDOMAIN_ALIAS_RID_ADMINS 创建 SID 并执行类似的令牌成员身份检查来检查是否属于 Administrators 组。

如果当前进程不具有 LocalSystem 或管理员权限,则会首先通过利用 UAC 绕过机制,借助 ICMLuaUtil COM 接口,将权限提升至管理员。它会构造一个 moniker 字符串 "Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}",以创建具有管理员权限的 CMSTPLUA 对象。一旦创建了该对象并获取了 ICMLuaUtil 接口,恶意软件就会使用该接口公开的 ShellExec 方法来运行 DevQueryBroker.exe

如果未创建定期运行 DevQueryBroker.exe 的任务或服务,恶意软件会检查防病毒进程 360tray.exe 是否正在运行。如果未运行,则会创建一个服务,以使用以下属性提升权限至 SYSTEM:

  • 服务名称:DevQueryBrokerService
    二进制路径名称:“C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\DevQueryBroker.exe -svc”
  • 显示名称:DevQuery Background Discovery Broker Service
  • 描述:使应用能够通过后台任务发现设备。
  • 启动类型:系统启动时自动启动
  • 权限:LocalSystem

如果检测到 360tray.exe 正在运行,恶意软件会将加密的 PE 文件写入 DevQueryBrokerService.log,然后将下一个阶段的 PE 文件(阶段 1)映射到当前进程内存中,并将执行权转移到该文件。

一旦 DevQueryBroker.exe 以 SYSTEM 级别权限重新触发并到达链的这一部分,恶意软件会检查 Windows 版本。对于运行 Vista 或更高版本(不包括 Windows 7)的系统,它会将另一个下一阶段(阶段 2)映射到内存中并将执行权转移到那里。

但是,在 Windows 7 上,它会执行一段 shellcode,该 shellcode 解密并运行 DevQueryBrokerPre.log 文件。

阶段 1 注入 (explorer.exe)

SADBRIDGE 利用 PoolParty 变体 7 将 shellcode 注入到 explorer.exe 中,方法是针对其线程池的 I/O 完成队列。它首先复制目标进程的 I/O 完成队列的句柄。然后,它在 explorer.exe 中分配内存以存储 shellcode。分配额外的内存来存储一个精心制作的 TP_DIRECT 结构,其中包括 shellcode 的基地址作为回调地址。最后,它调用 ZwSetIoCompletion,传递指向 TP_DIRECT 结构的指针,以将数据包排队到目标进程的工作器工厂(工作线程管理器)的 I/O 完成队列,从而有效地触发注入的 shellcode 的执行。

此 shellcode 解密 DevQueryBrokerService.log 文件,取消映射占用其首选基地址的任何内存区域,将 PE 文件映射到该地址,然后执行其入口点。此行为与先前观察到的 shellcode 相似。

阶段 2 注入 (spoolsv.exe/lsass.exe)

对于阶段 2,SADBRIDGE 使用与阶段 1 中相同的注入技术,将 shellcode 注入到 spoolsv.exe,或者如果 spoolsv.exe 不可用,则注入到 lsass.exe 中。该 shellcode 的行为与早期阶段类似:它将 DevQueryBrokerPre.log 解密为 PE 文件,取消映射占用其首选基地址的任何区域,映射 PE 文件,然后将执行权转移到其入口点。

DevQueryBrokerService.log

如上一节所述,从 DevQueryBrokerService.log 解密的 shellcode 利用 Windows 任务计划程序使用一种权限提升技术。SADBRIDGE 集成了一种使用 IElevatedFactorySever COM 对象间接创建计划任务的公开 UAC 绕过技术。此任务配置为使用任务名称 DevQueryBrokerService,每天以 SYSTEM 级别权限运行 DevQueryBroker.exe

为了掩盖其踪迹,恶意软件通过直接修改进程环境块 (PEB) 来欺骗映像路径和命令行,这很可能是为了将 COM 服务伪装成来自 explorer.exe

DevQueryBrokerPre.log

SADBRIDGE 在注册表子项 SYSTEM\CurrentControlSet\Services\DevQueryBrokerServiceSvc 下创建名为 DevQueryBrokerServiceSvc 的服务,并具有以下属性

  • 描述:使应用能够通过后台任务发现设备。
  • 显示名称:DevQuery Background Discovery Broker Service
  • 错误控制: 1
  • 映像路径%systemRoot%\system32\svchost.exe -k netsvcs
  • 对象名称:LocalSystem
  • 启动:2(自动启动)
  • 类型: 16.
  • 失败操作:
    • 每 24 小时重置失败计数。
    • 执行三次重启尝试:第一次延迟 20 毫秒,第二次和第三次延迟 1 分钟。

服务参数指定位于 C:\Program Files (x86)\Common Files\Microsoft Shared\Stationery\<hostname_hash>\DevQueryBrokerService.dllServiceDll。如果 DLL 文件不存在,它将立即被丢到磁盘上。

DevQueryBrokerService.dll 具有与 HealthServiceRuntime.dll 类似的代码结构,后者在执行链的早期阶段可见。它负责解密 DevQueryBroker.log 并运行它。当服务启动时,ServiceDll 将由 svchost.exe 加载和执行。

此外,它还会修改 SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs 键,以包含 DevQueryBrokerServiceSvc 的条目,以便将新创建的服务集成到由 netsvcs 服务主机组管理的服务组中。

然后,SADBRIDGE 通过删除注册表子项 SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree\\DevQueryBrokerServiceSYSTEM\\CurrentControlSet\\Services\\DevQueryBrokerService 来删除先前创建的计划任务和服务。

最后,由于新的持久化机制已就绪,它会删除 C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker 文件夹中的 DevQueryBroker.exeHealthServiceRuntime.dll 文件。

GOSAR 注入

在代码的后半部分,SADBRIDGE 使用 WTSEnumerateSessionsA API 枚举本地计算机上的所有活动会话。

如果找到会话,则会迭代每个会话

  • 对于每个会话,它会尝试使用 WTSQuerySessionInformationA 检索用户名 (WTSUserName)。如果查询失败,则会移动到下一个会话。
  • 如果 WTSUserName 不为空,则代码会以 svchost.exe 为目标,并将其路径、会话 ID 和加载器配置的内容传递给一个子例程,该子例程会注入最后阶段。
  • 如果 WTSUserName 为空,但会话的 WinStationName"Services" (表示服务会话),则会改为以 dllhost.exe 为目标,并将相同的参数传递给最后阶段注入子例程。

如果未找到任何会话,它将进入一个无限循环,以重复枚举会话并调用用于注入最后阶段的子例程,同时执行检查以避免冗余注入。

已登录会话的目标是 svchost.exe,而服务会话或没有登录用户的会话的目标是 dllhost.exe

如果会话 ID 可用,代码会尝试复制该会话的用户令牌,并将复制的令牌的完整性级别提升到 S-1-16-12288 (系统完整性)。然后,它使用提升后的令牌通过 CreateProcessAsUserA 创建一个子进程(svchost.exedllhost.exe)。

如果令牌操作失败或没有可用的会话 ID(系统进程的会话 ID 可以为 0),它将回退到使用 CreateProcessA 创建一个没有令牌的进程。

加密的 shellcode C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini 使用之前看到的相同的 XOR 和 LZNT1 解压缩技术进行解密,以解密 .log 文件,并且使用 APC 注入来将 shellcode 排队以在新创建的进程的线程中执行。

最后,注入的 shellcode 将 DevQueryBrokerCore.log 解密为 GOSAR,并在新创建的进程的内存中运行它。

GOSAR 介绍

GOSAR 是一种多功能的远程访问木马,目标是 Windows 和 Linux 系统。这个后门包括检索系统信息、截取屏幕截图、执行命令、键盘记录等功能。GOSAR 后门保留了 QUASAR 的大部分核心功能和行为,同时合并了一些使其与原始版本不同的修改。

通过使用 Go 等现代语言重写恶意软件,可以降低检测率,因为许多防病毒解决方案和恶意软件分类器难以识别这些新编程结构下的恶意字符串/特征。下面是一个解压缩后的 GOSAR 在上传时仅收到 5 个检测的例子。

值得注意的是,此变体支持多个平台,包括用于 Linux 系统的 ELF 二进制文件和用于 Windows 的传统 PE 文件。这种跨平台能力与 Go 的适应性相一致,使其比基于原始 .NET 的 QUASAR 更通用。在以下部分中,我们将重点介绍 GOSAR 的代码结构,以及与开源版本(QUASAR)相比的新功能和添加。

GOSAR 代码分析概述

GOSAR 的代码结构

由于该二进制文件保留了所有符号,我们能够重建源代码结构,该结构是从 0.12.01 版本的示例中提取的。

  • vibrant/config:包含恶意软件的配置文件。
  • vibrant/proto:包含所有 Google 协议缓冲区 (proto) 声明。
  • vibrant/network:包括与网络相关的功能,例如主连接循环、代理处理,以及用于配置防火墙和设置侦听器的线程。
  • vibrant/msgs/resolvers:定义恶意软件处理的命令。这些命令被分配给 vibrant_msgs_init* 函数中的一个对象。
  • vibrant/msgs/services:引入新功能,例如运行键盘记录器、剪贴板记录器等服务。这些服务在 vibrant_network._ptr_Connection.Start 函数中启动。
  • vibrant/logs:负责记录恶意软件的执行。日志使用存储在配置中的 AES 密钥进行加密。恶意软件使用 AES 分块解密日志。
  • vibrant/pkg/helpers:包含在各种恶意软件命令和服务中使用的辅助函数。
  • vibrant/pkg/screenshot:处理受感染系统上的屏幕截图捕获功能。
  • vibrant/pkg/utils:包括实用程序函数,例如生成随机值。
  • vibrant/pkg/native:提供用于调用 Windows API (WINAPI) 函数的功能。

GOSAR 的新添加

通信和信息收集

此新变体继续使用与原始版本相同的基于 TCP TLS 的通信方法。连接后,它首先将系统信息发送到 C2,并添加了 4 个新字段

  • IPAddress
  • AntiVirus
  • ClipboardSettings
  • Wallets

防病毒软件和数字钱包的列表在函数 vibrant_pkg_helpers_init 中初始化,可以在本文档的底部找到。

服务

恶意软件处理在客户端首次连接到 C2 时启动的 3 项服务

  • vibrant_services_KeyLogger
  • vibrant_services_ClipboardLogger
  • vibrant_services_TickWriteFile

键盘记录器

GOSAR 中的键盘记录功能在 vibrant_services_KeyLogger 函数中实现。此功能依赖于 Windows API,通过使用参数为 WH_KEYBOARD_LLSetWindowsHookEx 设置全局 Windows 钩子来拦截和记录受感染系统上的击键,以监视低级别键盘事件。钩子函数名为 vibrant_services_KeyLogger_func1

剪贴板记录器

剪贴板记录功能很简单,依赖于 Windows API。它首先使用 IsClipboardFormatAvailable 检查剪贴板数据是否可用,然后使用 GetClipboardData API 检索数据。

TickWriteFile

ClipboardLoggerKeyLogger 服务都会收集数据,这些数据由 TickWriteFile 定期写入到目录 (C:\ProgramData\Microsoft\Windows\Start Menu\Programs\diagnostics) 下的当前日期文件中,例如 2024-11-27
可以通过先减去值 0x1f,然后将其与值 0x18 进行异或来解密,如 CyberChef 配方所示。

网络设置

在初始化其服务后,恶意软件会生成 三个线程,专门用于其网络设置。

  • vibrant_network_ConfigFirewallRule
  • vibrant_network_ConfigHosts
  • vibrant_network_ConfigAutoListener

处理网络设置的线程

ConfigFirewallRule

恶意软件为端口范围 51756-51776 创建一个入站防火墙规则,规则的中文名称翻译为 分布式事务协调器(LAN),它允许所有程序和 IP 地址入站,描述设置为:分布式事务协调器服务的核心事务管理器通过 RPC/TCP 远程管理入站规则。

ConfigHosts

此函数将以下条目添加到 c:\Windows\System32\Drivers\etc\hosts127.0.0.1 micrornetworks.com。添加此条目的原因尚不清楚,但很可能是由于恶意软件当前开发阶段缺少功能或不完整的功能。

ConfigAutoListener

恶意软件的此功能在 51756-51776 范围内的第一个可用端口上运行 HTTP 服务器侦听器,该端口之前已由防火墙规则允许。有趣的是,该服务器不处理任何命令,这证明该恶意软件仍处于开发中。我们当前的测试版本仅处理对 URI /security.jsGET 请求,并以字符串 callback(); 作为响应,任何其他请求都会返回 404 错误代码。此最小响应可能表明该服务器是占位符或早期开发阶段的一部分,并且有可能在以后添加更复杂的功能。

日志

恶意软件将其运行时日志保存在目录:%APPDATA%\Roaming\Microsoft\Logs 下,文件名格式为:windows-update-log-<年月份日期>.log
每个日志条目都使用 HMAC-AES 算法加密;密钥在 vibrant_config 函数中硬编码,以下是一个示例

攻击者可以通过发出命令 ResolveGetRunLogs 远程检索恶意软件的运行时日志。

插件

恶意软件能够执行插件,这些插件是从 C2 下载的 PE 文件,并使用 XOR 算法加密后存储在磁盘上。这些插件保存在路径:C:\ProgramData\policy-err.log。要执行插件,会调用命令 ResolveDoExecutePlugin,它首先检查是否有可用的插件。

然后,它会反射式加载一个本地 DLL,该 DLL 以 base64 格式存储在名为 plugins.dll 的二进制文件中,并执行其导出函数 ExecPlugin

ExecPlugin 会创建一个挂起的 C:\Windows\System32\msiexec.exe 进程,并带有参数 /package /quiet。然后,它会将异步过程调用 (APC) 排队到该进程的主线程。当线程恢复时,排队的 shellcode 将被执行。

shellcode 会读取存储在 C:\ProgramData\policy-err.log 的加密插件,使用硬编码的 1 字节 XOR 密钥对其进行解密,然后反射式加载并执行它。

HVNC

该恶意软件通过现有的套接字支持隐藏 VNC (HVNC),它暴露了 5 个命令

  • ResolveHVNCCommand
  • ResolveGetHVNCScreen
  • ResolveStopHVNC
  • ResolveDoHVNCKeyboardEvent
  • ResolveDoHVNCMouseEvent

执行的第一个命令是 ResolveGetHVNCScreen,它将首先初始化并设置视图。它使用以 base64 格式嵌入的本地 DLL HiddenDesktop.dll。该 DLL 会被反射式加载到内存中并执行。

该 DLL 负责执行低级 API 以设置 HVNC,总共有 7 个导出函数

  • ExcuteCommand
  • DoMouseScroll
  • DoMouseRightClick
  • DoMouseMove
  • DoMouseLeftClick
  • DoKeyPress
  • CaptureScreen

调用的第一个导出函数是 Initialise,它使用 CreateDesktopA API 初始化桌面。此 HVNC 实现总共处理 17 个命令,这些命令可以在 ExcuteCommand 导出中找到。如前所述,它的名称中有一个错字,命令 ID 从恶意软件的命令 ResolveHVNCCommand 转发,该命令将调用 ExcuteCommand

命令 ID描述
0x401该函数首先通过将 TaskbarGlomLevel 注册表项设置为 2,禁用 Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced 下的任务栏按钮分组。接下来,它通过使用 SHAppBarMessageABM_SETSTATE 命令将状态设置为 ABS_ALWAYSONTOP,确保任务栏始终可见并位于最顶层。
0x402通过执行 shell32.dll 的第 61 个导出函数来生成一个 RUN 对话框。C:\Windows\system32\rundll32.exe shell32.dll,#61
0x403运行一个 powershell.exe 实例
0x404执行存储在 C:\\ProgramData\\shell.log 中的 PE 文件
0x405运行一个 chrome.exe 实例
0x406运行一个 msedge.exe 实例
0x407运行一个 firefox.exe 实例
0x408运行一个 iexplore.exe 实例
0x409运行一个 360se.exe 实例
0x40A运行一个 360ChromeX.exe 实例。
0x40B运行一个 SogouExplorer.exe 实例
0x40C关闭当前窗口
0x40D最小化指定的窗口
0x40E激活窗口并将其显示为最大化窗口
0x40F杀死窗口的进程
0x410设置剪贴板
0x411清除剪贴板

屏幕截图

该恶意软件反射式加载以 base64 格式嵌入的第三个也是最后一个 PE DLL,名为 Capture.dll,它有 5 个导出函数

  • CaptureFirstScreen
  • CaptureNextScreen
  • GetBitmapInfo
  • GetBitmapInfoSize
  • SetQuality

该库首先通过调用 resolvers_ResolveGetBitmapInfo 进行初始化,该函数会反射式加载并执行其 DllEntryPoint,后者将使用常见的 Windows API(如 CreateCompatibleDCCreateCompatibleBitmapCreateDIBSection)设置屏幕捕获结构。导出函数 CaptureFirstScreenCaptureNextScreen 用于捕获受害者桌面的屏幕截图作为 JPEG 图像。

观察

有趣的是,原始的 .NET QUASAR 服务器仍然可以用于接收来自 GOSAR 样本的信标,因为它们保留了相同的通信协议。但是,如果要投入实际使用,则需要进行重大修改以支持 GOSAR 的功能。

尚不清楚作者是否更新或扩展了开源的 .NET QUASAR 服务器,或者开发了一个全新的服务器。值得一提的是,它们保留了默认的监听端口 1080,这与原始实现一致。

新功能

下表描述了所有新添加的命令

新命令
ResolveDoRoboCopy执行 RoboCopy 命令来复制文件
ResolveDoCompressFiles以 zip 格式压缩文件
ResolveDoExtractFile解压 zip 文件
ResolveDoCopyFiles在受感染的计算机中复制目录或文件
ResolveGetRunLogs获取可用的日志
ResolveHVNCCommand执行 HVNC 命令
ResolveGetHVNCScreen启动 HVNC
ResolveStopHVNC停止 HVNC 会话
ResolveDoHVNCKeyboardEvent向 HVNC 发送键盘事件
ResolveDoHVNCMouseEvent向 HVNC 发送鼠标事件
ResolveDoExecutePlugin执行插件
ResolveGetProcesses获取正在运行的进程列表
ResolveDoProcessStart启动进程
ResolveDoProcessEnd杀死进程
ResolveGetBitmapInfo检索当前屏幕显示设置的 BITMAPINFO 结构
ResolveGetMonitors使用 EnumDisplayMonitors API 枚举受害者的显示器
ResolveGetDesktop启动屏幕捕获功能
ResolveStopGetDesktop停止屏幕捕获功能
ResolveNewShellExecute打开到派生的 cmd.exe 进程的管道,并将命令发送到该进程
ResolveGetSchTasks通过运行命令 schtasks /query /fo list /v 获取计划任务
ResolveGetScreenshot捕获受害者桌面的屏幕截图
ResolveGetServices使用 **WMI** 查询获取服务列表:select * from Win32_Service
ResolveDoServiceOperation启动或停止服务
ResolveDoDisableMultiLogon通过将键 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer 下的 fSingleSessionPerUser 值设置为 1,禁用用户多会话
ResolveDoRestoreNLA恢复远程桌面协议 (RDP) 的安全设置,启用**网络级身份验证** (NLA) 并强制执行 **SSL/TLS** 加密以确保安全通信。
ResolveGetRemoteClientInformation获取所有已启用的本地用户列表、**RDP 端口**、**LAN IP** 和 **OS 特定信息**:从注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 中提取的 **DisplayVersion**、**SystemRoot** 和 **CurrentBuildNumber**
ResolveDoInstallWrapper设置隐藏远程桌面协议 (HRDP)
ResolveDoUninstallWrapper卸载 HRDP
ResolveDoRecoverPrivileges恢复在安装 HRDP 期间更改之前原始的 HKEY_LOCAL_MACHINE\\SAM\\SAM 注册表
ResolveGetRemoteSessions检索有关计算机上的 RDP 会话的信息。
ResolveDoLogoffSession使用 **WTSLogoffSession** API 注销 RDP 会话
ResolveGetSystemInfo获取系统信息
ResolveGetConnections获取计算机中的所有连接
ResolveDoCloseConnection未实现

恶意软件和 MITRE ATT&CK

Elastic 使用 MITRE ATT&CK 框架记录威胁针对企业网络使用的常见战术、技术和过程。

战术

战术代表技术或子技术的“为什么”。它是攻击者的战术目标:执行某个操作的原因。

技术

技术代表攻击者如何通过执行某个操作来实现战术目标。

缓解 REF3864

检测

预防

YARA

Elastic Security 已创建 YARA 规则来识别此活动。

观察

以下可观察对象在此研究中进行了讨论

可观察对象类型名称参考
opera-x[.]net域名着陆页
teledown-cn[.]com域名着陆页
15af8c34e25268b79022d3434aa4b823ad9d34f3efc6a8124ecf0276700ecc39SHA-256NetFxRepairTools.msiMSI
accd651f58dd3f7eaaa06df051e4c09d2edac67bb046a2dcb262aa6db4291de7SHA-256x64bridge.dllSADBRIDGE
7964a9f1732911e9e9b9e05cd7e997b0e4e2e14709490a1b657673011bc54210SHA-256GOSAR
ferp.googledns[.]io域名GOSAR C2 服务器
hk-dns.secssl[.]com域名GOSAR C2 服务器
hk-dns.winsiked[.]com域名GOSAR C2 服务器
hk-dns.wkossclsaleklddeff[.]is域名GOSAR C2 服务器
hk-dns.wkossclsaleklddeff[.]io域名GOSAR C2 服务器

参考

以下内容在上述研究中被引用

附录

哈希算法 (SADBRIDGE)

def ror(x, n, max_bits=32) -> int:
    """Rotate right within a max bit limit, default 32-bit."""
    n %= max_bits
    return ((x >> n) | (x << (max_bits - n))) & (2**max_bits - 1)

def ror_13(data) -> int:
    data = data.encode('ascii')
    hash_value = 0

    for byte in data:
        hash_value = ror(hash_value, 13)
        
        if byte >= 0x61:
            byte -= 32  # Convert to uppercase
        hash_value = (hash_value + byte) & 0xFFFFFFFF

    return hash_value


def generate_hash(data, dll) -> int:
    dll_hash = ror_13(dll)
    result = (dll_hash + ror_13(data)) & 0xFFFFFFFF
    
    return hex(result)

GOSAR 中检查的 AV 产品

360sd.exekswebshield.exe
360tray.exekvmonxp.exe
a2guard.exekxetray.exe
ad-watch.exemcshield.exe
arcatasksservice.exemcshield.exe
ashdisp.exeminer.exe
avcenter.exemongoosagui.exe
avg.exempmon.exe
avgaurd.exemsmpeng.exe
avgwdsvc.exemssecess.exe
avk.exenspupsvc.exe
avp.exentrtscan.exe
avp.exepatray.exe
avwatchservice.exepccntmon.exe
ayagent.ayepsafesystray.exe
baidusdsvc.exeqqpcrtp.exe
bkavservice.exequhlpsvc.EXE
ccapp.exeravmond.exe
ccSetMgr.exeremupd.exe
ccsvchst.exerfwmain.exe
cksoftshiedantivirus4.exertvscan.exe
cleaner8.exesafedog.exe
cmctrayicon.exesavprogress.exe
coranticontrolcenter32.exesbamsvc.exe
cpf.exespidernt.exe
egui.exespywareterminatorshield.exe
f-prot.EXEtmbmsrv.exe
f-prot.exeunthreat.exe
f-secure.exeusysdiag.exe
fortitray.exev3svc.exe
hipstray.exevba32lder.exe
iptray.exevsmon.exe
k7tsecurity.exevsserv.exe
knsdtray.exewsctrl.exe
kpfwtray.exeyunsuo_agent_daemon.exe
ksafe.exeyunsuo_agent_service.exe