如何构建自己的自定义 C2 框架

admin 2024年4月20日01:30:52评论6 views字数 6924阅读23分4秒阅读模式

强制性免责声明:此处提供的所有信息均用于研究目的,只能以合法和合法的方式使用,作者不对任何不当行为或非法活动负责。

TL;DR:C2 框架可以像你想要的那样简单,在本例中,它只有 3 个组件:一个用于在主机上执行命令的花哨的 while 循环,一个用于将基本命令发送到 flask 脚本的花哨 Web 界面,用于处理来自/发送到代理和接口的命令和结果的 flask 脚本

  • 如何构建自己的自定义 C2 框架

如何构建自己的自定义 C2 框架

介绍

在这篇文章中,我们将讨论创建命令和控制 (C2) 框架的过程。我们将在这里采用的方法将围绕在端点上设置一个轻量级代理,并让它回调到服务器以接收和发送命令。

有一百万种不同的方法可以做到这一点,但以上是我选择的方法。这个项目的主要思想和方法始于我对 t3l3machus [001] 的 hoaxshell 定制版本的需求。

那么,我们在这个项目中满足的需求是什么:我需要一个小型的轻量级反向 shell 设置,它可以绕过 EDR 并在远程系统上执行代码。为此,一个简单的 PowerShell 代理就足够了。我还需要一些基础设施来控制这个代理。最初,这是通过终端完成的,但对于项目的下一阶段,我们将设置一个 Web 应用程序来处理用户交互。代理和基础结构主要用于内部渗透测试,以便在服务器上执行代码,但也可用于轻量级初始访问。除此之外,我还希望服务器支持参与工具的文件托管,而不必在不同的端口上运行两个不同的服务器。

其他灵感

以下是该项目的其他灵感来源列表

  • Havoc C2 框架 - https://github.com/HavocFramework/Havoc

  • 使用 Nim 构建 C2 植入物 — https://casvancooten.com/posts/2021/08/building-a-c2-implant-in-nim-considerations-and-lessons-learned/

  • 在 c++ 中构建 c2 框架 — https://shogunlab.gitbook.io/building-c2-implants-in-cpp-a-primer

先决条件

为了充分利用这篇文章,以下技能将形成一个很好的基础:

  • 具有全栈开发的基本经验

  • 基本的渗透测试经验——即以前尝试过Metasploit

  • 编程知识

但是,由于这个主题不是最先进的,因此您应该能够阅读和理解我们在这里的目的,而不会遇到太多麻烦。

基本概念

为了确保我们都在同一页面上,以下是本文中使用的术语的简要概述以及不同术语的使用方式,因为其中许多术语经常互换使用,如果列出一些标准定义,对我们所有人来说都会容易得多:

  • 特工 — 这是在受害者身上运行的代码,通常也使用术语植入物,这些是你的:meterpreter shells、covenant beacons、covenant grunt 等,所以什么将运行我们的命令。

  • 服务器/后端/API — 一些代码/基础设施,侦听传入请求,在本例中,这将是指后端处理来自代理的传入请求和通过前端的用户交互。

  • 前端 — 这是用户/操作员将用于与代理和底层基础设施进行交互的 Web 组件。

要求

所以现在结束了,让我们开始设置我们的要求:

  • 我们需要一个在 Windows 主机上运行的简单代理,以及一种在没有 EDR 捕获的情况下生成它的方法。

  • 我们需要一个强大的后端来处理代理 - 这需要能够处理多个会话/代理。

  • 我们需要一个漂亮的前端来完成我们的工作,即它需要看起来很酷的屏幕截图。

  • 我们需要一种方法来托管和访问要在参与期间使用的文件。

除了这些功能要求外,生产软件还需要以下几点

  • 强大的错误处理

  • 记录访问尝试

  • 记录命令和输出,带有时间戳

  • 敏感终结点和数据的身份验证

因此,现在我们有了一般要求,我们可以在开始项目开发之前继续进行设计和最后一条信息。

建筑

因此,现在我们对我们正在尝试做什么以及我们将使用的工具有一个大致的了解,以实现在远程主机上执行命令的目标,而无需从桥上跳下来......为此,我提出了以下解决方案,深受他人伟大工作的启发。这些框架或语言都不是特别重要,如果你想用同样可行的普通PHP创建一切,或多或少每种语言都可以使用。

当你选择了你选择的武器时,现在是时候考虑一下一切将如何结合在一起了。

代理

从最简单的部分开始,代理。这只是一个执行 GET 和 POST 请求的美化 while 循环。GET 检索要执行的命令,POST 发送结果。状态管理是通过标头完成的。具体来说,有两个标头,第一个标头具有命令的“ID”,这有助于管理执行的命令并确保结果存储在正确的位置。第二个是代理的 ID,最后一个充当身份验证令牌,如果不存在,API 将不会响应。就是这样,这可以随心所欲地复杂或简单,你可以用 C 从头开始创建所有内容,或者像我一样只有一个 PowerShell 脚本。我选择了 PowerShell,因为它很容易,而且因为我需要代理在我可以复制和粘贴到我需要的地方。

前端

接下来是你最会盯着看的部分......无论是用于开发还是用于一般用途......前端!这里的功能是迄今为止最简单的,我们只是希望在某个地方可以大致了解我们部署的代理,向他们发送命令并查看结果。听起来很简单!...而且,这里没有什么花哨的,你可以让一切变得像你想要的一样简单或复杂。我最终花了很多时间在这里实现舒适功能,例如漂亮的自我更新概述、后端的事件和警报显示,以及用于生成代理的漂亮界面,允许选择不同的功能和要求。甚至比代理商更重要的是,这是您可以发挥创造力的地方,并且或多或少地将所有时间花在添加功能并根据自己的喜好调整所有内容上。同样,只要您对它感到满意并知道如何让它为您工作,框架就无关紧要。

要记住的另一件事是,这是屏幕截图的来源,因此请确保它看起来足够酷;)

API/后端

这将确保所有内容都同步,并将负责从代理生成到代理和前端身份验证的所有内容,它将生成事件日志并跟踪发送、接收和执行的命令,它将处理代理的会话等。

听起来像是一大口......确实如此,但将其分解为单独的组件实际上表明,尽管听起来很复杂,但实现相当简单。那么你可能会问这些组件是什么,让我告诉你:

  • 将数据发送到前端 - 这可以是从代理会话到新 shell 的所有内容。在这里,对信息的不同要求被拆分为不同的端点

  • 身份验证 — 这是为代理和前端完成的,前端身份验证是通过 react 路由完成的,该路由根据后端的烧瓶会话检查会话。还对代理进行身份验证,但此处的身份验证基于创建代理时设置的标头。每当生成代理时,都会存储此会话标识符以供以后参考

  • 事件记录 — 每当发生事件或警报时,它都会打印在终端中,添加到字典中以显示在前端,并记录到本地文件中以进行审计

  • 向代理提供命令 — 这里后端只有一些端点来接收结果和发送命令,这里还有一些逻辑可以注册,如果之前看到过代理(还将验证会话标头以检查身份验证),如果没有,则会话将被添加到活动会话列表中。此外,数据结构也进行了更新,以跟踪包含此处所有信息的命令。

这涵盖了 API 的功能。

它们将如何协同工作?

因此,现在我们对将要组合在一起的组件有了更好的了解。他们将如何互动?好吧,这部分最终成为整个项目中最简单的。前端将只处理烧瓶 API,并发送信息请求、为代理发送的命令以及生成 shell 的请求。代理还将对 Flaask API 执行所有 GET 和 POST 请求。然后,Flask API 将负责协调从登录到前端到代理生成和提供文件的所有内容,正是这一点需要暴露给代理将从中调用的网络。

这澄清了吗?不。。。好的,那么让我们为代理和后端 API 的典型工作流程制作一些图表,我不会处理前端,因为这只是一个从 API 获取和放置一些数据的常规网站(为此,我发现博客文章“如何创建 React + Flask 项目”[005] 对于初步了解设置非常有用):

如何构建自己的自定义 C2 框架

代理服务器通信的工作流

现在,在看到所有这些考虑的结果之前,让我们先看看最后的细节。

选择的编程语言

我为这个项目选择的编程语言,这些语言是我很舒服的,并且通常遵循不用新语言创造新东西的口头禅。因此,我选择 ReactJs 作为前端,选择 Python 烧瓶作为后端。

选择 ReactJs 作为前端而不是 HTMX 或 Laravel 或类似工具的原因是,我想要一些有据可查的东西,我可以快速迭代,并且性能和可维护性不是一个大问题,因为未来的更新可能会从重大的返工和改进开始。

至于 Python 烧瓶,很简单,我知道它,我很了解它,并且可以在短时间内启动一个应用程序。它易于理解、实施和阅读。由于所有逻辑都是通过 API 在后端完成的,这意味着“困难”的部分可以相当顺利地完成。

为什么没有代码片段?!

到现在为止,您可能已经向下滚动了这篇文章,并想知道为什么没有代码可供您复制和粘贴。答案很简单:因为它并不难。如果你知道如何编程,这个项目没有什么特别困难的。我们或多或少只是使用后端 API 设置一个 Web 服务器。这些东西中的大多数都可以从堆栈溢出中“借用”,或者你可以让 ChatGPT 为你做这件事......所以别再偷懒了。

防御规避

对于防御规避,我们没有做任何太有趣或太复杂的事情。如前所述,我们基于 hoaxshell [001] 的一般方法,此外,我们还根据 t3l3machus 的“PowerShell 混淆圣经”[006] 为我们的脚本添加了一些混淆。

还可以根据需要添加其他技术,如AMSI旁路等。然而,这里[007]将不涵盖这一点。

所以,总而言之,规避部分,我们在这里要的不是任何花哨的解钩或“主动”规避,而我们只是让反向壳总是不同的,因此不受字符串匹配防御机制的影响。

概念验证

基本实现

在我们计划好了细节并对我们的目标有了总体了解之后,剩下的就是“只是”实施它。这需要一段时间,没有办法。在这一点上,我基本上是在学习前端和 API 开发。幸运的是,这两个方面比我的其他一些项目(如rootkit开发)更容易,也更有据可查。所以没花那么长时间。以下是 Web 前端第一版的一些屏幕截图,然后用 CSS 让一切看起来都很花哨。

在你问之前,“漂亮”的颜色只是为了让你更容易弄清楚页面上不同元素的布局。

如何构建自己的自定义 C2 框架

用于通信和查看代理结果的主窗口

如何构建自己的自定义 C2 框架

用于生成带有混淆选项的反向 shell 的接口

如何构建自己的自定义 C2 框架

原型接口,用于多个端口供反向 shell 通信 — 后来废弃

如何构建自己的自定义 C2 框架

用于在参与期间下载文件的托管页面

上述资产将成为应用程序的核心,用于正确设置所有内容并实现基本功能。

CSS的魔力

现在你可能会坐在那里想哇!...这看起来有点狗屎..你是对的。幸运的是,这一切都可以通过CSS的魔力来解决。CSS 是危险的,因为如果不加以控制,微调应用程序的这一部分所花费的时间或多或少是无限的。但是,我仍然认为在这里花一些时间仍然是一个好主意,因为这会使您的前端从看起来像 90 的东西变成看起来半体面和可用的东西。另外,这可能是应用程序的唯一部分,您将向其展示它的大多数人都会看到它。

所以,花了一些时间让一切看起来都不错,我最终得到了这样的前端(请注意,“响尾蛇”是我选择称呼整个项目的方式):

如何构建自己的自定义 C2 框架

CSS更新后的主页

如何构建自己的自定义 C2 框架

CSS 更新后的反向 shell 生成页面

如何构建自己的自定义 C2 框架

CSS 更新后的 Web 文件共享

部署

所以现在我们已经启动并运行了一些很好的东西,但是我们如何在参与中使用它呢?如果您像我们其他人一样,那么您将在每次参与中使用新的虚拟机。为此,我刚刚创建了一个基本的 bash 脚本来为我排序所有内容,其内容最终看起来有点像这样:

# general system update
sudo apt-get update
# download
git clone https://<PAT>@github.com/<GithubUsername>/SIDEWINDER
# Move to dir
cd SIDEWINDER
# flask setup
pip install flask_session
# reactjs setup
cd src
sudo apt install npm
npm install


对于启动服务器,使用以下命令

# start servers
cd api
flask --app api_main run --host=0.0.0.0
cd src
npm start

这就像这里的其他事情一样,可以用一百万种不同的方式完成,我可能会根据不断变化的需求和使用这个东西的经验来改变我的方法。为了在GitHub上设置特权访问令牌(PAT),我遵循了本指南[008]。

渗透测试

由于我们正在创建一个应用程序,该应用程序将保存潜在的敏感信息和对系统的访问。检查事物是否已安全设置和创建可能是个好主意。因此,测试最常见的问题和痛点可能是个好主意。对于这样的应用程序,主要的痛点可能是:

  • 未经授权的访问和 IDOR。

  • 弱加密和凭据。

  • 信息披露。

  • 代理和用户的访问控制,包括前端和后端。

如果不确定,只需浏览 OWASP 前 10 名,这应该涵盖大多数问题。此外,还值得考虑设置的部署,例如基于已知 IP 地址等限制访问和系统强化。

改进点

那么,在这一切之后,还有什么可以改进的呢?这不会是深入的,也不会旨在涵盖所有内容,只是可以大大改善用户体验的大件项目:

  • CSS 和 Web 界面——这是无限改进项目,我想你可能会一直在这里呆下去,直到宇宙的热寂。但对于这个项目,有几个关键的改进很突出,例如当在主菜单中选择新会话时,控制台/终端也应该更新。其他方面,例如能够按下键盘以执行最后一个命令也非常好。CSS可以更好,更精致......而且这个名单还在继续。

  • ReactJS— 由于这是我第一次使用 JS 框架制作合适的 Web 界面,因此这里选择的一些代码和解决方案肯定可以改进,变得更加模块化和整体更好。

  • Flask — 由于我习惯于使用 Python,这部分进展得相当顺利,但仍然有一堆重复代码、缺乏日志记录和缺少错误处理,总的来说,只是进行一般清理会很好。

  • 可维护性 — 该项目在很大程度上是概念证明,需要一些返工才能使其可维护和稳定。

...还有更多。正如我之前提到的,你或多或少总能找到一些事情要做,一些事情要改变。但就目前而言,我有一个可行的 PoC 可供使用,这里的关键是不要将其打磨到您害怕做出重大更改的程度。此外,我发现另一件重要的事情是创建一个 PoC 工具并使其尽快达到可用状态,这样你就可以知道它是否真的想花更多时间在上面,或者这个想法在你的脑海中是否比在现实生活中更好。

经验 教训

在这个项目中学到了很多东西,同样,这是一个学习一系列不同新技能和技术的伟大项目,因为基本前提是一个服务器通过 HTTP/HTTPS 提供命令,并在 while 循环中获取这些命令。在整个项目中,我学到了很多东西,在此之前,我在 Web 开发方面的主要经验是用 PHP 做一堆网站,所以给自己一个机会玩弄 Web 框架和开发是很酷的。此外,玩弄代理混淆和不同形式的编码也非常有益。总而言之,这是一个很棒的项目,虽然有点耗时!

结论

站在这样一个项目的末尾,我学到了很多技能,我现在有一个很酷的 C2 框架。虽然代码需要做很多工作,完全重新开始并重新做一次可能是明智的,但很高兴看到项目的演变,这最初是 hoaxshell 的简单克隆,现在是它自己的事情。该项目还激发了许多新的想法和概念,例如像 nimplant 这样的“更厚”客户端的可能性,其中使用编译的二进制文件,目录列表、文件上传和下载等功能以及其他基本命令使用 Windows API 直接在二进制文件中实现......也许我们下次再谈。

引用

  • [001] — https://github.com/t3l3machus/hoaxshell

  • [002] — Havoc C2框架- https://github.com/HavocFramework/Havoc

  • [003] — 用 Nim 构建 C2 植入物 — https://casvancooten.com/posts/2021/08/building-a-c2-implant-in-nim-considerations-and-lessons-learned/

  • [004] — 在 c++ 中构建 c2 框架 — https://shogunlab.gitbook.io/building-c2-implants-in-cpp-a-primer

  • [005] — 如何创建 React + Flask 项目 — https://blog.miguelgrinberg.com/post/how-to-create-a-react--flask-project

  • [006] PowerShell 混淆圣经 — https://github.com/t3l3machus/PowerShell-Obfuscation-Bible

  • [007] — https://github.com/Sh3lldon/FullBypass?tab=readme-ov-file

  • [008] — https://kettan007.medium.com/how-to-clone-a-git-repository-using-personal-access-token-a-step-by-step-guide-ab7b54d4ef83

  • 如何构建自己的自定义 C2 框架

  • windows

  • 如何构建自己的自定义 C2 框架

  • windows()

  • 如何构建自己的自定义 C2 框架

  • USB()

  • 如何构建自己的自定义 C2 框架

  • ()

  • 如何构建自己的自定义 C2 框架

  • ios

  • 如何构建自己的自定义 C2 框架

  • windbg

  • 如何构建自己的自定义 C2 框架

  • ()

  • 如何构建自己的自定义 C2 框架如何构建自己的自定义 C2 框架如何构建自己的自定义 C2 框架

  • 如何构建自己的自定义 C2 框架

  • 如何构建自己的自定义 C2 框架

  • 如何构建自己的自定义 C2 框架

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年4月20日01:30:52
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何构建自己的自定义 C2 框架https://cn-sec.com/archives/2631843.html

发表评论

匿名网友 填写信息