通过加法递归检测非周期性结构化C2
信标猎人检测使用phi兼容加法递归调度的命令与控制信标——一种增长型、非周期性的时序模式,其中每个连接间隔大致等于前两个间隔之和。该家族设计上规避了基于规律性的检测器(RITA、AC-Hunter),同时通过双门递归测试在结构上保持可识别性。
"信标不必是周期性的才能是结构化的。"

信标猎人双门流水线:门1通过phi比率聚类过滤,门2测试加法递归结构。
pip install -r requirements.txt
# 在Zeek的conn.log上运行
python beacon_hunter.py /path/to/conn.log
# 重现所有论文结果
python run_full_evaluation.py --quick # 约2分钟,跳过完整证据套件
python run_full_evaluation.py # 约5分钟,完整流水线
# 运行单元测试
pytest tests/
# 端到端验证(验证论文声称)
python validate.py
信标猎人是一个在Zeek连接日志上运行的双门流水线。
门1 — 比率测试
对来自同一源/目的对的连接进行分组,并计算连续连接间间隔(ICI)的比率。如果平均比率接近phi(φ = 1.618)且在±0.20以内,且比率变异系数(CV)低于0.50,则通过。最少需要5个间隔。
门2 — 加法递归测试
测试所有连续三元组是否满足 ICI[n+2] ≈ ICI[n+1] + ICI[n] ,使用相对于500次置换零假设的平均相对误差。如果平均误差<0.20且p<0.05则通过。该门拒绝幂律增长(残差0.40)和指数退避(0.56),这些偶然会通过门1。
分类标签
| 标签 | 含义 |
|---|---|
ADDITIVE_RECURRENCE_BEACON | 两个门均通过——phi兼容的增长间隔调度 |
JITTERED_BEACON | 带抖动的周期性——通过比率门,未通过递归测试 |
REGULAR_BEACON | 固定间隔信标 |
BACKGROUND | 未检测到信标结构 |
INSUFFICIENT_DATA | 少于5个间隔 |
接受窗口: 几何比率在[1.45, 1.80]范围内,通过边界扫描经验验证。
beacon_hunter_github/
├── beacon_hunter.py # CLI检测器——入口点
├── detectors.py # 纯无状态门函数(556行)
├── validate.py # 32项端到端验证
├── run_full_evaluation.py # 一键复现流水线
├── requirements.txt # 固定版本依赖
├── evidence/
│ ├── evidence_suite.py # 所有6个评估套件(实验A-J)
│ ├── rita_comparison.py # RITA风格周期性基线 + 真实RITA对比
│ ├── roc_and_ci.py # ROC曲线(AUC=0.900)+ Wilson置信区间
│ ├── generate_figures.py # 图1-7(PNG + PDF)
│ └── *.json # 预计算结果
├── data/
│ ├── pcaps/ # 真实PCAP文件(见下方数据集说明)
│ └── zeek/ # Zeek的conn.log文件
├── figures/ # 图1-8 PNG + PDF(顺序编号)
├── paper/ # 完整论文(含附录A-G)
├── reports/ # 信标猎人输出报告 + 真实RITA v5.1.2输出
├── tests/
│ └── test_detectors.py # 34个单元测试(34/34通过)
├── tools/
│ ├── fib_beacon_client.py # 斐波那契信标流量生成器
│ ├── fib_beacon_server.py
│ └── uwf_to_connlog.py # UWF-ZeekData22 parquet → Zeek conn.log转换器
└── archive/ # 已弃用的脚本(legacy_detectors.py, old scanners)
对于UWF-ZeekData22评估:从 https://datasets.uwf.edu/data/ 下载,并使用 tools/uwf_to_connlog.py 转换。
以下结果来自信标猎人对真实企业流量的运行:
真实RITA v5.1.2对比(reports/rita_output_v5.1.2_24h.txt):
两种工具均检测到了30秒抖动周期性信标。RITA在其他50个严重/高危警报中将其评分为0.617低严重性。信标猎人将其分类为 JITTERED_BEACON。纯加法递归调度在RITA中的得分低于0.35——这在附录A中通过分析证明,并经经验确认。
UWF-ZeekData22(100万个真实企业连接):
在良性周内,0/12,083个分析流程被标记为 ADDITIVE_RECURRENCE_BEACON。在侦察/发现攻击周内,0/1,995 被标记(正确——端口扫描不是信标行为)。所有4个注入的斐波那契信标在0–25%抖动下均被检测到。
24小时企业Zeek背景:
1/243 个分析流程被标记——IPv6 NDP在34%分析师分类启发式下,边缘且可归因于协议。
参见 EXPECTED_RESULTS.md 了解预期的精确数值输出。
# 快速验证所有论文声称:
python validate.py
# 完整流水线(从头生成所有输出):
python run_full_evaluation.py
# 预期:32/32验证检查通过,ROC AUC=0.900,抖动20%=100%检测
如果您使用本工作,请引用随附论文:
Cordero, A. (2026). Detecting Non-Periodic Structured C2 Beaconing via Additive Recurrence. RepoSignal.io LLC. https://doi.org/10.5281/zenodo.20431555
AGPL-3.0。参见 LICENSE。
商业许可可通过 RepoSignal.io LLC 获取。
| 脚本 | 实验 | 输出 |
|---|
evidence/evidence_suite.py | A(合成)、B(实验室PCAP)、C(AC抖动)、E(对抗套件)、F(抖动扫描)、G(长度敏感性)、H(零假设分布)、I(phi边界)、J(逻辑映射) | evidence_results.json |
evidence/roc_and_ci.py | G.5(ROC,AUC=0.900)、G(Wilson CI [0.992, 1.000]) | roc_results.json |
evidence/rita_comparison.py | D(RITA风格基线对比) | rita_comparison_results.json |
evidence/generate_figures.py | 图1-7 | figures/fig*.png/pdf |
| 文件 | 类型 | 描述 |
|---|
data/pcaps/fib_beacon_validation.pcapng | 真实数据 | 实验室生成的斐波那契信标PCAP;用于实验B |
data/pcaps/jit_var_d30_j0_1h.pcap | 真实数据 | 30秒固定间隔信标,0%抖动,1小时 |
data/pcaps/jit_var_d30_j10_1h.pcap | 真实数据 | 30秒信标,10%抖动,1小时 |
data/pcaps/jit_var_d30_j99_1h.pcap | 真实数据 | 30秒信标,99%抖动(纯噪声),1小时 |
data/zeek/delay_var_d30_j25_combined.log | 真实+注入 | 2小时企业Zeek conn.log,注入30秒+25%抖动信标 |
data/zeek/delay_var_d30_j25_24h_combined.log | 真实+注入 | 上述数据24小时版本 |
reports/rita_output_v5.1.2_24h.txt | 真实RITA输出 | 实际RITA v5.1.2二进制在24小时数据集上的输出(100个流程评分) |
| 实验 | 结果 |
|---|
| 合成检测(实验A) | 3/3信标类别正确,0假阳性 |
| 实验室PCAP(实验B) | ADDITIVE_RECURRENCE_BEACON,rec_err=0.000,p<0.002 |
| 抖动扫描(实验F) | 在20%抖动以下100%检测;在30%处悬崖式下降 |
| 幂律 vs 指数退避(实验E) | 残差0.40和0.56 > 阈值0.20;正确拒绝 |
| ROC AUC(实验G.5) | 0.900;TPR=1.000 at FPR=0.071 |
| 真实RITA v5.1.2在抖动信标上 | 0.617 低严重性(两种工具均检测到;分类不同) |
| UWF-ZeekData22(100万流程,良性) | 0/12,083个分析流程被标记为ARB——0.00%假阳性率 |
| 逻辑映射套件(实验J) | 纯逻辑:0%检测;phi偏差≤20%噪声:100% |
| phi边界扫描(实验I) | 确认接受窗口[1.45, 1.80] |