NullAILab/nullai-c2-beacon

GitHub: NullAILab/nullai-c2-beacon

一个最小化的命令与控制教学框架,通过 Flask 服务器、Python Beacon 代理和浏览器控制面板,帮助安全学习者直观理解恶意软件 C2 通信的完整流程。

Stars: 0 | Forks: 0

# 简易 C2 Beacon ![Python](https://img.shields.io/badge/Python-3.8+-3776AB?logo=python&logoColor=white) ![Tests](https://img.shields.io/badge/Tests-50%20passing-brightgreen) ![License](https://img.shields.io/badge/License-MIT-green) 一个最小化的命令与控制(Command & Control,C2)框架——包含 C2 服务器、Beacon(信标)代理以及操作员 控制面板——旨在让恶意软件通信的机制变得可见且 易于理解。 ## 问题背景 每位安全分析师最终都会问:*“恶意软件究竟是如何与其 操作员通信的?”* 阅读关于 Cobalt Strike 或 Sliver 的资料能让你掌握相关词汇, 但无法建立直觉。本项目构建了一个尽可能简单的 C2 工作系统, 让你可以在研究生产级框架之前,用纯 Python 看到 每一个层级——注册、轮询、命令分发、结果回传。 ## 适用人群 | 受众 | 使用场景 | |----------|----------| | **安全专业学生** | 在学习 Cobalt Strike / Sliver 之前了解 C2 架构 | | **蓝队成员** | 准确了解需要检测哪些网络流量和主机行为 | | **红队初学者** | 在合法、受控的实验环境中学习基本原理 | | **恶意软件分析师** | 获得关于“正常”HTTP Beacon 流量究竟是什么样的真实基准 | ## 系统架构 ``` ┌────────────────────────────────────────────────────────────────────┐ │ LAB NETWORK ONLY │ │ │ │ ┌──────────────┐ register/poll/result (HTTP) ┌──────────────┐ │ │ │ beacon.py │ ────────────────────────────► │ Flask C2 │ │ │ │ (agent) │ │ server │ │ │ └──────────────┘ │ app.py │ │ │ └──────┬───────┘ │ │ │ │ │ ┌──────▼───────┐ │ │ │ Dashboard │ │ │ │ (browser) │ │ │ └──────────────┘ │ └────────────────────────────────────────────────────────────────────┘ ``` **三个组件:** | 组件 | 文件 | 用途 | |-----------|------|---------| | **C2 服务器** | `server/app.py` | REST API —— 接收签到、排队命令、存储结果 | | **存储模块** | `server/store.py` | 线程安全的内存状态(Beacon、队列、结果) | | **操作员控制面板** | `server/templates/dashboard.html` | 浏览器 UI —— 下发命令,查看结果 | | **Beacon 代理** | `beacon/beacon.py` | 轮询服务器,执行命令,返回输出 | ## 项目结构 ``` 15-simple-c2-beacon/ ├── LICENSE ├── README.md ├── .gitignore ├── docker-compose.yml ├── server/ │ ├── app.py ← Flask REST API (beacon + operator routes) │ ├── store.py ← Thread-safe in-memory store │ ├── requirements.txt ← Flask only │ ├── Dockerfile │ └── templates/ │ └── dashboard.html ← Operator console (vanilla JS, no build step) ├── beacon/ │ └── beacon.py ← Beacon agent (stdlib only — no dependencies) ├── tests/ │ ├── conftest.py ← sys.path setup for imports │ ├── test_store.py ← Store unit tests (28 tests) │ └── test_server.py ← Flask route tests (22 tests) └── docs/ └── NOTES.md ``` ## 安装与设置 ### 方式 A —— Docker(推荐用于隔离环境) ``` git clone https://github.com/NullAILab/nullai-c2-beacon.git cd nullai-c2-beacon docker compose up # 服务器可通过 http://localhost:5000 访问 ``` ### 方式 B —— 直接运行 ``` # 服务器 cd server pip install -r requirements.txt python app.py # → http://localhost:5000 # Beacon (单独的终端,建议使用实验室 VM) cd beacon python beacon.py --server http://127.0.0.1:5000 ``` ## 使用方法 ### 启动服务器 ``` # 使用自定义 tokens (推荐 — 更改默认值) OPERATOR_TOKEN=mytoken BEACON_TOKEN=mysecret python server/app.py ``` ### 打开操作员控制面板 在浏览器中访问 `http://localhost:5000`。 ### 启动 Beacon ``` python beacon/beacon.py --server http://127.0.0.1:5000 --interval 10 ``` ### 通过控制面板向 Beacon 下发命令 1. 在左侧面板中点击该 Beacon 2. 在输入框中输入命令(如 `whoami`、`ls -la`、`id` 等) 3. 按下 **Send** —— Beacon 将在下次签到时获取该命令 4. 结果会自动显示在控制台面板中 ### 通过 curl 向 Beacon 下发命令 ``` # 列出 beacons curl -H "X-Operator-Token: changeme" http://localhost:5000/api/beacons # 将 command 加入队列 curl -X POST http://localhost:5000/api/command \ -H "X-Operator-Token: changeme" \ -H "Content-Type: application/json" \ -d '{"beacon_id": "", "command": "whoami"}' # 获取 results curl -H "X-Operator-Token: changeme" http://localhost:5000/api/results/ ``` ## API 参考 ### Beacon API (令牌: `X-Beacon-Token`) | 方法 | 路径 | 描述 | |--------|------|-------------| | `POST` | `/api/beacon/register` | 注册一个新的 Beacon —— 返回 `{id}` | | `GET` | `/api/beacon//poll` | 签到并接收下一条命令 | | `POST` | `/api/beacon//result` | 提交命令输出 | ### Operator API (令牌: `X-Operator-Token`) | 方法 | 路径 | 描述 | |--------|------|-------------| | `GET` | `/api/beacons` | 列出所有已注册的 Beacon | | `POST` | `/api/command` | 为某个 Beacon 排队一条命令 | | `GET` | `/api/results/` | 获取命令结果的历史记录 | ## Beacon 工作原理 Beacon 实现了 HTTP **长轮询 (long-polling)** —— 最简单的 C2 通信传输方式: ``` Beacon C2 Server │ │ ├─ POST /api/beacon/register ────►│ "I'm alive, assign me an ID" │◄─ {"id": "a1b2c3d4"} ──────────│ │ │ │ ┌──────── repeat forever ────────────────────────────────────┐ ├─ GET /api/beacon/a1b2c3d4/poll ►│ "Any tasks for me?" │ │◄─ {"command": "whoami", ...} ───│ "Run this" │ │ execute: whoami │ │ ├─ POST .../a1b2c3d4/result ─────►│ "Here's the output" │ │◄─ {"received": true} ───────────│ │ │ sleep(interval ± jitter) │ │ └─────────────────────────────────────────────────────────────- ┘ ``` **抖动 (Jitter)** —— Beacon 在两次签到之间会休眠 `interval ± jitter` 秒。 如果没有 Jitter,精确且固定的出站连接将是一个极易被检测到的 特征。引入 Jitter 后,简单的时间分析就会失效。 ## 防御者应关注什么 此 Beacon 刻意产生了多个可检测的信号。理解 这些信号正是构建该项目的目的所在: | 信号 | 如何检测 | |--------|--------------| | 固定间隔的规律出站 HTTP 请求 | 网络时间分析 —— 关联连接时间戳 | | `python-urllib` User-Agent | 代理日志 —— 设置预期 User-Agent 的白名单 | | 未知端点 (`/api/beacon/*/poll`) | 代理或防火墙的 URL 过滤 | | Python 进程派生的子进程 | EDR 进程树 —— `python.exe → cmd.exe` 或 `python3 → sh` | | Base64 / JSON POST 请求体 | IDS/IPS 规则中的深度包检测 (DPI) 签名 | **Sigma 规则概念:** ``` title: C2 HTTP Polling Pattern detection: selection: http.method: GET http.url|contains: '/api/beacon/' timeframe: 5m condition: selection | count() > 3 ``` ## MITRE ATT&CK 映射 | ID | 技术 | 实现方式 | |----|-----------|---------------| | T1071.001 | 应用层协议: Web | HTTP GET/POST 轮询 | | T1059.004 | 命令和脚本解释器: Shell | `subprocess.run(shell=True)` | | T1008 | 备用信道 | 签到间隔中的 Jitter | | T1082 | 系统信息发现 | 注册时发送 `hostname`、`platform.system()` | ## 运行测试 ``` pip install pytest Flask cd 15-simple-c2-beacon pytest tests/ -v ``` 预期输出:**50 passed**。 测试覆盖范围: - `test_store.py` (28 个测试) —— 独立测试所有 C2Store 方法 - `test_server.py` (22 个测试) —— 通过测试客户端测试所有 Flask 路由 - 每个受保护的端点都强制执行 Token 身份验证 - 并发入队/出队情况下的 FIFO 命令排序 - 边界情况:未知的 Beacon、空队列、缺失的 payload ## 配置 所有配置均通过环境变量完成: | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `OPERATOR_TOKEN` | `changeme` | 操作员控制面板/API 的 Token | | `BEACON_TOKEN` | `beaconkey` | Beacon 代理的 Token | | `HOST` | `0.0.0.0` | 绑定地址 | | `PORT` | `5000` | 监听端口 | ## 项目扩展 代码库刻意保持精简。常见的扩展点: | 功能 | 在何处添加 | |---------|-------------| | **HTTPS** | 向 `app.run()` 传入 `ssl_context`,或在反向代理处终止 TLS | | **数据持久化** | 将 `C2Store` 替换为 SQLite/PostgreSQL 后端 | | **DNS Beaconing** | 添加 DNS 服务器并在 `beacon.py` 中实现基于 DNS 的传输 | | **分阶段 Payload** | 第一阶段的 Beacon 从服务器下载第二阶段的脚本 | | **多监听器** | 在 HTTP 路由旁添加备用的传输处理程序 | | **Sigma 检测规则** | 编写能匹配此 Beacon 所生成流量的 `.yml` 规则 | ## 参考资料 - [MITRE ATT&CK — Command and Control (TA0011)](https://attack.mitre.org/tactics/TA0011/) - [C2 Matrix — C2 框架对比](https://www.thec2matrix.com/) - [Hunting C2 traffic — SANS 白皮书](https://www.sans.org/reading-room/whitepapers/detection/detecting-security-incidents-using-network-flows-36534) - [Sigma rules —— 检测即代码](https://github.com/SigmaHQ/sigma) ## 许可证与负责任的使用 MIT —— 完整条款请参见 [LICENSE](LICENSE)。 **此工具仅可用于:** - 您自己拥有的虚拟机上,且处于隔离的实验网络中 - 安全研究、教育以及授权的渗透测试 **切勿将 Beacon 部署在任何您不拥有的系统上。** 在未经明确书面授权的情况下 对系统使用 C2 框架是严重的犯罪行为。
标签:C2框架, DAST, Flask, HTTP/HTTPS抓包, HTTP通信, Python, Web安全, 命令与控制, 安全学习资源, 安全实验室, 安全测试, 态势感知, 恶意软件分析, 攻击性安全, 数据可视化, 数据展示, 无后门, 红队, 网络信息收集, 网络安全教育, 蓝队分析, 请求拦截, 逆向工具