介绍
Elastic Security Labs最近观察到一个新的入侵系列,目标是讲中文的地区,并将其标记为REF3864。这些有组织的攻击活动通过伪装成合法软件如网页浏览器或社交媒体消息服务来针对受害者。背后威胁组织展示了在多个平台(如Linux、Windows和Android)传播恶意软件的中等程度的灵活性。在这次调查中,我们团队发现了一个独特的Windows感染链,使用了一个我们称为SADBRIDGE的自定义加载器。这个加载器部署了一个用Golang重写的QUASAR版本,我们称之为GOSAR。这是我们团队首次观察到用Golang编写的QUASAR重写版本。
关键要点
• 持续的攻击活动针对讲中文的人群,使用伪装成合法软件(如Telegram和Opera浏览器)的恶意安装程序
• 感染链使用注入和DLL旁加载技术,通过自定义加载器(SADBRIDGE)进行部署
• SADBRIDGE部署了一个新发现的用Golang编写的QUASAR后门变种(GOSAR)
• GOSAR是一个多功能的后门,仍在积极开发中,具有未完成的功能,并观察到随着时间的推移改进的功能迭代
• Elastic Security提供了对这一攻击链的全面预防和检测能力
REF3864活动概述
在11月,Elastic Security Labs团队在分析上传到VirusTotal的多个样本时,观察到一个独特的感染链。这些不同的样本通过伪装成合法软件(如Telegram或Opera GX浏览器)的着陆页面进行托管。

伪造的Telegram着陆页面
在这次调查中,我们发现了涉及类似技术的多个感染链:
• 伪装的MSI安装程序,检测率低
• 使用捆绑恶意DLL的合法软件进行伪装
• 部署自定义SADBRIDGE加载器
• 加载最终阶段的GOSAR
我们认为这些活动由于多个抽象层面而未被发现。通常,第一阶段涉及打开一个包含MSI安装程序的压缩文件(ZIP)。合法软件如Windows的x64dbg.exe
调试应用程序在后台加载一个恶意的已修补DLL(x64bridge.dll
)。这个DLL启动一个新的合法程序(MonitoringHost.exe
),在其中旁加载另一个恶意DLL(HealthServiceRuntime.dll
),最终通过注入在内存中加载GOSAR植入物。
恶意软件研究人员提取的SADBRIDGE配置显示了对手指定的活动日期,并表明至少自2023年12月以来,具有相似TTPs的操作一直在进行。GOSAR的命令与控制(C2)基础设施经常伪装成可信的服务或软件,以看起来无害并符合受害者对软件安装程序的期望。在执行链中,重点放在枚举中国的防病毒产品如360tray.exe
,以及防火墙规则名称和描述使用中文。由于这些定制化,我们认为这个威胁是针对讲中文的人群。此外,广泛使用中文日志记录表明攻击者也是讲中文的人。
QUASAR自2017年以来曾被用于国家支持的间谍活动、非国家黑客活动和以经济利益为动机的犯罪活动(Qualys,Quasar RAT的演变[1]),包括中国相关的APT10[2]。用Golang重写可能利用了在这期间获得的机构知识,允许增加功能,而无需对先前有效的TTP进行广泛的重新训练。
GOSAR扩展了QUASAR的功能,增加了信息收集能力、多操作系统支持,以及改进了对防病毒产品和恶意软件分类器的规避能力。然而,通用的诱饵网站,缺乏其他目标信息或目标行动,使我们无法确定攻击者的动机。

SADBRIDGE执行链导致GOSAR感染
SADBRIDGE介绍
SADBRIDGE恶意软件加载器以MSI可执行文件的形式进行交付,并使用DLL旁加载和各种注入技术来执行恶意负载。SADBRIDGE滥用合法应用程序如x64dbg.exe
和MonitoringHost.exe
来加载恶意DLL如x64bridge.dll
和HealthServiceRuntime.dll
,这导致了后续阶段和shellcode的执行。
通过服务创建和注册表修改实现持久性。使用UAC绕过技术[3](滥用ICMLuaUtil
COM接口)静默提升权限至管理员。此外,SADBRIDGE还集成了通过Windows任务计划程序绕过权限提升的技术,以系统级权限执行其主要负载。
SADBRIDGE配置使用简单的减法加密(每个字节减去0x1
)来加密配置字符串。加密阶段附带.log
扩展名,并在运行时使用XOR和LZNT1解压算法解密。
SADBRIDGE使用PoolParty[4]、APC队列和令牌操纵技术进行进程注入。为了避免沙箱分析,它使用长时间的Sleep
API调用。另一种防御规避技术是API补丁,禁用Windows安全机制如反恶意软件扫描接口(AMSI)和Windows事件跟踪(ETW)。
以下深入分析结构将探索执行链,提供对重要文件和阶段功能的逐步介绍,基于分析样本的配置。分析旨在突出每个组件之间的交互及其在达到最终负载中的角色。
SADBRIDGE代码分析
MSI分析
初始文件打包在MSI中,使用Advanced Installer[5],主要关注的文件是x64dbg.exe
和x64bridge.dll
。

MSI安装程序内的重要文件
通过使用MSI工具(lessmsi[6]),我们可以看到aicustact.dll
中的LaunchApp
入口点配置为执行AI_APP_FILE
属性中指定的文件路径。

使用Advanced Installer配置的自定义操作
如果我们导航到这个AI_APP_FILE
属性,我们可以看到与此配置绑定的文件是x64dbg.exe
。这代表了安装完成后将执行的文件,而合法的NetFxRepairTool.exe
从未执行。

AI_APP_FILE属性配置为启动x64dbg.exe
x64bridge.dll旁加载
当x64dbg.exe
被执行时,它调用了x64bridge.dll
的BridgeInit
导出。BridgeInit
是BridgeStart
函数的包装器。

调用BridgeStart的控制流图
与观察到的BLISTER[7]技术类似,SADBRIDGE修补了合法DLL的导出。

x64bridge.dll的BridgeStart导出的比较
在恶意软件初始化过程中,SADBRIDGE首先使用主机名和魔法种子0x4E67C6A7
生成哈希。这个哈希用作存储加密配置文件的目录名。加密配置写入C:\Users\Public\Documents\
。这个文件具有FILE_ATTRIBUTE_SYSTEM
、FILE_ATTRIBUTE_READONLY
、FILE_ATTRIBUTE_HIDDEN
属性,以在普通目录列表中隐藏自己。

隐藏的配置文件
解密配置非常简单,加密块用空字节分隔。对于每个加密块内的字节,我们可以将其递增0x1
。
配置包括:
• 可能的活动日期
• 用于创建服务的字符串
•
MonitoringHost.exe
的新名称(DevQueryBroker.exe
)•
MonitoringHost.exe
旁加载的DLL名称(HealthServiceRuntime.dll
)• 其他阶段的绝对路径(
.log
文件)• 承载GOSAR的主要注入目标(
svchost.exe
)

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

DevQueryBroker文件夹的文件列表
最后,它创建一个进程运行DevQueryBroker.exe
,该进程旁加载同一文件夹中的恶意HealthServiceRuntime.dll
。
HealthServiceRuntime.dll
这个模块在用户的%TEMP%
目录中放置一个加密和部分解密的shellcode。shellcode的文件名格式为:log
。然后,将每个部分解密的shellcode字节递减0x10
以完全解密。shellcode在同一进程的新线程中执行。

HealthServiceRuntime.dll中的shellcode解密
恶意软件使用与SonicWall发布的研究[8]中相同的算法进行API哈希,哈希算法在附录部分[9]中列出。shellcode将DevQueryBroker.log
解密为一个PE文件,然后对文件的前三分之一进行简单的XOR操作(单字节0x42
),然后使用LZNT1算法解压结果。

shellcode解密DevQueryBroker.log文件
shellcode然后使用NtUnmapViewOfSection
取消映射在PE文件首选基址的任何现有映射,确保对VirtualAlloc
的调用将从首选基址开始分配内存。最后,它将解密的PE文件映射到此分配的内存,并将执行转移到其入口点。所有由SADBRIDGE识别并执行的shellcode共享相同的代码结构,仅在它们引用的解密和执行的.log
文件上有所不同。
DevQueryBroker.log
恶意软件动态加载amsi.dll
以禁用Windows中的关键安全机制。它通过插入指令修改AmsiScanBuffer
的返回值为0x80070057
(表示无效参数的Microsoft标准错误代码E_INVALIDARG
),并提前返回,从而有效地绕过扫描逻辑。同样,它通过将AmsiOpenSession
的返回值始终设为相同的错误代码E_INVALIDARG
来补丁AmsiOpenSession
。此外,它通过用ret
指令替换ntdll.dll
中的第一条指令,补丁EtwEventWrite
,禁用Windows事件跟踪(ETW),抑制任何恶意活动的日志记录。

补丁AmsiScanBuffer、AmsiOpenSession和EtwEventWrite API
补丁后,一个加密的shellcode写入路径(C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
)的temp.ini
文件。恶意软件检查当前进程令牌的组成员资格以确定其权限级别。通过初始化带有SECURITY_LOCAL_SYSTEM_RID
的SID并调用CheckTokenMembership
来验证进程是否属于LocalSystem帐户。如果不是,它尝试通过创建带有SECURITY_BUILTIN_DOMAIN_RID
和DOMAIN_ALIAS_RID_ADMINS
的SID并执行类似的令牌成员资格检查,检查是否属于管理员组。
如果当前进程没有LocalSystem或管理员权限,首先通过UAC绕过机制[10]提升权限至管理员,利用ICMLuaUtil
COM接口。它通过创建单子字符串"Elevation:Administrator!new:{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"
来创建具有管理员权限的CMSTPLUA
对象实例。一旦对象创建并获取ICMLuaUtil
接口,恶意软件使用接口暴露的ShellExec
方法运行DevQueryBroker.exe
。

通过ICMLuaUtil COM接口提升权限
如果没有创建任务或服务来定期运行DevQueryBroker.exe
,恶意软件检查防病毒进程360tray.exe
是否正在运行。如果未运行,则创建一个服务以提升权限至SYSTEM,具有以下属性:
• 服务名称:DevQueryBrokerService
• 二进制路径名:“C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\DevQueryBroker.exe -svc”
• 显示名称:DevQuery背景发现代理服务
• 描述:允许应用通过后台任务发现设备
• 启动类型:系统启动时自动
• 权限:LocalSystem
如果检测到360tray.exe
正在运行,恶意软件会将一个加密的PE文件写入DevQueryBrokerService.log
,然后将下一个阶段的PE文件(阶段1)映射到当前进程内存中,并将执行转移到它。
一旦DevQueryBroker.exe
以SYSTEM级权限重新触发并达到这一链的部分,恶意软件会检查Windows版本。对于Vista及更高版本(不包括Windows 7)的系统,它会将另一个下一个阶段(阶段2)映射到内存中并将执行转移到那里。
然而,在Windows 7上,它会执行一个shellcode,解密并运行DevQueryBrokerPre.log
文件。
阶段1注入(explorer.exe)
SADBRIDGE利用PoolParty Variant 7[11]通过目标线程池的I/O完成队列将shellcode注入到explorer.exe
中。它首先复制目标进程的I/O完成队列的句柄。然后在explorer.exe
内分配存储shellcode的内存。额外的内存被分配来存储一个包含shellcode基址的TP_DIRECT结构。最后,它调用ZwSetIoCompletion
,传递TP_DIRECT结构的指针,将一个数据包排队到目标进程的I/O完成队列中,触发注入的shellcode执行。

I/O完成端口shellcode注入
这个shellcode解密DevQueryBrokerService.log
文件,取消映射在PE文件首选基址的任何内存区域,将PE文件映射到该地址,然后执行其入口点。这个行为与之前观察到的shellcode类似。
阶段2注入(spoolsv.exe/lsass.exe)
对于阶段2,SADBRIDGE使用与阶段1相同的注入技术,将shellcode注入到spoolsv.exe
或lsass.exe
中(如果spoolsv.exe
不可用)。shellcode表现出类似的行为:解密DevQueryBrokerPre.log
为一个PE文件,取消映射占据其首选基址的任何区域,映射PE文件,然后将执行转移到其入口点。
DevQueryBrokerService.log
从DevQueryBrokerService.log
解密的shellcode利用Windows任务计划程序进行权限提升。SADBRIDGE集成了一个公开的UAC绕过技术,使用IElevatedFactorySever
COM对象间接创建计划任务。该任务配置为每天以SYSTEM级权限运行DevQueryBroker.exe
,任务名称为DevQueryBrokerService
。

计划任务创建中的GUID(虚拟工厂用于维护UI)
为了掩盖其踪迹,恶意软件直接修改进程环境块(PEB),伪造图像路径和命令行,试图将COM服务伪装成来自explorer.exe
。

DevQueryBrokerService.log伪造的图像命令行
DevQueryBrokerPre.log
SADBRIDGE在注册表子键SYSTEM\CurrentControlSet\Services\DevQueryBrokerServiceSvc
下创建一个名为DevQueryBrokerServiceSvc
的服务,具有以下属性:
• 描述:允许应用通过后台任务发现设备
• 显示名称:DevQuery背景发现代理服务
• 错误控制:1
• 图像路径:
%systemRoot%\system32\svchost.exe -k netsvcs• 对象名称:LocalSystem
• 启动:2(自动启动)
• 类型:16
• 失败操作:
• 每24小时重置失败计数
• 执行三次重启尝试:第一次延迟20毫秒,第二次和第三次延迟1分钟
服务参数指定了位于C:\Program Files (x86)\Common Files\Microsoft Shared\Stationery\
的ServiceDll
。如果DLL文件不存在,它将在之后被写入磁盘。
DevQueryBrokerService.dll
的代码结构与在执行链的早期阶段看到的HealthServiceRuntime.dll
类似。它负责解密并运行DevQueryBroker.log
。当服务启动时,ServiceDll
将由svchost.exe
加载并执行。

svchost.exe的恶意ServiceDLL参数
此外,它修改了SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost\netsvcs
键,添加了DevQueryBrokerServiceSvc
的条目,将新创建的服务集成到由netsvcs
服务主机组管理的服务组中。

修改了netsvc注册表键以添加DevQueryBrokerServiceSvc
SADBRIDGE然后删除了先前创建的计划任务和服务,通过删除注册表子键SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Schedule\\TaskCache\\Tree\\DevQueryBrokerService
和SYSTEM\\CurrentControlSet\\Services\\DevQueryBrokerService
。
最后,它删除了C:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker
文件夹中的文件DevQueryBroker.exe
和HealthServiceRuntime.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.exe
或dllhost.exe
)。

复制用户令牌并提升令牌权限
如果令牌操纵失败或没有会话ID可用(系统进程可能有一个会话ID为0),则回退到使用CreateProcessA
创建没有令牌的进程。
加密的shellcodeC:\ProgramData\Microsoft\DeviceSync\Device\Stage\Data\DevQueryBroker\temp.ini
使用之前解密.log
文件所见的XOR和LZNT1解压技术进行解密,并使用APC注入将shellcode排队到新创建的进程线程中执行。

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

GOSAR注入到dllhost.exe和svchost.exe
GOSAR介绍
GOSAR是一个多功能的远程访问木马,目标是Windows和Linux系统。这个后门包括获取系统信息、截图、执行命令、记录键盘输入等功能。GOSAR保留了QUASAR的大部分核心功能和行为,同时包含了一些区别于原版本的修改。
通过用现代语言如Go重写恶意软件,可以降低检测率,因为许多防病毒解决方案和恶意软件分类器难以识别这些新编程结构下的恶意字符串/特征。以下是一个未打包的GOSAR上传后的低检测率示例。

GOSAR在VT上传时的低检测率
值得注意的是,这个变种支持多个平台,包括Linux系统的ELF二进制文件和传统的Windows PE文件。这种跨平台能力符合Go的适应性,使其比原始基于.NET的QUASAR更具灵活性。在接下来的部分中,我们将重点介绍GOSAR的代码结构、新功能和与开源版本(QUASAR)的区别。
GOSAR代码分析概述
GOSAR的代码结构
由于二进制文件保留了所有符号,我们能够重构源代码结构,从一个版本为0.12.01
的样本中提取。

GOSAR代码结构
• vibrant/config:包含恶意软件的配置文件。
• vibrant/proto:包含所有的Google Protocol Buffers(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发送系统信息,并新增了四个字段:
• IPAddress
• AntiVirus
• ClipboardSettings
• Wallets
这些防病毒和数字钱包的列表在函数vibrant_pkg_helpers_init
中初始化,详见本文档底部。
服务
恶意软件在客户端与C2初始连接期间启动了三个服务:
• vibrant_services_KeyLogger
• vibrant_services_ClipboardLogger
• vibrant_services_TickWriteFile

GOSAR服务
KeyLogger
GOSAR中的键盘记录功能在vibrant_services_KeyLogger
函数中实现。该功能依赖Windows API,拦截并记录受感染系统上的按键,通过SetWindowsHookEx
[12]设置全局Windows挂钩,参数为WH_KEYBOARD_LL
,以监控低级键盘事件。挂钩函数名为vibrant_services_KeyLogger_func1
。

GOSAR设置键盘记录器
ClipboardLogger
剪贴板记录功能相对简单,依赖Windows API。它首先使用IsClipboardFormatAvailable
[13]检查剪贴板数据的可用性,然后使用GetClipboardData
[14] API获取数据。

GOSAR剪贴板记录
TickWriteFile
ClipboardLogger
和KeyLogger
服务收集的数据定期由TickWriteFile
写入到目录C:\ProgramData\Microsoft\Windows\Start Menu\Programs\diagnostics
下的当前日期文件,如2024-11-27
。可以通过先减去值0x1f
然后与值0x18
进行异或解密,如CyberChef配方所示。

用于解密键盘记录日志的CyberChef配方
网络设置
在初始化其服务后,恶意软件生成三个线程,专门处理其网络设置。
• vibrant_network_ConfigFirewallRule
• vibrant_network_ConfigHosts
• vibrant_network_ConfigAutoListener
处理网络设置的线程[15]
ConfigFirewallRule
恶意软件为端口范围51756-51776
创建入站防火墙规则,名称为中文,翻译为“分布式事务协调器(LAN)”,允许所有程序和IP地址入站,描述为:“核心事务协调器服务的入站规则通过RPC/TCP远程管理。”

添加的防火墙规则
ConfigHosts
此功能向c:\Windows\System32\Drivers\etc\hosts
添加条目127.0.0.1 micrornetworks.com
。添加此条目的原因不明,但可能是由于恶意软件当前开发阶段的功能缺失或未完成。
ConfigAutoListener
此功能在之前防火墙规则允许的端口范围51756-51776
内的第一个可用端口上运行HTTP服务器监听器。有趣的是,服务器不处理任何命令,这表明恶意软件仍在开发中。我们目前版本仅处理对URI /security.js
的 GET
请求,响应字符串 callback();
,任何其他请求返回404错误代码。这种最小响应可能表明服务器是一个占位符或早期开发阶段的一部分,未来可能会增加更复杂的功能。

GOSAR处理的回调
日志
恶意软件将其运行时日志保存在目录%APPDATA%\Roaming\Microsoft\Logs
下,文件名格式为:windows-update-log-
。每个日志条目使用HMAC-AES算法加密;密钥硬编码在vibrant_config
函数中,示例如下:

GOSAR生成的日志示例
攻击者可以通过发送命令ResolveGetRunLogs
远程检索恶意软件的运行时日志。
插件
恶意软件具有执行插件的能力,这些插件是从C2下载并使用XOR算法加密存储在磁盘上的PE文件。这些插件保存路径为:C:\ProgramData\policy-err.log
。要执行插件,调用命令ResolveDoExecutePlugin
,首先检查是否有可用插件。

GOSAR检查是否存在可执行插件
然后它以反射方式加载存储在二进制文件中的base64格式的本地DLL plugins.dll
并执行其导出函数ExecPlugin
。

GOSAR加载plugins.dll并调用ExecPlugin
ExecPlugin
创建一个带有参数/package
/quiet
的suspended
进程C:\Windows\System32\msiexec.exe
。然后它将异步过程调用(APC)[16]队列到进程的主线程。当线程恢复时,排队的shellcode被执行。

GOSAR插件模块在msiexec.exe中注入PE
shellcode读取存储在C:\ProgramData\policy-err.log
的加密插件,使用硬编码的单字节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
[17] API初始化桌面。这个HVNC实现总共处理17个命令,可以在ExcuteCommand
导出中找到,如下表所示:
| 命令ID | 描述 |
| 0x401 | 首先通过在Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced下设置注册表键 TaskbarGlomLevel为2来禁用任务栏按钮分组。接着,通过使用 SHAppBarMessage设置任务栏始终可见和置顶,设置状态为 ABS_ALWAYSONTOP。 |
| 0x402 | 通过执行shell32.dll的第61个导出函数生成一个运行对话框。 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如CreateCompatibleDC
[18]、CreateCompatibleBitmap
[19]和CreateDIBSection
[20]的屏幕捕获结构。导出函数CaptureFirstScreen
和CaptureNextScreen
用于捕获受害者桌面的截图作为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 | 使用EnumDisplayMonitorsAPI枚举受害者的显示器。 |
| ResolveGetDesktop | 启动屏幕捕获功能。 |
| ResolveStopGetDesktop | 停止屏幕捕获功能。 |
| ResolveNewShellExecute | 打开到生成的cmd.exe进程的管道并发送命令。 |
| ResolveGetSchTasks | 通过运行命令schtasks query fo list v获取计划任务。 |
| ResolveGetScreenshot | 捕获受害者桌面的截图。 |
| ResolveGetServices | 通过WMI查询获取服务列表:select * from Win32_Service。 |
| ResolveDoServiceOperation | 启动或停止服务。 |
| ResolveDoDisableMultiLogon | 通过设置注册表键fSingleSessionPerUser的值为1禁用用户的多会话。 |
| ResolveDoRestoreNLA | 恢复远程桌面协议(RDP)的安全设置,启用网络级别身份验证(NLA)并强制SSL/TLS加密以确保安全通信。 |
| ResolveGetRemoteClientInformation | 获取所有本地启用用户的列表、RDP端口、LAN IP和操作系统特定信息:从注册表键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 | 使用WTSLogoffSessionAPI注销RDP会话。 |
| ResolveGetSystemInfo | 获取系统信息。 |
| ResolveGetConnections | 获取机器上的所有连接。 |
| ResolveDoCloseConnection | 未实现。 |
恶意软件与MITRE ATT&CK
Elastic使用MITRE ATT&CK[21]框架记录威胁对企业网络使用的常见战术、技术和程序。
战术
战术表示技术或子技术的原因。它是对手的战术目标:执行某个操作的原因。
• Collection[22]
• Command and Control[23]
• Defense Evasion[24]
• Discovery[25]
• Execution[26]
• Exfiltration[27]
• Persistence[28]
• Privilege Escalation[29]
技术
技术表示对手通过执行某个操作来实现战术目标的方式。
• 劫持执行流:DLL旁加载[30]
• 输入捕获:键盘记录[31]
• 进程注入:异步过程调用[32]
• 进程发现[33]
• 隐藏工件:隐藏窗口[34]
• 创建或修改系统进程:Windows服务[35]
• 非标准端口[36]
• 滥用权限提升控制机制:绕过用户帐户控制[37]
• 模糊文件或信息[38]
• 削弱防御:禁用或修改工具[39]
• 虚拟化/沙箱规避:基于时间的规避[40]
减轻REF3864
检测
• 潜在的反恶意软件扫描接口绕过通过PowerShell[41]
• 异常的打印后台处理程序子进程[42]
• 从异常目录执行 - 命令行[43]
• 非浏览器进程进行的外部IP查找[44]
• 异常的父子关系[45]
• 通过DllHost的异常网络连接[46]
• 通过服务注册表的异常持久性[47]
• 父进程PID欺骗[48]
预防
• 通过具有异常参数的进程的网络连接[49]
• 潜在的伪装为SVCHOST[50]
• 从可疑未备份内存加载的网络模块[51]
• 通过ICMLuaUtil提升的COM接口进行的UAC绕过[52]
• 具有伪造创建时间的潜在图像加载[53]
YARA
Elastic Security创建了YARA规则来识别这种活动。
• Multi.Trojan.Gosar[54]
• Windows.Trojan.SadBridge[55]
观察
在这项研究中讨论了以下可观察对象:
| 可观察对象 | 类型 | 名称 | 参考 |
| opera-x[.]net | 域名 | 着陆页 | |
| teledown-cn[.]com | 域名 | 着陆页 | |
| 15af8c34e25268b79022d3434aa4b823ad9d34f3efc6a8124ecf0276700ecc39 | SHA-256 | NetFxRepairTools.msi | MSI |
| accd651f58dd3f7eaaa06df051e4c09d2edac67bb046a2dcb262aa6db4291de7 | SHA-256 | x64bridge.dll | SADBRIDGE |
| 7964a9f1732911e9e9b9e05cd7e997b0e4e2e14709490a1b657673011bc54210 | SHA-256 | GOSAR | |
| 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服务器 |
参考资料
以下是本文研究中的参考资料:
• 高级Windows任务计划程序剧本第2部分:从COM到UAC绕过并直接获取系统权限[56]
• Project Androm:后门木马[57]
• 使用Windows线程池的进程注入[58]
• UAC绕过机制[59]
附录
SADBRIDGE的哈希算法
def ror(x, n, max_bits=32) -> int:
"""在最大位数限制内向右旋转,默认32位。"""
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 # 转换为大写
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中检查的防病毒产品
| 360sd.exe | kswebshield.exe |
| 360tray.exe | kvmonxp.exe |
| a2guard.exe | kxetray.exe |
| ad-watch.exe | mcshield.exe |
| arcatasksservice.exe | mcshield.exe |
| ashdisp.exe | miner.exe |
| avcenter.exe | mongoosagui.exe |
| avg.exe | mpmon.exe |
| avgaurd.exe | msmpeng.exe |
| avk.exe | mssecess.exe |
| avp.exe | nspupsvc.exe |
| avp.exe | ntrtscan.exe |
| avwatchservice.exe | patray.exe |
| ayagent.aye | pccntmon.exe |
| baidusdsvc.exe | psafesystray.exe |
| bkavservice.exe | qqpcrtp.exe |
| ccapp.exe | quhlpsvc.EXE |
| ccSetMgr.exe | ravmond.exe |
| ccsvchst.exe | remupd.exe |
| cksoftshiedantivirus4.exe | rfwmain.exe |
| cleaner8.exe | rtvscan.exe |
| cmctrayicon.exe | safedog.exe |
| coranticontrolcenter32.exe | savprogress.exe |
| cpf.exe | sbamsvc.exe |
| egui.exe | spidernt.exe |
| f-prot.EXE | spywareterminatorshield.exe |
| f-prot.exe | tmbmsrv.exe |
| f-secure.exe | unthreat.exe |
| fortitray.exe | usysdiag.exe |
| hipstray.exe | v3svc.exe |
| iptray.exe | vba32lder.exe |
| k7tsecurity.exe | vsmon.exe |
| knsdtray.exe | vsserv.exe |
| kpfwtray.exe | wsctrl.exe |
| ksafe.exe | yunsuo_agent_daemon.exe |
| yunsuo_agent_service.exe |
引用链接
[1]
Quasar RAT的演变: https://www.qualys.com/docs/whitepapers/qualys-wp-stealthy-quasar-evolving-to-lead-the-rat-race-v220727.pdf?_ga=2.196384556.1458236792.1733495919-74841447.1733495919[2]
APT10: https://www.fbi.gov/wanted/cyber/apt-10-group[3]
UAC绕过技术: https://github.com/0xlane/BypassUAC[4]
PoolParty: https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/[5]
Advanced Installer: https://www.advancedinstaller.com/[6]
lessmsi: https://github.com/activescott/lessmsi[7]
BLISTER: https://www.elastic.co/security-labs/blister-loader[8]
研究: https://www.sonicwall.com/blog/project-androm-backdoor-trojan[9]
部分: https://www.elastic.co/security-labs/under-the-sadbridge-with-gosar#appendix[10]
UAC绕过机制: https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512[11]
PoolParty Variant 7: https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/[12]
`SetWindowsHookEx`: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexa[13]
`IsClipboardFormatAvailable`: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-isclipboardformatavailable[14]
`GetClipboardData`: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getclipboarddata[15]
处理网络设置的线程: https://www.elastic.co/security-labs/assets/images/under-the-sadbridge-with-gosar/image15.png[16]
异步过程调用(APC): https://learn.microsoft.com/en-us/windows/win32/sync/asynchronous-procedure-calls[17]
`CreateDesktopA`: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createdesktopa[18]
`CreateCompatibleDC`: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createcompatibledc[19]
`CreateCompatibleBitmap`: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createcompatiblebitmap[20]
`CreateDIBSection`: https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-createdibsection[21]
MITRE ATT&CK: https://attack.mitre.org/[22]
Collection: https://attack.mitre.org/tactics/TA0009/[23]
Command and Control: https://attack.mitre.org/tactics/TA0011/[24]
Defense Evasion: https://attack.mitre.org/tactics/TA0005/[25]
Discovery: https://attack.mitre.org/tactics/TA0007/[26]
Execution: https://attack.mitre.org/tactics/TA0002/[27]
Exfiltration: https://attack.mitre.org/tactics/TA0010/[28]
Persistence: https://attack.mitre.org/tactics/TA0003/[29]
Privilege Escalation: https://attack.mitre.org/tactics/TA0004/[30]
劫持执行流:DLL旁加载: https://attack.mitre.org/techniques/T1574/002/[31]
输入捕获:键盘记录: https://attack.mitre.org/techniques/T1056/001/[32]
进程注入:异步过程调用: https://attack.mitre.org/techniques/T1055/004/[33]
进程发现: https://attack.mitre.org/techniques/T1057/[34]
隐藏工件:隐藏窗口: https://attack.mitre.org/techniques/T1564/003/[35]
创建或修改系统进程:Windows服务: https://attack.mitre.org/techniques/T1543/003/[36]
非标准端口: https://attack.mitre.org/techniques/T1571/[37]
滥用权限提升控制机制:绕过用户帐户控制: https://attack.mitre.org/techniques/T1548/002/[38]
模糊文件或信息: https://attack.mitre.org/techniques/T1027[39]
削弱防御:禁用或修改工具: https://attack.mitre.org/techniques/T1562/001/[40]
虚拟化/沙箱规避:基于时间的规避: https://attack.mitre.org/techniques/T1497/003/[41]
潜在的反恶意软件扫描接口绕过通过PowerShell: https://github.com/elastic/detection-rules/blob/main/rules/windows/defense_evasion_amsi_bypass_powershell.toml[42]
异常的打印后台处理程序子进程: https://github.com/elastic/detection-rules/blob/main/rules/windows/privilege_escalation_unusual_printspooler_childprocess.toml[43]
从异常目录执行 - 命令行: https://github.com/elastic/detection-rules/blob/main/rules/windows/execution_from_unusual_path_cmdline.toml[44]
非浏览器进程进行的外部IP查找: https://www.elastic.co/guide/en/security/current/external-ip-lookup-from-non-browser-process.html[45]
异常的父子关系: https://github.com/elastic/detection-rules/blob/main/rules/windows/privilege_escalation_unusual_parentchild_relationship.toml[46]
通过DllHost的异常网络连接: https://github.com/elastic/detection-rules/blob/main/rules/windows/defense_evasion_unusual_network_connection_via_dllhost.toml[47]
通过服务注册表的异常持久性: https://github.com/elastic/detection-rules/blob/main/rules/windows/persistence_services_registry.toml[48]
父进程PID欺骗: https://github.com/elastic/detection-rules/blob/main/rules/windows/defense_evasion_parent_process_pid_spoofing.toml[49]
通过具有异常参数的进程的网络连接: https://github.com/elastic/endpoint-rules/blob/main/rules/windows/defense_evasion_masquerading_process_with_unusual_args_and_netcon.toml[50]
潜在的伪装为SVCHOST: https://github.com/elastic/endpoint-rules/blob/main/rules/windows/defense_evasion_unusual_svchost.toml[51]
从可疑未备份内存加载的网络模块: https://github.com/elastic/endpoint-rules/blob/main/rules/windows/defense_evasion_netcon_dll_suspicious_callstack.toml[52]
通过ICMLuaUtil提升的COM接口进行的UAC绕过: https://github.com/elastic/endpoint-rules/blob/95b23ae32ce1445a8a2f333dab973de313b14016/rules/windows/privilege_escalation_uac_bypass_com_interface_icmluautil.toml[53]
具有伪造创建时间的潜在图像加载: https://github.com/elastic/endpoint-rules/blob/main/rules/windows/defense_evasion_susp_imageload_timestomp.toml[54]
Multi.Trojan.Gosar: https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Multi_Trojan_Gosar.yar[55]
Windows.Trojan.SadBridge: https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_SadBridge.yar[56]
高级Windows任务计划程序剧本第2部分:从COM到UAC绕过并直接获取系统权限: https://zcgonvh.com/post/Advanced_Windows_Task_Scheduler_Playbook-Part.2_from_COM_to_UAC_bypass_and_get_SYSTEM_dirtectly.html[57]
Project Androm:后门木马: https://www.sonicwall.com/blog/project-androm-backdoor-trojan[58]
使用Windows线程池的进程注入: https://www.safebreach.com/blog/process-injection-using-windows-thread-pools/[59]
UAC绕过机制: https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512




