Menelaus29/c2-framework

GitHub: Menelaus29/c2-framework

研究级 C2 仿真框架,用于生成带标签的网络遥测数据,支撑机器学习 NIDS 检测模型的训练与评估

Stars: 2 | Forks: 0

![Python](https://img.shields.io/badge/Python-3.11%2B-blue?logo=python&logoColor=white) ![License](https://img.shields.io/badge/License-Apache%202.0-green) ![Research Only](https://img.shields.io/badge/Use-Research%20Only-red) # C2 仿真框架 ## 项目概述 本项目是一个研究级的命令与控制(Command and Control, C2)仿真框架,旨在探索在现实网络条件下,基于拉取机制的植入程序如何与控制器通信,并生成带有标签的网络遥测数据,以供未来基于机器学习的网络入侵检测系统(NIDS)研究使用。它实现了从植入程序到控制器的完整生命周期:初始签到、任务分发、结果收集和清理终止 —— 所有通信均通过 AES-256-GCM 加密和 TLS 封装,并经由 Nginx 反向代理(作为重定向器)进行路由。 该框架展示了三种网络层规避技术 —— 睡眠抖动、流量填充和 HTTP 头随机化 —— 并测量了它们对流级特征(到达时间间隔、负载大小、香农熵)的影响。每种技术都实现为一个可配置、可独立测试的模块,并与固定的对照条件(基线配置)进行对比评估。由此产生的遥测流水线,从实时 PCAP 捕获到逐流特征提取,旨在为计划中的蓝队机器学习检测项目生成带标签的数据集。所有 Agent 操作都被严格限制在实验室网络内:如果超出定义的环境范围,植入程序将拒绝启动、连接或执行命令。 ## 系统架构 该框架由五层组成:Agent(代理)、Server(服务端)、Transport(传输)、Evasion(规避)和 Telemetry(遥测)。Agent(Windows VM)通过 Nginx Redirector 向 FastAPI Server(Ubuntu VM)发出信标。整个协议在应用层进行加密(AES-256-GCM),独立于 Nginx 终止的外部 TLS 会话。 ### 信标周期序列 ``` sequenceDiagram participant A as Agent (Victim VM) participant R as Redirector (Nginx :443) participant S as Server (FastAPI :8443) A->>A: check_lab_environment() A->>A: BeaconLoop.__init__() — derive key, load profile A->>A: pack(CHECKIN, key) A->>R: HTTPS POST /beacon R->>R: validate User-Agent contains Mozilla R->>R: validate Content-Type == application/octet-stream R->>S: proxy_pass http://c2-server:8443/beacon S->>S: unpack + verify nonce S->>S: create_session() → session_id S-->>R: 200 OK encrypted(CHECKIN, session_id) R-->>A: 200 OK encrypted(CHECKIN, session_id) A->>A: store session_id, update logger context loop Beacon loop A->>A: sleep_fn(BEACON_INTERVAL_S, jitter_pct) A->>A: time.sleep(interval) A->>A: pack(TASK_PULL, key) A->>R: HTTPS POST /beacon R->>S: proxy_pass alt Task pending S-->>A: encrypted(TASK_DISPATCH {task_id, command, args, timeout_s}) A->>A: executor.execute(command) A->>R: HTTPS POST /beacon encrypted(TASK_RESULT) R->>S: proxy_pass S->>S: mark_complete(task_id), insert_result S-->>A: encrypted(TASK_RESULT {status: received}) else Session killed by operator S-->>A: encrypted(TERMINATE {reason}) A->>A: sys.exit(0) else No task S-->>A: encrypted(TASK_PULL {status: no_task}) end Note over A: TransportError → backoff [1,2,4,8,16,32,60]s then retry Note over A: Other exception → reset backoff, continue immediately end ``` ### 网络拓扑 (Docker — 推荐) ``` graph LR subgraph WIN["Windows Victim VM 192.168.100.20"] AG["agent_main.py
BeaconLoop
outbound only"] end subgraph DOCKER["Ubuntu Server VM 192.168.100.10
Docker bridge network: c2-internal"] subgraph NGINX_C["Container: c2-nginx"] NX[":443 HTTPS — TLS termination
:80 → 301 to HTTPS
UA + Content-Type pre-filter
Server: Apache/2.4.54 spoofed
Fake website on /
more_set_headers module"] end subgraph SERVER_C["Container: c2-server"] FP["FastAPI + uvicorn
:8443 plain HTTP
BEHIND_NGINX=1
LAB_MODE=1
Runs as uid 1000"] end NX -- "proxy_pass
http://c2-server:8443/beacon
X-Real-IP forwarded
internal bridge only
no TLS" --> FP end AG -- "HTTPS POST /beacon
https://c2.lab.internal:443
TLS 1.2+ pinned to server.crt
AES-256-GCM payload inside" --> NX style WIN fill:#fff3cd,color:#000000 style DOCKER fill:#d1ecf1,color:#000000 style NGINX_C fill:#f8d7da,color:#000000 style SERVER_C fill:#d4edda,color:#000000 style AG fill:#fffde7,color:#000000 style NX fill:#fce4ec,color:#000000 style FP fill:#e8f5e9,color:#000000 ``` ## 规避层 规避层 (`evasion/`) 是一个包含三种独立技术的可配置流水线,每种技术由 `evasion/profile_config.yaml` 中的命名配置控制。活动配置(`active_profile` 键)在信标启动时通过 `transport/traffic_profile.py` 加载。定义了四种配置:**baseline**(基线)、**low**(低)、**medium**(中,默认)和 **high**(高)。 | Technique | Module | Research Purpose | |---|---|---| | **Sleep Jitter** | `evasion/sleep_strat.py` | 使用均匀分布或高斯分布随机化信标间隔,以击败固定阈值时间检测器。`gaussian` 策略(高配置,σ=40%)会产生偶尔的大偏差,从而打破周期性假设。 | | **Traffic Padding** | `evasion/padding_strat.py` | 在 AES-GCM 加密前,添加 2 字节的长度前缀并附加 0–256 个随机字节。目标:破坏基于包大小的特征签名。在此负载规模下,TLS 记录帧结构部分掩盖了小的填充差异。 | | **Header Randomisation** | `evasion/header_randomizer.py` | 轮换四个级别的 HTTP 头池复杂度 —— 从仅固定头(级别 0)到完全随机化 `User-Agent`、`Accept-Language`、`Accept-Encoding` 及其插入顺序(级别 3)。`Host` 和 `Content-Type` 始终置于首位且保持固定,以通过 Nginx 预过滤。 | ## 实验结果 实验在 `BEACON_INTERVAL_S=5s` 的设置下运行,捕获窗口为 180 秒(每个配置约 35 个信标)。流量在回环接口 (`lo`) 上捕获;各配置间的 IAT 方差比是有效的,但绝对计时值不能代表真实双机部署的情况。 ### 各配置特征统计 | Profile | beacon_iat mean (s) | beacon_iat std (s) | entropy mean | entropy std | payload mean (B) | payload std (B) | |---------|--------------------|--------------------|-------------|------------|-----------------|----------------| | baseline | 5.0983 | 0.0318 | 2.1811 | 0.1242 | 345.2063 | 158.3464 | | low | 5.0708 | 0.2771 | 2.1964 | 0.1534 | 344.1140 | 152.0404 | | medium | 5.1602 | 1.0622 | 2.1970 | 0.1235 | 351.2477 | 153.8857 | | high | 5.2024 | 1.7554 | 2.1711 | 0.1437 | 350.4224 | 146.8890 | **主要发现:** - **Baseline** 显示接近零的 IAT 方差(std=0.032 s)—— 仅为操作系统调度噪声。任何计算连接间隔的监控器都能轻易识别其指纹。 - **Low** 配置的 IAT 标准差是 **基线的 8.7 倍**(0.277 s),通过 10% 的均匀抖动实现。变化可测但幅度适中。 - **Medium** 配置的 IAT 标准差是 **基线的 33.4 倍**(1.062 s),通过 20% 的均匀抖动实现 —— 足以击败简单的固定阈值检测器。 - **High** 配置的 IAT 标准差是 **基线的 55.2 倍**(1.755 s),通过 40% 的高斯抖动实现 —— 方差最大,规避信号最明显。 - **熵值** 在所有配置中约为 2.18–2.20:由于所有流量都经过 TLS 加密,包大小熵值在此不是有效的跨配置区分指标。 - **负载大小** 差异处于噪声范围内 —— TLS 记录帧结构(约 29 字节开销)在此负载规模(总计约 350 字节)下部分掩盖了应用层填充。 从 baseline → low → medium → high 的单调递增确认了抖动流水线按设计正常工作。有关完整的指标定义和局限性,请参阅 [result_summary.md](experiments/result_summary.md)。 ## 快速开始 **预计时间:约 15 分钟**(假设已按照 `setup/vm_setup.md` 配置好实验室 VM)。 ### 步骤 1 — 克隆仓库 (Ubuntu Server VM) ``` git clone https://github.com/Menelaus29/c2-framework.git /home/c2server/c2-framework cd /home/c2server/c2-framework ``` ### 步骤 2 — 创建 Python 虚拟环境 ``` python3.11 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ### 步骤 3 — 配置 `common/config.py` ``` cp common/config_example.py common/config.py ``` 编辑 `common/config.py` 并设置适合您实验室网络的值(服务器 IP、PSK、允许的主机等)。所有常量均有内联文档说明。 ### 步骤 4 — 放置 TLS 证书 将您的实验室 TLS 证书和私钥复制到 `certs/` 目录: ``` certs/server.crt ← certificate (also copied to Windows VM) certs/server.key ← private key (server only — never copy to agent) ``` 如果您没有实验室证书,请生成一个自签名证书: ``` openssl req -x509 -newkey rsa:4096 -keyout certs/server.key \ -out certs/server.crt -days 365 -nodes \ -subj "/CN=c2.lab.internal" ``` ### 步骤 5 — 添加主机名解析 (两台 VM) 在 **Ubuntu Server VM** 上: ``` echo "127.0.0.1 c2.lab.internal" | sudo tee -a /etc/hosts ``` 在 **Windows Victim VM** 上: ``` # 在 C:\Windows\System32\drivers\etc\hosts 中(以管理员身份运行 Notepad): 192.168.100.10 c2.lab.internal ``` ### 步骤 6 — 启动服务端 请遵循 [`redirector/deployment_guide.md`](redirector/deployment_guide.md) 执行完整的服务器和重定向器启动过程。推荐路径是使用 **Docker Compose**: ``` cd /home/c2server/c2-framework docker compose up -d ``` 验证两个容器均已启动: ``` [+] Running 2/2 ✔ Container c2-server Started ✔ Container c2-nginx Started ``` 对技术栈进行冒烟测试(预期 `400` = Nginx 转发成功,服务器因协议无效拒绝请求): ``` curl -k --resolve c2.lab.internal:443:127.0.0.1 \ -X POST https://c2.lab.internal/beacon \ -H 'Content-Type: application/octet-stream' \ -d 'test' -o /dev/null -w '%{http_code}\n' ``` ### 步骤 7 — 准备 Windows Victim VM 在 Windows Victim VM 上,克隆仓库并安装依赖: ``` git clone C:\c2-framework cd C:\c2-framework python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r requirements.txt ``` 从 Ubuntu VM 复制 `certs/server.crt`(例如通过 SCP 或共享文件夹)到 `C:\c2-framework\certs\server.crt`。 从 Ubuntu VM 复制 `common/config.py` —— 它必须与服务端配置 **完全一致**,以便 PSK、端口和允许的主机相匹配。 ### 步骤 8 — 设置实验室模式环境变量 打开一个 **提升权限的** PowerShell 提示符,并为该会话设置所需的环境变量: ``` $env:LAB_MODE = "1" ``` 如果 `LAB_MODE` 未设置为 `"1"`,Agent 的 `environment_checks.py` 将拒绝启动。 ### 步骤 9 — 运行 Agent (Windows) ``` cd C:\c2-framework .\.venv\Scripts\Activate.ps1 python -m agent.agent_main ``` 预期的启动日志(JSON 输出到 stdout): ``` {"message": "environment check passed", "lab_mode": "1"} {"message": "beacon loop started", "target": "c2.lab.internal", "interval_s": 30} {"message": "checkin complete", "session_id": ""} ``` ### 步骤 10 — 通过 Operator CLI 下发命令 在 Ubuntu Server VM 的第二个终端中: ``` cd /home/c2server/c2-framework source .venv/bin/activate python -m server.api_interface ``` 使用交互界面列出会话、排队任务并获取结果: ``` > list > task whoami > results > kill ``` Agent 将在下一个信标周期(默认 30 秒间隔,可在 `common/config.py` 中配置)提取排队的任务。 ## 项目结构 ``` c2-framework/ ├── agent/ # Windows implant — beacon loop, executor, environment gate │ ├── agent_main.py # Entry point: environment check → BeaconLoop startup │ ├── beacon.py # CHECKIN → TASK_PULL → TASK_RESULT cycle; exponential back-off │ ├── environment_checks.py # LAB_MODE and host validation; refuses to run outside lab │ ├── executor.py # subprocess.run(shell=False); enforces BLOCKED_COMMANDS list │ └── jitter.py # Jitter calculation helper used by beacon loop ├── server/ # Ubuntu FastAPI controller │ ├── server_main.py # FastAPI app; /beacon POST handler; lifespan hooks │ ├── session_manager.py # In-memory session state with asyncio.Lock │ ├── command_queue.py # Per-session async task queue │ ├── storage.py # SQLite persistence (aiosqlite): sessions, tasks, results, nonces │ └── api_interface.py # Operator CLI: list / task / results / kill ├── transport/ # Network transport layer (agent-side) │ ├── http_transport.py # send_beacon(): TLS-pinned session, host validation, error mapping │ ├── tls_wrapper.py # SSLContext pinned to lab cert; TLS 1.2 minimum │ └── traffic_profile.py # Loads active evasion profile from profile_config.yaml ├── evasion/ # Configurable evasion techniques │ ├── sleep_strat.py # uniform_sleep / gaussian_sleep; MIN_SLEEP_S floor │ ├── padding_strat.py # Prepend length prefix; append random bytes; strip_padding() │ ├── header_randomizer.py # Four-level header pool rotation │ └── profile_config.yaml # Named profiles: baseline / low / medium / high ├── common/ # Shared constants and primitives │ ├── config_example.py # Template — copy to config.py before use │ ├── config.py # Runtime constants (gitignored if PSK is live) │ ├── crypto.py # AES-256-GCM encrypt/decrypt; HKDF-SHA256 key derivation │ ├── message_format.py # pack/unpack: JSON → encrypt → binary envelope (magic 0xC2C2) │ ├── logger.py # Structured JSON logger; stdout + rotating file │ └── utils.py # Exception hierarchy: C2Error → Crypto/Protocol/Transport/Env ├── redirector/ # Nginx reverse proxy configuration and deployment docs │ ├── nginx_docker.conf # Docker-specific config (more_set_headers, bridge DNS) │ ├── nginx_example.conf # Bare-metal config template │ ├── deployment_guide.md # Step-by-step: bare-metal and Docker Compose methods │ └── site/ # Fake static website served on non-beacon paths ├── telemetry/ # PCAP capture and flow feature extraction pipeline │ ├── traffic_capture.py # Wraps tcpdump/scapy; labels captures by experiment config │ ├── flow_parser.py # PCAP → FlowRecord list; inter-arrival times, byte counts │ └── feature_extractor.py # Per-flow: mean/std IAT, Shannon entropy, payload statistics ├── experiments/ # Experiment scripts and results │ ├── beacon_variation_tests.py # Runs all four profiles; collects PCAP per run │ ├── entropy_analysis.py # Post-hoc Shannon entropy analysis on captured flows │ └── result_summary.md # Metric definitions, results table, interpretations, limitations ├── tests/ # pytest test suite │ ├── test_crypto.py # Unit tests for AES-GCM, HKDF, nonce handling │ ├── test_protocol.py # pack/unpack round-trips, magic byte and envelope validation │ ├── test_executor.py # Blocked command enforcement, shell=False verification │ ├── test_session_manager.py # Session lifecycle, lock contention │ ├── test_header_randomizer.py # Header level coverage, fixed-header invariants │ ├── test_sleep_strat.py # Jitter bounds, MIN_SLEEP_S floor │ └── integration_test.py # Full beacon cycle against live FastAPI test server ├── setup/ # Lab environment setup guides │ ├── vm_setup.md # VM provisioning requirements │ ├── network_config.md # Static IP and DNS configuration for both VMs │ └── lab_topology.md # Authoritative lab IP and hostname reference ├── docs/ # Project documentation │ ├── architecture.md # Full architecture reference with all Mermaid diagrams │ ├── protocol_spec.md # Wire protocol specification: message types, envelope format │ └── threat_model.md # Simulated adversary capabilities and explicit exclusions ├── certs/ # TLS certificates (server.key is gitignored) │ └── server.crt # Lab self-signed certificate (also deployed to agent VM) ├── logs/ # Runtime log output (gitignored; created on first run) ├── docker-compose.yml # Orchestrates c2-server and c2-nginx containers ├── Dockerfile # C2 server container image ├── requirements.txt # Python dependencies (pinned versions) └── pytest.ini # pytest configuration ``` ## 安全控制 以下控制措施是不可妥协的。它们已在代码中实现,绝不能被移除或绕过。 | Control | Location | Description | |---|---|---| | **实验室环境门禁** | `agent/environment_checks.py` | Agent 在打开任何套接字之前会检查 `LAB_MODE=1` 环境变量,并根据 `ALLOWED_HOSTS` 验证目标主机。如果任一检查失败,进程将立即退出。 | | **服务器不发起出站连接** | `server/server_main.py` | 服务器完全被动 —— 它从不主动向 Agent 发起连接。所有通信均为 Agent 拉取模式。 | | ** blocked 命令列表** | `agent/executor.py`, `common/config.py` | 硬编码的 `BLOCKED_COMMANDS` 集合阻止执行网络扫描工具(ARP、Ping 扫描、SMB 枚举)、注册表工具、taskschd 及其他超出范围的操作。命令以列表形式传递,绝不作为 Shell 字符串传递。 | | **`subprocess.run(shell=False)`** | `agent/executor.py` | 所有命令均在不使用 Shell 解释的情况下执行,以防止通过命令参数进行注入。 | | **AES-256-GCM 端到端加密** | `common/crypto.py` | 所有消息负载均使用 AES-256-GCM 加密,密钥通过 HKDF-SHA256 派生。AEAD 认证标签提供篡改检测。服务器端的 SQLite Nonce 表防止重放攻击。 | | **TLS 证书锁定** | `transport/tls_wrapper.py` | Agent 的 `SSLContext` 绑定到 `certs/server.crt`。即使是由受信任 CA 签名的证书,如果与该证书不同,连接也会被拒绝。 | | **无持久化机制** | `agent/executor.py` (`BLOCKED_COMMANDS`) | 注册表写入、计划任务创建和启动文件夹修改均被明确阻止。Agent 不具备自我持久化能力。 | | **无权限提升** | 威胁模型 | 植入程序设计为以非特权用户模式进程运行。未实现任何 UAC 绕过或权限提升技术。 | | **Nginx 预过滤** | `redirector/nginx_docker.conf` | Nginx 拒绝任何不包含 Mozilla 的 `User-Agent` 和 `Content-Type: application/octet-stream` 的请求。非信标路径提供虚假静态站点或返回 404。FastAPI 从不直接暴露于网络。 | | **无内核级或 EDR 技术** | 威胁模型 + 代码 | 无驱动程序安装,无内核挂钩,无 EDR 绕过。规避严格限于网络层(时序、填充、HTTP 头)。 | | **结构化 JSON 日志** | `common/logger.py` | 所有服务器和 Agent 事件均带有会话 ID 上下文记录,以便审计。`logs/` 中的日志文件使用可配置的最大大小进行轮换。 | | **服务器以 uid 1000 运行** | `docker-compose.yml`, `Dockerfile` | FastAPI 容器降权为非 root 用户。除默认外无额外的 Docker 能力。 | ## 超出范围 本项目涵盖研究的 **红队仿真和遥测收集** 部分。不包括检测、分类或响应工具。 **基于机器学习的 NIDS** 是一个计划的后续项目,将使用此框架遥测流水线(`telemetry/`)生成的带标签 PCAP 数据集来训练和评估基于机器学习的 NIDS 模型。检测目标将包括基于 IAT 的周期性分类器、流统计异常检测器和 TLS 指纹(JA3)关联器。此处实施的规避配置专门为这些检测实验提供分级难度曲线:基线极易检测,高配置则是最难的目标。 基于机器学习的 NIDS 项目不在此仓库中跟踪。项目间的接口契约是由 `telemetry/traffic_capture.py` 生成的 PCAP 标签格式以及 `telemetry/feature_extractor.py` 输出的特征 Schema。 ## 运行测试 ``` source .venv/bin/activate # or .\.venv\Scripts\Activate.ps1 on Windows python -m pytest tests/ -v # all tests python -m pytest tests/test_crypto.py -v # single module python -m pytest --cov=. --cov-report=term # with coverage ``` ## 许证 Apache License 2.0 — 详见 [`LICENSE`](LICENSE)。 **仅供研究使用。** 请参阅本文档顶部的学术声明。
标签:AES-256-GCM 加密, Apex, AV绕过, C2 框架, DNS 反向解析, FastAPI, HTTP 隐蔽信道, Nginx 反向代理, NIDS 数据集, Python, 僵尸网络模拟, 底层编程, 无后门, 时间抖动, 机器学习, 流量混淆, 流量特征工程, 红队模拟, 网络安全, 蓝队研究, 计算机病毒, 请求拦截, 隐私保护, 隐蔽通信