感染链
虽然研究人员无法复制整个感染进程,但他们能够从 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 执行。