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 评分分布、实时警报源和流量日志。 ![概述](https://static.pigsec.cn/wp-content/uploads/repos/cas/28/28492be88915556f57a22f69c2d837cc4b4454edc05b19845ebb7cdba29c601c.png) ### Beacon 分析 所有被标记的 `(src → dst:port)` 会话及其评分环、jitter、间隔统计信息,以及解决 / 抑制 / 分析操作。 ![Beacon 分析](https://static.pigsec.cn/wp-content/uploads/repos/cas/7d/7dce733d082387f54731576297bbb09751de7949684f954469fdeeb60c2a8e40.png) 展开的 Beacon 详情——平均间隔、jitter (CV)、标准差、样本数,以及间隔历史和 payload 熵微型图表。 ![Beacon 分析详情](https://static.pigsec.cn/wp-content/uploads/repos/cas/b8/b8294fa3a35fa99b7cb8860e58d67f1fa7a5a92008665a457ac172258ad0671d.png) ### IP 信誉 GreyNoise + 离线情报源信息丰富化:分类、威胁评分、组织、国家/地区、标签、噪音标志。 ![IP 信誉](https://static.pigsec.cn/wp-content/uploads/repos/cas/26/260d6a1ea05ed48b906d7e7af818721648355ebb3dc732f1ff2a115bec9f8e7e.png) ### IR 关联 源主机及其所有 Beacon 会话和威胁情报分组,并带有风险等级指示器。 ![IR 关联](https://static.pigsec.cn/wp-content/uploads/repos/cas/e2/e2a380e995bccd991e9f8dddb8299a524d03880d9f00a0725f436a65a65a724c.png) ### 强制执行(可选) 经分析师手动确认的拦截,并带有试运行命令预览。每个 Beacon、关联和信誉行上的红色 **Block** 按钮会打开一个模态框,显示将要运行的确切命令,并在执行前要求明确勾选确认复选框。侧边栏徽章显示配置的后端和试运行状态。 ![强制执行模态框](https://static.pigsec.cn/wp-content/uploads/repos/cas/68/68ace2c46415f97e30aa6fd6eabc04d8de1e64d41aa343f96017dba1abfe9890.png) 请参阅 [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 熵和内联目标信誉。 ![流量日志](https://static.pigsec.cn/wp-content/uploads/repos/cas/2d/2d0b9d17633c175a3578d7cbf8b04770b1ae54f5f1ed54dfa234f0d3211dd697.png) ## 事件响应手册 当 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, 威胁情报, 开发者工具, 网络流量分析, 逆向工具