加密命令与控制(C2)研究框架,用于网络安全教育、红队实验室以及安全的客户端-服务器通信实验。
BlackBerryC2 是一个加密远程管理和 C2 框架,专为教育用途、安全研究和受控实验环境设计。

该项目展示了如何构建一个自定义命令与控制服务器,具备应用层加密、会话管理和安全客户端通信,无需依赖外部 TLS 协议栈。
本项目不是恶意软件,也不用于未经授权的访问。
BlackBerryC2:
请仅在您拥有或已获得明确授权测试的系统与网络上使用。
Python 依赖:
pip install cryptography prompt_toolkit zstandard
zstandard为可选依赖,建议在传输大于 1 GB 的文件时使用。
get -r,put -r)-b 标志)—— 非阻塞,可取消.partial + .resume 文件)generate-payload)BlackBerryHTTPs_TLSProxyGUI)log 命令)logs/last_start.jsonBlackBerryC2 v2.0 按以下步骤建立安全通信:
REQUEST_PUBKEY。secp256r1)。HMAC_PRE_SHARED_SECRET)验证 HMAC。每个会话维护:
所有加密密钥在运行时生成,重启后不会重复使用(除非设置了 --persistente)。
python3 BlackBerryC2_server.py
默认配置:
0.0.0.09949示例:
# 基本启动(提示输入日志密码短语)
python3 BlackBerryC2_server.py
# 持久 ECDHE 密钥 + 详细日志
python3 BlackBerryC2_server.py -p -vv
# 自定义端口,不进行 HMAC 检查
python3 BlackBerryC2_server.py -P 8080 --no-secure
# 自定义端口上的端口敲门
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 9001,9002,9003
# BerryTransfer 模式 + 自动确认
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm
# 查看/解密日志而不启动服务器
python3 BlackBerryC2_server.py --logs
select <ID> 内部)BerryTransfer 是一种专用的纯文件传输服务器模式,灵感来自 scp。激活后,服务器拒绝所有 shell 访问,仅接受 BT:* 协议命令。
启动:
python3 BlackBerryC2_server.py --berrytransfer
python3 BlackBerryC2_server.py --berrytransfer --auto-confirm # GET 请求无需操作员提示
BerryTransfer shell 命令:
传输日志写入 logs/bt_transfer.jsonl(可选择 AES-256-GCM 加密)。
当激活 --spa 时,客户端必须在 TCP 连接被接受前通过 UDP 进行认证。
SPA 模式(默认):客户端向 SPA_UDP_PORT 发送一个 32 字节的 HMAC-SHA256 令牌。
token = HMAC-SHA256(HMAC_SECRET, "{ip}:{time_window_30s}")
敲门模式:客户端按顺序向一个 UDP 端口序列敲门,必须在超时窗口内完成。
python3 BlackBerryC2_server.py --spa --spa-mode knock --knock-seq 7001,7002,7003 --knock-timeout 10
授权 IP 在 --spa-ttl 秒内有效(默认 60)。
使用内置查看器查看日志:
BlackBerry> log
或者独立查看(不启动服务器):
python3 BlackBerryC2_server.py --logs
本项目仅适用于:
严禁在未经许可的系统上未经授权使用。
完整的许可证详情请见 LICENSE 文件。
本软件按“原样”提供,不附带任何形式的担保。
作者对因使用本软件而产生的任何滥用或损害概不负责。
| 标志 | 描述 |
|---|
-p / --persistente | 使用 ecdhe-cert/ 中的持久 ECDHE 密钥(提示输入密码短语) |
-v | 调试日志 |
-vv | 详细(宽松)日志 |
-H <host> | 监听主机(默认:0.0.0.0) |
-P <port> | 监听端口(默认:9949) |
--no-secure | 接受任何 ECDHE 客户端,不进行 HMAC 验证 |
--hmac <secret> | 自定义 HMAC 预共享密钥(十六进制或字符串) |
--log-passphrase <pass> | 使用 AES-256-GCM 加密服务器日志(PBKDF2 60 万次迭代) |
--logs | 交互式日志查看器 —— 不启动服务器 |
--spa | 启用 SPA/端口敲门预认证 |
--spa-mode <spa|knock> | spa = 单个 UDP 令牌,knock = 端口序列 |
--spa-port <port> | SPA 监听器的 UDP 端口(默认:7331) |
--knock-seq <ports> | 敲门模式的端口序列(默认:7001,7002,7003) |
--knock-timeout <sec> | 完成敲门序列的超时秒数(默认:10) |
--spa-ttl <sec> | 授权 IP 的有效秒数(默认:60) |
--berrytransfer | BerryTransfer 模式:仅文件传输,无 shell |
--transfer-root <dir> | BerryTransfer 的根目录(默认:./berry_transfers) |
--auto-confirm | BerryTransfer 中自动批准所有 GET 请求(无需操作员提示) |
| 命令 | 描述 |
|---|
list | 列出活跃会话,显示统计信息和主机名 |
select <ID> | 与客户端会话交互 |
all <cmd> | 向所有已连接客户端发送命令 |
report | 完整服务器状态报告(运行时间、会话、传输) |
set host <HOST> | 更改监听主机(重新绑定服务器) |
set port <PORT> | 更改监听端口(重新绑定服务器) |
sVbanner "<text>" | 更改服务横幅 |
generate-payload | 生成客户端载荷 |
fingerprint | 显示 ECDHE 服务器密钥指纹(SHA-256) |
ecdhe-keys | 打印当前 ECDHE 密钥对(PEM) |
kill <id|ip> | 按 ID 或 IP 终止会话 |
block <IP> | 永久阻止 IP |
unblock <IP> | 解除 IP 阻止(持久 + 临时) |
blocklist | 显示被阻止的 IP(持久和临时) |
log | 交互式日志查看器(支持加密日志) |
report | 状态摘要:运行时间、会话、传输 |
banner | 重新显示启动横幅 |
clean | 删除服务器日志文件 |
v | 切换 DEBUG 日志记录 |
vv | 切换 VERBOSE 日志记录 |
cd <dir> | 更改服务器本地工作目录 |
E <cmd> | 通过 os.system 在本地执行命令 |
<any command> | 在服务器上本地执行 |
exit | 停止服务器并退出 |
| 命令 | 描述 |
|---|
proxy | 启动 TLS/HTTP 代理守护进程(自动模式) |
proxy --mode <mode> | 模式:auto、tls、http、https、both、all |
proxy --stats | 显示代理统计信息 |
proxy gui | 启动代理 GUI(单独进程) |
stop-proxy | 停止代理守护进程 |
stop-proxy-gui | 停止代理 GUI |
proxy-help | 代理帮助 |
| 命令 | 描述 |
|---|
help | 显示会话帮助 |
exit | 返回主 shell |
!<cmd> | 在服务器本地执行命令 |
<cmd> | 在远程客户端上执行命令 |
cmd1 && cmd2 | 链式执行:仅当 cmd1 成功时运行 cmd2 |
cmd1 || cmd2 | 链式执行:仅当 cmd1 失败时运行 cmd2 |
cmd1 ; cmd2 | 链式执行:始终运行 cmd2 |
| 命令 | 描述 |
|---|
get <file> | 从客户端下载文件 |
get <dir> -r | 递归下载目录 |
get <file> -b | 后台下载(非阻塞) |
get <dir> -r -b | 后台递归下载 |
put <file> | 上传文件到客户端 |
put <file> -exc | 上传并在内存中执行(脚本) |
put <dir> -r | 递归上传目录 |
put <file> -b | 后台上传 |
transfers | 列出所有活跃和已完成传输 |
stop <ID> | 取消后台传输(例如 stop T1) |
resume <local_file> | 恢复中断的下载 |
screenshot | 捕获客户端屏幕 |
| 命令 | 描述 |
|---|
confirm <ID> | 批准待处理的 GET 请求 |
deny <ID> | 拒绝待处理的 GET 请求 |
pending | 列出等待批准的 GET 请求 |
auto [on|off] | 切换/设置自动确认 |
clients | 显示活跃的 BerryTransfer 会话 |
ls [dir] | 列出传输根目录中的文件 |
tree [dir] | 传输根目录的文件树 |
find <name> | 在传输根目录中搜索文件 |
rm <file> | 从传输根目录删除文件(需确认) |
log [N] | 显示最近 N 条传输日志条目(默认 30) |
cd <dir> | 更改本地工作目录 |
pwd | 显示当前本地目录 |
!<cmd> | 执行本地系统命令 |
exit | 停止 BerryTransfer 服务器 |
| 特性 | 详情 |
|---|
| 密钥交换 | ECDHE secp256r1,临时或持久 |
| 会话加密 | AES-256-GCM,每条消息 12 字节随机一次性随机数 |
| 客户端认证 | 握手期间基于共享密钥的 HMAC-SHA256 |
| 消息完整性 | 每数据包 HMAC-SHA256(覆盖序列号 + 一次性随机数 + 密文) |
| 反重放 | 每个会话的序列号窗口跟踪器 |
| 降级保护 | 强制最低 AES 密钥大小(256 位) |
| 心跳速率限制 | 心跳间隔至少 3 秒;违规会被跟踪 |
| 命令洪水保护 | 速率限制器;超阈值自动断开 |
| 扫描检测 | 连接扫描、服务标识获取、握手失败计数器 |
| IP 管理 | 持久黑名单 + 临时封禁(自动 + 手动) |
| 日志加密 | AES-256-GCM + PBKDF2-HMAC-SHA256(60 万次迭代) |
| 响应抖动 | 10–50ms 随机抖动,抵御时序攻击 |
| 预认证 | 在 TCP 接受前执行 SPA 令牌或端口敲门 |
| 日志文件 | 内容 |
|---|
logs/BlackBerryC2_Server.log | 明文轮转服务器日志(INFO 及以上) |
logs/BlackBerryC2_enc.log | 加密服务器日志(如果设置了 --log-passphrase) |
logs/sessions.jsonl | 会话事件:连接、断开、字节数 |
logs/bt_transfer.jsonl | BerryTransfer 文件传输日志 |
logs/last_start.json | 启动配置快照(主机、端口、令牌、PID) |