隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件,主要通过钓鱼邮件打开突破口,收集各种信息再回传给攻击者。近期,研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件,最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azure 页面,通过 JavaScript 脚本下载 MSI 安装程序再加载 SSLoad 其他载荷。

SSLoad 是新型恶意软件,研究人员发现了许多变种。在恶意软件即服务(MaaS)领域,该恶意软件通过多样化的交付方式彰显自身的技术水平。

MSI 安装程序

由此安装程序开启多个 Loader 组成的攻击链,最终部署攻击者期望的 Payload。

1718550741_666f00d59aa16ef6abefe.png!small?1718550741942

攻击链

通过分析工具,可以发现安装程序要执行哪些操作:

❯ msiinfo export 90f1511223698f33a086337a6875db3b5d6fbcce06f3195cdd6a8efa90091750.sample CustomAction
[...]
SET_APPDIR 307 APPDIR [AppDataFolder][Manufacturer]\[ProductName]
LaunchFile 1026 viewer.exe C:\Windows\System32\regsvr32.exe /S [LocalAppDataFolder]sharepoint\MenuEx.dll

PhantomLoader

最初的 Loader 是 C/C++ 编写的 32 位 DLL 文件,该 Loader 通过二进制修补文件并采用自修改技术来逃避检测,加载程序被添加到合法的 DLL 中。

根据文件的元数据来看,PhantomLoader 试图将自己伪装成名为 MenuEx.dll(360 杀软引擎依赖的 DLL 文件)的合法 DLL 文件。该文件的 PDB 路径为 C:\vmagent_new\bin\joblist\500965\out\Release\MenuEx.pdb,该加载程序还与反病毒软件共享部分代码并保留了数字签名的痕迹。

1718550821_666f0125c97cb4e58ae1c.png!small?1718550823686

代码重用

1718550836_666f0134480de2b68f422.png!small?1718550836190

文件元数据

Payload 被加密存在资源段中,熵值较大:

1718550850_666f0142f21025e9a7ae8.png!small?1718550850793

文件结构

Phantom Loader 首先解密再从资源段中提取 Payload,.text段具有可读可写可执行权限。该 Loader 是自修改的,攻击者需要这种权限也是理所应当的。

样本文件将指定地址的加密代码的每个字节与预定义加密密钥的相应字节进行异或操作,如果代码超过密钥长度,密钥会被重复使用。异或加密的密钥如下所示:

71 21 2a 43 74 52 4f 42 65 6a 6c 6-4 57 46 37 45 33 40 31 4c 69 79 55 53 00

根据加密的逻辑反解的 IDA Python 脚本如下所示:

import ida_bytes
import ida_autodef decode_code(start_addr, length, key_hex):# Convert the hex key string into a byte arraykey_bytes = bytearray.fromhex(key_hex)# Read the current encrypted data from the IDBencrypted_data = ida_bytes.get_bytes(start_addr, length)# Create a bytearray for the encrypted data to perform mutable operationsencrypted_data = bytearray(encrypted_data)key_length = len(key_bytes)# Perform the XOR decryptionfor i in range(length):encrypted_data[i] ^= key_bytes[i % key_length]# Write the decrypted data back to the IDB# Convert bytearray back to bytes since patch_bytes expects a ‘bytes’ typeida_bytes.patch_bytes(start_addr, bytes(encrypted_data))# Optionally, inform IDA to reanalyze modified areas to reflect changes in disassemblyida_auto.auto_make_code(start_addr)ida_auto.auto_wait()# Constants
encryption_key_hex = “71212a4374524f42656a6c6-4574637453340314c6979555300”  # The decryption key in hex
code_region_length = 0x76C  # Length of the code region
start_address = 0x1000AF77  # Starting address of the encrypted code# Decode the encrypted code region
decode_code(start_address, code_region_length, encryption_key_hex)print(“Decryption complete. The code region has been updated.”

解密后 EIP 会指向第一条指令,再使用相同的密钥进行异或解密,从资源段中提取 Payload。提取得到 Payload 后再加载执行,这又是另一个 Loader。

1718550876_666f015c7c7fad607e6b2.png!small?1718550876446

资源段

相似诱饵文档的攻击中,使用了另一版本的 Loader。这个 Loader 处理逻辑类似,但异或的密钥不同。

25 5e 47 51 4d 4a 42 44 77 42 6-4 58 4c 41 46 57 75 28 21 46 61 67 32 24 34 46 47 00

恶意 DLL 文件

Phantom Loader 的第二阶段是一个用 C/C++ 编写的小型、简单的 32 位 DLL 文件,攻击者利用其加载 Payload 并执行 DllRegisterServer 函数。

1718550890_666f016a1b15474235daf.png!small?1718550889768

入口点函数

SSLoad

SSLoad 是使用 Rust 编写的 32 位 DLL 文件,字符串都使用了独特的方式进行加密。样本文件首先解密 URL 与 User-Agent,URL 指向 Telegram 频道。频道中的另一个加密字符串,则是最终 Payload 的 C&C 服务器。

分析样本的 URL 与 User-Agent 如下所示:

https://t[.]me/+st2YadnCIU1iNmQyMozilla/5.0 (Windows NT 10.0; Win6-4; x6-4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

1718550908_666f017caec71e92458cd.png!small?1718550908817

Telegram 频道

解密获得 C&C 地址后,SSLoad 解密另一个 User-Agent 为 SSLoad/1.1。再向 http://C&C/api/g 发出 GET 请求,下载后续 Payload。

字符串解密

SSLoad 使用 RC4 算法对数据进行加密,只不过每个字符串都使用独特的密钥进行加密,密钥和加密字符串存放在一起。以某个字符串为例来解释解密算法,如下数据包含加密字符串与 RC4 密钥:

uTjvTPJayj/5Af1pr+qBtvkwh9KKDV2mKF0C+7lBoOJHnmLwZJzKE

转换为十六进制为:

75 54 6A 76 54 50 4A 61 79 6A 2F 35 41 66 31 70 72 2B 71 42 74 76 6B 77 68 39 4B 4B 44 56 32 6D 4B 46 30 43 2B 37 6C 42 6F 4F 4A 48 6E 6D 4C 77 5A 4A 7A 4B 45

每个字符串的解密密钥由编码字符串的前 6 个字节与后 7 个字节连接而成,上述的密钥为:

75 54 6A 76 54 50 4C 77 5A 4A 7A 4B 45

其余部分由自定义函数处理,函数使用以下逻辑计算加密字符串的长度:

scaled_length = (length >> 2)
if (length & 3) == 1:scaled_length -= 1
scaled_length *= 3

本质上讲,加密字符串从数据的第 7 个字节开始,scaled_length 的值决定其长度。 该恶意软件使用 base6-4 编码,示例样本文件中 scaled_length 为 30(0x1E)。

1718550920_666f0188d6ecb2a0ac88e.png!small?1718550920517

base6-4 解码

然后使用 RC4 算法与之前得到的密钥对 base6-4 解码后的 Payload 进行解密,获取 Telegram 频道 URL 地址。

1718550932_666f0194f06adac431065.png!small?1718550932633

RC4 解密

最终载荷

获取得到另一个 Rust 文件,首先使用硬编码字符串创建互斥量,检查失陷主机是否为重复感染。

1718550944_666f01a02b110fff79718.png!small?1718550943835

互斥量

SSLoad 检查 PEB 查看是否设置了 BeingDebugged 进行反调试:

1718550957_666f01ad62ac3a2dc53c5.png!small?1718550957123

反调试技术

紧接着动态定位内存中的 Advapi32.dll,使用多重算术运算来导出异或密钥。该密钥用于动态解密字符串,解密的每个字符串都有一组唯一对应的算术运算与输入,每个字符串也都有唯一的异或密钥。

1718550979_666f01c30fdea93762038.png!small?1718550979472

部分代码

Advapi32.dll 调用函数 RtlGenRandom 生成随机数命名文件夹,文件夹都位于 AppData\Roaming\Microsoft 之下:

1718550997_666f01d5093f017319491.png!small?1718550996751

创建文件夹

类似的,恶意软件也通过哈希来解析函数,循环遍历匹配模块的函数,根据哈希找到相应的函数地址。再将这些针存储为局部变量,以便在适当的时候调用。攻击者在 winhttp.dll 模块中常用该技术,以逃避检测分析。

1718551017_666f01e9ef386da04f265.png!small?1718551017668

检索函数

DLL 文件进行指纹识别,整合成 JSON 对象回传 C&C 服务器。

1718551035_666f01fb82f0b6e50d389.png!small?1718551035288

支持字段

1718551047_666f020718085b6273f57.png!small?1718551049724

回传信息

JSON 信息通过 HTTP POST 请求回传给 C&C 服务器。上线成功后,C&C 服务器会将密钥和 ID 返回给受害者,密钥通常是 base6-4 编码的,后续用于 RC4 加密。而 ID 是失陷主机的唯一标识,主要用于标识自身。后续失陷主机向 C&C 服务器发送 POST 请求,并且使用 ID 作为 URL 路径。

POST /api/[unique_identifier]/tasks

如果有下发的任务,攻击者会下发 JSON 结构数据,其中包含任务与任务的 ID。任务是经过 RC4 加密的,再使用 base6-4 编码。任务主要包含命令与参数两部分,分析人员只发现了 exe 命令,参数是用于下载后续 Payload 的 URL。攻击者通过这种方法实现更好的可扩展性,便于支持更多命令。

结论

SSLoad 十分复杂,在收集数据、检测逃避等多种方面都展现了不俗的实力。攻击者基于 Rust 开发了多个恶意软件,也使用了极为复杂的加密措施与反调试措施。

IOC

90f1511223698f33a086337a6875db3b5d6fbcce06f3195cdd6a8efa90091750
09ffc4188bf11bf059b616-491fcb8a09a474901581f46ec7f2c350fbda4e1e1c
73774861d946d62c2105fef4718683796cb77de7ed42edaec7affcee5eb0a0ee
6aa3daefee979a0efbd30de15a1fc7c0d05a6e8e3f439d5af3982878c3901a1c
265514c8b91b96062fd2960d52ee09d67ea081c56ebadd7a8661f479124133e9
6329244cfb3480eae11070f1aa880bff2fd52b374e12ac37f1eacb6379c72b80
https://t[.]me/+st2YadnCIU1iNmQy
85.239.53[.]219

参考来源

Intezer

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

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

相关文章

svn切换分支

现在有一个场景: 在svn中有一个b分支,是基于a分支拉出来的,并且我的b分支在本地已经有了改动,a分支在远端也有了改动, 我想把远端a分支的改动同步到我的本地b分支上,如何操作 目前已知的方法 项目右键-&g…

上古世纪战争台服官网地址+台服预约+预创建角色教程

上古世纪战争台服上线啦,在《上古世纪战争》中,通过主要势力和地区,剧情和角色可以想起原作。《上古世纪战争》的主要背景为,原大陆消失之后,完成移民的种族们定居在诺伊大陆之后遇到的多个势力之间的冲突。同时&#…

CentOS安装ntp时间同步服务

CentOS安装ntp时间同步服务 安装ntp 检查服务器是否安装ntp: rpm -q ntp安装ntp: yum install -y ntp服务端配置 配置文件路径:/etc/ntp.conf 设置ntp为开机启动 systemctl enable ntpd查看ntp开机启动状态 enabled:开启, disabled:关闭 …

C# 类中访问修饰符的优先级

参考链接 : C# 指南 - .NET 托管语言 | Microsoft Learn 访问修饰符 - C# | Microsoft Learn

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时,要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

DLS策略洞察:如何应对AI数据中心网络交换机市场的爆发式增长?

摘要: 随着AI技术的发展和应用,AI数据中心对网络交换机的需求日益增加。摩根士丹利预计,2023-2026年间,AI数据中心网络交换机的收入复合年增长率(CAGR)将达到55%。本文将详细分析AI数据中心网络交换机市场…

C#udpClient组播

一、0udpClient 控件: button(打开,关闭,发送),textbox,richTextBox 打开UDP: UdpClient udp: namespace _01udpClient {public partial class Form1 : Form{public Form1(){Initi…

最新Adobe2024全家桶下载,PS/PR/AE/AI/AU/LR/ID详细安装教程

如大家所熟悉的,Adobe全家桶系列常用的软件有Photoshop(PS)、Premiere(PR)、After Effects(AE)、illustrator(AI)、Audition(AU)、Lightroom&…

“所得”如何超越“所见”?合合信息扫描全能王发布扫描“黑科技”

数字化时代,扫描工具正变得越来越智能和个性化。除了常规的文件扫描外,无论是在工作中,还是在旅途里,人们也经常会使用手机扫描褶皱、脏污的文件,或是旅行交通地图、博物馆展品介绍等,打造独属于自己的随身…

基于SpringBoot和PostGIS的某国基地可视化实战

目录 前言 一、Java后台开发设计与实现 1、模型层实现 2、控制层设计 二、WebGIS界面实现 1、列表界面的定义 2、全球基地可视化 三、成果展示 1、全球部署情况 2、亚太地区 3、欧洲基地分布 4、中东的部署 四、总结 前言 在之前的博客中,我们曾经对漂亮…

ROS1通信机制——以topic为例

ROS1 的通信机制 ROS1是一个分布式框架,为用户提供多节点(进程)之间的通信服务。 ROS1通信时有一个中心节点(ROS Master),进行信息匹配等工作。 ROS1 的话题通信机制 通信链接:XML/RPC 信息传…

JavaScript中的Date对象,以及常用格式化日期的方法封装

一、Date对象 二、操作Date对象 1、创建Date对象 (1)常用方法 (2)使用示例 2、获取日期 (1)常用方法 (2)使用示例 3、设置日期 (1)常用方法 &…

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数

08 - matlab m_map地学绘图工具基础函数 - 绘制线、图例、添加文字注释等函数 0. 引言1. 关于m_line2. 关于m_quiver3. 关于m_text4. 关于m_plot5. 结语 0. 引言 本篇介绍下m_map中添加绘制基础线(m_line、m_plot)、绘制箭头(m_quiver&#x…

鸿蒙开发Ability Kit(程序框架服务):【ServiceAbility切换】 组件切换

ServiceAbility切换 FA模型中的ServiceAbility对应Stage模型中的ServiceExtensionAbility。Stage模型下的ServiceExtensionAbility为系统API,只有系统应用才可以创建。因此,FA模型的ServiceAbility的切换,对于系统应用和三方应用策略有所不同…

利用Python控制终端打印字体的颜色和格式

利用Python控制终端打印字体的颜色和格式—操作详解(ANSI转义序列) 一、问题描述二、ANSI转义序列三、具体代码和显示效果(看懂这段代码,以后可随心控制字体的打印格式) 欢迎学习交流! 邮箱: z……

单片机+DS18B20温度控制程序仿真与原理图PCB文件 可设上下限

资料下载地址:单片机DS18B20温度控制程序仿真与原理图PCB文件 可设上下限 目录 1、项目介绍 2、实物图 ​3、电路原理图 ​4、仿真原理图 ​5、部分代码 1、项目介绍 基于51单片机温度控制,使用18b20来做温度传感器,四位共阳数码管显…

【消息队列】Kafka学习笔记

概述 定义 传统定义: 一个分布式的, 基于发布订阅模式的消息队列, 主要应用于大数据实时处理领域新定义: 开源的分布式事件流平台, 被用于数据管道/流分析/数据集成 消息队列的使用场景 传统消息队列的主要应用场景包括: 削峰: 解耦: 异步: 两种模式 点对点模式 发布/订…

SaaS产品运营:维护四个不同类型的合作伙伴的实战指南

在SaaS(软件即服务)行业的竞争中,与合作伙伴建立并维护良好关系至关重要。不同类型的合作伙伴对于产品的推广、市场覆盖和用户增长都起着不同的作用。如何有效维护这四种类型合作伙伴?看个案例一起学习吧。 一、合作伙伴的四种类型…

恭喜!Z医生喜提世界名校—斯坦福大学访问学者邀请函

➡️【院校简介】 斯坦福大学(Stanford University),全称为小利兰斯坦福大学,简称“斯坦福”,位于美国加州旧金山湾区南部帕罗奥多市境内,临近高科技园区硅谷,是私立研究型大学,全球…

HarmonyOS Next开发学习手册——内存管理(GC)

GC(全称 Garbage Collection),即垃圾回收。在计算机领域,GC就是找到内存中的垃圾,释放和回收内存空间。当前主流编程语言实现的GC算法主要分为两大类:引用计数和对象追踪(即Tracing GC&#xff…