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

news2024/11/25 18:25:53

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_auto

def decode_code(start_addr, length, key_hex):
    # Convert the hex key string into a byte array
    key_bytes = bytearray.fromhex(key_hex)

    # Read the current encrypted data from the IDB
    encrypted_data = ida_bytes.get_bytes(start_addr, length)

    # Create a bytearray for the encrypted data to perform mutable operations
    encrypted_data = bytearray(encrypted_data)
    key_length = len(key_bytes)

    # Perform the XOR decryption
    for 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’ type
    ida_bytes.patch_bytes(start_addr, bytes(encrypted_data))
   
    # Optionally, inform IDA to reanalyze modified areas to reflect changes in disassembly
    ida_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/+st2YadnCIU1iNmQy

Mozilla/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.coloradmin.cn/o/1870689.html

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

相关文章

系统性掌握C++17容器四件套:std::optional, std::any, std::variant, std::tuple

昨天在写《深入探讨C的高级反射机制(2):写个能用的反射库》的时候,正好遇到动态反射需要的类型擦除技术。所谓的类型擦除,就是在两个模块之间的接口层没有任何类型信息,实现两个模块之间安全的通信。可以理…

QT控制comboBox切换方法

目录 1. 效果2. 操作 1. 效果 如下图: 点击全切换雨天模式按钮 则 comboBox 文本显示为 “雨天模式”点击全切换正常模式按钮 则 comboBox 文本显示为 “雨天模式” 切换到 雨天模式 切换到 正常模式 2. 操作 使用 “setCurrentIndex” 方法,切换 combo…

# bash: chkconfig: command not found 解决方法

bash: chkconfig: command not found 解决方法 一、chkconfig 错误描述: 这个错误表明在 Bash 环境下,尝试执行 chkconfig 命令,但是系统找不到这个命令。chkconfig 命令是一个用于管理 Linux 系统中服务的启动和停止的工具,通常…

[数据集][目标检测]电力场景下电柜箱门把手检测数据集VOC+YOLO格式1167张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1167 标注数量(xml文件个数):1167 标注数量(txt文件个数):1167 标注…

26、 MySQL数据库基础练习系列股票交易系统基础查询和复杂查询

5、基础查询 -- 1、查询用户信息仅显示姓名与手机号 SELECT username as 姓名,phone as 手机号 from users;-- 2、模糊查询和explain语句 alter table stocks add index stock_name_index(stock_name); explain SELECT * from stocks where stock_name like %东吴证券%; -- 3、…

Attention步骤

一个典型的Attention思想包括三部分:Qquery、Kkey、Vvalue。 Q是query,是输入的信息;key和value成组出现,通常是原始文本等已有的信息;通过计算Q与K之间的相关性a,得出不同的K对输出的重要程度;…

2024年北京市安全员-C3证证模拟考试题库及北京市安全员-C3证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年北京市安全员-C3证证模拟考试题库及北京市安全员-C3证理论考试试题是由安全生产模拟考试一点通提供,北京市安全员-C3证证模拟考试题库是根据北京市安全员-C3证最新版教材,北京市安全员-C…

【深度学习】机器学习基础

机器学习就是让机器具备找一个函数的能力 带有未知的参数的函数称为模型 通常一个模型的修改,往往来自于对这个问题的理解,即领域知识。 损失函数 平均绝对误差(Mean Absolute Error,MAE) 均方误差(Mea…

送物机器人电子方案定制

这是一款集娱乐、教育和互动于一身的高科技产品。 一、它的主要功能包括: 1. 智能对话:机器人可以进行简单的对话,回答用户的问题,提供有趣的互动体验。 2. 前进、后退、左转、右转、滑行:机器人可以通过遥控器或AP…

秋招突击——6/26~6/27——复习{二维背包问题——宠物小精灵之收服}——新作{串联所有单词的字串}

文章目录 引言复习二维背包问题——宠物小精灵之收服个人实现重大问题 滚动数组优化实现 新作串联所有单词的字串个人实现参考实现 总结 引言 今天应该是舟车劳顿的一天,头一次在机场刷题,不学习新的东西了,就复习一些之前学习的算法了。 复…

SherlockChain:基于高级AI实现的智能合约安全分析框架

关于SherlockChain SherlockChain是一款功能强大的智能合约安全分析框架,该工具整合了Slither工具(一款针对智能合约的安全工具)的功能,并引入了高级人工智能模型,旨在辅助广大研究人员针对Solidity、Vyper和Plutus智…

CentOS安装ntp时间同步服务

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

国际产业园双创孵化空间点亮创业梦想

国际数字影像产业园的双创孵化空间旨在打造一个集创意、技术、资金、市场等资源于一体的综合孵化平台,为初创企业和创新项目提供从创意到产品化、从初创到成长的全方位支持。 主要功能与服务 1、孵化服务:为初创企业提供办公场地、基础设施、技术支持等…

navicat Premium发布lite免费版本了

Navicat Premium发布lite免费版本了,下面是完整功能对比链接 Navicat Premium 功能列表 | Navicat 免费版本下载链接如下: Navicat | 免费下载 Navicat Premium Lite 开发功能完全够用,点赞。 dbeaver该如何应对。

幻兽帕鲁Palworld樱花版本服务器一键开服联机

1、登录服务器(百度莱卡云) 1.1、第一次购买服务器会安装游戏端,大约5分钟左右,如果长时间处于安装状态请联系客服 2、在启动中调整游戏参数 2.1、重启服务器,等待running出现,或者运行时间变为灰色&#x…

MySQL高级-索引-使用规则-前缀索引

文章目录 1、前缀索引2、前缀长度3、查询表数据4、查询表的记录总数5、计算并返回具有电子邮件地址(email)的用户的数量6、从tb_user表中计算并返回具有不同电子邮件地址的用户的数量7、计算唯一电子邮件地址(email)的比例相对于表…

为什么要本地化您的多媒体内容?

当我们访问网站、应用程序和社交媒体时,体验不再局限于陈旧的文本和静态图像。现代处理能力和连接速度提高了快速加载视频、音频和动画的可能性。 这一切都提供了更具沉浸感和互动性的用户体验。多媒体是数字营销中最有效的内容之一,因为它对用户更具吸…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门,各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场,这里安装了生产工具,还有操作员进行加工或生产制造。 制造时使用的材料或零组件,需要对外采购。对于加工组装型的工厂,…

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

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

python中类的继承详解

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展 (1)在类的继承中,存在父类跟子类,子类可以继…