Ob1ppO/c2-hunter
GitHub: Ob1ppO/c2-hunter
面向 Debian Linux 的实时网络流量 C2 Beacon 检测系统,结合多维评分与威胁情报帮助安全团队发现和响应恶意通信。
Stars: 1 | Forks: 0
# C2 Hunter
适用于基于 Debian 的 Linux 的实时 C2 Beacon 检测工具。捕获实时网络流量,检测 Beacon 模式(jitter、entropy、frequency),通过 GreyNoise 和离线威胁情报源丰富目标信息,并提供带有 WebSocket 实时更新的暗色主题仪表板。
## 要求
| 要求 | 详情 |
|---|---|
| 操作系统 | Debian, Ubuntu, Linux Mint, Kali Linux, Parrot OS |
| Python | 3.9+ |
| 权限 | `root` 或具备 `CAP_NET_RAW` 以进行实时 pcap |
| 可选 | GreyNoise Community API key(可在 [greynoise.io](https://greynoise.io) 免费获取) |
**Python 软件包**:`scapy flask flask-sock requests`
**系统软件包**:`libpcap-dev libcap2-bin`(由 `install.sh` 安装)
## 安装
```
git clone https://github.com/Ob1ppO/c2-hunter.git c2-hunter
cd c2-hunter
sudo bash install.sh
```
安装程序将:
- 安装系统和 Python 依赖项
- 将 Feodo Tracker 和 abuse.ch SSLBL 情报源下载到 `feeds/` 目录
- 为 `python3` 设置 `CAP_NET_RAW`(允许在无完整 root 权限的情况下进行捕获)
- 创建 `/usr/local/bin/c2hunter` 包装器
- 安装并配置 `c2hunter.service` systemd 单元
- 提示输入您的 GreyNoise API key(可稍后添加)
## 使用方法
### 前台运行(交互式)
```
# Basic — 在自动检测的 interface 上捕获
sudo c2hunter
# 指定 interface
sudo c2hunter -i eth0
# 带有 GreyNoise API key
sudo c2hunter -i eth0 --api-key YOUR_KEY_HERE
# 所有流量(不仅来自私有 IP)
sudo c2hunter -i eth0 --all-traffic
# 自定义 database 和 feeds 目录
sudo c2hunter -i eth0 --db /var/lib/c2hunter/c2hunter.db --feeds /etc/c2hunter/feeds
# 详细的 debug logging
sudo c2hunter -i eth0 --log-level DEBUG
```
打开仪表板:[http://localhost:5001](http://localhost:5001)
### 所有 CLI 选项
| 标志 | 默认值 | 描述 |
|---|---|---|
| `-i`, `--interface` | `any` | 用于捕获的网络接口 |
| `--port` | `5001` | 仪表板 HTTP/WebSocket 端口 |
| `--db` | `c2hunter.db` | SQLite 数据库路径 |
| `--feeds` | `feeds/` | 威胁情报源目录 |
| `--api-key` | 环境变量 `GREYNOISE_API_KEY` | GreyNoise Community API key |
| `--all-traffic` | 关闭 | 包含来自公共源 IP 的流量 |
| `--score-threshold` | `65` | 触发标记的最低 Beacon 分数 |
| `--log-level` | `INFO` | `DEBUG / INFO / WARNING / ERROR` |
## GreyNoise API Key 设置
1. 在 [greynoise.io](https://greynoise.io) 注册免费的 Community 账户
2. 从仪表板复制您的 API key
**选项 A — 环境变量**(推荐用于 systemd):
```
sudo nano /etc/c2hunter.conf
# 设置:GREYNOISE_API_KEY=your_key_here
sudo systemctl restart c2hunter
```
**选项 B — CLI 标志**:
```
sudo c2hunter -i eth0 --api-key your_key_here
```
**选项 C — Shell 导出**:
```
export GREYNOISE_API_KEY=your_key_here
sudo -E c2hunter -i eth0
```
如果没有 key,信息丰富化将回退到离线威胁情报源(Feodo、SSLBL)。
## systemd 服务
```
# 启动
sudo systemctl start c2hunter
# 开机启用
sudo systemctl enable c2hunter
# 状态
sudo systemctl status c2hunter
# 实时日志
journalctl -u c2hunter -f
# 重启(例如在更改 config 之后)
sudo systemctl restart c2hunter
# 停止
sudo systemctl stop c2hunter
```
服务文件位于 `/etc/systemd/system/c2hunter.service`。
要更改接口或 API key,请编辑 `/etc/c2hunter.conf` 并重新启动。
## 更新威胁情报源
情报源应每周刷新。包含一个辅助脚本:
```
sudo bash update-feeds.sh
```
或者设置每周 cron 任务:
```
sudo crontab -e
# 添加:
0 3 * * 1 /path/to/c2-hunter/update-feeds.sh >> /var/log/c2hunter-feeds.log 2>&1
```
**情报源来源**:
| 情报源 | URL | 内容 |
|---|---|---|
| Feodo Tracker | [feodotracker.abuse.ch](https://feodotracker.abuse.ch/downloads/ipblocklist.json) | 僵尸网络 C2 IP(Emotet、TrickBot 等) |
| abuse.ch SSLBL | [sslbl.abuse.ch](https://sslbl.abuse.ch/blacklist/sslipblacklist.csv) | 恶意 SSL 证书 IP |
| 本地屏蔽列表 | `feeds/blocklist.txt` | 每行一个 IP,可自行添加 |
## Beacon 评分
每个 `(src_ip, dst_ip, dst_port)` 会话使用 1 小时的滚动窗口进行 0-100 分的评分。
开始评分前需要至少 **5 个连接**。
| 组件 | 最高分 | 描述 |
|---|---|---|
| Jitter / CV | 40 | 到达时间间隔的变异系数。CV < 3% = 40 分。真实的 C2 Beacon 极具规律性。 |
| 自相关性 (lag-1) | 20 | 时间间隔的 lag-1 自相关性。数值高 = 时钟驱动的规律性。 |
| 连接计数 | 20 | 样本越多 = 置信度越高。 |
| Payload 熵 | 15 | Shannon 熵在 5.2–7.5 位之间且方差较低 → 可能是加密的 C2。 |
| Payload 大小一致性 | 10 | 固定大小的帧是强烈的 C2 指标。 |
**警报阈值**:
| 分数 | 级别 | 含义 |
|---|---|---|
| 85–100 | 严重 | 高置信度 C2 Beacon,建议立即分类处理 |
| 65–84 | 高 | 强烈的 Beacon 模式,需进行调查 |
| 40–64 | 中 | 可能是周期性流量,需监控 |
| 20–39 | 低 | 信号微弱,已记录但不报警 |
| 0–19 | — | 未标记 |
## 仪表板页面
| 页面 | 描述 |
|---|---|
| **概述 (Overview)** | KPI 卡片、2 小时流量时间轴、实时警报源、实时流量日志 |
| **Beacon 分析 (Beacon Analysis)** | 所有被标记的会话及其评分环、jitter、间隔分析。支持按会话解决/抑制。 |
| **IP 信誉 (IP Reputation)** | GreyNoise + 情报源信息丰富化表格。分类、威胁评分、标签、噪音标志。 |
| **IR 关联 (IR Correlation)** | 源主机及其所有 Beacon 会话和威胁情报分组。风险等级。 |
| **流量日志 (Flow Logs)** | 原始流量表格。高亮显示熵。内联显示目标信誉。 |
仪表板通过 **WebSocket** (`ws://localhost:5001/ws`) 连接以进行实时更新,并回退为每 10-60 秒轮询一次 REST endpoint。
## 仪表板截图
仪表板呈现为带有 WebSocket 实时更新的暗色主题 SOC 控制台。
以下所有截图均由**真实的 `dashboard/index.html`**(随工具提供的实际 UI)渲染而成。显示的流量数据为**种子样本数据**——仅用于说明,因为捕获真实的 C2 流量需要在授权网络上运行实时 daemon。UI 布局、评分、图表和信息丰富化全都是仓库内的真实代码。
当您针对真实流量运行 `c2hunter` 时,您将看到填充了您实际流量、Beacon 和警报的相同视图。
### 概述
KPI 卡片、2 小时流量时间轴、Beacon 评分分布、实时警报源和流量日志。

### Beacon 分析
所有被标记的 `(src → dst:port)` 会话及其评分环、jitter、间隔统计信息,以及解决 / 抑制 / 分析操作。

展开的 Beacon 详情——平均间隔、jitter (CV)、标准差、样本数,以及间隔历史和 payload 熵微型图表。

### IP 信誉
GreyNoise + 离线情报源信息丰富化:分类、威胁评分、组织、国家/地区、标签、噪音标志。

### IR 关联
源主机及其所有 Beacon 会话和威胁情报分组,并带有风险等级指示器。

### 强制执行(可选)
经分析师手动确认的拦截,并带有试运行命令预览。每个 Beacon、关联和信誉行上的红色 **Block** 按钮会打开一个模态框,显示将要运行的确切命令,并在执行前要求明确勾选确认复选框。侧边栏徽章显示配置的后端和试运行状态。

请参阅 [RUNBOOK.md](RUNBOOK.md) 了解为何强制执行是可选的,并与检测保持独立。
### 安全性
强制执行面已针对注入和滥用进行了强化:
- **无命令注入** — 每个后端(`iptables`、`nftables`、`dnsmasq-sinkhole`、`webhook`)
均在 `shell=False`、argv 列表和超时的情况下运行。IP 通过 `ipaddress` 进行规范化
(除非 `allow_private=True`,否则拒绝 loopback/multicast/unspecified/link-local 和 RFC1918 地址)。
域名采用 IDNA 编码,并与严格的正则表达式匹配(无 `/`、空格或 shell 元字符),因此 sinkhole 行 `address=//0.0.0.0` 无法注入文件内容。
- **无 SQL 注入** — 所有数据库访问均使用参数化 `?` 占位符。
- **在强制执行 POST 请求中进行 CSRF + bearer-token 认证** — 浏览器请求需要同源 `Origin`/`Referer`;编程客户端在配置了 token 时需要 `Authorization: Bearer $C2HUNTER_API_TOKEN`
(常数时间比较)。请参阅 [RUNBOOK.md](RUNBOOK.md)。
- **XSS 加固** — 仪表板 HTML 文本上下文使用 `esc()`;单独的 `jsq()`
(JSON 字符串化 + HTML 转义)处理插入到内联事件处理程序中的任何值,
填补了普通单引号转义无法修复的 HTML/JS 双上下文漏洞。
- **Sinkhole 写入竞争** — 专用的 `sinkhole_lock` 序列化了读-改-写过程,因此
并发的 `block_domain` 调用不会丢失条目。
- **不记录密钥** — webhook bearer token 仅在请求中发送,从不写入
日志、数据库或命令 argv。
运行 `pytest -q` 以执行专注于安全性的测试套件。
### 流量日志
原始流量表格,带有颜色编码的 Shannon 熵和内联目标信誉。

## 事件响应手册
当 C2 Hunter 标记流量且怀疑被证实时,请按照
**[RUNBOOK.md](RUNBOOK.md)** 中的分步操作手册执行:
- 分类标准(什么使 Beacon 成为“已证实”)
- 立即遏制:网络隔离与主机隔离
- 证据保全(内存、磁盘、网络捕获、c2hunter 数据库)
- 调查:通过 Sysmon 进行进程关联、持久化、横向移动
- 常见 C2 行为的 MITRE ATT&CK 映射
- 针对 SQLite 数据库的 CLI 分类查询
- 误报处理(抑制 / 允许列表 / 阈值调优)
- 讨论:**C2 Hunter 应该自动拦截 IP 吗?**(简短回答:不——
检测和强制执行保持独立;包含推荐模式)
## 架构
```
Network interface
│ (Scapy pcap / /proc/net/tcp fallback)
▼
CaptureEngine capture.py
│ FlowRecord
▼
BeaconDetector detector.py
│ alert_callback
├──────────────────────────────┐
▼ ▼
Database (SQLite) EnrichmentEngine database.py / enrichment.py
│ │
└──────┬─────────────┘
▼
C2Hunter daemon daemon.py
│
Flask + flask-sock
│
Dashboard (port 5001)
```
**模块**:
- `capture.py` — 使用 BPF 过滤器的 Scapy `sniff()`;`/proc/net/tcp` 回退;每个数据包的 Shannon 熵;10s 流超时
- `detector.py` — 每个会话的 1 小时滚动窗口;jitter/CV、自相关、熵、大小一致性评分
- `enrichment.py` — 4 级查找:LRU 缓存 → SQLite(24h TTL)→ 离线情报源 → GreyNoise API;0.2s 速率限制
- `database.py` — SQLite WAL 模式;表:`flow_logs`, `beacon_sessions`, `alerts`, `ip_reputation`, `hostnames`
- `daemon.py` — 协调器;Flask REST API + WebSocket 广播;ANSI 终端警报
## 手动安装(不使用 install.sh)
```
# 系统包
sudo apt-get install python3 python3-pip libpcap-dev libcap2-bin
# Python 包
pip3 install scapy flask flask-sock requests
# 下载 feeds
mkdir -p feeds
curl -o feeds/feodo.json https://feodotracker.abuse.ch/downloads/ipblocklist.json
curl -o feeds/sslbl.csv https://sslbl.abuse.ch/blacklist/sslipblacklist.csv
# 运行
sudo python3 -m c2hunter.daemon -i eth0 --api-key YOUR_KEY
```
## 故障排除
**捕获时提示 "Operation not permitted":**
```
sudo setcap cap_net_raw+eip $(which python3)
# 或者直接使用 sudo 运行
```
**"No module named scapy":**
```
pip3 install --break-system-packages scapy flask flask-sock requests
```
**仪表板无法加载:**
确保进程启动没有错误(`journalctl -u c2hunter -n 50`),然后打开 [http://localhost:5001](http://localhost:5001)。
**GreyNoise 返回 401:**
检查 `/etc/c2hunter.conf` 中的 API key 或 `GREYNOISE_API_KEY` 环境变量。
**未捕获到流量(仅回退到 /proc):**
可能是未安装 Scapy,或者进程缺少 `CAP_NET_RAW`。再次运行 `sudo bash install.sh` 以修复 capabilities。
## 合法与合规使用
本工具适用于:
- 监控**您拥有或获得明确书面授权进行监控的网络**
- 网络安全研究、教育和 CTF 环境
- 针对您自己基础设施的事件响应
在大多数司法管辖区,未经授权的网络监控是非法的
请负责任地使用。仅供教育和防御目的使用。
## 许可证
MIT — 随意使用、修改、分享。
标签:C2检测, Flask, IP 地址批量处理, Scapy, 威胁情报, 开发者工具, 网络流量分析, 逆向工具