Covenant源码调试分析-Execute
在上篇分析StagerCode时,我们就获取到了ExectuteCode的源码。本篇我们来调试一下Execute的源码,了解其工作过程。经过分析Execute主要负责两个功能,注册信息提交以及任务监听。
Execute工作流程

源码分析
调试准备
在StagerCode调用ExectuteCode时,需要传入一些参数并且利用Assembly.Load在内存中加载数据,为了方便调试我们直接将获取的ExectuteCode源码与StagerCode合并在一个程序中,直接调用ExectuteCode中的Execute方法。

注册信息提交
在ExecuteCode刚运行时候会收集本机的主机名、IP地址、操作系统类型、进程名、进程完整性级别、用户域、用户名属性上传至Server端。

Server端收到Client提交的信息后,进行解码、解密,提取相关的注册信息,最后push到缓存读进数据库。


任务监听
任务监听是核心功能用于接收远程任务执行命令,ExecuteStage中利用一个无限while循环进行任务监听。任务类型分为4种:
- SetOption:设置会话属性
- Jobs:查看当前任务
- Exit:结束会话
- default:执行监听到的任务
Server端在创建任务时读取Web传递的参数创建对象,传递给CreateGruntTasking方法

当传入任务参数后,Server根据任务的ID去数据库中寻找payload,进行编译下发。


Client在执行任务时调用TaskExecute方法,该方法提取参数和Assembled进行内存执行,并且返回执行结果。

总结
至此,利用三篇小短文对Covenant从创建launchers->LoadStager->ExecuteStager的流程跑个通,Covenant中还有很多为了支持此流程写的校验、API等,限于文章篇幅就不一一叙述了。由于covenant目前的payload都是基于.net core的,后续为了支持我会尝试在此架构上添加Python、c的payload。