Covenant源码调试分析-CreateLaunchers

Covenant源码调试分析-CreateLaunchers

以前一直有想法去自己写一些攻击框架,正好趁着这次工作需求先调研一些攻击框架的工作过程。由于Covenant是C#编写,其编码成本低,容易二次开发,并且对Windows的支持尚佳,就从此框架先入手。

Launcher生成流程

image-20200412205313645

入口获取下断点

  1. 使用浏览器调试工具获取交互接口,URL如下:
1
2
3
4
5
6
7
8
9
/launcher/binary
/launcher/powershell
/launcher/msbuild
/launcher/installutil
/launcher/wmic
/launcher/regsvr32
/launcher/mshta
/launcher/cscript
/launcher/wscript
  1. Covenant项目的launcher模块前端交互处理逻辑在Controllers/ViewControllers/LauncherController.cs,这里先以Binary类型的Launcher为例

    image-20200412182839069

BinaryLauncher分析

EditBinaryLauncher方法

  1. 进入EditBinaryLauncher方法,从方法名和代码内容来看主要是对BinaryLauncher做了做了一个修改更新的操作,最后返回新的BinaryLauncher。

image-20200412184830764

  1. 进入GetBinaryLauncher方法查看,该方法去数据库提取当前BinaryLauncher的配置

image-20200412190055476

  1. 在生成新的Launcher时,我修改了ConnectAttempts的值,最后通过SaveChangesAsync保存

image-20200412191305853

GenerateBinaryLauncher方法

  1. GenerateBinaryLauncher方法主要分为两个部分定义Grunt的属性和生成Grunt代码并编译

image-20200412193849526

image-20200412194654073

  1. 进入GruntTemplateReplace方法,可以看到传入的template.StagerCode参数内容,该代码位Grunt模板代码

image-20200412195100068

  1. 查看GruntTemplateReplace方法代码逻辑,根据通讯类型从配置文件中读取相应的值替换Stager代码,本次测试采用的HTTP信道,最后返回CodeTemplate

image-20200412195216286

  1. 进入CompileGruntCode方法,可以看到该方法调用了修改和编译方法来输出编译好的二进制数据

image-20200412200521636

  1. 由于Source的值无法调试获得,所以在方法外添加一条模板修改方法,查看替换后的结果。可以看到相关的值已经替换为配置文件中的属性

image-20200412201504316

image-20200412201353408

  1. 进入GetLauncher方法,逻辑只是把二进制数据编码返回(感觉传了很多没用的),最后将launcher对象保存,同步到数据库,至此BinLauncher生成完毕。

image-20200412201818815

总结

本次分析了BinaryLauncher的生成过程,过程比较简单。就是从数据库读取StagerCode模板,然后进行修改。我也看了其他Launcher的代码Binary是一样的。