新型挖矿恶意软件 Minas 的分析

文章正文
发布时间:2023-06-02 13:28

2022 年 6 月,卡巴斯基实验室的研究人员在一个系统进程的内存中发现了一个可疑的 shellcode。为此,他们深入分析了 shellcode 是如何放置到进程中的,以及受感染系统上的威胁隐藏在何处?

感染链

虽然研究人员无法复制整个感染进程,但他们能够从 PowerShell 执行的位置重建它,如下图所示。

攻击流程

简而言之,感染链如下:

·PowerShell 脚本通过任务计划程序运行,并从远程服务器下载 lgntoerr.gif 文件;

·该脚本解密 lgntoerr.gif,生成一个 .NET DLL,然后加载该 DLL;

·.NET DLL 从其资源中提取并解密三个文件:两个 DLL 和一个加密的有效负载。提取的文件被放置在 ProgramData 目录中。

·.NET DLL 创建一个任务,在系统启动时通过任务调度程序自动运行合法的 ilasm.exe 组件;

·任务调度程序从 ProgramData 目录启动 ilasm.exe;

·ilasm.exe 从同一目录启动 fusion.dll,这是一个恶意的 DLL 劫持程序;

·fusion.dll 加载第二个解密的 DLL;

·该 DLL 创建一个挂起的 dllhost.exe 进程;

·然后,它对加密的二进制文件中的有效负载进行解密;

·解密后的有效负载作为 DLL 加载到 dllhost.exe 进程中;

·dllhost.exe 进程的 PID 保存在 ProgramData 目录中的一个文件中;

·dllhost.exe 进程将控制权传递给解密的有效负载;

· 有效负载 DLL 提取并在内存中启动挖矿 DLL;

他们把这个恶意软件命名为 Minas。根据研究人员对感染链的重建,他们确定它是通过将编码的 PowerShell 脚本作为任务运行而产生的,他们不太确信该脚本是通过 GPO 创建的:

编码的 PowerShell 命令

技术细节

PowerShell 脚本的核心功能是启动恶意软件安装进程。为此,PowerShell 脚本从远程服务器下载加密有效负载,使用自定义异或加密算法 ( 密钥为 "fuckkasd9akey" ) 对其解密,并将负载加载到内存中:

已解码的 PowerShell 命令

负载是由 PowerShell 进程启动的 .NET 二进制文件(DLL),它传递三个参数:

$a.GetType ( "I.C" ) .GetMethod ( "I" ) .Invoke ( $null, ( [ Byte [ ] ] ( $d ) ,"A5D9FD13 ″ ,0 ) ) ;

1.$d: .NET DLL 作为字节数组;

2.A5D9FD13: (用于对 .NET DLL 中的资源进行解密的密钥);

3.0:(用于阻止创建多个主有效负载进程的参数);

此 .NET 二进制文件(他们将其称为 " 安装程序 ")负责 .NET DLL 资源中包含的恶意软件组件的后续安装。

使用哈希函数 ( Ap, SDBM, RS ) ,安装程序创建一个目录结构:

示例文件和目录

接下来,它检查系统上是否存在合法的 ilasm.exe 文件 ( 版本 4.0.30319 位于 %windir%Microsoft.NETFramework64v4.0.30319ilasm.exe 或版本 2.0.50727 位于 %windir%Microsoft.NETFramework64v2.0.50727ilasm.exe ) 。注意,如果系统上存在 ilasm.exe,它应该在这些目录之一中 ) 。如果没有找到该文件,安装进程将被终止。只要找到 ilasm.exe,就会创建一个计划任务作为持久机制 :

在此之后,文件被复制到前面提到的创建的目录中

然后,恶意软件继续将安装程序的前 100 个字节附加到从 "_64_bin". net DLL 资源中提取的文件 {RSHash ( MachineName ) } 中,并且生成的文件被加密 ( 密钥是小写的计算机名称 ) 。另外,在 "fusion.dll" 和 "{SDBMHash ( MachineName ) }.dll" 文件中添加了多达 10240 个随机字节,导致反恶意软件产品的哈希检测无效。

之后,安装程序为运行的 ilasm.exe 启动先前创建的任务,该任务反过来加载位于同一目录下的恶意 fusion.dll 库,假设它正在使用合法的 fusion.dll ( DLL 劫持技术 ) 。

恶意软件的执行进程包括两个加载程序:DLL 劫持程序 fusion.dll 和下一阶段的加载程序 {SDBMHash ( MachineName ) }. DLL。

DLL 劫持程序做三件事:

1. 隐藏 ilasm.exe 进程的控制台。

2. 确定进程名是否为 ilasm.exe。如果不是,则终止进程。

3. 基于 SDBM 哈希函数,它构建路径 C:ProgramData{SDBMHash ( MachineName ) }{SDBMHash ( MachineName ) }. DLL 并尝试通过 LoadLibraryA API 函数将该 DLL 加载到内存中。

加载的 {SDBMHash ( MachineName ) }.dll DLL 再次检查进程名是否为 ilasm.exe。

然后生成文件路径 C:ProgramData{SDBMHash ( {SDBMHash ( MachineName ) } ) } 并检查它是否存在。如果文件存在,则从中读取值 ( 十进制数 ) 。这个十进制数字是 dllhost.exe 进程的 PID 乘以先前运行 Minas 时创建的 0x144。加载程序然后尝试用该 PID 终止进程。

然后,它读取并解密 ( 记住,密钥是小写的计算机名称 ) 位于 C:ProgramData{ApHash ( MachineName ) }{RSHash ( MachineName ) }{RSHash ( MachineName ) } 的主有效负载 ( 挖矿 ) 。此外,加载器创建一个进程环境变量 ( SetEnvironmentVariable ) 配置,其值为 {"addr":"185.243.112.239:443 ″ ,"p":"143e256609bcb0be5b9f9c8f79bdf8c9 ″ } 。

通过进程传递参数

之后,{SDBMHash ( MachineName ) }.dll 创建一个挂起的 dllhost.exe 进程,创建一个节,将其映射到 dllhost.exe 进程并写入先前读取和解密的文件 ( 带有挖矿组件的原始加载器 ) 。然后它读取 dllhost.exe 进程的内存,确定主线程的入口点并将其重写为:

然后将创建的 dllhost.exe 进程的 PID 乘以 0x14f 写入 C:ProgramData{SDBMHash ( {SDBMHash ( MachineName ) } ) },之后 dllhost.exe 进程继续运行。然后终止 ilasm.exe 进程。

最后,DLL .exe 将控制流传递给解密的原始加载器,该加载器在进程内存中映射 XMRig 挖矿程序 ( XMRig 挖矿程序的 DLL 文件形式的汇编 ) ,然后使用反射加载启动它。

挖矿程序使用 ( GetEnvironmentVariable ) 获取进程环境变量配置的值。这些值用于通过以下配置挖掘加密货币 :

Minas 是一个使用标准实现并旨在隐藏其存在的挖矿程序。由于加密、随机生成名称以及使用劫持和注入技术,检测难度得以实现。它还能够使用持久性技术驻留在受感染的系统上。

虽然研究人员目前还无法完全确定初始 PowerShell 命令是如何执行的,但很可能是通过 GPO 执行。