Menelaus29/c2-framework
GitHub: Menelaus29/c2-framework
研究级 C2 仿真框架,用于生成带标签的网络遥测数据,支撑机器学习 NIDS 检测模型的训练与评估
Stars: 2 | Forks: 0



# 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)。
**仅供研究使用。** 请参阅本文档顶部的学术声明。
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
标签:AES-256-GCM 加密, Apex, AV绕过, C2 框架, DNS 反向解析, FastAPI, HTTP 隐蔽信道, Nginx 反向代理, NIDS 数据集, Python, 僵尸网络模拟, 底层编程, 无后门, 时间抖动, 机器学习, 流量混淆, 流量特征工程, 红队模拟, 网络安全, 蓝队研究, 计算机病毒, 请求拦截, 隐私保护, 隐蔽通信