恶意PowerShell在注册表中的持久化攻击技术解析

本文深入分析了攻击者如何利用PowerShell在Windows注册表中实现持久化攻击的技术细节,包括Run键的利用、base64编码载荷的隐藏和解码方法,以及使用RegRipper等工具进行检测的技术要点。

恶意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插件来提取这些信息:

1
rip.exe -r SOFTWARE -p 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"插件。这将搜索注册表配置单元中超过特定阈值的值并将其转储出来:

1
rip.exe -r SOFTWARE -p sizes

(感谢Harlan更新了这个插件!如果最近没有更新,请务必更新。)

要查看解码此base64的详细步骤,请查看我 earlier 关于解码恶意PowerShell脚本的博客文章。

以下是解码的高级步骤:

  1. 解码注册表键中的unicode base64
  2. 解码和解压缩(gzip)嵌入的base64
  3. 解码另一轮嵌入的base64
  4. 载荷 = shellcode
  5. 尝试对生成的shellcode运行scdb.exe或strings以获取IP地址和端口

生成的代码通常是一种建立Meterpreter反向shell的方法。

在注册表中查找恶意PowerShell实例的另一种方法是搜索"%COMSPEC%"。

我使用Registry Explorer及其方便的查找命令来执行此操作。确保选择了正确的"Search in"框:

虽然此示例显示了具有随机名称的注册表键和值——但情况并非总是如此。这些名称可以是攻击者想要的任何内容,它们并不总是像随机名称那样明显的提示。

在我的示例中,我使用Metasploit在注册表中安装了这个持久化机制。查看所有可用的选项。如上所述,注册表键/值名称可以设置为任何内容:

我下一篇关于恶意PowerShell脚本的文章将涵盖PowerShell日志记录和从内存中提取信息。狩猎愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计