Covenant C2框架调研及扩展
前言
这半年来BLOG都没有更新,这段事件主要的工作是忙于ATT&CK框架的应用落地,其中做的一块工作就是攻击模拟、规则提取、知识库总结。以前的攻击模拟都是自己写的散装脚本或程序,在真正到了项目需要落地或POC测试时,还是需要进行复现效果展示的,所以最近开始调研一些开源的攻击框架把攻击本都集成进去,帮助项目进行效果展示。
后来关注到Covenant这个C2框架,它使用DotNet编写所以天然对Windows的操作支持良好,利用DotNet已有的API可以快速编写Windows下的利用程序,故对Covenant做了一些调研和Demo。
Covenant介绍
Covenant分为4个核心的模块:Listeners、Launchers、Grunts、Tasks,模块都具备高自由度、扩展性。
Listeners:
和其他的框架类似Listeners的功能为设置C2框架的监听设置。Listeners可以在前端对于HTTP通信隧道的属性(Urls\Head\Useragent\PostRequest\Response)进行修改,操作非常简单,也可以利用Bridge开发自己自定义通信隧道。
Launchers:
该模块的功能为加载Stage的模块,相当于ShellCode Load的程序。Covenant在该模块提供了几个常见的白名单程序加载方案,虽然可能现在也不再“白”了:Binary、Powershell、MSBuild、InstallUtil、Wmic、Regsvr32、Mshta、Cscript、Wscript。
在前端未发现扩展Lunchers的按钮,如果要扩展加载模块可能需要在源码更改编译。
Grunts:
该模块的功能为管理上线的终端主机,可远程查看信息、执行命令等
Tasks:
该模块为后渗透模块,目前集合多种开源模块:Rebeus、Seatbelt、SharpDPAPI、SharpDump、SharpSploit、SharpUp、SharpWMI。
Covenant Task扩展
Covenant后渗透模块扩展,需要通过添加Reference Source Libraries被调用。调研初衷是想在ATT&CK落地项目中进行效果测试,那这样咱们的目标明确就是要做一个ATT&CK的模拟攻击DLL。
以Discovery战术下的IP地址获取为例,C#的DLL代码如下:
1 | using System.Net; |
将C#的项目源代码目录放置到Covenant/Data/ReferenceSourceLibraries目录下

在Covenant->Tasks模块下创建新的ReferenceSourceLibrary引用并选择支持的DotNet版本和引用的程序集


Covenant默认存在的程序集可在Reference Assemblies标签页查看,内置大部分常用的程序集,如果你需要新增的ReferenceSourceLibrary引用的程序集不在范围内需要自己将程序集复制到AssemblyReferences目录下。
在成功导入AttAck库后,新增Task任务调用DLL程序集中的方法
1 | using System; |
添加Task后可以通过Grunts向上线主机发送task任务或者通过Interact命令行执行命令

结论
Covenant在扩展性方面是友好的,开发成本低,速度快,界面简洁,操作门槛低,对于开发好的模块可以快速的实施测试。但是是基于DotNet开发的特性导致不适用于一些不满足DotNet环境的目标机器,这导致了在通用性有所欠缺,如果后续需要加入针对Linux平台的测试脚本,可能需要另外基于Python或perl开发新的Listeners模块和Grunts模块。在这方面可能Covenant就不如Empire,但是我依然非常喜欢C#。后面我会继续看一看Covenant的源码,了解其详细的运行原理,并记录。