NullAILab/nullai-c2-beacon
GitHub: NullAILab/nullai-c2-beacon
一个最小化的命令与控制教学框架,通过 Flask 服务器、Python Beacon 代理和浏览器控制面板,帮助安全学习者直观理解恶意软件 C2 通信的完整流程。
Stars: 0 | Forks: 0
# 简易 C2 Beacon
  
一个最小化的命令与控制(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安全, 命令与控制, 安全学习资源, 安全实验室, 安全测试, 态势感知, 恶意软件分析, 攻击性安全, 数据可视化, 数据展示, 无后门, 红队, 网络信息收集, 网络安全教育, 蓝队分析, 请求拦截, 逆向工具