首页 > 其他分享 >隐秘而又复杂的恶意软件:SSLoad

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

时间:2024-10-18 09:51:46浏览次数:3  
标签:加密 恶意软件 bytes length 密钥 key 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

网络安全学习路线 (2024最新整理)

 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言扣1或者关注我我后台会主动发给你! 

第一阶段:安全基础

网络安全行业与法规

Linux操作系统

计算机网络

HTML PHP Mysql Python基础到实战掌握

  第二阶段:信息收集

IP信息收集

域名信息收集

服务器信息收集

Web网站信息收集

Google hacking

Fofa网络安全测绘

 第三阶段:Web安全 

SQL注入漏洞

XSS

CSRF漏洞

文件上传漏洞

文件包含漏洞

SSRF漏洞

XXE漏洞

远程代码执行漏洞

密码暴力破解与防御

中间件解析漏洞

反序列化漏洞

 第四阶段:渗透工具 

MSF

Cobalt strike

Burp suite

Nessus   Appscea   AWVS

Goby   XRay

Sqlmap

Nmap

Kali

 第五阶段:实战挖洞 

漏洞挖掘技巧

Src

Cnvd

众测项目

热门CVE漏洞复现

靶场实战

四、学习资料的推荐

学习框架已经整理完毕,现在就差资料资源了,我这里整理了所有知识点对应的资料资源文档,大家不想一个一个去找的话,可以参考一下这些资料!

1.视频教程

 2.SRC技术文档&PDF书籍 

3.大厂面试题    

特别声明:

此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失。

标签:加密,恶意软件,bytes,length,密钥,key,SSLoad,隐秘
From: https://blog.csdn.net/2401_84466225/article/details/143033859

相关文章

  • 注释与关键字:代码的隐秘语言!
    Java编程的基础要素:注释、关键字与标识符在编程的世界里,代码就像是一座宏伟的建筑,而注释、关键字和标识符则是构成这座建筑的基石与结构,支撑着整个程序的逻辑与可读性。无论是初学者还是经验丰富的开发者,理解和掌握这些基本要素都是提升编程能力的重要步骤。注释:代码中的......
  • YARA规则详解及其在恶意软件分析中的应用
    YARA规则是用于识别恶意软件、恶意文件或可疑活动的一种工具和规则集。YARA主要用于恶意软件分析领域,帮助研究人员根据模式匹配来识别类似的恶意软件样本。下面我们一步步介绍YARA规则的结构和使用:1.规则的基本结构YARA规则由三部分组成:meta、strings和condition。ruleExampleR......
  • 攻击者如何在日常网络资源中隐藏恶意软件
    近二十年来,安全Web网关(SWG)一直在监控网络流量,以检测恶意软件、阻止恶意网站并保护企业免受基于Web的威胁。然而,攻击者已经找到了许多绕过这些防御措施的方法,SquareX的安全研究人员对此进行了记录。最危险的策略之一是将恶意软件隐藏在显眼的地方,使用图像、WebAssem......
  • 机器学习中的聚类艺术:探索数据的隐秘之美
    一什么是聚类聚类是一种经典的无监督学习方法,无监督学习的目标是通过对无标记训练样本的学习,发掘和揭示数据集本身潜在的结构与规律,即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇,从而每个簇对应一个潜在的类别。聚类直观上来......
  • Android开发 - ClassLoader 加载外部类解析
    ClassLoader是什么ClassLoader主要作用是将字节码文件(.class文件)加载到Java虚拟机(JVM)中,以便应用程序可以使用这些类ClassLoader的好处模块化加载:应用程序可能由多个模块组成,而这些模块可能需要按需加载插件机制:很多应用支持插件化,插件在安装或更新后需要动态加载......
  • 使用ClassLoader.getSystemResource更新上线后空指针异常
     目录 问题描述:原问题代码:问题原因以及解决思路:解决方法:问题描述:项目中使用到一个功能,于是在资源路径下加了点依赖包:更新上线后,发现使用ClassLoader.getSystemResource("dependencies")找不到依赖包原问题代码:URLresourceURL=ClassLoader.getSystemResource(......
  • 利用机器学习模型实时检测恶意软件——打造一款基于PyQt5的智能检测系统
    引言随着科技的发展,恶意软件的种类和复杂性也在日益增加。传统的防护手段往往难以应对新型的攻击手段,而机器学习技术的应用为恶意软件检测带来了新的可能性。本文将带领大家一起探索如何通过Python和PyQt5,构建一个实时恶意软件检测系统。这个系统不仅可以分析数据,还能训练机器......
  • 隐秘之舞:探索聊天记录隐藏与密友构建的艺术境界
    在数字时代的洪流中,社交的经纬线编织出一幅幅错综复杂的人际图谱。在这片由0与1构建的虚拟世界里,聊天记录与密友关系,成为了我们情感交流、思想碰撞的重要载体。然而,随着信息量的激增与个人隐私需求的日益增强,隐藏聊天记录与构建密友圈,逐渐演变成了一门精致而深邃的艺术,它们不仅......
  • 【笔记】【THM】Malware Analysis(恶意软件分析)
    【笔记】【THM】MalwareAnalysis(恶意软件分析)探索恶意软件的世界,分析恶意软件如何感染系统并造成破坏。恶意软件分析就像猫捉老鼠的游戏。恶意软件的作者一直在设计新的技术来躲避恶意软件分析师的眼睛,而恶意软件分析师也一直在寻找识别和抵消这些技术的方法。在这个模块中,我们......
  • InputStream inputStream = classLoader.getResourceAsStream("aaa.properties") ; 
    问:InputStreaminputStream=classLoader.getResourceAsStream("aaa.properties"); 获取到的 inputStream 是null答:当您尝试使用ClassLoader的getResourceAsStream方法来获取一个资源文件(如"aaa.properties")的InputStream,但得到的结果是null时,这通常意味着资源文......