强对抗的 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.mzph.cn/bicheng/39254.shtml

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

相关文章

Vue 数据大屏适配

1、准备俩个盒子 .dataScreen-content 盒子内容根据设计稿给的px单位进行正常的布局就行 2、盒子的CSS样式 .dataScreen-container {width: 100%;height: 100%;// 有背景图需要的样式background: url("./images/bg.png") no-repeat;background-repeat: no-repeat;b…

入门PHP就来我这(纯干货)04

~~~~ 有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 我们接着《想入门PHP就来我这(纯干货)03》继续往下学习&am…

安装Rabbitmq遇到的坑

!!!一定要对号版本号 不同的虚拟机unbontu、cetenos和不同的erlang和不同的rabbitmq之间要对应下载对应版本 下面给出我的版本centos7erlangrabbitmq 分割线 安装好后,如果在虚拟机的服务器上可以打开,在本地浏览器…

JavaScript中的Array(数组)对象

目录 一、Array数组对象 1、介绍 2、创建数组对象并赋值 3、访问数组元素 二、Array对象属性 1、constructor属性 2、length属性 3、prototype属性 三、Array对象的常用方法 1、isArray() 2、concat() 3、pop() 4、shift() 5、push() 6、unshift() 7、reverse(…

高性价比宠物空气净化器分享,希喂、霍尼韦尔、有哈PK

近期,家中的小猫咪仿佛化身为行走的“蒲公英”,掉毛现象愈发严重,家中每个角落乃至空气中都弥漫着难以忽视的猫毛,衣物更是无一幸免,披上了毛茸茸的“外衣”。更令人啼笑皆非的是,就连不经意间清理的眼屎中…

VQA视觉问答系统

这是一个典型的多模态问题,融合了CV与NLP的技术,计算机需要同时学会理解图像和文字。 Joint embedding 首先,图像和问题分别由CNN和RNN进行第一次编码得到各自的特征,随后共同输入到另一个编码器中得到joint embedding,最后通过解码器输出答案。 值得注意的是,有的工作…

小红书运营教程02

小红书大致会分享10篇左右。微博、抖音、以及视频剪辑等自媒体运营相关技能以及运营教程相关会陆续的进行分享。 上次分享涉及到的对比,母婴系列,或者可以说是服装类型,不需要自己过多的投入,对比知识类博主来说,自己将知识讲述出来,然后要以此账号进行变现就比较麻烦,…

如果这时你还不清理C盘,那只能眼睁睁看着电脑越来越卡 直到系统崩溃

如果这时候你还不清理C盘,那只能眼睁睁看着电脑越来越卡 直到系统崩溃。很多人就是想偷懒,当然这是人的天性,明明知道自己的C盘空间就那么大,一天天看着C盘空间越来越小,还不去清理C盘。 这样的人有两种,一…

软件开发案例参考

前言:基于平台现有需求进行新功能模块开发与实现,以下内容为部分源码解析,仅提供一些思路参考,不予以客观指导,毕竟条条大路通罗马嘛; 语言:C# 工具:visual studio 2017/visual st…

C++基础(二):C++入门(一)

C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式 等。熟悉C语言之后,对C学习有一定的帮助,本篇博客主要目标: 1. 补充C语言语法的不足,以及C是如何对C语言设计…

【RabbitMQ实战】邮件发送(直连交换机、手动ack)

一、实现思路 二、异常情况测试现象及解决 说明:本文涵盖了关于RabbitMQ很多方面的知识点, 如: 消息发送确认机制 、消费确认机制 、消息的重新投递 、消费幂等性, 二、实现思路 1.简略介绍163邮箱授权码的获取 2.编写发送邮件工具类 3.编写RabbitMQ配置文件 4.生产者发起调用…

高考失利咨询复读,银河补习班客服开挂回复

补习班的客服在高考成绩出来后,需要用专业的知识和足够的耐心来回复各种咨询,聊天宝快捷回复软件,帮助客服开挂回复。 ​ 前言 高考成绩出来,几家欢喜几家愁,对于高考失利的学生和家长,找一个靠谱的复读补…

全面了解机器学习

目录 一、基本认识 1. 介绍 2. 机器学习位置 二、机器学习的类型 1. 监督学习 2. 无监督学习 3. 强化学习 三、机器学习术语 1. 训练样本 2. 训练 3. 特征 4. 目标 5. 损失函数 四、机器学习流程 五、机器学习算法 1. 分类算法 2. 聚类算法 3. 关联分析 4. …

Qt入门教程(一):Qt使用的基本知识

目录 Qt简介 新建项目 构建目录和工作目录 构建目录 工作目录 项目结构 项目配置文件 .pro 用户文件 .user 主文件 main.cpp 头文件 dialog.h 源文件 dialog.cpp 帮助文档 三种查询文档的方式: 文档的重点位置:​编辑 调试信息 Qt简介 Qt…

java 代码块

Java中的代码块主要有三种类型:普通代码块、静态代码块、构造代码块。它们的用途和执行时机各不相同。 普通代码块:在方法内部定义,使用一对大括号{}包围的代码片段。它的作用域限定在大括号内,每当程序执行到该代码块时就会执行其…

全平台7合一自定义小程序源码系统功能强大 前后端分离 带完整的安装代码包以及搭建教程

系统概述 这款全平台 7 合一自定义小程序源码系统是专为满足各种业务需求而设计的。它整合了多种功能,能够在不同平台上运行,为用户提供了全方位的体验。无论你是企业主、开发者还是创业者,这款系统都能为你提供强大的支持。 代码示例 系统…

crewAI实践(包含memory的启用)--AiRusumeGenerator

crewAI实践--AiRusumeGenerator 什么是crewAIAiRusumeGenerator功能效果展示开发背景开发步骤1. 首先得学习下这款框架原理大概用法能够用来做什么? 2. 安装crewAI以及使用概述3. 写代码Agents.pyTasks.pymian.py关于task中引入的自定义工具这里不再赘述 什么是crew…

V Rising夜族崛起的管理员指令大全

使用方法: 如果没有启用控制台需要先启用控制台 打开游戏点击选项(如果在游戏内点击ESC即可),在通用页面找到启用控制台,勾选右边的方框启用 在游戏内点击键盘ESC下方的波浪键(~)使用控制台 指…

构建LangChain应用程序的示例代码:49、如何使用 OpenAI 的 GPT-4 和 LangChain 库实现多模态问答系统

! pip install "openai>1" "langchain>0.0.331rc2" matplotlib pillow加载图像 我们将图像编码为 base64 字符串,如 OpenAI GPT-4V 文档中所述。 import base64 import io import osimport numpy as np from IPython.display import HT…

PDF一键转PPT文件!这2个AI工具值得推荐,办公必备!

PDF转换为PPT文件,是职场上非常常见的需求,过去想要把PDF文件转换为PPT,得借助各种文件转换工具,但在如今AI技术主导的大背景下,我们在选用工具时有了更多的选择,最明显的就是基于AI技术打造的AI格式转换工…