Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

Covenant C2 框架:完整教程

Covenant C2 框架:完整教程

Mar 17, 2023

Covenant 是最新且最出色的命令与控制(Command and Control,C2)后渗透(post-exploitation)框架之一。本文将带您完成配置 Covenant 的过程,并说明如何使用它在受损主机上执行载荷(payload)。

注意: 本文展示的是截至 2019 年 9 月中旬 Covenant 的能力。

1. 安装 Covenant

首先,我们需要在一台主机上安装 Covenant,该主机既将作为 Covenant 数据库,也将作为管理应用程序,用于控制应用程序代理(application agents),这些代理被称为 grunts

先决条件

在这篇博客文章中,我是在 Windows 10 工作站上安装了 Covenant,但任何支持 .NET Core 的较新 Windows Server 操作系统或 Linux 发行版也同样完全可以胜任。

必须在承载 Covenant 的机器上安装以下应用程序:

安装流程

鉴于 Covenant 采用了现代的跨平台架构,它并不提供那种老式的安装程序可执行文件。相反,我们需要克隆项目的 git 仓库,然后使用以下命令构建并运行该应用程序:

      git clone --recurse-submodules https://github.com/cobbr/Covenant

cd Covenant/Covenant

dotnet build

dotnet run
      
Image

此外,我们也可以在 Docker 容器中运行 Covenant。

2. 创建账户。

当 Covenant 服务启动并正常运行后,我们可以通过默认 Web 端口 7443 打开 Covenant 应用界面。系统会提示我们设置用户帐户:

Image

完成注册流程后,我们将被重定向到“User Management(用户管理)”页面:

Image

左侧的菜单可让我们浏览 Covenant 的各项功能。

3. 配置一个监听器。

监听器可让 grunts 与 Covenant 应用程序进行通信。开箱即用时没有配置任何监听器,因此需要自行配置一个。点击 Listeners(左侧菜单)以打开“监听器”页面:

Image

然后点击 Create 按钮以打开“创建 HTTP 监听器”页面:

Image

我们需要更新提供的几个值:

  • Name — 默认情况下,Covenant 会提供一个简单的“GUID”类型名称。你可以随意将其更改为更易读的内容。
  • BindAddressConnectAddress — 请确保这两个都指定了 grunts 可访问到的地址。
  • UseSSL — 如果你想使用 SLL,你需要指定一个 SSL 证书文件和密码。

配置完成后,点击 Create 按钮以创建并启用监听器。

4. 创建一个启动器(launcher)。

接下来,我们需要创建 launcher。launcher 用于将远程主机转换为 grunts,并将它们连接到 Covenant 应用程序。它们通常以在远程主机上运行的载荷(payload)包形式提供。每个 launcher 都与一个监听器(listener)配对。

在“用户管理(User Management)”页面左侧菜单中,点击 Launchers。您将看到一份不同类型的启动器(launcher)列表。用于生成自定义二进制文件的 Binary launcher 是最容易使用的启动器之一,因此我们先选择 Binary 作为我们的第一个启动器。

Image

将打开配置页面:

Image

指定以下配置选项:

  • Listener — 指定新启动器(launcher)将使用的监听器(listener)。我们使用之前创建的 HTTP listener:
Image
  • Template — 我们使用开箱即用的模板 GruntHTTP
Image
  • 延迟 和 抖动 — 这些设置用于控制一个 grunt 与 Covenant 通信的频率。我们可以保留默认值。
  • 连接尝试次数 和 终止日期 — 这些设置用于控制 grunt 何时会停止尝试与 Covenant 通信。再一次,我们可以保留默认值。

配置完成后,点击 Generate 按钮以创建新的启动器,并返回到配置页面。

5. 通过执行启动器来创建一个 grunt。

接下来需要保存启动器有效载荷:点击 Download,然后点击 Save File

Image

接下来,将已保存的文件复制到目标主机并执行它。

新注册的 grunt 将出现在 Covenant 的仪表板中:

Image

6. 为 grunt 分配任务。

在“用户管理”页面的左侧菜单中,点击 Grunts,然后打开我们刚刚注册的 grunt。Info 选项卡将提供其连接状态和功能的详细信息:

Image

要为我们的 grunt 分配任务,我们需要点击 Task 选项卡。

示例 1:截取屏幕截图。

首先,假设我们希望让 grunt 对活动用户的桌面进行截图。我们从“任务”下拉列表中选择 Screenshot,然后点击下面的 Task 按钮,立即在 grunt 上执行此操作:

Image

刷新页面以查看更新后的任务状态。它将显示任务已完成,并提供其输出结果;在本例中,输出只是一个截图。请注意,任务的输出取决于任务的类型。

Image

示例 2:运行 Mimikatz。

让 grunt 执行另一个任务:运行 Mimikatz

我们需要返回到我们这种“grunt”(僵尸/代理)详情页面的 Tasks(任务)选项卡。然后我们将从“Task”下拉菜单中选择 Mimikatz

许多任务都有一组可自定义的输入参数。Mimikatz 任务有一个“Command”(命令)输入参数,可以让我们指定要执行哪条 Mimikatz 命令。方便的是,它已经预先填充了 sekurlsa::logonPasswords 这一命令,用于发现内存中保存的密码。让我们把这个任务分配给我们的 grunt,看看会发生什么。

碰巧的是,这台 grunt 主机上已经登录了一个 Domain Admin 账户——因此在任务输出中,我们可以看到 Domain Admin 的密码以明文形式显示出来!

Image

使用 Covenant 运行 Mimikatz 有助于对手避免被检测,因为 Covenant 不会将任务直接存储在 grunt 主机上。相反,它会在下发任务的时刻,通过其客户端连接动态编译并部署任务载荷(payload)。此外,每当创建新的 grunt,或将新的任务分配给某个 grunt 时,相关代码都会被重新编译并使用 ConfuserEx 进行混淆,从而避免更容易被发现的静态载荷。事实上,当我在本机上执行这里的步骤时,Windows Defender 已启用且保持最新,但 grunt 的 Mimikatz 任务仍然毫无问题地执行了。

查看任务历史和输出。

Covenant 会提供它已执行任务的清晰历史记录。在“用户管理”页面左侧菜单中,点击 Taskings

Image

您可以看到我们之前运行的“截图”任务和 mimikatz 任务。单击任意一行,即可查看该任务的参数以及完整输出。

请注意,许多任务也会将其输出的部分内容保存到 Data 页面。单击各个选项卡以查看凭据、指标、下载的工件以及截图。例如,以下是我们 Mimikatz 任务发现的凭据:

Image

这也是我们其他任务捕获的截图:

Image

示例 3:下载文件。

现在,我们在 grunt 上再运行一个任务来下载文件,这样我们就可以在 Downloads 选项卡中查看它。

假设我们已经发现,grunt 主机上有一个名为 MySecretDocument.txt 的文件。让我们使用 Download 任务来获取这份文件的副本吧!

Image

运行此任务将检索文件副本,并立即在 Downloads 选项卡中提供:

Image

该任务本身很简单,但由于我们可以使用执行 grunt 启动器的用户权限来运行此任务,或使用通过其他任务获得的凭据,因此具有一些引人入胜的使用场景。

结论

Covenant 已经提供了种类繁多的任务,并且由于开放源代码社区的参与,该任务清单每天都在增长。这个项目很可能拥有令人兴奋的未来,当然也值得一看!

分享到

了解更多

关于作者

Asset Not Found

Joe Dibley

安全研究员

Netwrix 的安全研究员,并且是 Netwrix Security Research Team 的成员。Joe 是 Active Directory、Windows 以及各类企业软件平台与技术方面的专家;他/她研究新的安全风险、复杂的攻击技术,以及相应的缓解措施与检测方法。