
Détecte les balises C2 phi-structured qui contournent RITA et les détecteurs standard regularity-based.
Détection de C2 structuré non périodique par récurrence additive
Beacon Hunter détecte les beaconings de commande et contrôle qui utilisent une planification par récurrence additive compatible avec le nombre d'or — un modèle temporel croissant et non périodique où chaque intervalle inter-connexion est approximativement égal à la somme des deux précédents. Cette famille échappe intentionnellement aux détecteurs basés sur la régularité (RITA, AC-Hunter), tout en restant structurellement identifiable via un test de récurrence à deux portes.
"Un beacon n'a pas besoin d'être périodique pour être structuré."

Pipeline à deux portes de Beacon Hunter : la porte 1 filtre par regroupement basé sur le ratio phi, la porte 2 teste la structure de récurrence additive.
pip install -r requirements.txt
# Exécution sur un fichier conn.log de Zeek
python beacon_hunter.py /chemin/vers/conn.log
# Reproduction de tous les résultats de l'article
python run_full_evaluation.py --quick # ~2 min, ignore la suite complète de preuves
python run_full_evaluation.py # ~5 min, pipeline complet
# Exécution des tests unitaires
pytest tests/
# Validation de bout en bout (vérifie les affirmations de l'article)
python validate.py
Beacon Hunter est un pipeline à deux portes opérant sur les journaux de connexion Zeek.
Porte 1 — Test de ratio
Regroupe les connexions d'une même paire source/destination et calcule les ratios d'intervalles inter-connexion (ICI) consécutifs. Le test est réussi si le ratio moyen est proche de phi (φ = 1,618) à ±0,20 près et si la variabilité du ratio (CV) est inférieure à 0,50. Minimum : 5 intervalles.
Porte 2 — Test de récurrence additive
Teste si ICI[n+2] ≈ ICI[n+1] + ICI[n] est vérifié pour tous les triplets consécutifs, en utilisant l'erreur relative moyenne par rapport à une distribution nulle de permutation sur 500 itérations. Le test est réussi si l'erreur moyenne < 0,20 et p < 0,05. Cette porte rejette la croissance en loi de puissance (résidu 0,40) et le backoff exponentiel (0,56) qui passent la porte 1 par coïncidence.
Étiquettes de classification
Enveloppe d'acceptation : ratios géométriques dans [1,45 ; 1,80], confirmée empiriquement par balayage des limites.
beacon_hunter_github/
├── beacon_hunter.py # Détecteur CLI — point d'entrée
├── detectors.py # Fonctions de porte pures et sans état (556 lignes)
├── validate.py # Validation de bout en bout en 32 vérifications
├── run_full_evaluation.py # Pipeline de reproduction en une commande
├── requirements.txt # Dépendances épinglées
├── evidence/
│ ├── evidence_suite.py # Les 6 batteries d'évaluation (Expériences A-J)
│ ├── rita_comparison.py # Ligne de base de périodicité style RITA + comparaison avec RITA réel
│ ├── roc_and_ci.py # Courbe ROC (AUC=0,900) + Intervalle de Wilson
│ ├── generate_figures.py # Figures 1-7 (PNG + PDF)
│ └── *.json # Résultats pré-calculés
├── data/
│ ├── pcaps/ # PCAPs de vérité terrain (voir Notes sur les jeux de données ci-dessous)
│ └── zeek/ # Fichiers conn.log de Zeek
├── figures/ # fig1-fig8 PNG + PDF (séquentiel)
├── paper/ # Article complet avec annexes A-G
├── reports/ # Rapports de sortie de Beacon Hunter + sortie réelle de RITA v5.1.2
├── tests/
│ └── test_detectors.py # 34 tests unitaires (34/34 réussis)
├── tools/
│ ├── fib_beacon_client.py # Générateur de trafic beacon Fibonacci
│ ├── fib_beacon_server.py
│ └── uwf_to_connlog.py # Convertisseur parquet UWF-ZeekData22 → conn.log Zeek
└── archive/ # Scripts obsolètes (legacy_detectors.py, anciens scanners)
Pour l'évaluation UWF-ZeekData22 : télécharger depuis https://datasets.uwf.edu/data/ et convertir avec tools/uwf_to_connlog.py.
Ces résultats proviennent de l'exécution de Beacon Hunter sur du trafic d'entreprise réel :
Comparaison avec RITA v5.1.2 réel (reports/rita_output_v5.1.2_24h.txt) :
Les deux outils détectent le beacon périodique avec gigue de 30 secondes. RITA le note 0,617 Faible sévérité parmi 50 autres alertes Critiques/Hautes. Beacon Hunter le classe JITTERED_BEACON. Un planning de récurrence additive pure obtient un score inférieur à 0,35 dans RITA — prouvé analytiquement dans l'Annexe A, confirmé empiriquement.
UWF-ZeekData22 (1 million de connexions d'entreprise réelles) :
0/12 083 flux analysés signalés comme ADDITIVE_RECURRENCE_BEACON sur la semaine bénigne. 0/1 995 sur la semaine d'attaque Recon/Découverte (correct — les scans de ports ne sont pas des beacongings). Les 4 beacons Fibonacci injectés détectés avec 0–25% de gigue.
Contexte Zeek d'entreprise sur 24 heures :
1/243 flux analysés signalé — IPv6 NDP à 34% heuristique de triage analyste, marginal et attribuable au protocole.
Voir EXPECTED_RESULTS.md pour les résultats numériques exacts attendus.
# Vérification rapide de toutes les affirmations de l'article :
python validate.py
# Pipeline complet (génère toutes les sorties à partir de zéro) :
python run_full_evaluation.py
# Attendu : 32/32 vérifications de validation réussies, AUC ROC=0,900, gigue 20%=détection à 100%
Si vous utilisez ce travail, veuillez citer l'article associé :
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. Voir LICENSE.
Licence commerciale disponible via RepoSignal.io LLC.
| Étiquette | Signification |
|---|
ADDITIVE_RECURRENCE_BEACON | Les deux portes réussissent — planification d'intervalle croissant compatible phi |
JITTERED_BEACON | Périodique avec gigue — réussit le test de ratio, échoue la récurrence |
REGULAR_BEACON | Beacon à intervalle constant |
BACKGROUND | Aucune structure de beaconing détectée |
INSUFFICIENT_DATA | Moins de 5 intervalles |
| Script | Expériences | Sortie |
|---|
evidence/evidence_suite.py | A (synthétique), B (PCAP labo), C (gigue AC), E (batterie antagoniste), F (balayage gigue), G (sensibilité longueur), H (distribution nulle), I (limite phi), J (carte logistique) | evidence_results.json |
evidence/roc_and_ci.py | G.5 (ROC, AUC=0,900), G (Intervalle de Wilson [0,992 ; 1,000]) | roc_results.json |
evidence/rita_comparison.py | D (comparaison ligne de base style RITA) | rita_comparison_results.json |
evidence/generate_figures.py | Figures 1-7 | figures/fig*.png/pdf |
| Fichier | Type | Description |
|---|
data/pcaps/fib_beacon_validation.pcapng | Vérité terrain | PCAP beacon Fibonacci généré en laboratoire ; utilisé dans l'Expérience B |
data/pcaps/jit_var_d30_j0_1h.pcap | Vérité terrain | Beacon constant 30s, 0% de gigue, 1 heure |
data/pcaps/jit_var_d30_j10_1h.pcap | Vérité terrain | Beacon 30s, 10% de gigue, 1 heure |
data/pcaps/jit_var_d30_j99_1h.pcap | Vérité terrain | Beacon 30s, 99% de gigue (bruit pur), 1 heure |
data/zeek/delay_var_d30_j25_combined.log | Réel + injecté | Journal conn.log Zeek d'entreprise de 2 heures avec beacon injecté de 30s + 25% de gigue |
data/zeek/delay_var_d30_j25_24h_combined.log | Réel + injecté | Version 24 heures du ci-dessus |
reports/rita_output_v5.1.2_24h.txt | Sortie réelle de RITA | Sortie binaire réelle de RITA v5.1.2 sur le jeu de données 24h (100 flux notés) |
| Expérience | Résultat |
|---|
| Détection synthétique (Exp A) | 3/3 classes de beacon correctes, 0 FP |
| PCAP labo (Exp B) | ADDITIVE_RECURRENCE_BEACON, rec_err=0,000, p<0,002 |
| Balayage gigue (Exp F) | Détection à 100% jusqu'à 20% de gigue ; chute à 30% |
| Loi de puissance vs backoff exponentiel (Exp E) | Résidus 0,40 et 0,56 > seuil 0,20 ; rejetés correctement |
| AUC ROC (Exp G.5) | 0,900 ; TPR=1,000 à FPR=0,071 |
| RITA v5.1.2 réel sur beacon avec gigue | 0,617 Faible sévérité (les deux outils détectent ; classification différente) |
| UWF-ZeekData22 (1M flux, bénin) | 0/12 083 flux analysés signalés ARB — 0,00% FPR |
| Batterie carte logistique (Exp J) | Logistique pur : 0% de détection ; biais phi ≤20% de bruit : 100% |
| Balayage limite phi (Exp I) | Fenêtre d'acceptation [1,45 ; 1,80] confirmée |