Covenant 利用分析

发布于 2024-08-06 20:58:32 字数 10028 浏览 85 评论 0

0x00 前言

Covenant 是一个.NET 开发的 C2(command and control) 框架,使用.NET Core 的开发环境,不仅支持 Linux,MacOS 和 Windows,还支持 docker 容器。

最特别的地方是支持动态编译,能够将输入的 C#代码上传至 C2 Server,获得编译后的文件并使用 Assembly.Load() 从内存进行加载。

本文仅在技术研究的角度,介绍 Covenant 的细节,分析特点。

0x01 简介

本文将要介绍以下内容:

  • Covenant 的启动方法
  • Covenant 的功能介绍
  • Covenant 的优点
  • Covenant 的检测

0x02 Covenant 的启动方法

1.Windows 系统

需要装对应版本的.NET Core、ASP.NET Core 和 SDK

经测试,Covenant 需要.NET Core 2.2.0、ASP.NET Core 2.2.0 和 SDK 2.2.101,其他版本会报错

下载地址:

安装 Git for Windows

下载并启动:

git clone --recurse-submodules https://github.com/cobbr/Covenant
cd Covenant/Covenant
dotnet build
dotnet run

访问 https://localhost:7443 进入控制面板,第一次使用时需要注册用户

这里可以注册多个用户,实现团队协作

注:

Elite 是与 Covenant 服务器进行交互的命令行程序,目前已经临时弃用,地址:https://github.com/cobbr/Elite

0x03 Covenant 的功能介绍

Covenant 支持的功能可参考:https://github.com/cobbr/Covenant/wiki

这里只介绍个人认为比较重要的部分

1. Listeners

只支持 HTTP 协议,可以指定 url 和通信消息的格式

选择 Listeners -> Profiles ,默认包括两个配置模板,如下图

Alt text

配置模板中可以设置多个 HttpUrls,Grunt 在回连的时候会从 HttpUrls 中随机选择

注:

Grunt 用作部署到目标,作为被控制端

HttpRequest 和 HttpResponse 的内容都可以指定

配置模板对应源码文件的位置: .\Covenant\Covenant\Data\Profiles

2. Launchers

用于启动 Grunt,包括以下 9 种启动方式:

(1) Binary

.NET 程序集,格式为 exe 文件

(2) PowerShell

命令行下通过 Powershell 启动 Grunt

将.NET 程序集保存在数组,通过 Assembly.Load() 在内存进行加载

代码示例:

[Reflection.Assembly]::Load(Data).EntryPoint.Invoke(0,$a.ToArray())

(3)MSBuild

命令行下通过 msbuild 启动 Grunt

启动命令示例:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe GruntStager.xml

将.NET 程序集保存在数组,通过 Assembly.Load() 在内存进行加载

代码示例:

System.Reflection.Assembly.Load(oms.ToArray()).EntryPoint.Invoke(0, new object[] { new string[]{ } });

关于 msbuild 的用法可参考之前的文章 《Use MSBuild To Do More》

(4) InstallUtil

命令行下通过 InstallUtil 启动 Grunt

注:

我在测试的时候这里产生了 bug,生成的文件名称为 GruntStager.xml ,里面保存了 base64 加密的.NET 程序集

按照我理解的 InstallUtil 的用法,这里应该生成一个.cs 文件

查看 Covenant 的源码,生成模板的源码位置: .\Covenant\Covenant\Models\Launchers\InstallUtilLauncher.cs

对应的链接:https://github.com/cobbr/Covenant/blob/master/Covenant/Models/Launchers/InstallUtilLauncher.cs

模板中包括.cs 文件的内容,如下图

Alt text

这里可以将 CodeTemplate 的内容另存为.cs 文件,并把其中的 "{{GRUNT_IL_BYTE_STRING}}" 替换成 base64 加密的.NET 程序集,最终保存成 test.cs

启动命令示例:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /unsafe /out::file.dll test.cs
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=false /U file.dll

(5) Wmic

启动命令示例:

wmic os get /format:"file.xsl"

注:

Covenant 在此处提示这个方法也许无法在 Windows 10 和 Windows Server 2016 下使用

将.NET 程序集保存在数组,通过 DotNetToJScript 的方法在内存进行加载

代码示例:

var o = delegate.DynamicInvoke(array.ToArray()).CreateInstance('Grunt.GruntStager');

(6) Regsvr32

启动命令示例:

regsvr32 /u /s /i:file.sct scrobj.dll

注:

Covenant 在此处提示这个方法也许无法在 Windows 10 和 Windows Server 2016 下使用

将.NET 程序集保存在数组,通过 DotNetToJScript 的方法在内存进行加载

关于 Regsvr32 的用法可参考之前的文章《Use SCT to Bypass Application Whitelisting Protection》

(7) Mshta

启动命令示例:

mshta file.hta

注:

Covenant 在此处提示这个方法也许无法在 Windows 10 和 Windows Server 2016 下使用

将.NET 程序集保存在数组,通过 DotNetToJScript 的方法在内存进行加载

关于 Mshta 的用法可参考之前的文章 《渗透技巧——从 github 下载文件的多种方法》

(8)Cscript

启动命令示例:

cscript file.js

这里借助了 DotNetToJScript,其他内容同上

(9) Wscript

启动命令示例:

wscript file.js

这里借助了 DotNetToJScript,其他内容同上

以上 9 种启动方式都可选择以下两个模板:

(1) GruntHTTP

使用 HTTP 协议同 C2 server 进行通信

执行后反弹连接至 C2 server

可设置以下参数:

  • ValidateCert
  • UseCertPinning
  • Delay
  • JitterPercent
  • ConnectAttempts
  • KillDate
  • DotNetFrameworkVersion

(2) GruntSMB

使用命名管道,不直接同 C2 server 进行通信,而是在各个 Grunts 之间进行通信

执行后在本机创建命名管道,可通过其他的 Grunt 进行远程连接

这里多了一个配置参数:

SMBPipeName

使用示例:

GruntSMB 为内网使用,可通过其他的 Grunt 进行激活,激活方式:

Grunt:<id> -> Task -> Connect

如下图

Alt text

3.Grunts

所有 Grunts 的列表,可向 Grunt 发送控制命令

(1)Info

包括 Grunt 的基本信息

(2)Interact

命令行的控制页面

(3)Task

Grunt 支持的功能,内置了多个开源工具:

(4)Taskings

记录每条命令的执行情况

4.Templates

Grunt 的模板文件,默认包含了 GruntHTTP 和 GruntSMB

这里可以修改模板文件或者添加新的模板文件

5.Tasks

Task 的模板文件,作为 Grunt 支持的功能,内置了多个开源工具:

这里可以修改模板文件或者添加新的模板文件

6.Taskings

记录所有 Grunts 的命令执行情况

7.Graph

图形化页面,展示 Grunt 和 Listener 的连接关系

8.Data

展示从 Grunt 获得的有价值信息

9.Users

管理登录用户,用作团队协作

0x04 Covenant 的优点

1.C2 Server 支持多平台

C2 Server 不仅支持 Linux,MacOS 和 Windows,还支持 docker 容器

2.扩展性高

可自定义通信协议,自定义启动方式,自定义功能等

3.扩展的功能可直接在内存执行

通过动态编译,C2 Server 能够对代码进行动态编译后发送至目标并使用 Assembly.Load() 从内存进行加载

4.支持内网通信,统一流量出口

在内网各个被控制端之间通过命名管道进行通信,统一流量出口,隐藏通信通道

5.便于团队协作

支持多用户,能够共享资源

0x05 Covenant 的检测

1.检测.NET 程序集的运行

因为需要使用 Rosyln C#编译器,所以会引用 Microsoft.CodeAnalysis 程序集

这里可以尝试从指定进程中收集.NET 事件,参考脚本:https://gist.github.com/cobbr/1bab9e175ebbc6ff93cc5875c69ecc50

2.检测命名管道的使用

检测命令管道远程连接的流量

命令管道远程连接会产生 Event ID 18 的日志,参考地址:https://github.com/hunters-forge/OSSEM/blob/master/data_dictionaries/windows/sysmon/event-18.md

3.HTTP 通信流量

默认的通信模板存在特征,如下图

Alt text

0x06 小结

本文介绍了 Covenant 的细节,分析特点,Covenant 的可扩展性很高,能够很方便的做二次开发。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
26 人气
更多

推荐作者

alipaysp_snBf0MSZIv

文章 0 评论 0

梦断已成空

文章 0 评论 0

瞎闹

文章 0 评论 0

寄意

文章 0 评论 0

似梦非梦

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文