恶意PowerShell在注册表中的持久化机制
这是我关于“发现和解码恶意PowerShell脚本”系列文章的第二部分。第一篇博文介绍了如何在系统事件日志中查找恶意PowerShell脚本,以及解码它们所需的各个步骤。在这篇文章中,我想讨论另一个可能隐藏恶意PowerShell脚本的位置——注册表。
注册表是攻击者建立持久化驻留的绝佳场所。常见的驻留位置是位于软件配置单元(Software Hive) 或用户的ntuser.dat配置单元中的Run键。关于Run键的列表,可以查阅取证维基(Forensic Wiki)。
在我处理过的一些案例中,我看到过攻击者使用的一种技术:利用Run键中的PowerShell命令去调用另一个包含Base64编码负载的注册表键值。
让我们来看一个具体的例子。使用Eric Zimmerman的Registry Explorer,我导航到以下注册表键:HKLM\Software\Microsoft\Windows\CurrentVersion\Run。在名为"hztGpoWa"的值下,有以下条目:
|
|
你也可以使用Harlan的RegRipper的soft_run插件来提取这些信息:
|
|
(对于NTUSER.DAT配置单元,请使用user_run插件)
那么这个命令是做什么的呢?%COMSPEC%是cmd.exe的系统环境变量。它使用cmd.exe在一个隐藏窗口中启动PowerShell。然后,它使用PowerShell命令Get-Item去获取另一个注册表键——HKLM:Software\4MX64uqR,以及该键下的Dp8m09KD值。
在Registry Explorer中浏览到HKLM:Software\4MX64uqR键,会显示一大串Base64编码的内容:
另一种从注册表中提取此类Base64数据的方法是使用RegRipper的"sizes"插件。该插件会搜索注册表配置单元中超过特定大小阈值的值并将其转储出来:
|
|
(感谢Harlan更新了这个插件!如果你最近没有更新,请务必更新。)
关于如何解码这个Base64的详细步骤,请参阅我早期关于解码恶意PowerShell脚本的博客文章。
以下是解码过程的高级步骤:
- 解码注册表键中的Unicode Base64
- 解码并解压(gzip)嵌入的Base64
- 解码另一轮嵌入的Base64
- 负载 = Shellcode
- 尝试对得到的Shellcode运行
scdb.exe或strings命令,以获取最终的IP地址和端口
最终得到的代码通常是一种建立Meterpreter反向Shell的方式。
另一种在注册表中发现恶意PowerShell实例的方法是搜索注册表中包含"%COMSPEC%"的条目。
我使用Registry Explorer及其方便的查找功能来执行此操作。请确保选择了正确的“Search in”复选框:
虽然本例中显示的注册表键和值具有随机名称,但情况并非总是如此。这些名称可以是攻击者想要的任何内容,它们并不总是像随机名称那样有明显的提示。
对于我的示例,我使用了Metasploit在注册表中安装了这种持久化机制。请查看所有可用的选项。如上所述,注册表的键/值名称可以设置为任何内容:
我下一篇关于恶意PowerShell脚本的博文将涵盖PowerShell日志记录以及从内存中提取信息。狩猎愉快!