
Обнаруживает фи-структурированные C2-маяки, которые обходят RITA и стандартные детекторы регулярности
Обнаружение непериодического структурированного C2 через аддитивную рекуррентность
Beacon Hunter обнаруживает маячки (beaconing) командно-контрольных систем (C2), использующие фи-совместимое аддитивное рекуррентное планирование — растущий, непериодический паттерн временных интервалов, в котором каждый интервал между соединениями приблизительно равен сумме двух предыдущих. Это семейство обходит детекторы, основанные на регулярности (RITA, AC-Hunter), по замыслу, оставаясь структурно идентифицируемым с помощью двухвентильного теста рекуррентности.
«Маячку не обязательно быть периодическим, чтобы быть структурированным.»

Двухэтапный конвейер Beacon Hunter: Этап 1 фильтрует по кластеризации фи-коэффициента, Этап 2 проверяет структуру аддитивной рекуррентности.
pip install -r requirements.txt
# Run on a Zeek conn.log
python beacon_hunter.py /path/to/conn.log
# Reproduce all paper results
python run_full_evaluation.py --quick # ~2 min, skips full evidence suite
python run_full_evaluation.py # ~5 min, full pipeline
# Run unit tests
pytest tests/
# End-to-end validation (verifies paper claims)
python validate.py
Beacon Hunter — это двухэтапный конвейер, работающий с журналами соединений Zeek.
Этап 1 — Тест отношения
Группирует соединения от одной пары источник/назначение и вычисляет последовательные отношения интервалов между соединениями (ICI). Проходит, если среднее отношение близко к фи (φ = 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.
Метки классификации
Приемлемый диапазон: геометрические отношения в [1.45, 1.80], подтверждены эмпирически через пограничное сканирование.
beacon_hunter_github/
├── beacon_hunter.py # CLI detector — entry point
├── detectors.py # Pure stateless gate functions (556 lines)
├── validate.py # 32-check end-to-end validation
├── run_full_evaluation.py # One-command reproduction pipeline
├── requirements.txt # Pinned dependencies
├── evidence/
│ ├── evidence_suite.py # All 6 evaluation batteries (Experiments A-J)
│ ├── rita_comparison.py # RITA-style periodicity baseline + real RITA comparison
│ ├── roc_and_ci.py # ROC curve (AUC=0.900) + Wilson CI
│ ├── generate_figures.py # Figures 1-7 (PNG + PDF)
│ └── *.json # Pre-computed results
├── data/
│ ├── pcaps/ # Ground-truth PCAPs (see Dataset Notes below)
│ └── zeek/ # Zeek conn.log files
├── figures/ # fig1-fig8 PNG + PDF (sequential)
├── paper/ # Full paper with appendices A-G
├── reports/ # Beacon Hunter output reports + real RITA v5.1.2 output
├── tests/
│ └── test_detectors.py # 34 unit tests (34/34 pass)
├── tools/
│ ├── fib_beacon_client.py # Fibonacci beacon traffic generator
│ ├── fib_beacon_server.py
│ └── uwf_to_connlog.py # UWF-ZeekData22 parquet → Zeek conn.log converter
└── archive/ # Deprecated scripts (legacy_detectors.py, old scanners)
Для оценки UWF-ZeekData22: скачайте с https://datasets.uwf.edu/data/ и конвертируйте с помощью tools/uwf_to_connlog.py.
Эти результаты получены при запуске Beacon Hunter на реальном корпоративном трафике:
Сравнение с реальным RITA v5.1.2 (reports/rita_output_v5.1.2_24h.txt):
Оба инструмента обнаруживают 30-секундный джиттерный периодический маячок. RITA оценивает его как 0.617 Низкая серьезность среди 50 других критических/высоких предупреждений. Beacon Hunter классифицирует его как JITTERED_BEACON. Чистое аддитивное рекуррентное расписание оценивается ниже 0.35 в RITA — аналитически доказано в Приложении A, эмпирически подтверждено.
UWF-ZeekData22 (1 миллион реальных корпоративных соединений):
0/12,083 проанализированных потоков помечены как ADDITIVE_RECURRENCE_BEACON на безвредной неделе. 0/1,995 на неделе атак Recon/Discovery (верно — сканирование портов не является маячком). Все 4 инжектированных маячка Фибоначчи обнаружены при джиттере 0–25%.
24-часовой фоновый трафик корпоративного Zeek:
1/243 проанализированных потока помечен — IPv6 NDP с эвристикой анализа 34%, пограничный и объяснимый протоколом.
См. EXPECTED_RESULTS.md для точных числовых результатов.
# Quick verification of all paper claims:
python validate.py
# Full pipeline (generates all outputs from scratch):
python run_full_evaluation.py
# Expected: 32/32 validation checks pass, ROC AUC=0.900, jitter 20%=100% detection
Если вы используете эту работу, пожалуйста, процитируйте сопроводительную статью:
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.
| Метка | Значение |
|---|
ADDITIVE_RECURRENCE_BEACON | Оба этапа пройдены — фи-совместимый график с растущими интервалами |
JITTERED_BEACON | Периодический с джиттером — проходит тест отношения, не проходит рекуррентность |
REGULAR_BEACON | Маячок с постоянным интервалом |
BACKGROUND | Структура маячка не обнаружена |
INSUFFICIENT_DATA | Менее 5 интервалов |
| Скрипт | Эксперименты | Вывод |
|---|
evidence/evidence_suite.py | A (синтетические), B (лабораторный PCAP), C (джиттер AC), E (состязательная батарея), F (заметание джиттера), G (чувствительность к длине), H (нулевое распределение), I (граница фи), 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 с инжектированным маячком 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) | 100% обнаружение до 20% джиттера; обрыв на 30% |
| Степенной закон vs экспоненциальное затухание (Эксп. E) | Остатки 0.40 и 0.56 > порога 0.20; корректно отклонены |
| ROC AUC (Эксп. G.5) | 0.900; TPR=1.000 при FPR=0.071 |
| Реальный RITA v5.1.2 на джиттерном маячке | 0.617 Низкая серьезность (оба инструмента обнаруживают; разная классификация) |
| UWF-ZeekData22 (1 млн потоков, безвредные) | 0/12,083 проанализированных потоков помечены как ARB — 0.00% FPR |
| Батарея логистических карт (Эксп. J) | Чистая логистика: 0% обнаружения; фи-смещенные ≤20% шума: 100% |
| Пограничное сканирование фи (Эксп. I) | Окно приема [1.45, 1.80] подтверждено |