强对抗的 SquidLoader 针对中国企业发起攻击

研究人员近期发现了一种高对抗强度的 Loader,其通过钓鱼邮件附件传递给受害者。根据恶意软件所具备的引诱和规避行为,研究人员将其命名为 SquidLoader。SquidLoader 最早在 2024 年 4 月下旬被发现,但研究人员认为其至少已经活跃了一个月以上。

SquidLoader 后续投递的是 Cobalt Strike,也都经过加强以对抗静态分析。根据 SquidLoader 的配置信息,研究人员发现过去两年中主要在针对讲中文的受害者进行攻击。攻击者的攻击技术与攻击策略有可能会被他人模仿,在不久的将来被其他攻击者应用到攻击其他受害者。

Loader 分析

2024 年 4 月下旬,研究人员观察到一些特别的钓鱼邮件附件,文件名为“华为工业级路由器相关产品介绍和优秀客户案例”。顺藤摸瓜发现一系列以中国企业/组织名称命名的恶意附件,如“中国移动集团XX分公司”、“嘉X智能科技”与“XX水利技术学院”。所有样本都使用 Word 文档的图标,吸引受害者打开这些文档文件,但实际上执行的是二进制文件。

这些 Loader 具备强大的引诱和规避能力,帮助恶意样本保持不被发现,也阻止分析人员进行分析。下载的 Shellcode 也加载进同一 Loader 中,不写入磁盘也降低了被发现的风险。

发现的大多数样本文件都使用合法的过期证书,使样本文件看起来很正常。使用证书之一是颁发给杭州瑛格科技有限公司的,在 2021 年 7 月 15 日到期。证书的指纹为 3F984B8706702DB13F26AE73BD4C591C5936344F,序列号为 02 0E B5 27 BA C0 10 99 59 3E 2E A9 02 E3 97 CB。当然,这并不是唯一的无效证书。

SquidLoader 使用的 C&C 服务器采用自签名证书,其签发者和主体都包含:

  • Common Name: localhost
  • Organizational Unit: group
  • Organization: Company
  • Locality: Nanjing
  • State/Province: Jiangsu
  • Country: CN

首次执行时,SquidLoader 会复制到特定位置(C:\BakFiles\install.exe),再从新位置重新启动。这可能是攻击者故意的,想通过不可疑的名称执行,因为 SquidLoader 并不具备任何持久化机制。只是后续投递的 Cobalt Strike 能够创建服务并修改注册表,可以实现攻击者的持久化目标。

Shellcode 通过 5 字节的异或密钥进行加密,密钥使用小端存储硬编码为 DE FF CC 8F 9A。

1719332758_667aef96a3c4a5d785a40.png!small?1719332758440

异或解码

尽管文件名和图片都模拟 Word 文档文件,但样本文件中包含大量引用微信或 mingw-gcc 等软件的代码,以此来误导研究人员。文件的元数据中也是如此,想让受害者相信恶意文件只是这些软件的合法组件。当然,这些代码永远不会被执行。

1719332776_667aefa8807fb0d6a9f85.png!small?1719332776425

其他代码

所有观察到的可执行文件都有类似于 Microsoft Office Word 的文档图标,样本文件还会弹出中文告警信息:

1719332790_667aefb6b9bdf75b0e9f5.png!small?1719332790381

告警信息

检测规避技术

SquidLoader 使用了大量的检测规避技术,此处简单列举几个:

使用无意义/模糊的指令

文件中包含模糊且无意义的 x86 指令,例如 pause、mfence 或 lfence。某些函数还包含填充指令,例如根本不使用的随机算术计算。这可能是攻击者想要破坏或者绕过反病毒模拟器的尝试,这些检测手段可能并未实现不太常见的指令,或者可能只能运行模拟指令。

加密代码段

恶意软件开始执行后立即加载内嵌的加密 Shellcode,在动态分配的内存段中进行解密,赋予该段执行权限并调用。加密算法是固定位移的单字节异或加密,如下所示。解密过程中还包括诱饵指令,进一步混淆代码,但没有实际用途。

1719332803_667aefc39287898e9fc6e.png!small?1719332803211

异或解密

栈内加密字符串

加密 Shellcode 中的敏感字符串都被异或加密作为局部变量嵌入函数体中,甚至会使用多字节异或密钥进行字符串解密。将字符串存储在栈中可以更轻松地隐藏特定信息,当栈更新时其内容将从内存中被删除。如下所示,恶意软件解密字符串获得 NtWriteVirtualMemory 后调用其 API。

1719332815_667aefcfa41a19dc8167f.png!small?1719332815450

加密变量

跳转指令

某些函数包含 call 或 jmp 指令,跳转到另一个函数内的地址,这使得反汇编程序对函数体产生错误的汇编。

如下所示。用 IDA 查看 14000770E+2 处无法得到正确的汇编输出。

1719332828_667aefdcd9297e4fec864.png!small?1719332828862

调用跳转

该地址被 IDA 认为在不同函数中间,140007710 甚至不会出现。

1719332839_667aefe7218dd7f031ecb.png!small?1719332838829

解析错误

手动标记函数起始位置后,IDA 才能够正确进行反汇编。

1719332853_667aeff57edbb38d4fe7b.png!small?1719332853339

修正解析结果

反汇编的隐藏函数位于 __scrt_common_main_seh函数中,调用的目标是解密和执行内嵌加载程序 Shellcode 的代码。但该函数是标准 C 编译器生成的,旨在启动 WinMain/main 函数。换句话说,此处不应该出现自定义代码。从 WinMain 开始的程序流程就完全被改变了。

返回地址混淆

负责加载和执行此前提到的 Shellcode 的代码也通过栈操作执行返回地址混淆。如下所示,代码中可以看到返回地址如何指向 __scrt_common_main_seh+14。在最后一个函数调用后,通过不正确的指令操作栈。这会使函数到达 retn 指令时,栈指向解密 Shellcode 地址作为返回地址,这种技术主要阻止分析人员进行分析。

1719332872_667af0086924661d7af19.png!small?1719332872472

原始返回地址

1719332887_667af0170fb42e1db80ff.png!small?1719332889371

实际返回地址

控制流图混淆

Shellcode 函数还使用了控制流图混淆,在无限循环中包含大量 Switch 语句。Switch 语句由变量进行控制,看似随机的值来选择下面要执行的分支。这种混淆方式使得不进行动态分析就不可能知道 Switch 语句是否会被执行。

控制流图混淆如下所示:

1719332901_667af025472544c571e92.png!small?1719332903029

控制流图混淆

调试器检测

Loader 使用了三种方法检测调试器,一旦发现就会执行非法指令触发崩溃。

  • 检查已知调试器进程名称列表。通过 SystemProcessInformation (0x5) 调用 NtQuerySystemInformation 获取正在运行的进程列表。检查的进程包括:
Ida64.exe
Ida.exe
DbgX.Shell
Windbg.exe
X32dbg.exe
X64dbg.exe
Olldbg.exe

1719332921_667af03953719dcd6e6e1.png!small?1719332921985

进程检查

  • 调用 NtQueryInformationProcess 并使用未记录的 0x1e 作为 ProcessInformationClass 参数的值来查找附加到正在运行进程的调试器。如果存在会返回调试对象
NtQueryInformationProcess (in: ProcessHandle=0xffffffffffffffff, ProcessInformationClass=0x1e, ProcessInformation=0x26ce8ff788, ProcessInformationLength=0x8, ReturnLength=0x26ce8ff788 | out: ProcessInformation=0x26ce8ff788, ReturnLength=0x26ce8ff788) returned 0xc0000353
  • 通过使用 SystemKernelDebuggerInformation (0x23) 系统信息类调用 NtQuerySystemInformation 来查找内核调试器的存在
NtQuerySystemInformation (in: SystemInformationClass=0x23, SystemInformation=0x26ce8ff388, Length=0x2, ResultLength=0x0 | out: SystemInformation=0x26ce8ff388, ResultLength=0x0) returned 0x0

一旦检测到调试器,不仅触发自身程序崩溃,还会将 WinHttpConnect 替换为自己代码的入口点。这样 Loader 就不能正常加载库文件,也就不能正常连接 C&C 服务器,避免暴露。

1719332949_667af055d6706cb4bd6a1.png!small?1719332951989

代码变更

文件检查

Loader 检测以下几个文件是否存在,存在文件的话即会退出:

  • C:\temp\diskpartScript.txt
  • C:\Users\Admin\My Pictures\My Wallpaper.jpg
  • C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

执行直接系统调用

攻击者尽量避免调用 Windows NT API,直接执行自己实现的系统调用。攻击者创建了多个 NT API 的 Wrapper,每个 NT API 都对应一个 Wrapper。如下所示,为具有四个参数的 NT API Wrapper:

1719332965_667af06519537db5a57a9.png!small?1719332966167

NT API Wrapper

Wrapper 解析 NtQuerySystemInformation,后续通过 jump_to_syscall 指令将给定的系统调用号移动到 EAX 并执行跳转 NtQuerySystemInformation+12。这样完全避免使用 NT API,也就绕过了很多检测 Hook 点位,也就不会在执行日志中现形。

1719332987_667af07bc1b884f69a19a.png!small?1719332987529

jump_to_syscall 函数体

1719333002_667af08a240aa4d6c1080.png!small?1719333006626

jmp 指令跳转 syscall 指令

Payload

分析人员只观察到了使用相同 CFG 混淆的 Cobalt Strike,很可能是出自相同攻击者之手。但其中并不包含反调试和反虚拟机技术,可能攻击者认为 Loader 已经确认过。

恶意样本模拟 Kubernetes 流量,向 /api/v1/pods 发起 GET 请求。如果 C&C 服务器没有响应或者不是预期响应,Payload 就会无限循环 ping C&C 服务器。

1719333015_667af097db54edf923f91.png!small?1719333015848

C&C 请求

头字段 X-Method 有三个可能值:

  • con:回连上线
  • snd:回传信息
  • rcv:接收任务

Cobalt Strike 读取 C&C 服务器的响应信息,进行检查:

  • HTTP 响应代码 200
  • 存在 X-Session

满足条件时,恶意软件收集失陷主机信息并通过 /api/v1/pods 的 POST 请求回传 C&C 服务器。收集的信息很多,例如用户名、计算机名称、ACP、OEMCP 与网络接口 IP 地址等。

1719333035_667af0ab24f69ffc6bdad.png!small?1719333037255

收集信息

窃取的信息会加密发送:

1719333049_667af0b940aa13a1df819.png!small?1719333049510

失陷主机信息

窃取系统信息后,向 C&C 服务器发送的 HTTP GET 请求再执行任务。通过 C&C 信道以加密形式发送要执行的指令,加密算法存在大量的位运算。

1719333075_667af0d3df4759df48a14.png!small?1719333077126

加密方式

Win32 API 混淆

因为 Payload 需要与位置无关,因此 Win API 导入需要动态解析。恶意软件在内存中创建包含所需的所有 API 函数地址的表,并不存储函数的直接地址,而是存储 ~(_DWORD) api_addr & 0xCAFECAFE | api_addr & 0xFFFFFFFF35013501 的结果值。

1719333085_667af0dd652e37e3b43ae.png!small?1719333085169

存储地址

调用 API 前要撤销此操作,API 调用如下所示:

1719333098_667af0ea309edcd3826e1.png!small?1719333098206

展开并调用

结论

SquidLoader 明显具备很强的对抗检测能力,两年多一直使用相似的攻击手段针对讲中文的受害者。

参考来源

强对抗的 SquidLoader 针对中国企业发起攻击

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366356.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE3解决跨域问题

本文基于vue3 vite element-plus pnpm 报错:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接访问其他IP,需要用vite.config.ts &#xff0…

【一生一芯】笔记

文章目录 一级目录二级目录三级目录缓存的验证 一级目录 Data, 二级目录 三级目录 缓存的验证

应急响应:应急响应流程,常见应急事件及处置思路

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需…

基于X86+FPGA+AI的芯片缺陷检测方案

应用场景 随着半导体技术的发展,对芯片的良率要求越来越高。然而集成电路芯片制造工艺复杂,其制造过程中往往产生很多缺陷,因此缺陷检测是集成电路制造过程中的必备工艺。 客户需求 小体积,低功耗 2 x USB,1 x LAN Core-i平台无…

CVE-2020-26048(文件上传+SQL注入)

简介 CuppaCMS是一套内容管理系统(CMS)。 CuppaCMS 2019-11-12之前版本存在安全漏洞,攻击者可利用该漏洞在图像扩展内上传恶意文件,通过使用文件管理器提供的重命名函数的自定义请求,可以将图像扩展修改为PHP&#xf…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon?Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件(application.yml)说明: Feign 与 Ribbon 结合使用的应用场景1. 动态服…

OpenStack开源虚拟化平台(二)

目录 三、对象存储服务Swift(一)Swift特性(二)应用场景(三)Swift主要组件(四)Swift基本原理(五)实例分析 四、镜像服务Glance(一)Glan…

STM32自己从零开始实操08:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感:通低频阻高频的。仿真中高频信号通过电感,因为电感会阻止电流发生变化,故说阻止高频信号 电容:隔直通交。…

华为云服务器系统重装

文章目录 1 登录云服务器,点击控制台2 选择实例3 点击更多,选择重装系统4 勾选关机,填写密码,点击确定5 选择自己方便的认证方式6 同意协议7 等待完成8 重装完毕 1 登录云服务器,点击控制台 2 选择实例 3 点击更多&…

C语⾔数据类型和变量

C语⾔数据类型和变量 1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&#…

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为:在写某些代码的时候,仓库中有些文件夹,只提交了文件夹名称到…

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式:缓存有就返回,没有数据库查询,放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似,程序不需要关注从哪里读取数据,它只需要从缓存查询数据。…

海思SS928/SD3403开发笔记4——u盘挂载

首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图: 取消挂载 umount /mnt/usb

学习笔记——动态路由——OSPF(OSPF协议的工作原理)

八、OSPF协议的工作原理 1、原理概要 (1)相邻路由器之间周期性发送HELLO报文,以便建立和维护邻居关系 (2)建立邻居关系后,给邻居路由器发送数据库描述报文(DBD),也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器…

vite+vue集成cesium

1、创建项目、选择框架vuejs pnpm create vite demo_cesium 2、进入项目安装依赖 cd demo_cesium pnpm install3、安装cesium及插件 3、pnpm i cesium vite-plugin-cesium 4、修改vite-config.js import { defineConfig } from vite import vue from vitejs/plugin-vue impo…

怎么测试远程服务器能否连通

远程服务器连接测试的方法很多,下面简单介绍下其中两种方法。 ping命令 按WINR快截键,打开“运行”对话框,输入cmd,回车,打开命令提示符。 输入ping IP地址或ping 域名即可,如ping360服务器通不通&#xf…

第十四届蓝桥杯省赛C++B组D题【飞机降落】题解(AC)

解题思路 这道题目要求我们判断给定的飞机是否都能在它们的油料耗尽之前降落。为了寻找是否存在合法的降落序列,我们可以使用深度优先搜索(DFS)的方法,尝试所有可能的降落顺序。 首先,我们需要理解题目中的条件。每架…

【OceanBase】OBProxy 无状态的理解

SueWakeup 个人主页:SueWakeup 系列专栏:为祖国的科技进步添砖Java 个性签名:保留赤子之心也许是种幸运吧 本文封面由 凯楠📸友情提供 目录 前言 OBProxy 无状态的概述 OBProxy 无状态特性带来的优点 1. 高可用 2. 负载均衡…

盛元广通打造智慧校园实验室安全管理系统

盛元广通智慧校园实验室安全管理系统以安全为重点,构建由学校、二级单位、实验室组成的三级联动的实验室安全多级管理体系、多类用户角色,内置教育部标准检查表,支撑实验室相关业务过程的智慧管理。实现通过PC端/手机移动端开展检查工作、手机…

基于贵州非遗推广小程序的设计与实现14362

基于贵州非遗推广小程序的设计与实现 摘 要 本文设计并实现了一个基于贵州非遗推广的小程序,旨在通过小程序平台推广和展示贵州省非物质文化遗产。该小程序提供了非遗项目介绍、相关活动展示、购买非遗产品等功能。 首先,我们收集了贵州省各个非遗项目的…