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,还不来一起早睡?