导语:在上一篇文章中,我们解释了如何构造具有精妙结构的YARA规则的检测方法,来检验证书里所含有的恶意PowerShell脚本,而AV和IDS通常无法检测到这些含有恶意代码的证书。在这篇文章中,我们将分析一个包含PowerShell脚本的证书。
在上一篇文章中,我们解释了如何构造具有精妙结构的YARA规则的检测方法,来检验证书里所含有的恶意PowerShell脚本,而AV和IDS通常无法检测到这些含有恶意代码的证书。这是因为,很多证书文件中并没有包含有效的证书,而是一个PowerShell脚本。虽然我们已经发现了各种有效载荷,但包含Windows可执行文件的伪造证书似乎是最常见的。在这篇文章中,我们将分析一个包含PowerShell脚本的证书。
攻击者可以将这些包含PowerShell脚本的伪造证书文件用作各种有效载荷的容器,以避免杀毒软件,IDS等检测到有效载荷。在Windows系统上打开证书文件时,有效载荷并不会被激活,它必须由攻击者或恶意软件进行提取。还有一种情况就是,证书文件本身无法进行动态分析,在沙箱中打开证书不会导致代码的执行,因此通过沙箱检测也不会发现恶意行为。
分析
我们使用YARA检测规则在VirusTotal上检测到证书MD5 0082aed588f76b517946a824fba43994。它的BASE64代码不以字母M开头,因此它不会是有效的证书,也不会是Windows可执行文件(PE文件),因为BASE64代码不会以字母T开头。
但是当我们用base64dump.py进行分析时,发现了一些异常的信息。
这看起来像一个以powershell.exe开头的命令,我们来看看完整的代码。
这个有效载荷经过多层混淆,这是安全人员在野外发现的恶意PowerShell脚本的典型特征。这也是为什么我们选择这个证书的另一个原因,它允许我们展示静态分析PowerShell脚本的整个过程。
在上图中,你可以看到powershell.exe是使用-encodedcommand参数执行的,该参数是一串很长的经过BASE64编码的UNICODE字符串,不过也可以用base64dump解码。
这个反混淆的脚本也包含BASE64代码,而且还添加了另一层混淆。让我们将其重新格式化以获得更好的可读性。
我们可以看到,BASE64字符串被解码、解压缩(GZip)并执行(IEX)。
解码和解压缩后,我们最终会得到另一个PowerShell脚本。 translate.py有一个函数(GzipD)来解压缩GZip压缩数据。
可以看出,有很多BASE64代码,不过这种类型的脚本也是众所周知的,因为它包含shellcode(BASE64编码),且在PowerShell进程中被注入后就会执行恶意行为。最后一个if语句带有一个表达式,查看整数指针(IntPtr)的大小是否为8字节,这是检测PowerShell进程是32位还是64位进程的技巧。 32位进程使用4字节指针而64位进程使用8字节指针,在本文所举的脚本样本中,如果指针不是8字节长(32位),则直接执行脚本(IEX)。对于64位PowerShell,则启动32位PowerShell进程(start-job … IEX … -RunAs32)来运行脚本。
这个32位的技巧之所以能够实现,是因为该脚本只包含32位的shellcode,只能在32位进程内运行,而不能在64位进程内运行。
以下是被解码的另一层BASE64:
当我们解码这层BASE64编码的shellcode并提取字符串时,就可以看到一个域和一个用户代理字符串。
使用scdbg.exe提取和模拟这个shellcode,将使我们更好地了解这个shellcode的作用。
可以看出,shellcode建立了一个HTTP链接,以下载多级shell代码,它们负责启动远程可访问的多个shell。这段代码是渗透测试工具的典型代码,如较旧的Metasploit / Meterpreter和PowerShell中开发的类似框架。
总结
无法使用动态分析方法直接分析隐藏在伪造证书文件中的恶意软件,因为证书在打开时不会执行代码。因此,对此脚本的检测需要分几个步骤,第一步就是提取有效载荷。以上,我们给出了一个静态分析的例子,它混淆了最终执行第一阶段shellcode的PowerShell脚本。这是渗透测试框架的典型特征,但也会被犯罪分子反过来使用。