hassan-hamadi/C2-Project
GitHub: hassan-hamadi/C2-Project
一个用于教育目的的命令与控制框架,通过从零构建帮助理解 C2 通信实现原理,同时详细记录了所有可被蓝队检测的特征。
Stars: 0 | Forks: 0
# C2 框架
## 免责声明
这是一个用于教育和授权安全研究的工具。这是第一阶段 Alpha 版本,故意保留了可被检测的痕迹。请勿在非您拥有或未获得明确书面授权测试的实验环境之外部署此工具。随附的博客文章详细记录了此框架生成的每一个 IOC 以及蓝队如何捕获它。
## 概述
这是一个从头构建的命令与控制框架,旨在从实现层面理解 C2 通信。该框架使用基于拉取的 HTTP 轮询模型,包含一个 Go agent 和一个 Python/Flask 团队服务器。
Agent 是一个静态链接的 Go 二进制文件,零外部依赖。它按可配置的间隔进行检查,检索待处理任务,执行它们,并报告结果。服务器根据操作员指定的配置(回调 URL、签到间隔、持久化)按需编译 agent,配置直接作为编译时字面量注入到 Go 源码中。磁盘上没有配置文件。
这是一个 Alpha 版本。它不是 OPSEC 安全的,也从未打算如此。它会产生显著的行为特征,这些特征很容易被 EDR、网络监控和基本的取证分析检测到。上述博客文章中记录了所有这些特征。
## 架构
```
Operator (Dashboard)
│
│ HTTP
▼
┌──────────────────┐
│ Team Server │
│ (Python/Flask) │
│ │
│ - REST API │
│ - Task Queue │
│ - Payload │
│ Builder │
│ - SQLite DB │
└────────┬─────────┘
│
│ HTTP Polling (JSON)
│
┌────┴────┬──────────┐
▼ ▼ ▼
Agent Agent Agent
(Go) (Go) (Go)
```
## 当前状态(第一阶段)
### Agent
| 功能 | 实现 |
|---|---|
| HTTP Beaconing | 基于范围的抖动:每个周期在 `JitterMin` 和 `JitterMax` 之间均匀采样随机休眠时间。Agent POST 身份信息,接收任务数组。 |
| 浏览器配置文件伪装 | 编译时选择浏览器配置文件。一个 `UATransport` RoundTripper 拦截每个出站请求,并注入一组完整的、经过验证的头部信息,匹配五种真实浏览器指纹之一(Chrome/Win, Chrome/Linux, Firefox/Win, Firefox/Linux, Safari/macOS)。 |
| 命令执行 | 根据任务分发给 `cmd.exe /C` (Windows) 或 `/bin/sh -c` (Linux/macOS)。 |
| 有状态 `cd` | 在 shell 之前拦截 `cd` 命令。通过 `CurrentDir` 全局变量在进程内跟踪工作目录。后续命令通过 `cmd.Dir` 继承该目录。 |
| 文件窃取 | `get ` 读取目标文件并以 `multipart/form-data` 形式 POST 到服务器。 |
| 文件投放 | `download ` 从服务器获取暂存文件并写入磁盘。 |
| 持久化 | Windows: 使用 `reg.exe add` 写入 `HKCU\...\Run`。Linux: 添加 `@reboot` cron 条目。 |
| 自毁 | 移除持久化,删除自身二进制文件(Linux: `os.Remove`, Windows: 延迟 `.bat` 清理脚本),从服务器数据库中清除所有 agent 数据。 |
| 身份标识 | 通过 `crypto/rand` 生成的加密安全随机 UUID v4,在启动时生成。短暂性:每次重启生成新 UUID。 |
### 服务器
| 功能 | 实现 |
|---|---|
| 动态编译 | 生成自定义 `config.go` 和 `main.go`,通过 `go build` 进行交叉编译,设定 `GOOS`/`GOARCH` 目标。使用 `-s -w` ldflags 剥离符号。Windows 构建使用 `-H=windowsgui` 以隐藏控制台窗口。Beacon 计时作为 `JitterMin`/`JitterMax` 范围烘焙进二进制文件(磁盘上无配置文件)。浏览器配置文件 ID 和语言环境在编译时注入。 |
| 任务队列 | SQLite 支持的状态机:`pending` > `sent` > `complete`。任务被打包到签到响应中,并在检索时标记为 `sent`。 |
| 战利品存储 | 窃取的文件以时间戳为前缀保存。元数据记录在 `loot` 表中。 |
| 文件暂存 | 操作员通过仪表板上传文件。Agent 根据命令通过数字 ID 拉取文件。 |
| Agent 管理 | 首次签到时注册,后续签到更新 `last_seen`,自毁时级联清除。 |
### 规避状态
跟踪每一个已知的检测面、修复方案以及是否已实施。
| 检测面 | 风险 | 状态 | 修复方案 |
|---|---|---|---|
| Beacon 频率 | 固定间隔轮询很容易被大多数网络分析软件标记 | ✅ 已修复 | 基于范围的抖动,agent 在每个周期的 `JitterMin` 和 `JitterMax` 之间随机休眠一段时间 |
| User-Agent 指纹 | 默认的 `Go-http-client/1.1` User-Agent 是高置信度 IOC;不匹配的头部会创建可检测的“HTTP 嵌合体” | ✅ 已修复 | 通过 `UATransport` RoundTripper 应用五种经过验证的浏览器配置文件。每个配置文件包含正确的 UA 字符串、`Sec-Ch-Ua` 客户端提示、`Sec-Fetch-*` 元数据和 `Accept` 值,匹配 2026 年 4 月的浏览器基线 |
| 进程树 | 每个 shell 命令都会生成 `cmd.exe` 或 `sh` 作为直接子进程,对任何 EDR 可见 | 🔴 未解决 | 直接调用 Windows API syscall(`CreateProcess`, `ShellExecute`)以去除 shell 中间人 |
| 持久化噪音 | `reg.exe` 使用硬编码的值名称写入 Windows 中监控最严格的 Run 键 | 🔴 未解决 | COM 对象劫持、`ITaskService` 计划任务或 DLL 搜索顺序劫持(或者是我正在研究的一种更简单的方法) |
| 负载加密 | 所有 C2 流量负载(命令、结果)均以明文 JSON 发送,任何网络分接头均可读取 | 🔴 未解决 | AES-256-GCM 负载加密配合会话密钥交换 |
| 传输安全 | 所有流量均为未加密的 HTTP,对任何中间人可见 | 🔴 未解决 | HTTPS 配合证书锁定 |
| 可预测的 URL | 端点路径(`/api/checkin`, `/api/result`)是硬编码的,容易被特征化 | 🔴 未解决 | 通过负载构建器在构建时随机化 API 路径 |
| 无认证 | 每个服务器端点都是开放的,任何发现服务器的人都可以发出命令或下载战利品 | 🔴 未解决 | 所有端点启用 API 密钥认证,agent 与服务器之间使用双向 TLS |
| 二进制文件中的字符串 | 服务器 URL、API 路径和持久化名称均可通过 `strings` 查看 | 🔴 未解决 | 符号剥离已完成(`-s -w`);下一步是字符串字面量的编译时混淆 |
## 项目结构
```
C2-Project/
├── agent/
│ ├── main.go # Entry point, check-in loop, command dispatcher
│ ├── config.go # Compile-time configuration, UUID generation
│ ├── go.mod
│ └── funcs/
│ ├── shell.go # Command execution, cd state tracking
│ ├── transfer.go # File exfiltration and download
│ ├── persist.go # Registry/cron persistence
│ ├── selfdestruct.go # Binary deletion and DB purge
│ └── ua.go # Browser profile spoofing (UATransport + 5 profiles)
├── server/
│ ├── app.py # Flask API, build pipeline, task management
│ ├── database.py # SQLite schema and connection handling
│ ├── templates/
│ │ └── index.html # Operator dashboard
│ └── static/ # Frontend assets
├── requirements.txt
└── README.md
```
## 快速开始
### 启动服务器
```
cd server
pip install -r ../requirements.txt
python app.py
```
仪表板地址为 `http://localhost:5000`。
### 构建 Agent
在仪表板中,导航到 Deploy 并配置:
- **目标 OS:** `windows`, `linux`, 或 `MacOS`
- **架构:** `amd64`, `arm64`, 或 `386`
- **服务器 URL:** Agent 的回调地址
- **Jitter 范围:** 最小和最大 beacon 间隔(秒)(agent 在范围内随机选择)
- **持久化:** 启用或禁用开机持久化
点击 Build。服务器使用指定配置编译 agent 并返回二进制文件以供下载。
或者,通过 API 构建:
```
curl -X POST http://localhost:5000/api/build \
-H "Content-Type: application/json" \
-d '{
"target_os": "windows",
"arch": "amd64",
"server_url": "http://:5000",
"jitter_min": "8",
"jitter_max": "30",
"persistence": false
}'
```
### 运行 Agent
在目标主机上执行编译后的二进制文件。它将生成一个 UUID,按配置的 jitter 范围开始签到,并出现在仪表板中。
## 测试
Agent 包含 jitter 实现的单元测试。在 `agent/` 目录下运行它们。
```
cd agent
# 运行所有测试
go test ./funcs/ -v -count=1
# 仅运行 jitter 测试
go test ./funcs/ -v -count=1 -run "TestRandomDuration|TestSleepWithJitter"
```
`-count=1` 标志绕过 Go 的测试结果缓存,因此每次运行都是新的。这对于分布测试很重要,因为它每次都会抽取新的随机样本。
## API 参考
| 方法 | 端点 | 描述 |
|---|---|---|
| `GET` | `/` | 操作员仪表板 |
| `POST` | `/api/checkin` | Agent 签到和任务检索 |
| `POST` | `/api/result` | 任务结果提交 |
| `POST` | `/api/task` | 为 agent 排队命令 |
| `POST` | `/api/upload` | 接收来自 agent 的窃取文件 |
| `POST` | `/api/build` | 编译新的 agent 二进制文件。接受 `target_os`, `arch`, `server_url`, `jitter_min` (s), `jitter_max` (s), `persistence`, `profile_id` (1-5), `locale` |
| `GET` | `/api/agents` | 列出所有已注册的 agent |
| `GET` | `/api/agents/` | _(未实现,使用 DELETE 变体)_ |
| `DELETE` | `/api/agents/` | 为 agent 排队自毁指令 |
| `DELETE` | `/api/agents//force` | 强制从数据库中移除 agent |
| `GET` | `/api/tasks/` | 获取 agent 的任务历史 |
| `GET` | `/api/results/` | 获取特定任务的输出 |
| `GET` | `/api/builds` | 列出所有已编译的负载 |
| `GET` | `/api/builds/download/` | 下载已编译的 agent 二进制文件 |
| `DELETE` | `/api/builds/` | 删除构建记录及其文件 |
| `POST` | `/api/files/stage` | 上传文件供 agent 下载 |
| `GET` | `/api/files` | 列出所有暂存文件 |
| `GET` | `/api/files/` | Agent 通过 ID 获取暂存文件 |
| `DELETE` | `/api/files/` | 删除暂存文件 |
| `GET` | `/api/loot` | 列出窃取的文件 |
| `GET` | `/api/loot/download/` | 下载窃取的文件 |
| `DELETE` | `/api/loot/` | 删除窃取的文件 |
| `GET` | `/api/stats` | 仪表板统计信息 |
## 许可证
详情请参阅 [LICENSE](LICENSE)。
标签:C2框架, DNS 反向解析, Flask, Golang, Go语言, HTTP/HTTPS抓包, HTTP轮询, IP 地址批量处理, Python, Team Server, 中高交互蜜罐, 后门开发, 命令与控制, 安全学习资源, 安全编程, 态势感知, 恶意软件开发, 攻击模拟, 教育工具, 无后门, 日志审计, 程序破解, 网络信息收集, 网络安全, 蓝队演练, 远程控制, 逆向工具, 隐私保护, 驱动签名利用