Covenant源码调试分析-CreateLaunchers
以前一直有想法去自己写一些攻击框架,正好趁着这次工作需求先调研一些攻击框架的工作过程。由于Covenant是C#编写,其编码成本低,容易二次开发,并且对Windows的支持尚佳,就从此框架先入手。
Launcher生成流程
入口获取下断点
- 使用浏览器调试工具获取交互接口,URL如下:
1 | /launcher/binary |
Covenant项目的launcher模块前端交互处理逻辑在Controllers/ViewControllers/LauncherController.cs,这里先以Binary类型的Launcher为例
BinaryLauncher分析
EditBinaryLauncher方法
- 进入
EditBinaryLauncher
方法,从方法名和代码内容来看主要是对BinaryLauncher做了做了一个修改更新的操作,最后返回新的BinaryLauncher。
- 进入
GetBinaryLauncher
方法查看,该方法去数据库提取当前BinaryLauncher的配置
- 在生成新的Launcher时,我修改了ConnectAttempts的值,最后通过
SaveChangesAsync
保存
GenerateBinaryLauncher方法
- GenerateBinaryLauncher方法主要分为两个部分定义Grunt的属性和生成Grunt代码并编译
- 进入
GruntTemplateReplace
方法,可以看到传入的template.StagerCode
参数内容,该代码位Grunt模板代码
- 查看
GruntTemplateReplace
方法代码逻辑,根据通讯类型从配置文件中读取相应的值替换Stager代码,本次测试采用的HTTP信道,最后返回CodeTemplate
- 进入
CompileGruntCode
方法,可以看到该方法调用了修改和编译方法来输出编译好的二进制数据
- 由于Source的值无法调试获得,所以在方法外添加一条模板修改方法,查看替换后的结果。可以看到相关的值已经替换为配置文件中的属性
- 进入
GetLauncher
方法,逻辑只是把二进制数据编码返回(感觉传了很多没用的),最后将launcher对象保存,同步到数据库,至此BinLauncher生成完毕。
总结
本次分析了BinaryLauncher的生成过程,过程比较简单。就是从数据库读取StagerCode模板,然后进行修改。我也看了其他Launcher的代码Binary是一样的。