Covenant 利用分析

发布于 2024-08-06 20:58:32 字数 10028 浏览 34 评论 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技术交流群

上一篇:

下一篇:

发布评论

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

关于作者

0 文章
0 评论
22 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

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