Covenant是一个.NET命令和控制框架,旨在突出.NET的攻击面,在Covenant的帮助下,研究人员可以更加轻松地去利用.NET的攻击面,而且它还可以作为红队研究人员的协作命令和控制平台

0x01 Covenant安装

项目地址:

1
https://github.com/cobbr/Covenant

Covenant提供了两种安装方法:https://github.com/cobbr/Covenant/wiki/Installation-And-Startup,这里采用Docker安装方式。

构建Docker镜像:

1
2
3
4
5
git clone --recurse-submodules https://github.com/cobbr/Covenant

cd Covenant/Covenant

docker build -t covenant .

接下来,在Docker容器中运行Covenant,确保已经将”</absolute/path/to/Covenant/Covenant/Data>”替换成了我们的绝对路径:

1
docker run -it -p 7443:7443 -p 80:80 -p 443:443 --namecovenant -v </absolute/path/to/Covenant/Covenant/Data>:/app/Data covenant

-it参数是Docker参数,指示我们应该在交互式tty中开始Covenant,如果您不想附加到tty,可以将其排除。

这些-p参数将端口公开到Covenant Docker容器。您必须公开端口7443和要启动侦听器的任何其他端口。

-v参数在主机和容器之间创建一个共享的数据目录。确保指定数据目录的绝对路径,相对路径将不起作用。

一定要把Covenant 映射到docker镜像里面对应的目录,如果没有的话,就跑不起来,因为所有的功能模块都在Data目录里面

注意:如果你是Mac系统那么绝对路径需要去docker Preferences中的File Sharing中添加一下

运行下列命令即可终止容器运行:

1
docker stop covenant

运行下列命令即可重启容器:

1
docker start covenant –ai

如果你需要移除所有Covenant数据并进行初始化恢复,可以运行下列命令:

1
2
docker rm covenant
docker run -it -p 7443:7443 -p 80:80 -p 443:443 --namecovenant -v </absolute/path/to/Covenant/Covenant/Data>:/app/Data covenant--username AdminUser --computername 0.0.0.0

通过安装,可以看到已经跑起来了

启动Covenant之后,我们需要通过Web接口完成初始用户注册:

0x02 配置使用Covenant

注册用户登录后进入

接下来说一个各个模块的使用方法:

1
2
3
4
5
6
7
8
9
10
Dashboard      #主视图和你登陆时看到的第一个东西。你可以很快地看到你得到的活跃的Grunts,当前活跃的监听器,以及一些最近分配给Grunts的任务。
Listeners #提供用于管理监听器和监听器配置文件的界面。
Launchers #提供用于创建,托管和下载启动器的界面,以用于启动新的Grunts。
Grunts #显示一个表格,以查看所有活动和不活动的Grunts,以及与Grunts进行交互并为其分配新任务。
Templates #植入模板 可自定义很多payload模板
Tasks #任务内置Mimikatz等很多模块执行多种任务,也可自行定制
Taskings #显示一个表格,以查看分配给Grunts的所有任务。
Graph #提供图形视图以可视化监听器,Grunts和对等图形。
Data #提供有关在操作过程中从Grunts 收集的数据的视图,例如凭据,指示器和下载的文件。
Users #提供用于用户管理和创建的界面。

Dashboard:仪表盘

Listeners:监听器

单击Create新建一个监听器

HTTP监听器配置:

1
2
3
4
5
6
7
Name   #将在整个接口中使用的监听器的名称。选择一些可识别的东西!
BindAddress #BindAddress是监听器将绑定到的本地ip地址。通常,这个值是0.0.0.0。
BindPort #监听器需要绑定的端口
ConnectPort #ConnectPort是Grunts将直接连接到的回调端口
ConnectAddress #ConnectAddress是Grunts将直接连接到的回调地址
UseSSL #是否启动SSL证书
HttpProfile #HttpProfile决定了Grunt和Listener通信的行为,大家可以自行修改

选择默认配置,直接新建一个

这里还有一个选项为Profiles这个里面为监听器的配置文件,大家可以自行修改调试。默认现在有四个Profile,选择默认的来看看。

这里可以定制HttpUrls访问地址,如果url你只定制一个如index.html很容易被发现,定制多个url这样访问的是随机的。

MessageTransform这里的类名称,方法名不用变,里面的内容可以替换。这个就是说你真正要传输的内容,可以自定义进行加解密,比如说你要把mimikatz的结果传回来,那么你可以在这里自定义各类加解密的方式。这里就比CobaltStrike好一点,CobaltStrike它只给你限定了几种方法,就那几种,Covenant就可以想用什么样的加解密都可根据你自己的需求来。

HttpRequestHeaders请求头这里GUID给放在了cookie里面,也可以增加多个头,HttpPostRequest回传,这个Data就是实际的回传内容。

Launchers:启动器

启动器用于启动GruntCovenant支持9种启动方式,大家在web页面上能看见名称和介绍

这里要说一下Grunt这种都会分是否进行staging,相当于一个shellcode在里面,一般叫Loader, Loader负责与Team server端。相当于一个中间转发端,这个Loder会去Team server端去拉取真正的core dll 把它拉到内存里去执行,为一个stager的过程。 stager一般都是不具备独立运行的,这里需要一个launcher加载器,相当于一个bootstrop引导程序,引导程序是可以运行的。

具体的各种启动方法,大家可以参照systemino大佬的文章:

1
https://blog.csdn.net/systemino/article/details/102901790

Binary启动方式:

我们单击Binary名称进入配置页面,Binary默认生成一个.NET的程序集,就是把stager生成成一个Binary,首先先选择我们之前建立的监听器

下一个是需要选择通信模板,官方提供了三个,一种是HTTP,一种是SMB。如果监听器选择的是走HTTP的,那么模板也选择HTTP的,如果是SMB的那么就选GruntSMB的。SMB在内网用的比较多,用其他机器可以通过另外一个已经运行了这个Grunt的机器,通过它来上网,而不直接外连,走SMB协议。

KillDate在实际渗透当中比较有用,它的意思是会在指定的时间点达到的时候会自动杀掉,比如在实际情况中因为某些网络原因把权限给丢了,连不上了,但这个时候你的Grunt还在目标机器上跑着,这个时候很容易被人发现,这个时候设置一个KillDate可以防止被发现的风险

1
2
3
4
5
6
7
Listener      #为监听器
Template #为通讯模板
Delay #为延迟
JitterPercent #为抖动时间
ConnectAttempts #为尝试连接时间
KillDate #为杀死进程时间
DotNetFrameworkVersion #为.net的版本

这里我就选择默认的配置,监听器选择http的,模板也选http,.net版本为4.0,单击Generate即可成功生成,点击Download即可下载可执行文件

Code可以直接看到生成的代码,对于修改非常方便,是一个特色功能点

我们可以去靶机里测试即可上线

可以看到在Grunts已显示成功上线

Grunts:

Grunts里会显示所有的受控主机,并可以像受控主机发送命令及分配任务。

我们点击相应的名称即可进入对应主机的控制页面。

Info:info标签页会显示受控主机的所有信息,在底部的Edit按钮可对其进行修改。

Interact:Interact标签内可与主机进行交互,例如执行系统命令:shellcmd ipconfig

Covenant内置了多种命令和工具都可以在此处与主机进行交互(详情见Tasks)

使用help和查看所有命令的介绍

Task:Task标签主要用来对目标该目标下发任务

我们可以选取自己所需要的的脚本来执行

我这里选择一个扫端口的来演示一下,扫描的目标和端口都可以自定义

点击Task执行,扫描的结果会在弹出的任务页里显示,同时也会在Interact里显示详情

Taskings:Taskings标签主要用来查看该主机任务分配的情况,就是一个记录自己执行过的操作,相当于一个历史记录

点击各个任务的名称会显示任务详情

Templates:

Templates里会显示现已有的Grunt通讯模板,当然如果有需要的话也可以自己添加和修改。

Tasks:

Tasks里会显示已有的任务,例如绕过UAC、MImikatz等,可以在Grunts里与目标主机直接进行交互发送任务。同时在各个任务名称的右侧会描述出各个任务的作用。

如果有自己需要的插件可以点击Create进行添加,它的这个扩展功能是非常好的一个特色,你默认只要是按照它的一个要求去写好你的一个C#工程或者说是现有的从github上下载或找到比较好的C#内网渗透的工程或者是红队相关的,可以非常轻松到可以加入到里面

Taskings:

Taskings里会显示所有Grunt里目标主机的任务分配情况,单击名称即可查看任务详情。

Graph:

Graph里用图形化界面展示Grunts目标主机和Listeners监听器的连接关系。

Data:

在Data里会显示,凭证、指标、下载、截图

Credentials为已经在目标主机里获取到的账号密码、Hash、票据信息

Indicators为目标指标、网络指标、文件指标

Downloads为已从目标主机上下载的文件

Screenshost为已截取的目标主机桌面图

User:

User里可以添加和管理Covenant账户

参考链接:

https://www.freebuf.com/articles/system/213672.html

https://mp.weixin.qq.com/s/L5MNcYhzgPc6-l7biDf0Sg