摘要
近期,技术人员在用户现场检测时发现系统进程中存在一段可疑的 Shellcode,随后对其进行了深入调查,最终在系统的隐蔽位置中发现了挖矿木马——Minas。
重建Minas复杂感染链
虽然目前还无法重现整个感染过程,但是能够从执行的 PowerShell 对它的套路进行了复盘,如下图所示:
图1.Minas攻击执行流程
-
PowerShell 脚本首先打入系统内部,运行后通过计划程序从远程服务器下载 lgntoerr.gif 文件;
-
脚本对 lgntoerr.gif 文件解密后生成一个.NET DLL,然后加载该DLL;
-
.NET DLL 从其资源中提取并解密出三个文件:两个 DLL 和一个加密的有效负载,并放置在程序数据目录中;
-
.NET DLL 同时会先创建一个任务,以便在系统启动时能够通过任务计划自动运行合法的 ilasm.exe 组件;
-
任务计划程序从 ProgramData 目录启动 ilasm.exe;
-
然后 ilasm.exe 在同一目录启动 DLL,劫持 Fusion.dll 后进行融合,.dll 加载第二个解密的 DLL;
-
该 DLL 创建一个挂起的 dllhost.exe 进程,并从加密的二进制文件中解密有效负载;
-
解密的有效负载再作为 DLL 加载到 dllhost.exe 进程中;
-
dllhost.exe 将进程中的PID保存到 ProgramData 目录中的文件中,并将控制权传递给解密的有效负载;
-
最后,有效负载 DLL 提取并启动内存中的矿工 DLL。
通过数据库的检索和比对后,确认此恶意软件名为 Minas。根据技术人员对感染链的重建,发现它起源于作为任务运行的 PowerShell 脚本,而该脚本一般则通过 GPO 进行创建。
图2.编码后的PowerShell命令
Minas技术剖析说明
PowerShell 脚本的核心功能是启动恶意软件安装过程。为此,PowerShell 脚本从远程服务器下载加密的有效负载,使用自定义XOR加密算法(密钥“fuckkasd9akey”)对其进行解密,并将有效负载加载到内存中:
图3.解码的PowerShell命令
有效负载是由 .NET 二进制文件 (DLL)传递的三个参数:
$a.GetType(“I.C”).GetMethod(“I”).Invoke($null, ([Byte[]]($d),“A5D9FD13”,0));
-
$d:.NET DLL 作为字节数组;
-
A5D9FD13:(用于解密 .NET DLL 中的资源的密钥);
-
0:(用于阻止创建多个主有效负载进程的参数)。
此 .NET 二进制文件(以下简称“安装程序”)负责后续安装 .NET DLL 资源中包含的恶意软件组件。
首先,用哈希函数(Ap,SDBM,RS)安装程序创建一个目录结构:
图4.示例文件和目录
接下来,它将检查系统上是否存在合法的 ilasm.exe 文件(版本 4.0.30319 位于 %windir%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe 或版本 2.0.50727 位于 %windir%\Microsoft.NET\Framework64\v2.0.50727\ilasm.exe)(如果系统上存在 ilasm.exe,则它应该位于这些目录之一中)。如果未找到该文件,安装过程将终止,一旦找到 ilasm.exe就会创建一个计划任务作为持久性机制:
在此之后,将文件复制到先前创建的目录中。然后,恶意软件安装程序的前100个字节将会追加到从“_64_bin”.NET DLL 资源中提取的文件 {RSHash(MachineName)},并生成加密的文件。此外,多达 10240个随机字节会附加到 fusion.dll 和 {SDBMHash(MachineName)}.dll 文件中,从而使反恶意软件产品的哈希检测无效。
接下来,安装程序启动先前为 ilasm.exe 创建的任务,该任务又加载位于同一目录中的恶意 fusion.dll 库,假设它使用的是合法的 fusion.dll (DLL劫持)。
恶意软件执行过程由两个加载程序组成:DLL 劫持者融合 .dll 和下一阶段加载程序 {SDBMHash(MachineName)}.dll,同时 DLL 劫持者通过以下步骤进行检查:
-
隐藏 ilasm.exe 进程的控制台;
-
确定进程的名称是否为 ilasm.exe,否则它将终止进程;
-
基于 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运行创建的0x1F4,然后加载程序尝试使用该 PID 终止进程。
接下来,它读取并解密位于 C:\ProgramData\{ApHash(MachineName)}\{RSHash(MachineName)}\{RSHash(MachineName)} 的主有效载荷(矿工)。此外,加载程序会创建一个进程环境变量 (SetEnvironmentVariable) 配置,其值为 {“addr”:“185.243.112.239:443”,“p”:“143e256609bcb0be5b9f9c8f79bdf8c9”}。
图5.通过流程传递参数
之后,{SDBMHash(MachineName)}.dll 创建一个挂起的 dllhost.exe 进程,创建一个部分,将其映射到 dllhost.exe 进程,并写入先前读取和解密的文件(带有矿工组件的原始加载器)。然后,它读取 dllhost.exe 进程的内存,确定主线程的入口点并将其重写为:
将创建的 dllhost.exe 进程中的 PID 乘以 0x1F4 写入 C:\ProgramData\{SDBMHash({SDBMHash(MachineName)})}后, dllhost.exe 进程恢复,终止 ilasm.exe 进程。最后,dllhost.exe 将控制流传递给解密的原始加载程序,使加载程序在进程内存中映射XMRig矿工(DLL 文件形式的 XMRig 矿工程序集),然后使用反射加载启动它,矿工使用 GetEnvironmentVariable 获取流程环境变量配置的值来挖掘加密货币。
图6.流程环境变量值
结论
虽然目前无法准确掌握最初的 PowerShell 命令是如何执行的,但可以确定攻击向量是通过 GPO 执行的,意味着攻击者已经破坏了网络,将不遗余力地安装矿工木马。
Minas 挖矿木马由于其能够加密、随机生成名称并使用劫持和注入等技术手段进行入侵,使常规的安全检测方法难以发现,需要提高网络安全防范意识,避免感染此类病毒。