「SharpC2学习」EXE载荷生成流程
2023-11-11 11:24:17 Author: 黑客在思考(查看原文) 阅读量:2 收藏

SharpC2中EXE格式的Payload生成学习记录,shellcode的也差不多,多使用了个donut,记个笔记,写的较潦草


在MAC中的VS启动Teamserver,使用其自带的swagger进行调试(好方便)


在调试处发起请求,在PayloadsController这个Controller中对应的处理action是GetPayload,在这下断点


39行首先获取Profile,跟过去看到是从这里取配置设置的TeamServer.Models.C2Profile


接着payload为exe格式,自然进入ExePayload()方法处理


payload类型


进入到TeamServer.Models.ExePayload中的Generate()


第一步,进入GetDroneModuleDef,调用TeamServer.Utilities中的GetEmbeddedResource


GetEmbeddedResource方法如下


大致就是获取TeamServer中的资源文件读取到内存。

然后调用.net第三方库dnlib

语句:ModuleDefMD.Load(drone);,读取模块,(只能读取.net的模块这个库)

接着对模块进行一系列操作


通过这个库给这个EXE的payload根据profile写一些设置,


这里的EmbedHandler()复杂的一笔,猜测是对应Handler的,但代码真没看懂,还望师傅赐教,

        private void EmbedHandler(ModuleDef module)
        {
            // get handlers (not including the abstract)
            var handlers = module.Types
                .Where(t => t.FullName.Contains("Drone.Handlers", StringComparison.OrdinalIgnoreCase))
                .Where(t => !t.FullName.Equals("Drone.Handlers.Handler", StringComparison.OrdinalIgnoreCase));
            
            // match the one that matches the abstract name
            // it's actually set in the ctor of all places
            TypeDef targetHandler = null;
            
            foreach (var handler in handlers)
            {
                var ctor = handler.Methods.GetConstructor();
                if (ctor is nullcontinue;
                
                var instructions = ctor.Body.Instructions.Where(i => i.OpCode == OpCodes.Ldstr);
                
                foreach (var instruction in instructions)
                {
                    if (instruction.Operand is nullcontinue;
                    var operand = (string) instruction.Operand;
                    if (!operand.Equals(Handler.Name, StringComparison.OrdinalIgnoreCase)) continue;
                    
                    targetHandler = handler;
                    break;
                }
            }

            if (targetHandler is nullthrow new Exception("Could not find matching Handler");

            if (Handler.Parameters is not null)
            {
                foreach (var handlerParameter in Handler.Parameters)
                {
                    // get matching method in handler
                    var method = targetHandler.Methods.GetMethod(handlerParameter.Name);
                    var instruction = method?.Body.Instructions.FirstOrDefault(i => i.OpCode == OpCodes.Ldstr);
                    if (instruction is nullcontinue;
                    instruction.Operand = handlerParameter.Value;
                }
            }

            // finally, ensure that the drone is creating an instance of the correct handler
            var droneType = module.Types.GetType("Drone");
            var getHandler = droneType.Methods.GetMethod("get_GetHandler");
            getHandler.Body.Instructions[0].Operand = targetHandler.Methods.GetConstructor();
        }

最后使用AutoMapper,转换类型并响应这个请求,这个东西开始在controller构造函数中也注入进来了


转换这个对象为bytes类型并响应

为base64,解开之后是PE



    看了一下他的生成payload流程,没想到不是那种patch的方式,而是使用的dnlib这个库操作.net模块,如果二开的话使用c++编写植入体的话EXE这里的流程也都要修改不少,md。

    比较潦草,时间紧,因为我要早睡了,88,还不来一起早睡?


文章来源: http://mp.weixin.qq.com/s?__biz=MzI5NzU0MTc5Mg==&mid=2247484972&idx=2&sn=1cc49acdbdb2584d52bd8c0136407194&chksm=ecb2cfe3dbc546f5ce181978ab8a750c3135551ebae68932bbd3508b7c0a71af305fdbfe1f1a&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh