隐秘而又复杂的恶意软件: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_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

解决删除快照后启动虚拟机显示指定的文件不是虚拟磁盘 打不开磁盘“路径”或它所依赖的某个快照磁盘。 模块“disk”启动失败。 未能启动虚拟

今天删除虚拟机无用的快照的时候突然发现k8s集群的一台虚拟机打不开了并且也不能返回快照 报错如下 指定的文件不是虚拟磁盘 打不开磁盘“e:\1.虚拟机\vm2\centos 7 64 位-cl1-000003-s019.vmdk”或它所依赖的某个快照磁盘。 模块“disk”启动失败。 未能启动虚拟机。 找了很多…

【从0实现React18】 (五) 初探react mount流程 完成核心递归流程

更新流程的目的: 生成wip fiberNode树标记副作用flags 更新流程的步骤: 递:beginWork归:completeWork 在 上一节 ,我们探讨了 React 应用在首次渲染或后续更新时的整体更新流程。在 Reconciler 工作流程中&#xff…

未来一周比特币价格及数字货币市场预测

荷月的比特币市场就像过山车一样,仅仅六月下旬就跌去-12%,本周更是暴跌-6%,至 58,378美元。在这种市场表现,应有的踩踏如期而至。德国政府今日宣布再出售750 比特币的行为继续打击多头,但是小编认为这恰恰预示着市场可…

简化收支记录,只留关键日期! 一键掌握财务流动,高效管理您的每一笔收支

在繁忙的生活中,管理个人或家庭的财务收支变得尤为重要。然而,传统的记账方式往往繁琐且复杂,让人望而却步。今天,我们为您推荐一款简洁易用的记账神器——晨曦记账本,让您轻松记录收支,只显示日期&#xf…

全球首部 Sora 生成宣传片《玩具反斗城的起源》亮相;钉钉全新 AI 小时搜索对所有大模型开放丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

【Pillow】module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘问题解决

问题描述 我在使用 SummaryWriter 记录图片数据日志时,遇到了报错,如下图所示: 问题的原因在于,使用的pillow版本已经舍弃了ANTIALIAS,在新版本中已经改为了LANCZOS 问题解决 两种解决方式: 修改源码更…

Python学习打卡:day17

day17 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 目录 day17121、Python 操作 MySQL 基础使用pymysql创建到 MySQL 的数据库链接执行 SQL 语句执行非查询性质的SQL语句执行查询性质的SQL语句 122、Pyth…

[游戏开发][UE5]引擎使用学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1,参数2,参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1:输出窗口归类使用,你写什么它就显示什么 参数2&#x…

前端实现 海浪(波浪)进度条效果(支持自定义长度;调节速度,2s缓冲结束)

实现海浪进度条 文章目录 实现海浪进度条效果图如下(投入使用的版本)背景和过程一、调试和探索过程(下面都会给出来对应代码)二、类似Element-plus的进度条样式1. CSS的样式如下2. HTML结构如下 二、电涌效果的进度条如下1. CSS的样式如下2. HTML的结构如下:3. JavaScript代码如…

日元跌破160大关,日本当局何时干预?

KlipC报道:6月26日,日元又跌了,美元兑日元跌破160的整关口,超过了4月日本官员在市场上干预的水平,创1986年来新低。美联储降息的可能性降低,市场预计日元有可能延续当前的弱势。 KlipC分析师David表示&…

克服指标管理痛点,实现数据价值最大化

在当下的企业管理中,由于数据量的激增,管理方式逐渐从基于经验转向基于数据。在此过程中,我们能够通过数据探查业务情况、分析数据,从而获取更优的决策支持数据。这通常通过数据报表或分析平台来实现,对于临时性场景&a…

基于Spring Boot医护人员排班系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringbootMybatisvue 工具:IDEA、Maven、Navicat 主要功能: 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及查询操作。具体界面…

virtualbox(7.0) ubuntu(22) 和win11共享文件夹

在虚拟机中安装增强功能。在virtualbox中配置 执行命令将用户加入vboxsf组 sudo adduser your_usrname vboxsf 重启ubuntu即可

docker进阶篇

docker进阶篇 (重点) 1、docker run2、docker ps3、docker restart4、docker pull5、docker stop6、docker logs7、docker stats8、docker rm(重点) 9、docker exec10、查看本机镜像docker image11、发布镜像docker commit12、docker save(例如保存为tar给别人用)13、删除镜像1…

Qt样式表及相关案例

一.Qt样式表介绍 Qt样式表是一个可以自定义部件外观的强大机制,样式表的概念、术语、语法均受到HTML的层叠样式表(Cascading Style Sheets,CSS)的启发。 样式表可通过QApplication::setStyleSheet()函数将其设置到整个应用程序上,也可以使用QWidget::se…

c++习题01-ljc的暑期兼职

目录 一,题目描述 二,思路 三,伪代码 四,流程图 五,代码 一,题目描述 二,思路 1,根据题目要求需要声明4个变量:a,b,c,d ;牛奶价格a,活动要求b&…

微信公众号写作时必备的AI提示词(也称为指令或Prompt)

猫头虎 🐯 微信公众号写作时必备的AI提示词(也称为指令或Prompt) 🎉 大家好,我是猫头虎,科技自媒体博主。今天,我们来聊聊如何利用AI提示词,打造出爆款的微信公众号文章。&#x1…

腾讯云对象存储cors错误处理

最近将公司的域名进行了修改,同时将腾讯云的对象存储改成了https,为了安全嘛。然后上传软件包的时候发现上传软件就失败了。 在浏览器中打开该 HTML 文件,单击 Test CORS 发送请求后,出现以下错误,错误提示&#xff1…

《software architecture patterns》学习笔记

了解通用的架构模式并知道什么时候使用它们。 软件架构定义了软件的基本特点和行为。比如,有些软件架构会让软件变得可扩展,而有些软件架构会让软件变得易于修改。 知道每一种软件架构的特点、优缺点是非常有必要的,因为它们能帮助你选择一种…