导语:2022年6月,卡巴斯基实验室的研究人员在一个系统进程的内存中发现了一个可疑的shellcode。
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.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)}中,并且生成的文件被加密(密钥是小写的计算机名称)。另外,在“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执行。
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
(hack视频资料及工具)
(部分展示)
文章引用微信公众号"白帽子左一",如有侵权,请联系管理员删除!