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

news2024/11/16 8:54:17

研究人员近期发现了一种高对抗强度的 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.coloradmin.cn/o/1885012.html

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

相关文章

AE射频电源维修PE-II 10K中频电源维修

AE CESAR射频电源维修 PEII-10K镀膜电源;射频电源RF-5S;RFG3000;RFG3001等系列维修。 主要服务于太阳能光伏、PVD镀膜,半导体薄膜、离子注入、刻蚀,平板显示,光盘、光电子LED等制造工艺以及科研院校、技术研…

YOLO在目标检测与视频轨迹追踪中的应用

YOLO在目标检测与视频轨迹追踪中的应用 引言 在计算机视觉领域,目标检测与视频轨迹追踪是两个至关重要的研究方向。随着深度学习技术的飞速发展,尤其是卷积神经网络(CNN)的广泛应用,目标检测与视频轨迹追踪的性能得到…

2024年广东省食品安全管理员考试精选练习题库

76.已具有主体资格的企业申请食品流通可,该企业的()为可申请人。 A.投资者 B.经营负责人 C.本身 答案:C 77.食用亚硝酸盐的销售只面向()。 A.食品生产加工行业 B.餐饮业 C.食品流通单位 答案&…

Rakis: 免费基于 P2P 的去中心化的大模型

是一个开源的,完全在浏览器中运行的去中心化 AI 推理网络,用户无需服务器,打开即可通过点对点网络使用 Llama-3、Mistral、Gemma-2b 等最新开源模型。 你可以通过右上角的 Scale Worker ,下载好模型后挂机就能作为节点加入到这个…

SpringSecurity6 | 基于数据库实现登录认证

SpringSecurity6 | 基于数据库认证 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 基于数据库实现登…

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天,精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此,开发了一个基于深度学习的商品销售数据预测系统,该系统利用Python编程语言与Django框架&a…

数据结构与算法笔记:实战篇 - 剖析搜索引擎背后的经典数据结构和算法

概述 像百度、Google 这样的搜索引擎,在我们平时的工作、生活中,几乎天天用到。如果我们把搜索引擎也当做一个互联网产品的话,那它跟社交、电商这些类型的产品相比,有一个非常大的区别,那就是,它是一个技术…

内容分发网络(CDN)学习记录

目录 静态内容动态内容CDN工作原理CDN缓存 CDN关键技术1.内容路由功能2.内容分发技术:内容分发技术主要是PUSH和PULL3.内容存储技术4.内容管理技术 全局负载均衡基于DNS的GSLB基于HTTP重定向的GSLB基于IP欺骗的GSLB服务器群选择策略 静态内容 静态内容是不会因用户…

隐私计算实训营第二期第七课:XGB算法与SGB算法开发实践

隐私计算实训营第二期-第七课 第七课:XGB算法与SGB算法开发实践1 决策树模型1.1 决策树的训练和预测过程1.2 决策树的发展过程 2 GBDT模型2.1 Boosting核心思想2.2 GBDT原理 3 XGB模型3.1 XGB核心思想3.2 XGB优点 3 隐语纵向树模型3.1 数据纵向分割3.2 隐私保护的树…

学习笔记——动态路由——IS-IS中间系统到中间系统(背景)

一、IS-IS技术背景 1、前言 IS-IS最初是国际标准化组织ISO(the International Organization for Standardization)为它的无连接网络协议CLNP(ConnectionLess Network Protocol)设计的一种动态路由协议。 和OSPF一样,IS-IS也是一种基于链路状态并使用最短路径优先…

医疗器械FDA认证中,如何准备SBOM文件?

在医疗器械FDA认证过程中,准备SBOM(软件物料清单)文件是确保医疗器械软件部分符合FDA要求的关键步骤。以下是准备SBOM文件的清晰指南: 一、了解SBOM文件的目的和重要性 SBOM文件用于详细列出医疗器械所使用的所有软件组件、版本…

程序员节视频创意盛宴,邀您共赴创意之旅!

🌟 程序员节专属创意大赛震撼启幕! 🎉 亲爱的程序员及编程爱好者们,是时候拿起你们的镜头,捕捉那些日常中闪光的编程瞬间,向世界展示代码编织的奇迹与无限创意了!💻✨ &#x1f3c…

惠海 H6900B 2.7V3.7V4.2V5V9V升12V24V48VLED升压恒流芯片IC

惠海H6900B LED升压恒流芯片IC是一款功能丰富的LED驱动解决方案,为高亮度LED灯串设计。以下是针对该产品的进一步分析和解释: 产品特点 高效率:高达95%以上的效率意味着在驱动LED时,只有很少的能量转化为热量,从而提…

【Kaggle】Telco Customer Churn 数据编码与模型训练

💬在上一部分中,我们已经完成了对数据集背景解读、数据预处理与探索性分析。在数据背景解读中,我们介绍了数据集来源、电信用户流失分析的基本业务背景,并详细解释了每个字段的基本含义;在数据预处理过程中&#xff0c…

全国WMS厂商大盘点,哪家未来能杀出重围?

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 一、引言 随着物流行业的快速发展,仓储管理作为其重要的一环,正逐步受到越来越多企业的重视。当前,市…

可燃气体报警器检测标准对比:不同标准的优缺点分析

在工业生产及家庭生活中,可燃气体报警器发挥着至关重要的作用。它能够实时监测空气中可燃气体浓度,一旦超过安全阈值,便会发出警报,避免火灾和爆炸事故的发生。 接下来,佰德将重点探讨可燃气体报警器的检测标准&#…

三层交换基础

一、什么是三层交换 三层交换是一种在OSI模型第三层,即网络层上工作的网络设备技术,它整合了二层交换机的功能和路由器的部分功能,以实现更高效的网络数据转发和路由选择。三层交换技术的核心在于结合了二层交换技术和三层转发技术&#xff…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意:远程调试的代码需要与本地代码一致,远程调试目的是解决本地环境无法支持调试的情况下,解决线上(测试)环境调试问题。 配置启动脚本参数 n…

Java Lambda语法介绍

目录 一、概述 二、Lambda语法的历史 2.1 Lambda名字的含义 2.2 Lambda的历史 三、Lambda语法的核心接口 3.1 Lambda的四大核心接口 3.1.1 概述 3.1.2 Consumer 接口 3.1.3 Supplier 接口 3.1.4 Function 接口,> 3.1.5 Predicate 接口 四、Lambda的引用 4.1 概…

统计鸟:小而美的网站流量统计工具,免费好用

目前常见的网站流量统计平台有百度统计、Google Analytics、51.LA、友盟等,但Google Analytics在国内打不开、友盟已收费、百度统计限制较多、51.LA也很可能走向收费,无奈的我总算在网上搜到一款小众而好用的网站流量统计工具——统计鸟,现给…