Covenant 利用分析
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,其他版本会报错
下载地址:
- https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.101-windows-x64-installer
- https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-installer
- https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.0-windows-x64-asp.net-core-runtime-installer
安装 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
,默认包括两个配置模板,如下图
配置模板中可以设置多个 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 文件的内容,如下图
这里可以将 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
如下图
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 通信流量
默认的通信模板存在特征,如下图
0x06 小结
本文介绍了 Covenant 的细节,分析特点,Covenant 的可扩展性很高,能够很方便的做二次开发。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: SharpGen 利用分析
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论