BuildAndDestroy/ReaperC2

GitHub: BuildAndDestroy/ReaperC2

一款面向 Kubernetes 和云环境的 C2 框架,支持容器化部署、多操作员协作和链式代理。

Stars: 0 | Forks: 0

# ReaperC2 一款在 Kubernetes 和云端运行的 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://: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 现已运行
标签:Beacon, C2框架, Chrome Headless, DevSecOps, DInvoke, Docker, EVTX分析, Golang, IP 地址批量处理, Kubernetes安全, MongoDB, Server-Client架构, 上游代理, 后渗透利用, 命令与控制, 子域名突变, 安全学习资源, 安全测试, 安全编程, 安全防御评估, 容器化部署, 恶意软件, 提示注入, 攻击性安全, 攻击模拟, 日志审计, 网络安全, 请求拦截, 隐私保护, 集群管理, 驱动签名利用