yigit006/heartbeat-hunter

GitHub: yigit006/heartbeat-hunter

Heartbeat Hunter 是一个基于统计方法的 C2 beaconing 检测引擎,通过时间序列分析、复合评分和图关联三层管线从网络流量中识别隐藏在 jitter 背后的周期性命令与控制通信。

Stars: 0 | Forks: 0

[![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](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 本身并不足够(因为簇的定义狭窄,它在机制上会偏小)——它必须与**簇支持度**(即属于该簇的间隔比例)结合使用。 ![Jitter 鲁棒性](https://static.pigsec.cn/wp-content/uploads/repos/cas/cf/cfb0cd250811d79e897dc52e1ea7c5905ac3b3ab4d449a6b6cecfedfff1b88a6.png) **Schuster periodogram**:`R(f) = |Σ exp(2πi·f·tⱼ)|² / n`。直接对事件时间进行频率扫描——无需分箱(在 FFT 因不规则采样而失效的地方起作用),在 Poisson 噪声下 `R ~ Exp(1)` 呈分布状态,这意味着其统计显著性可以通过解析方法计算。 ![Schuster periodogram](https://static.pigsec.cn/wp-content/uploads/repos/cas/52/52aef131dba863217ff23bf8df4a3c8fcf32082048d25d748eed5e9bc68762af.png) 在 CTU-13 场景 42 (Neris) 上:单一特征不足以将 C2 通道从背景中分离出来——这是第二层(多重信号结合)的实验性依据。 ![CTU-13 分离度](https://static.pigsec.cn/wp-content/uploads/repos/cas/80/807747588e7e5880836075734ccce0a2dcf4dee1c67b0a460c9733e5247af08c.png) ## 方法(第二层):复合评分 + 漏斗 受 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,范围内候选者) ![PR 曲线](https://static.pigsec.cn/wp-content/uploads/repos/cas/1f/1f6744fe31b06d61f68cdd8c67ec52f8dc001135970099fc1e2aee5be360e88b.png) | 场景 | 首个 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, 威胁检测, 安全, 时间序列分析, 网络流量分析, 超时处理, 逆向工具