PowerShell的身影无所不在,我最近也遇到过越来越多的恶意PowerShell脚本。为什么攻击者热衷于运用PowserShell?因为许多Win版本中都会自带这个工具,并且该工具可以访问WMI以及.Net Framework的所有功能,也能在内存中执行恶意代码以逃避反病毒软件的查杀,对了,与PowerShell相关的日志记录也没有那么完备。 在对这类案例的分析过程中,我发现了多条线索可以证明某位攻击者已经利用PowerShell实施过攻击。这些线索包括已安装的服务、注册表条目以及磁盘上的PowerShell文件。如果启用了日志记录功能,我也能找到许多有用的信息。本文的目的是为那些对PowerShell不是特别熟悉的安全分析人员提供一份参考。在本文中,我会向大家介绍如何定位恶意PowerShell程序的一些经验,同时也会介绍解码经过混淆的PowerShell脚本的一些方式。这一系列文章共有三篇,本文是第一篇,未来几周我会陆续推出后续文章。 二、Part 1:以服务形式安装的PowerShell脚本 首先我想介绍我最喜欢的一个例子:如何通过System事件日志发现攻击者将PowerShell脚本安装成本机服务。为了定位这类程序,我所做的第一件事情就是查找ID为7045的那些事件(Event ID 7045)。当系统中安装某个服务时,日志中就会出现这类事件。以服务形式安装的某个PowerShell脚本如下所示: 1、服务名(Service Name)为随机的字符串。 2、服务文件名(Service File Name)为%COMSPEC%,这个字符串为cmd.exe所对应的环境变量。 3、引用了powershell可执行文件。 4、包含经过Base64编码的数据。 那么,这类事件为什么会出现在日志中?有多种方式可以做到这一点,其中一种方式就是运用内置的Win服务控制管理器(Service Control Manager)来创建服务,命令如下所示: 有个有趣的信息需要引起我们的注意:以这种方式创建服务后,我们可能会得到一些错误信息。然而,这些错误信息并不意味着服务安装失败,原因在于Win希望安装“真实”的二进制程序,因此在等待这个“服务”时会出现“超时”,最终呈现错误信息。我也是经过测验才知道这一点。在测验过程中,我运用该方式成功安装了一个反弹shell,操作过程中Win主机上会产生服务错误信息。如下图中,左图为我在攻击虚拟机上启动的一个Metasploit会话,右图为安装了Win 7系统的虚拟机。虽然Win 7主机会提示“服务没有及时响应启动或控制请求(The service did not respond to the start or control request in a timely fashion)”,但并不影响Metasploit会话中成功打开反弹shell: 接下来是另一个例子,这一次我们面对的是“普通”的base64代码。其中我们需要再次注意%COMSPEC%变量以及其中包含的powershell.exe字符串: 总结一下,为了解码这段PowerShell代码,我用到了如下方式: 1、解码base64编码的PowerShell字符串。 2、将解码后的base64内容写入zip文件。 3、运用7zip解压Gzip文件。 4、通过scdbg.exe分析所得的二进制输出结果。 如上所述,在取得最终成果前,我们需要通过若干个挑战关卡。 最后一个例子: 根据Iron Python官网的说法,“IronPython是Python编程语言的开源实现方案,与.NET Framework密切相关。IronPython可以运用.NET Framework和Python库,并且其他.NET代码想要运用Python代码也非常简单”。在Win上安装IronPython非常简单,只需要一个MSI文件即可。安装完毕后,你就可以运用ipy.exe来运行脚本(稍后我会给出具体例子)。 有了这个工具后,我就可以开发python代码(io_decompress.py),运用python IO压缩库来解压zip文件: 1、解码Unicode base64代码。 2、解码嵌套的base64代码。 3、解压解码后的base64代码。 三、总结 从上面这三个例子中,我们可以看到,攻击者可能会运用各种技术来混淆他们的PowerShell攻击代码。这些技术可以组合运用,其中一些用法我已经在上面例子中介绍过。对于每种情况,所采取的步骤往往也各不相同。我经常会看到每种案例会对应2到3种变化,并且会在几个月的时间内蔓延到数百个系统中。某些情况下,我们所需要运用的步骤可能为:base64、base64、解压、shellcode,也有可能是base64、解压、base64、明文代码、base64、shellcode。这种情况是不是与俄罗斯套娃非常相似?在完成这一系列文章后,我会介绍如何自动化处理这个过程。如果你运用过相似Harlan Carvy的时间线脚本来获得文本输出结果,那么整个过程处理起来会非常简单。 1、查找带有%COMSPEC%、powershell.exe、-encodedcommand、-w hidden、"From Base64String"之类特征的7045事件。 2、查找诸如Gzipstream或者[IO.Compression.CompressionMode]::Decompress之类的特征字符串,可以帮助我们了解代码所运用的压缩方式。 3、尝试运用sdbg.exe、shellcode2exe或其他恶意软件分析工具来分析得到的二进制文件。 在Part 2中,我会介绍注册表中的PowerShell代码,在Part 3中,我会介绍如何记录PowerShell日志,以及如何从内存中提取相关信息。 |