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压缩, 代码生成, 会话管理, 加密通信, 命令与控制, 安全学习资源, 安全实验, 实验室环境, 应用层加密, 开源安全工具, 数据展示, 文件传输, 无后门, 流量检测, 流量隐藏, 渗透测试工具, 端口敲门, 红队, 网络信息收集, 网络安全教育, 远程管理, 逆向工具, 逆向工程平台