恶意PowerShell在注册表中的持久化
这是我关于"查找和解码恶意PowerShell脚本"系列的第二部分。我的第一篇博客文章介绍了如何在系统事件日志中查找恶意PowerShell脚本,以及解码它们的各种步骤。在这篇文章中,我想讨论恶意PowerShell脚本可能隐藏的另一个位置——注册表。
注册表是攻击者建立持久性的绝佳位置。常用的位置是位于软件配置单元或用户的ntuser.dat配置单元中的Run键。有关运行键的列表,请查看取证维基。
在我处理的一些案例中,我看到的一种技术是攻击者使用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的详细步骤,请查看我 earlier 关于解码恶意PowerShell脚本的博客文章。
以下是解码的高级步骤:
- 解码注册表键中的unicode base64
- 解码和解压缩(gzip)嵌入的base64
- 解码另一轮嵌入的base64
- 载荷 = shellcode
- 尝试对生成的shellcode运行scdb.exe或strings以获取IP地址和端口
生成的代码通常是一种建立Meterpreter反向shell的方法。
在注册表中查找恶意PowerShell实例的另一种方法是搜索"%COMSPEC%"。
我使用Registry Explorer及其方便的查找命令来执行此操作。确保选择了正确的"Search in"框:
虽然此示例显示了具有随机名称的注册表键和值——但情况并非总是如此。这些名称可以是攻击者想要的任何内容,它们并不总是像随机名称那样明显的提示。
在我的示例中,我使用Metasploit在注册表中安装了这个持久化机制。查看所有可用的选项。如上所述,注册表键/值名称可以设置为任何内容:
我下一篇关于恶意PowerShell脚本的文章将涵盖PowerShell日志记录和从内存中提取信息。狩猎愉快!