dereeqw/BlackBerryC2
GitHub: dereeqw/BlackBerryC2
一个用于网络安全教育和红队演练的加密 C2 研究框架,演示如何在不依赖外部 TLS 的情况下构建自定义命令控制服务器。
Stars: 25 | Forks: 2
# BlackBerryC2 2.0.0-beta
BlackBerryC2 是一个**加密的远程管理和 C2 框架**,**专为教育用途、安全研究和受控实验室环境设计**。
该项目演示了如何构建**自定义命令和控制服务器**,实现**应用层加密**、会话管理和安全客户端通信,且**不依赖外部 TLS 协议栈**。
## ⚠️ 重要提示
本项目**不是恶意软件**,也**无意用于未经授权的访问**。
BlackBerryC2:
- **不**自我传播
- **不**自动利用漏洞
- **不**包含持久化机制
- **不**尝试逃避杀毒软件
**仅在你拥有或明确获得测试授权的系统 and 网络上使用**。
**Python 依赖:**
```
pip install cryptography prompt_toolkit zstandard
```
## 主要功能
- 自定义基于 TCP 的加密 C2 服务器 (v2.0)
- ECDHE (secp256r1) 密钥交换 — 临时或持久
- 每会话 AES-256-GCM 认证加密
- 每包 HMAC-SHA256 认证 + 防重放序列号
- 多个并发客户端会话
- 带有 tab 补全功能的交互式操作员控制台 (prompt_toolkit)
- 加密的远程命令执行
- 支持 zlib / Zstandard 压缩的加密文件传输
- 递归目录上传/下载 (`get -r`, `put -r`)
- 后台传输 (`-b` 标志) — 非阻塞,可取消
- 传输恢复支持 (`.partial` + `.resume` 文件)
- 客户端 payload 生成器 (`generate-payload`)
- IP 封锁:持久黑名单 + 临时自动封禁
- 扫描/洪水检测:连接扫描、Banner 抓取、握手失败、心跳洪水
- 可选 HTTP(S)/TLS 代理支持 (`BlackBerryHTTPs_TLSProxyGUI`)
- SPA (Single Packet Authorization) 和 Port-Knocking 预认证
- **BerryTransfer 模式** — 专用文件传输服务器(无 shell)
- 加密会话日志 (AES-256-GCM + PBKDF2, 600k 迭代)
- 加密服务器日志及内置 shell 查看器 (`log` 命令)
- 启动配置保存至 `logs/last_start.json`
## 加密设计
BlackBerryC2 v2.0 按如下方式建立安全通信:
1. 客户端通过 TCP 连接;服务器发送服务 Banner。
2. 客户端发送 `REQUEST_PUBKEY`。
3. 服务器发送其临时 ECDHE 公钥 (`secp256r1`)。
4. 客户端发送其 ECDHE 公钥 + HMAC-SHA256 认证标签。
5. 服务器根据预共享密钥 (`HMAC_PRE_SHARED_SECRET`) 验证 HMAC。
6. 双方通过 **HKDF-SHA256** 从共享密钥派生出 256 位 AES 会话密钥。
7. 所有后续通信使用 **AES-256-GCM**,带有每包 **HMAC-SHA256** 和防重放序列号。
每个会话维护:
- 自己的 AES-256 密钥和 HMAC 密钥
- 独立的 nonces (每条消息 12 字节随机数)
- 独立的防重放跟踪器 (序列窗口 ±100)
- 洪水保护速率限制器 (可配置命令数/秒)
所有加密密钥均在**运行时生成**,且在重启期间绝不重用(除非设置了 `--persistente`)。
## 运行服务器
```
python3 BlackBerryC2_server.py
```
默认配置:
- Host: `0.0.0.0`
- Port: `9949`
## 命令行参数
| 标志 | 描述 |
|------|-------------|
| `-p` / `--persistente` | 使用 `ecdhe-cert/` 中的持久 ECDHE 密钥(提示输入密码) |
| `-v` | Debug 日志 |
| `-vv` | Verbose(宽松)日志 |
| `-H ` | 监听主机 (默认: `0.0.0.0`) |
| `-P ` | 监听端口 (默认: `9949`) |
| `--no-secure` | 接受任何 ECDHE 客户端而无需 HMAC 验证 |
| `--hmac ` | 自定义 HMAC 预共享密钥 (十六进制或字符串) |
| `--log-passphrase ` | 使用 AES-256-GCM (PBKDF2 600k 迭代) 加密服务器日志 |
| `--logs` | 交互式日志查看器 — 不启动服务器 |
| `--spa` | 启用 SPA/Port-Knocking 预认证 |
| `--spa-mode ` | `spa` = 单个 UDP token, `knock` = 端口序列 |
| `--spa-port ` | SPA 监听器的 UDP 端口 (默认: `7331`) |
| `--knock-seq ` | Knock 模式的端口序列 (默认: `7001,7002,7003`) |
| `--knock-timeout ` | 完成 Knock 序列的秒数 (默认: `10`) |
| `--spa-ttl ` | 授权 IP 保持有效的秒数 (默认: `60`) |
| `--berrytransfer` | BerryTransfer 模式:仅文件传输,无 shell |
| `--transfer-root ` | BerryTransfer 的根目录 (默认: `./berry_transfers`) |
| `--auto-confirm` | 自动批准 BerryTransfer 中的所有 GET 请求(无操作员提示) |
**示例:**
```
# 基本启动(提示输入日志 passphrase)
python3 BlackBerryC2_server.py
# 持久化 ECDHE keys + verbose
python3 BlackBerryC2_server.py -p -vv
# 自定义 port,无 HMAC 检查
python3 BlackBerryC2_server.py -P 8080 --no-secure
# 自定义 ports 上的 Port-knocking
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# 带自动确认的 BerryTransfer 模式
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# 查看/解密日志而不启动 server
python3 BlackBerryC2_server.py --logs
```
## 操作员控制台命令
### 服务器管理
| 命令 | 描述 |
|---------|-------------|
| `list` | 列出活跃会话及其状态和主机名 |
| `select ` | 与客户端会话交互 |
| `all ` | 向所有连接的客户端发送命令 |
| `report` | 完整的服务器状态报告(运行时间、会话、传输) |
| `set host ` | 更改监听主机(重新绑定服务器) |
| `set port ` | 更改监听端口(重新绑定服务器) |
| `sVbanner ""` | 更改服务 Banner |
| `generate-payload` | 生成客户端 payload |
| `fingerprint` | 显示 ECDHE 服务器密钥指纹 (SHA-256) |
| `ecdhe-keys` | 打印当前 ECDHE 密钥对 (PEM) |
| `kill ` | 通过 ID 或 IP 终止会话 |
| `block ` | 永久封锁 IP |
| `unblock ` | 解封 IP(持久 + 临时) |
| `blocklist` | 显示被封锁的 IP(持久和临时) |
| `log` | 交互式日志查看器(支持加密日志) |
| `report` | 状态摘要:运行时间、会话、传输 |
| `banner` | 重新显示启动 Banner |
| `clean` | 删除服务器日志文件 |
| `v` | 切换 DEBUG 日志 |
| `vv` | 切换 VERBOSE 日志 |
| `cd ` | 更改服务器本地工作目录 |
| `E ` | 通过 `os.system` 在本地执行命令 |
| `` | 在服务器本地执行 |
| `exit` | 停止服务器并退出 |
### 代理
| 命令 | 描述 |
|---------|-------------|
| `proxy` | 启动 TLS/HTTP 代理守护进程(自动模式) |
| `proxy --mode ` | 模式: `auto`, `tls`, `http`, `https`, `both`, `all` |
| `proxy --stats` | 显示代理统计信息 |
| `proxy gui` | 启动代理 GUI(单独进程) |
| `stop-proxy` | 停止代理守护进程 |
| `stop-proxy-gui` | 停止代理 GUI |
| `proxy-help` | 完整代理帮助 |
## 会话命令(在 `select ` 内)
### 通用
| 命令 | 描述 |
|---------|-------------|
| `help` | 显示会话帮助 |
| `exit` | 返回主 shell |
| `!` | **在服务器本地**执行命令 |
| `` | 在远程客户端上执行命令 |
| `cmd1 && cmd2` | 链式:仅当 `cmd1` 成功时运行 `cmd2` |
| `cmd1 \|\| cmd2` | 链式:仅当 `cmd1` 失败时运行 `cmd2` |
| `cmd1 ; cmd2` | 链式:总是运行 `cmd2` |
### 文件传输
| 命令 | 描述 |
|---------|-------------|
| `get ` | 从客户端下载文件 |
| `get -r` | 递归目录下载 |
| `get -b` | 后台下载(非阻塞) |
| `get -r -b` | 后台递归下载 |
| `put ` | 上传文件到客户端 |
| `put -exc` | 上传并在内存中执行(脚本) |
| `put -r` | 递归目录上传 |
| `put -b` | 后台上传 |
| `transfers` | 列出所有活动和已完成的传输 |
| `stop ` | 取消后台传输 (例如 `stop T1`) |
| `resume ` | 恢复中断的下载 |
| `screenshot` | 捕获客户端屏幕 |
## BerryTransfer 模式
BerryTransfer 是一种受 `scp` 启发的专用**仅文件传输**服务器模式。激活时,服务器拒绝所有 shell 访问,仅接受 `BT:*` 协议命令。
**启动:**
```
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # no operator prompt for GETs
```
**BerryTransfer shell 命令:**
| 命令 | 描述 |
|---------|-------------|
| `confirm ` | 批准待处理的 GET 请求 |
| `deny ` | 拒绝待处理的 GET 请求 |
| `pending` | 列出等待批准的 GET 请求 |
| `auto [on\|off]` | 切换/设置自动确认 |
| `clients` | 显示活跃的 BerryTransfer 会话 |
| `ls [dir]` | 列出传输根目录中的文件 |
| `tree [dir]` | 传输根目录的文件树 |
| `find ` | 在传输根目录中搜索文件 |
| `rm ` | 从传输根目录删除文件(需确认) |
| `log [N]` | 显示最近 N 条传输日志条目(默认 30) |
| `cd ` | 更改本地工作目录 |
| `pwd` | 显示当前本地目录 |
| `!` | 执行本地系统命令 |
| `exit` | 停止 BerryTransfer 服务器 |
传输日志写入 `logs/bt_transfer.jsonl`(可选 AES-256-GCM 加密)。
## SPA / Port-Knocking
当 `--spa` 激活时,客户端必须在 TCP 连接被接受之前通过 UDP 进行认证。
**SPA 模式**(默认):客户端向 `SPA_UDP_PORT` 发送一个 32 字节的 HMAC-SHA256 token。
```
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
```
**Knock 模式**:客户端在超时窗口内按顺序敲击一系列 UDP 端口。
```
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
```
授权 IP 的有效期为 `--spa-ttl` 秒(默认 60)。
## 安全特性
| 特性 | 详情 |
|---------|---------|
| 密钥交换 | ECDHE secp256r1 临时或持久 |
| 会话加密 | AES-256-GCM,每条消息随机 12 字节 nonce |
| 客户端认证 | 握手期间基于共享密钥的 HMAC-SHA256 |
| 消息完整性 | 每包 HMAC-SHA256(覆盖 seq + nonce + ciphertext) |
| 防重放 | 每会话序列号窗口跟踪器 |
| 降级保护 | 强制执行最小 AES 密钥大小(256 位) |
| 心跳速率限制 | 心跳间隔最小 3 秒;跟踪违规 |
| 命令洪水保护 | 速率限制器;超过阈值自动断开连接 |
| 扫描检测 | 连接扫描、Banner 抓取、握手失败计数器 |
| IP 管理 | 持久黑名单 + 临时封禁(自动 + 手动) |
| 日志加密 | AES-256-GCM + PBKDF2-HMAC-SHA256 (600k 迭代) |
| 响应抖动 | 10–50ms 随机抖动以抵抗时序攻击 |
| 预认证 | 接受 TCP 之前进行 SPA token 或 Port-Knocking |
## 日志
| 日志文件 | 内容 |
|----------|----------|
| `logs/BlackBerryC2_Server.log` | 明文轮换服务器日志 (INFO+) |
|logs/BlackBerryC2_enc.log` | 加密服务器日志(如果设置了 `--log-passphrase`) |
| `logs/sessions.jsonl` | 会话事件:连接、断开、字节 |
| `logs/bt_transfer.jsonl` | BerryTransfer 文件传输日志 |
| `logs/last_start.json` | 启动配置快照 (host, port, token, pid) |
使用内置查看器查看日志:
```
BlackBerry> log
```
或独立运行(不启动服务器):
```
python3 BlackBerryC2_server.py --logs
```
## 预期用途
本项目**仅用于**:
- 教学演示
- 安全研究
- 受控实验室环境
- 授权渗透测试
严禁在未经许可的情况下对系统进行未经授权的使用。
## 许可证
有关完整的许可证详细信息,请参阅 [LICENSE](LICENSE) 文件。
## 免责声明
本软件按**“原样”**提供,不附带任何形式的保证。
作者对因使用本软件不当或造成的损害**不承担任何责任**。
标签:AES-256-GCM, C2框架, ECDHE, HMAC认证, IP 地址批量处理, Python, Remote Administration Tool, RSA/ECC, SPA, TCP服务器, Zstandard压缩, 代码生成, 会话管理, 加密通信, 命令与控制, 安全学习资源, 安全实验, 实验室环境, 应用层加密, 开源安全工具, 数据展示, 文件传输, 无后门, 流量检测, 流量隐藏, 渗透测试工具, 端口敲门, 红队, 网络信息收集, 网络安全教育, 远程管理, 逆向工具, 逆向工程平台