BuildAndDestroy/ReaperC2
GitHub: BuildAndDestroy/ReaperC2
一款面向 Kubernetes 和云环境的 C2 框架,支持容器化部署、多操作员协作和链式代理。
Stars: 0 | Forks: 0
# ReaperC2
一款在 Kubernetes 和云端运行的 C2 框架
## 开发进行中
此 C2 目前正处于开发阶段。
在发布稳定版本之前,不建议使用此服务器。
目前仅使用命令,后续需要集成更好的调用方式
## 示例 - 测试
### Docker Compose (完整栈)
[`docker-compose.yml`](docker-compose.yml) 在共享网络上运行 **MongoDB 7** 和一个 **ReaperC2** 容器(beacon 端口 **8080**,管理端口 **8443**)。将 [`.env.example`](.env.example) 复制为 `.env`,设置密码,然后运行:
```
docker compose up --build
```
- 管理 UI:`http://127.0.0.1:8443/login` — 当 `operators` 集合为空时,第一个操作员账户由 `.env` 中的 `ADMIN_BOOTSTRAP_*` 变量生成。
- MongoDB 也发布在 **27017** 端口供本地工具使用(可在 `.env` 中通过 `MONGO_HOST_PORT` 覆盖)。
- 应用程序使用 Mongo **root** 用户和 `MONGO_AUTH_SOURCE=admin` 进行连接(参见 [`pkg/dbconnections/mongoconnections.go`](pkg/dbconnections/mongoconnections.go));如果您切换到应用程序用户,请更改 `MONGO_USERNAME` / `MONGO_PASSWORD` / `MONGO_AUTH_SOURCE`。
所有辅助脚本和 `mongoclient` 镜像位于 [`test/`](test/) 目录下。
### 单次本地 Mongo 填充(推荐)
[`test/run_tests.sh`](test/run_tests.sh) 创建一个 Docker 网络,在容器中启动 **MongoDB Community**,等待其就绪,构建 **mongoclient** 镜像,并在该镜像内运行 [`test/setup_mongo.sh`](test/setup_mongo.sh)。它是**非交互式**的,适用于 CI。
```
cd test
./run_tests.sh
```
默认情况下,脚本退出时会移除 Mongo 容器。若要使其在 `localhost:27017` 上保持运行以便手动操作:
```
KEEP_MONGO=1 ./run_tests.sh
```
有用的环境变量(两个脚本均支持重叠的变量):
| 变量 | 用途 |
|----------|---------|
| `MONGO_HOST` / `MONGO_PORT` | Mongo 主机和端口(默认值:`setup_mongo.sh` 为集群内服务 DNS;`run_tests.sh` 将主机设置为测试网络上的 Mongo 容器名称) |
| `MONGO_ADMIN_USER` / `MONGO_ADMIN_PASSWORD` | 用于填充的 Root 用户(默认值与 `run_tests.sh` 中的 Docker `MONGO_INITDB_*` 匹配) |
| `MONGO_API_USER` / `MONGO_API_PASSWORD` | 在 `api_db` 中创建的应用程序用户(默认值:`api_user` / `api_mongoApiPassword`) |
| `IMPORT_DATA_JSON` | 设置为 `0` 以跳过导入 [`test/data.json`](test/data.json) |
| `DATA_JSON` | 用于 `mongoimport` 的 JSON 数组文件路径(默认值:脚本旁的 `test/data.json`) |
| `DATA_JSON_COLLECTION` | 该导入的目标集合(默认值:`seed_docs`) |
| `DOCKER_NETWORK` / `MONGO_CONTAINER` | 在 `run_tests.sh` 中覆盖 Docker 网络名称和 Mongo 容器名称 |
| `KEEP_MONGO` | `1` = 退出时不移除 Mongo 容器 |
| `KEEP_TEST_NETWORK` | `1` = 清理时跳过移除测试 Docker 网络(仅当未使用 `KEEP_MONGO` 时) |
[`test/setup_mongo.sh`](test/setup_mongo.sh) 创建 `api_db` 数据库,包含 `clients`、`heartbeat` 和 `data` 集合(以及索引和示例文档)。[`test/data.json`](test/data.json) 作为**额外**种子文档导入到 `seed_docs` 中;它不会替换脚本中的固定数据。
**Kubernetes:** Exec 进入一个装有 `mongosh` 和此仓库的 Pod(或使用 mongoclient 镜像),然后指向您的集群服务,例如:
```
export MONGO_HOST=mongodb-service.reaperc2-ns.svc.cluster.local
export MONGO_PORT=27017
./setup_mongo.sh
```
**手动 Docker**(如果您不使用 `run_tests.sh`):从 `test/` 目录构建并运行,并将 `MONGO_HOST` 设置为同一 Docker 网络上 Mongo 容器的可解析主机名。
### 服务器
服务器从环境变量读取 Mongo 设置(参见 [`pkg/dbconnections/mongoconnections.go`](pkg/dbconnections/mongoconnections.go))。在使用上述默认值完成填充后,针对发布端口上的 Docker Mongo 在本地运行:
```
export DEPLOY_ENV=ONPREM
export MONGO_HOST=127.0.0.1
export MONGO_PORT=27017
export MONGO_USERNAME=api_user
export MONGO_PASSWORD=api_mongoApiPassword
export MONGO_DATABASE=api_db
# 可选:当 DB 用户位于 admin DB 中时(例如 root 用户)
# export MONGO_AUTH_SOURCE=admin
cd cmd && env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -v -o ReaperC2
./ReaperC2
```
示例日志行:
```
Connected to MongoDB!
Beacon API listening on :8080
Admin panel listening on :8443
```
### 管理面板(同一二进制文件,第二个监听器)
该进程提供**两个 HTTP 监听器**:**beacon API**(植入程序 / Scythe)和**操作员 Web UI**,用于登录并创建带有生成的 Scythe 示例的 `clients` 行。
| 变量 | 用途 |
|----------|---------|
| `BEACON_ADDR` | Beacon API 绑定地址(默认 `:8080`) |
| `ADMIN_ADDR` | 管理面板绑定地址(默认 `:8443`) |
| `ADMIN_BOOTSTRAP_USERNAME` / `ADMIN_BOOTSTRAP_PASSWORD` | 如果 MongoDB 中**不**存在操作员,则在启动时创建第一个账户(密码以 **Argon2id** 形式存储)。省略则以手动方式在 `operators` 集合中创建操作员。 |
| `BEACON_PUBLIC_BASE_URL` | Scythe 示例的公共基础 URL(默认 `http://127.0.0.1:8080`,无路径)。在生产环境中设置为您的 ingress URL。 |
| `BEACON_PIVOT_PROXY` | 当 beacon 拥有**父级**(pivot)时,Scythe `--proxy` 的可选默认 `host:port`。单个 beacon 覆盖:**Pivot proxy** 字段或 generate API 中的 `pivot_proxy`。 |
| `ADMIN_SESSION_TTL_HOURS` | 服务器端会话生命周期(默认 `168`)。 |
| `ADMIN_COOKIE_SECURE` | 如果管理 UI 仅通过 HTTPS 提供服务,则设置为 `true`(在会话 cookie 上添加 `Secure`)。 |
| `ADMIN_DISABLE` | 设置为 `1` 以**仅**运行 beacon 监听器(无管理端口)。 |
| `ADMIN_ARGON2_TIME` | Argon2id 时间成本(默认 `3`)。 |
| `ADMIN_ARGON2_MEMORY_KIB` | Argon2id 内存(KiB)(默认 `65536`,即 64 MiB)。 |
| `ADMIN_ARGON2_THREADS` | Argon2id 并行度(默认 `4`)。 |
操作员密码以 **Argon2id** 形式存储(序列化在 `operators.password_hash` 中)。**现有的 bcrypt 哈希**(`$2a$` / `$2b$`)仍可验证,以便您逐步迁移。
打开 `https://:8443/beacons`(或本地使用 `http://`;`/` 重定向到 **Beacons**)。UI 包括:
| 区域 | 用途 |
|------|---------|
| **Beacons** | 生成客户端(可选标签,用于链式 pivot 的 `ParentClientId`,用于 Scythe 的可选 pivot 代理)。每次生成**始终保存一个配置文件**在 `beacon_profiles` 中(自定义名称或自动生成的 `beacon-xxxxxxxx-YYYYMMDD-hhmmss`)。列出/删除已保存的配置文件。 |
| **Reports** | 下载 JSON 或 CSV 导出(脱敏或完整)用于简报。 |
| **Topology** | C2 → beacon 的关系图(以及在客户端上设置 `ParentClientId` 时的父级 → 子级关系)。 |
| **Chat** | 存储在 `operator_chat` 中的操作员消息。 |
| **Users**(仅管理员) | 创建额外的门户账户并分配 **Admin** 或 **Operator** 角色(`/users`,`POST /api/users`)。 |
| **Logs**(仅管理员) | 查看最近的**审计**事件(MongoDB 中的 `audit_logs`)并**下载 JSON**(`/api/logs/export`,`/logs`)。 |
**角色**(MongoDB 中的 `operators.role` 字段):**Admin** — 完全的门户访问权限,包括用户管理。**Operator** — beacon、报告、拓扑、聊天和配置文件管理;**不能**创建用户或调用用户 API。出于向后兼容性,没有 `role` 的账户被视为 **Admin**。引导账户始终为 **Admin**。
### 客户端
* 使用客户端(例如 Scythe)查询 API
```
$ ./Scythe Http --method GET --timeout 5s --url http://127.0.0.1:8080 --headers 'Content-Type:application/json,X-Client-Id:550e8400-e29b-41d4-a716-446655440000,X-API-Secret:mysecurekey1' --directories '/heartbeat/550e8400-e29b-41d4-a716-446655440000,/heartbeat'
```
如果是 pivot(父 beacon),示例会添加 `--proxy `(来自表单或 `BEACON_PIVOT_PROXY`)。
* 如果没有经过身份验证的用户,则无法访问。
## 示例 - Kubernetes
### 需求
* Kubernetes 集群
* Traefik 路由 - 如果您使用其他路由,请更新 deployments/k8s/full-deployment.yaml 中的路由配置
* 用于您的 http(s) 请求的域名
### Yaml 更新
* 将您的子域名添加到 full-deployment.yaml
* 将您的 docker registry 密钥添加到 full-deployment.yaml
* 添加与您的 golang 二进制文件匹配的 secrets,以允许连接到 mongodb
* 应用 yaml:
```
$ kubectl apply -f full-deployment.yaml
namespace/reaperc2-ns created
secret/reaperc2-myregistrykey created
secret/reaperc2-mongodb-secrets created
service/mongodb-service created
persistentvolume/mongo-pv created
persistentvolumeclaim/mongo-pvc created
deployment.apps/mongodb-deployment created
deployment.apps/reaperc2-deployment created
service/reaperc2-service created
ingress.networking.k8s.io/reaperc2-ingress created
ingressroute.traefik.io/reaperc2-ingressroute created
```
* 假设一切正常,删除该部署
* 在 full-deployment.yaml 的第 191 行,为签名证书更改以下内容
```
cert-manager.io/cluster-issuer: letsencrypt-prod
# cert-manager.io/cluster-issuer: letsencrypt-staging
```
* 注意:我们将 staging 设置为 true,以避免因意外导致您的域名超时
* 您的 C2 现已运行
ReaperC2
## 开发进行中
此 C2 目前正处于开发阶段。
在发布稳定版本之前,不建议使用此服务器。
目前仅使用命令,后续需要集成更好的调用方式
## 示例 - 测试
### Docker Compose (完整栈)
[`docker-compose.yml`](docker-compose.yml) 在共享网络上运行 **MongoDB 7** 和一个 **ReaperC2** 容器(beacon 端口 **8080**,管理端口 **8443**)。将 [`.env.example`](.env.example) 复制为 `.env`,设置密码,然后运行:
```
docker compose up --build
```
- 管理 UI:`http://127.0.0.1:8443/login` — 当 `operators` 集合为空时,第一个操作员账户由 `.env` 中的 `ADMIN_BOOTSTRAP_*` 变量生成。
- MongoDB 也发布在 **27017** 端口供本地工具使用(可在 `.env` 中通过 `MONGO_HOST_PORT` 覆盖)。
- 应用程序使用 Mongo **root** 用户和 `MONGO_AUTH_SOURCE=admin` 进行连接(参见 [`pkg/dbconnections/mongoconnections.go`](pkg/dbconnections/mongoconnections.go));如果您切换到应用程序用户,请更改 `MONGO_USERNAME` / `MONGO_PASSWORD` / `MONGO_AUTH_SOURCE`。
所有辅助脚本和 `mongoclient` 镜像位于 [`test/`](test/) 目录下。
### 单次本地 Mongo 填充(推荐)
[`test/run_tests.sh`](test/run_tests.sh) 创建一个 Docker 网络,在容器中启动 **MongoDB Community**,等待其就绪,构建 **mongoclient** 镜像,并在该镜像内运行 [`test/setup_mongo.sh`](test/setup_mongo.sh)。它是**非交互式**的,适用于 CI。
```
cd test
./run_tests.sh
```
默认情况下,脚本退出时会移除 Mongo 容器。若要使其在 `localhost:27017` 上保持运行以便手动操作:
```
KEEP_MONGO=1 ./run_tests.sh
```
有用的环境变量(两个脚本均支持重叠的变量):
| 变量 | 用途 |
|----------|---------|
| `MONGO_HOST` / `MONGO_PORT` | Mongo 主机和端口(默认值:`setup_mongo.sh` 为集群内服务 DNS;`run_tests.sh` 将主机设置为测试网络上的 Mongo 容器名称) |
| `MONGO_ADMIN_USER` / `MONGO_ADMIN_PASSWORD` | 用于填充的 Root 用户(默认值与 `run_tests.sh` 中的 Docker `MONGO_INITDB_*` 匹配) |
| `MONGO_API_USER` / `MONGO_API_PASSWORD` | 在 `api_db` 中创建的应用程序用户(默认值:`api_user` / `api_mongoApiPassword`) |
| `IMPORT_DATA_JSON` | 设置为 `0` 以跳过导入 [`test/data.json`](test/data.json) |
| `DATA_JSON` | 用于 `mongoimport` 的 JSON 数组文件路径(默认值:脚本旁的 `test/data.json`) |
| `DATA_JSON_COLLECTION` | 该导入的目标集合(默认值:`seed_docs`) |
| `DOCKER_NETWORK` / `MONGO_CONTAINER` | 在 `run_tests.sh` 中覆盖 Docker 网络名称和 Mongo 容器名称 |
| `KEEP_MONGO` | `1` = 退出时不移除 Mongo 容器 |
| `KEEP_TEST_NETWORK` | `1` = 清理时跳过移除测试 Docker 网络(仅当未使用 `KEEP_MONGO` 时) |
[`test/setup_mongo.sh`](test/setup_mongo.sh) 创建 `api_db` 数据库,包含 `clients`、`heartbeat` 和 `data` 集合(以及索引和示例文档)。[`test/data.json`](test/data.json) 作为**额外**种子文档导入到 `seed_docs` 中;它不会替换脚本中的固定数据。
**Kubernetes:** Exec 进入一个装有 `mongosh` 和此仓库的 Pod(或使用 mongoclient 镜像),然后指向您的集群服务,例如:
```
export MONGO_HOST=mongodb-service.reaperc2-ns.svc.cluster.local
export MONGO_PORT=27017
./setup_mongo.sh
```
**手动 Docker**(如果您不使用 `run_tests.sh`):从 `test/` 目录构建并运行,并将 `MONGO_HOST` 设置为同一 Docker 网络上 Mongo 容器的可解析主机名。
### 服务器
服务器从环境变量读取 Mongo 设置(参见 [`pkg/dbconnections/mongoconnections.go`](pkg/dbconnections/mongoconnections.go))。在使用上述默认值完成填充后,针对发布端口上的 Docker Mongo 在本地运行:
```
export DEPLOY_ENV=ONPREM
export MONGO_HOST=127.0.0.1
export MONGO_PORT=27017
export MONGO_USERNAME=api_user
export MONGO_PASSWORD=api_mongoApiPassword
export MONGO_DATABASE=api_db
# 可选:当 DB 用户位于 admin DB 中时(例如 root 用户)
# export MONGO_AUTH_SOURCE=admin
cd cmd && env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -v -o ReaperC2
./ReaperC2
```
示例日志行:
```
Connected to MongoDB!
Beacon API listening on :8080
Admin panel listening on :8443
```
### 管理面板(同一二进制文件,第二个监听器)
该进程提供**两个 HTTP 监听器**:**beacon API**(植入程序 / Scythe)和**操作员 Web UI**,用于登录并创建带有生成的 Scythe 示例的 `clients` 行。
| 变量 | 用途 |
|----------|---------|
| `BEACON_ADDR` | Beacon API 绑定地址(默认 `:8080`) |
| `ADMIN_ADDR` | 管理面板绑定地址(默认 `:8443`) |
| `ADMIN_BOOTSTRAP_USERNAME` / `ADMIN_BOOTSTRAP_PASSWORD` | 如果 MongoDB 中**不**存在操作员,则在启动时创建第一个账户(密码以 **Argon2id** 形式存储)。省略则以手动方式在 `operators` 集合中创建操作员。 |
| `BEACON_PUBLIC_BASE_URL` | Scythe 示例的公共基础 URL(默认 `http://127.0.0.1:8080`,无路径)。在生产环境中设置为您的 ingress URL。 |
| `BEACON_PIVOT_PROXY` | 当 beacon 拥有**父级**(pivot)时,Scythe `--proxy` 的可选默认 `host:port`。单个 beacon 覆盖:**Pivot proxy** 字段或 generate API 中的 `pivot_proxy`。 |
| `ADMIN_SESSION_TTL_HOURS` | 服务器端会话生命周期(默认 `168`)。 |
| `ADMIN_COOKIE_SECURE` | 如果管理 UI 仅通过 HTTPS 提供服务,则设置为 `true`(在会话 cookie 上添加 `Secure`)。 |
| `ADMIN_DISABLE` | 设置为 `1` 以**仅**运行 beacon 监听器(无管理端口)。 |
| `ADMIN_ARGON2_TIME` | Argon2id 时间成本(默认 `3`)。 |
| `ADMIN_ARGON2_MEMORY_KIB` | Argon2id 内存(KiB)(默认 `65536`,即 64 MiB)。 |
| `ADMIN_ARGON2_THREADS` | Argon2id 并行度(默认 `4`)。 |
操作员密码以 **Argon2id** 形式存储(序列化在 `operators.password_hash` 中)。**现有的 bcrypt 哈希**(`$2a$` / `$2b$`)仍可验证,以便您逐步迁移。
打开 `https://标签:Beacon, C2框架, Chrome Headless, DevSecOps, DInvoke, Docker, EVTX分析, Golang, IP 地址批量处理, Kubernetes安全, MongoDB, Server-Client架构, 上游代理, 后渗透利用, 命令与控制, 子域名突变, 安全学习资源, 安全测试, 安全编程, 安全防御评估, 容器化部署, 恶意软件, 提示注入, 攻击性安全, 攻击模拟, 日志审计, 网络安全, 请求拦截, 隐私保护, 集群管理, 驱动签名利用