yigit006/heartbeat-hunter
GitHub: yigit006/heartbeat-hunter
Heartbeat Hunter 是一个基于统计方法的 C2 beaconing 检测引擎,通过时间序列分析、复合评分和图关联三层管线从网络流量中识别隐藏在 jitter 背后的周期性命令与控制通信。
Stars: 0 | Forks: 0
[](https://github.com/yigit006/heartbeat-hunter/actions)
# Heartbeat Hunter
基于统计的 C2 beaconing 检测引擎。从 Zeek 的 `conn.log` 数据中,利用纯数学方法捕捉带有 jitter 的命令与控制 (C2) 流量:时间序列分析、概率评分和图分析。
## 为什么?
C2 植入物会定期连接到其服务器。攻击者为了掩盖这一点会添加 jitter——但统计数据不会说谎。Heartbeat Hunter 通过三个层级工作:
1. **时间序列分析** — 稳健的分布统计量(主导簇 CV、MAD、Bowley skewness)+ Schuster/Rayleigh periodogram
2. **概率评分** — 通过贝叶斯方法结合多重信号
3. **图分析** — 从异常检测到活动检测
## 方法(第一层)
Beacon 会定期连接;攻击者使用 jitter 对此进行掩盖。我们使用了两种互补的方法:
**主导簇分布**(受 RITA 启发):真实的 C2 流量会在 beacon 间隔之间混入 retry/多重请求 burst,因此原始的变异系数会产生误导。相反,我们寻找到达时间间隔分布中最密集的众数,并测量该簇内的离散程度。但较低的簇 CV 本身并不足够(因为簇的定义狭窄,它在机制上会偏小)——它必须与**簇支持度**(即属于该簇的间隔比例)结合使用。

**Schuster periodogram**:`R(f) = |Σ exp(2πi·f·tⱼ)|² / n`。直接对事件时间进行频率扫描——无需分箱(在 FFT 因不规则采样而失效的地方起作用),在 Poisson 噪声下 `R ~ Exp(1)` 呈分布状态,这意味着其统计显著性可以通过解析方法计算。

在 CTU-13 场景 42 (Neris) 上:单一特征不足以将 C2 通道从背景中分离出来——这是第二层(多重信号结合)的实验性依据。

## 方法(第二层):复合评分 + 漏斗
受 RITA 启发,在无标签情况下运行的加权复合评分:时间子评分(主导簇、MAD、Schuster)+ **字节子评分**(beacon 的 payload 大小是固定的——burst 会破坏时序但不会破坏字节大小)+ 上下文(目标罕见度、连续性、端口类别)。其显著性通过受 BAYWATCH 启发的桶置换测试进行经验性验证。
单独的评分是不够的:在 CTU-42 测试中,前 20 名全都是合法的定期基础设施(NTP、SNMP、内部监控)。文献给出的答案不是权重,而是**过滤器**(BAYWATCH 漏斗,Elastic 方向过滤器):评分衡量的是“beacon 可能性”,范围过滤器(外部目标 + 非基础设施端口)缩小了 C2 的搜索空间。
结果:12,220 对 -> 4,958 个候选者;NTP/SNMP 从列表中被清除,全部四个 C2 通道的排名上升了 2-3 位。
```
hhunter score pairs.parquet --internal-net 147.32.0.0/16 # kapsam-içi liste
hhunter score pairs.parquet --all # ham sıralama
```
## 方法(第三层):图分析——从异常到活动
单一的 beacon 异常;两台或更多内部机器以**相似周期**向同一目标发送 beacon,即为一次活动。带评分的通道被放置在一个二分图(源 <-> 目标)中;共享目标将获得一个结合了周期一致性和通道评分的综合 `campaign_score`。
**多主机测试(CTU-13 场景 9,Neris,10 个 bot):**单通道评分可能只能将首个 C2 排在第 67 位;活动层将**真正的 C2 (195.190.13.70,7 个 bot,115 秒,一致性 1.0) 提升至第 1 位**。在场景 42 中埋没在第 8,177 位的主 C2 (173.192.170.88),凭借 8 个 bot 的集体证据成为了第 5 号活动。前 10 大活动中有 7 个属于 botnet 基础设施——包括没有 CC 标签的 spam/click-fraud 通道(超越标签的检测)。客观的边界:在单台受感染主机的捕获中 (S42),该层在机制上无法触发(需要 >=2 个源)——那里有 55 个候选者/0 个 CC。
```
hhunter campaign scored.parquet # kampanya adayları
```
## 评估(CTU-13,范围内候选者)

| 场景 | 首个 CC:朴素 -CV | 首个 CC:复合 | R@100:朴素 | R@100:复合 |
|---|---|---|---|---|
| S1/42 (Neris, 1 bot) | 59 | **37** | 0.25 | 0.25 |
| S2/43 (Neris, 1 bot) | 869 | **89** | 0.00 | **0.17** |
| S9/50 (Neris, 10 bot) | 87 | **46** | 0.16 | 0.10 (R@500: 0.27->**0.41**) |
| S13/54 (Virut, 1 bot) | 1,091 | **89** | 0.00 | **0.25** |
复合评分在所有四个场景中都改善了首个 CC 的排名;在 S2 中提升了 10 倍,在不同家族 中提升了 12 倍。在多 bot 的 S9 中,额外的层发挥了作用:**在活动层面,真正的 C2 在 94 个候选者中排名第 1**(在单 bot 捕获中,机制上无法满足 >=2 个源的要求——这是客观的边界)。
分层解读:在通道层面,要在数千次合法的定期探测(邮件、监控、update)中单独分离出 C2,是统计检测器面临的共同难题(AP 约为 0.03)。该工具主要的狩猎清单是在**活动层面**——真正的 C2 在 94 个候选者中位居榜首。通过测量记录了两个设计经验:目标罕见度信号在多 bot 捕获中会产生反向效果(从通道评分中移除,移至活动层),并且 Rbot 场景 (S10/S11) 因为不包含可衡量密度的 CC beaconing 而被排除在评估之外。
## 安装
```
pip install -e ".[dev]"
```
## 用法(端到端流水线)
```
# 1) Zeek conn.log 或 CTU-13 .binetflow -> cift tablosu
hhunter ingest capture.binetflow -o pairs.parquet
# 2) 评分(将机构的公共博客识别为内网)
hhunter score pairs.parquet --internal-net 147.32.0.0/16 -o scored.parquet
# 3) 活动检测(>=2 个内部源指向同一目标)
hhunter campaign scored.parquet
# 为 SIEM/otomasyon 提供两条命令的 JSON 输出:
hhunter score pairs.parquet --json | jq '.[0]'
hhunter campaign scored.parquet --json
```
## 分析仪表板
CLI 漏斗的人性化界面——仪表板仅用于读取,所有分析都在流水线中完成(没有第二种计算路径):
```
pip install -e ".[demo]"
streamlit run app.py
```
三个视图:过滤后的候选表、通道详情(时间轴 + 到达时间间隔分布 + periodogram + 子评分细分——“评分为什么高?”的答案)以及活动列表。
## 局限性(已测量并记录)
- **50%+ 的 jitter** 是检测的极限——间隔在该点会变成真正的噪声(鲁棒性矩阵见 `docs/img/jitter_robustness.png`)。
- **通道层面的 AP 较低**(约 0.03):数千次合法的定期探测(邮件、监控、update)与 beacon 具有相同的时间特征。此工具是一个优先级划分漏斗,而非单独的裁决引擎。
- **活动层需要 >=2 个受感染的源**——在单 bot 捕获中机制上无法触发。
- **Rbot/DDoS 场景 (S10/S11) 未能评估**:没有可测量密度的 CC beaconing——作为数据适用性分析进行报告。
- 未来工作:使用 PU-learning 进行正样本校准,受 Elastic 启发的桶自相关(针对高 jitter);针对每天 50GB+ 的规模,将 ingestion 层迁移至 Polars/lazy-scan(因为 schema 与来源无关,更改仅限于 `ingest.py`——在这种规模下,pandas 是有意为之的选择:处理 280 万个流耗时 14 秒)。
## 路线图
- [x] 第 1 周:Zeek conn.log ingestion + beacon 模拟器
- [x] 第 2 周:时间序列层(主导簇 CV、MAD、Bowley、Schuster periodogram)
- [x] 第 3 周:复合评分(时间+字节+上下文)+ 置换显著性 + 漏斗过滤器
- [x] 第 3 周:图分析 / 活动检测 —— `hhunter campaign`
- [x] 第 4 周:多主机场景 (S9) + 评估基础设施 + PR 曲线
- [x] 第 4 周:在 4 个场景中进行评估(3 个 Neris + Virut)——跨家族泛化
- [x] 第 4 周:CLI `--json`(SIEM 集成)+ 限制文档
- [x] 额外奖励:Streamlit 分析仪表板(`streamlit run app.py`)
- [ ] 第 4 周:CTU-13 评估(precision/recall)+ 文档
## 许可证
MIT
标签:AMSI绕过, C2检测, IP 地址批量处理, Kubernetes, 威胁检测, 安全, 时间序列分析, 网络流量分析, 超时处理, 逆向工具