Power Posing with PowerOPS
作者:Brian Fehrman
注意: 本博文中提到的技术和工具可能已过时,不适用于当前环境。但本文仍可作为学习机会,并可能更新或集成到现代工具和技术中。
如我上一篇博文《无PowerShell的PowerShell – 如何绕过应用程序白名单、环境限制和AV》(哇…已经有一段时间了!)所述,我们看到越来越多的环境开始检测或阻止PowerShell脚本的执行。绕过这些限制的一种方法是使用C#包装程序加载PowerShell脚本,并在.NET Framework上下文中直接执行。然而,通常每次运行新脚本时都需要修改包装程序,至少需要修改某种由包装程序读取的配置文件。这个过程可能有些繁琐,并增加了出错的机会。如果能将所有脚本整合到一个单一、紧凑的框架中就好了。介绍:PowerOPS框架(https://github.com/fdiskyou/PowerOPS)。
PowerOPS框架是多人(不包括我)的工作成果,他们的名字列在GitHub页面底部。实际上,该框架是后渗透阶段常用PowerShell脚本的集合。一些脚本包括:PowerView、Invoke-Mimikatz、Invoke-PSExec等。每个脚本都嵌入在C#代码本身中,因此您无需携带和加载脚本。您只需编译代码,运行可执行文件,并享受强大的PowerShell风格界面,使您能够通过简单命令运行脚本功能。您还可以从界面运行正常的PowerShell命令。所有这些都是在不实际调用powershell.exe二进制文件的情况下完成的。
那么如何开始使用它呢?让我们逐步完成这个过程。一个注意事项是您需要在目标系统上安装.NET Framework 4.0或更高版本。在此示例中,我安装了Microsoft Management Framework 4(https://www.microsoft.com/en-us/download/details.aspx?id=40855)。接下来,从本博文第一部分的GitHub链接下载PowerOPS项目。下载完成后解压缩zip文件。
下载并解压的PowerOPS项目
接下来,打开命令提示符,并使用以下命令编译项目(确保更改目录以匹配下载位置):
|
|
编译完成
如果一切顺利,您现在应该在桌面上(或您决定放置的位置)有一个名为PowerOPS_x64.exe的可执行文件。
PowerOPS二进制文件
请注意,给出的命令是针对x64架构编译的。如果您需要针对x86,请使用以下命令(再次确保更改目录名称以匹配您的系统):
|
|
要运行PowerOPS二进制文件,只需双击它。您应该会看到一个命令界面。
PowerOPS界面
通过在界面中键入show
,您可以查看当前可用的模块列表。
PowerOPS模块
每个模块中的命令已经为您导入。要查看模块中可用的命令,您可以键入:
|
|
例如,要查看PowerUp模块的命令,您将键入:
|
|
PowerView模块中的命令片段
让我们继续运行Invoke-AllChecks命令,只需键入:
|
|
PowerView模块中的命令片段
如果命令需要参数而您不记得它们怎么办?别担心!如前所述,您仍然可以在此框架中使用正常的PowerShell命令。假设我们想运行Invoke-ShareFinder但不太记得如何操作。我们可以通过键入以下内容获取示例:
|
|
获取Invoke-ShareFinder示例
我敢打赌,现在有些人已经注意到Invoke-Mimikatz功能,并想知道“它有效吗?”嗯,是的,但可能有一个奇怪的故障。关闭PowerOPS并以管理员身份重新运行它。
尝试通过键入运行Mimikatz:
|
|
您可能会得到如下所示的输出。
Invoke-Mimikatz未成功
我不太确定这里的问题是什么,但凭借完全的运气,我发现如果我先运行Invoke-Mimikittenz再运行Invoke-Mimikatz,它似乎有效。我尝试先运行其他一些模块,但似乎没有解决问题。我计划稍后进一步研究这个问题…但现在运行kittenz before katz很有趣。
|
|
运行Invoke-Mimikittenz后跟Invoke-Mimikatz
那么,AV对此有何看法?我们最近举办了年度Sacred Cash Cow Tipping AV-Bypass网络直播(网络直播:Sacred Cash Cow Tipping 2016)。可悲的是,一些AV供应商感到被冷落,他们迅速联系我们让我们知道…他们确实让我们知道了。别担心,朋友们,这不是个人问题。我们只是没有足够的时间包括每个人。幸运的是,对于你们中的一些人,我将加倍努力,腾出时间在这里包括你们!
我测试的第一个AV引擎是ESET。诚然,ESET有一个非常时髦的界面,带有许多很酷的附加功能。我打开了所有功能(除了防火墙一切),更新了数据库,并尝试运行PowerOPS。初始执行时没有发出警报。接下来,我运行了Invoke-Mimikatz功能,然后…成功了!我还对可执行文件进行了手动扫描,没有报告任何内容。
ESET扫描PowerOPS文件
Invoke-Mimikatz未被ESET检测到
那么卡巴斯基呢?我安装了卡巴斯基,并启用了所有功能,除了白名单和防火墙锁定一切。老实说,如果您在环境中实施基于白名单的方法,那么向您致敬!这是另一篇博文的测试。在这里,我们只是查看检测能力。我用卡巴斯基扫描了可执行文件,它表示一切正常。我运行了PowerOPS并发出了Invoke-Mimikatz命令。结果?成功!至少…我是这么想的…
Invoke-Mimikatz调用确实成功了。然而,在我再次运行它以获取本博文的截图后,卡巴斯基告诉我它检测到了活动并将删除该文件。
卡巴斯基检测到PowerOPS中的Invoke-Mimikatz
那么,这是怎么回事?它写了一个新的签名吗?它的行为分析引擎从程序执行中学到了什么?不,没有那么酷。事实证明,卡巴斯基需要一段时间才能完全加载。不清楚这是由于我的VM(4GB,2核心,在PCIe-SSD上…)还是程序的性质。卡巴斯基的检测似乎在此加载窗口期间无效。我碰巧在那个时间范围内运行了我的测试,导致Invoke-Mimikatz功能未被检测到。
卡巴斯基加载
哎呀,现在该怎么办…在最近的测试中,我一直在跳过在目标系统上使用Mimikatz,因为它现在似乎更频繁地被检测到。我通常使用PowerShell Procdump脚本(http://poshcode.org/4751)来转储目标机器的lsass进程。我将该转储文件离线,然后对其运行Mimikatz。但在此测试中,我继续抓取该脚本并进行了一些轻微修改。在脚本执行完执行进程转储的代码后,我添加了10秒的睡眠时间。睡眠时间是为了帮助确保转储例程已完成。睡眠后,我添加了以下代码:
|
|
上述命令告诉Mimikatz针对创建的转储文件运行,而不是尝试直接抓取内存。以下是PowerShell Procdump脚本中代码片段现在的样子:
修改后的PowerShell Procdump脚本
现在,我们需要将其添加到PowerOPS框架中。作者使这个过程非常简单。第一步是将Procdump脚本转换为Base64编码形式。我只是将脚本复制并粘贴到在线转换器中。
Base64编码Procdump脚本
接下来,复制Base64代码并在PowerOPS目录中打开PowerOPS.cs文件。注意已经存在的函数,并模仿它们的结构以添加新脚本。这仅涉及创建一个新函数,将其命名为您想要的名称(在此案例中为ProcDump),解码Base64版本的脚本,并返回该解码字符串。下面的快照显示了这一点。您的Base64代码只需放在双引号之间。
添加的ProcDump函数返回Base64编码的Procdump脚本的解码形式
下一步是在PowerOPS文件夹中打开Program.cs文件。找到代码中具有一系列pipeline.Commands.AddScript调用的部分。添加对您创建的函数的调用。您可以在以下屏幕截图中看到添加内容。
添加调用以添加Procdump脚本
最后一步需要使我们的新功能在我们在PowerOPS提示符中键入show
命令时显示。转到脚本顶部附近并找到DisplayModules函数。我继续将Get-ProcessDump字符串添加到最后一个Console.Write调用中。您可以在下面的屏幕截图中看到这一点。
最后,是时候重新编译程序了。发出我们之前使用的编译命令。以管理员身份运行PowerOPS可执行文件。键入show
命令以查看功能已添加。
显示的Get-ProcessDump
通过键入以下内容启动对lsass进程的进程转储和Mimikatz调用:
|
|
然后…成功!这次是真的!
成功转储Lsass和密码提取
总之,我概述了强大的PowerOPS框架以及如何开始使用它。将许多常见的PowerShell脚本放在一个实用程序中非常方便。此外,您能够在没有直接使用powershell.exe的情况下运行这些脚本。它似乎可以绕过一些AV供应商。对于其他供应商,我们不得不进行一次侧向冒险以绕过它们的检测方法。该框架还具有内置的应用程序白名单绕过技术,我在此未详细说明,但将在未来的博文中详细介绍。PowerOPS是一个对渗透测试人员非常方便的工具,我强烈建议您查看它!______ 在Twitter上关注Brian @fullmetalcache