
Rileva beacon C2 con struttura phi che eludono RITA e i rilevatori standard basati sulla regolarità.
Rilevamento di C2 strutturato non periodico tramite ricorrenza additiva
Beacon Hunter rileva i beacon di comando e controllo (C2) che utilizzano una pianificazione a ricorrenza additiva compatibile con phi — un pattern temporale crescente e non periodico in cui ogni intervallo tra connessioni è approssimativamente uguale alla somma dei due precedenti. Questa famiglia elude di proposito i rilevatori basati sulla regolarità (RITA, AC-Hunter), pur rimanendo strutturalmente identificabile tramite un test di ricorrenza a due gate.
"Un beacon non deve essere periodico per essere strutturato."

Pipeline a due gate di Beacon Hunter: il Gate 1 filtra tramite clustering del rapporto phi, il Gate 2 verifica la struttura a ricorrenza additiva.
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 è una pipeline a due gate che opera sui log di connessione Zeek.
Gate 1 — Test del rapporto
Raggruppa le connessioni della stessa coppia sorgente/destinazione e calcola i rapporti consecutivi degli intervalli tra connessioni (ICI). Supera il test se il rapporto medio è vicino a phi (φ = 1.618) entro ±0.20 e la variabilità del rapporto (CV) è inferiore a 0.50. Minimo: 5 intervalli.
Gate 2 — Test di ricorrenza additiva
Verifica se ICI[n+2] ≈ ICI[n+1] + ICI[n] vale per tutte le triple consecutive, usando l'errore relativo medio rispetto a un null di permutazione a 500 iterazioni. Supera il test se l'errore medio < 0.20 e p < 0.05. Questo gate rifiuta la crescita a legge di potenza (residuo 0.40) e il backoff esponenziale (0.56), che superano il Gate 1 per pura coincidenza.
Etichette di classificazione
Inviluppo di accettazione: rapporti geometrici in [1.45, 1.80], confermato empiricamente tramite scansione dei limiti.
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)
Per la valutazione UWF-ZeekData22: scaricare da https://datasets.uwf.edu/data/ e convertire usando tools/uwf_to_connlog.py.
Questi risultati derivano dall'esecuzione di Beacon Hunter su traffico aziendale reale:
Confronto con RITA v5.1.2 reale (reports/rita_output_v5.1.2_24h.txt):
Entrambi gli strumenti rilevano il beacon periodico con jitter di 30 secondi. RITA lo valuta 0.617 a gravità bassa tra 50 altri avvisi Critical/High. Beacon Hunter lo classifica come JITTERED_BEACON. Una pianificazione a ricorrenza additiva pura ottiene un punteggio inferiore a 0.35 in RITA — dimostrato analiticamente nell'Appendice A, confermato empiricamente.
UWF-ZeekData22 (1 milione di connessioni aziendali reali):
0/12,083 flussi analizzati segnalati come ADDITIVE_RECURRENCE_BEACON nella settimana benigna. 0/1,995 nella settimana di attacco Recon/Discovery (corretto — le scansioni delle porte non sono beaconing). Tutti i 4 beacon Fibonacci iniettati rilevati con jitter 0–25%.
Background Zeek aziendale di 24 ore:
1/243 flussi analizzati segnalato — NDP IPv6 al 34% dell'euristica di triage dell'analista, marginale e attribuibile al protocollo.
Vedere EXPECTED_RESULTS.md per gli output numerici esatti attesi.
# 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
Se utilizzi questo lavoro, cita l'articolo allegato:
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. Vedi LICENSE.
Licenza commerciale disponibile tramite RepoSignal.io LLC.
| Label | Significato |
|---|
ADDITIVE_RECURRENCE_BEACON | Entrambi i gate superati — pianificazione a intervalli crescenti compatibile con phi |
JITTERED_BEACON | Periodico con jitter — supera il gate del rapporto, fallisce la ricorrenza |
REGULAR_BEACON | Beacon a intervallo costante |
BACKGROUND | Nessuna struttura di beaconing rilevata |
INSUFFICIENT_DATA | Meno di 5 intervalli |
| Script | Esperimenti | Output |
|---|
evidence/evidence_suite.py | A (sintetico), B (PCAP di laboratorio), C (jitter AC), E (batteria avversariale), F (scansione del jitter), G (sensibilità alla lunghezza), H (distribuzione nulla), I (limite di phi), J (mappa logistica) | 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 (confronto baseline in stile RITA) | rita_comparison_results.json |
evidence/generate_figures.py | Figure 1-7 | figures/fig*.png/pdf |
| File | Tipo | Descrizione |
|---|
data/pcaps/fib_beacon_validation.pcapng | Riferimento reale | PCAP di beacon Fibonacci generato in laboratorio; usato nell'Esperimento B |
data/pcaps/jit_var_d30_j0_1h.pcap | Riferimento reale | Beacon costante da 30s, 0% jitter, 1 ora |
data/pcaps/jit_var_d30_j10_1h.pcap | Riferimento reale | Beacon da 30s, 10% jitter, 1 ora |
data/pcaps/jit_var_d30_j99_1h.pcap | Riferimento reale | Beacon da 30s, 99% jitter (rumore puro), 1 ora |
data/zeek/delay_var_d30_j25_combined.log | Reali + iniettati | conn.log Zeek aziendale di 2 ore con beacon iniettato da 30s + 25% jitter |
data/zeek/delay_var_d30_j25_24h_combined.log | Reali + iniettati | Versione da 24 ore del precedente |
reports/rita_output_v5.1.2_24h.txt | Output RITA reale | Output binario effettivo di RITA v5.1.2 sul dataset da 24h (100 flussi valutati) |
| Esperimento | Risultato |
|---|
| Rilevamento sintetico (Esp. A) | 3/3 classi di beacon corrette, 0 FP |
| PCAP di laboratorio (Esp. B) | ADDITIVE_RECURRENCE_BEACON, rec_err=0.000, p<0.002 |
| Scansione del jitter (Esp. F) | 100% di rilevamento fino al 20% di jitter; crollo al 30% |
| Legge di potenza vs backoff esponenziale (Esp. E) | Residui 0.40 e 0.56 > soglia 0.20; correttamente rifiutati |
| ROC AUC (Esp. G.5) | 0.900; TPR=1.000 a FPR=0.071 |
| RITA v5.1.2 reale su beacon con jitter | 0.617 gravità bassa (entrambi gli strumenti rilevano; classificazione diversa) |
| UWF-ZeekData22 (1M di flussi, benigni) | 0/12,083 flussi analizzati segnalati come ARB — 0.00% FPR |
| Batteria della mappa logistica (Esp. J) | Logistica pura: 0% di rilevamento; polarizzata su phi ≤20% di rumore: 100% |
| Scansione dei limiti di phi (Esp. I) | Finestra di accettazione [1.45, 1.80] confermata |