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 null) continue; var instructions = ctor.Body.Instructions.Where(i => i.OpCode == OpCodes.Ldstr); foreach (var instruction in instructions) { if (instruction.Operand is null) continue; var operand = (string) instruction.Operand; if (!operand.Equals(Handler.Name, StringComparison.OrdinalIgnoreCase)) continue; targetHandler = handler; break; } } if (targetHandler is null) throw 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 null) continue; 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,还不来一起早睡?