
Detecta balizas C2 con estructura phi que evaden RITA y los detectores estándar basados en regularidad.
Detección de C2 estructurado no periódico mediante recurrencia aditiva
Beacon Hunter detecta beaconing de comando y control que utiliza una programación de recurrencia aditiva compatible con phi: un patrón temporal creciente y no periódico en el que cada intervalo entre conexiones es aproximadamente igual a la suma de los dos anteriores. Esta familia evade por diseño los detectores basados en regularidad (RITA, AC-Hunter), a la vez que permanece estructuralmente identificable mediante una prueba de recurrencia de dos etapas.
"Un beacon no necesita ser periódico para estar estructurado."

Pipeline de dos etapas de Beacon Hunter: la Etapa 1 filtra por agrupamiento de razón phi; la Etapa 2 prueba la estructura de recurrencia aditiva.
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 es un pipeline de dos etapas que opera sobre registros de conexión de Zeek.
Etapa 1 — Prueba de razón
Agrupa las conexiones del mismo par origen/destino y calcula las razones de los intervalos entre conexiones (ICI) consecutivos. Pasa si la razón media está cerca de phi (φ = 1.618) dentro de ±0.20 y la variabilidad de la razón (CV) es inferior a 0.50. Mínimo: 5 intervalos.
Etapa 2 — Prueba de recurrencia aditiva
Comprueba si ICI[n+2] ≈ ICI[n+1] + ICI[n] se cumple en todas las ternas consecutivas, utilizando el error relativo medio frente a un nulo de permutación de 500 iteraciones. Pasa si el error medio es < 0.20 y p < 0.05. Esta etapa rechaza el crecimiento de ley de potencias (residuo 0.40) y el retroceso exponencial (0.56), que pasan la Etapa 1 por coincidencia.
Etiquetas de clasificación
Región de aceptación: razones geométricas en [1.45, 1.80], confirmada empíricamente mediante barrido de límites.
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)
Para la evaluación con UWF-ZeekData22: descargue desde https://datasets.uwf.edu/data/ y convierta con tools/uwf_to_connlog.py.
Estos resultados provienen de ejecutar Beacon Hunter contra tráfico empresarial real:
Comparación con el RITA real v5.1.2 (reports/rita_output_v5.1.2_24h.txt):
Ambas herramientas detectan el beacon periódico con jitter de 30 segundos. RITA lo puntúa con 0.617 de severidad baja entre otras 50 alertas críticas/altas. Beacon Hunter lo clasifica como JITTERED_BEACON. Un esquema de recurrencia aditiva pura obtiene una puntuación inferior a 0.35 en RITA — demostrado analíticamente en el Apéndice A y confirmado empíricamente.
UWF-ZeekData22 (1 millón de conexiones empresariales reales):
0/12,083 flujos analizados marcados como ADDITIVE_RECURRENCE_BEACON en la semana benigna. 0/1,995 en la semana de ataque Recon/Discovery (correcto: los escaneos de puertos no son beaconing). Los 4 beacons Fibonacci inyectados se detectaron con un jitter de 0–25 %.
Tráfico de fondo de Zeek empresarial de 24 horas:
1/243 flujos analizados marcados — NDP de IPv6 al 34 % en la heurística de triaje del analista, marginal y atribuible al protocolo.
Consulte EXPECTED_RESULTS.md para conocer las salidas numéricas exactas esperadas.
# 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
Si utiliza este trabajo, cite el documento adjunto:
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. Consulte LICENSE.
Las licencias comerciales están disponibles a través de RepoSignal.io LLC.
| Label | Meaning |
|---|
ADDITIVE_RECURRENCE_BEACON | Ambas etapas pasan: programación de intervalos crecientes compatible con phi |
JITTERED_BEACON | Periódico con jitter: pasa la etapa de razón, falla en recurrencia |
REGULAR_BEACON | Beacon de intervalo constante |
BACKGROUND | No se detectó estructura de beaconing |
INSUFFICIENT_DATA | Menos de 5 intervalos |
| Script | Experiments | Output |
|---|
evidence/evidence_suite.py | A (sintético), B (PCAP de laboratorio), C (jitter de AC), E (batería adversarial), F (barrido de jitter), G (sensibilidad a la longitud), H (distribución nula), I (límite de phi), J (mapa logístico) | evidence_results.json |
evidence/roc_and_ci.py | G.5 (ROC, AUC=0.900), G (IC de Wilson [0.992, 1.000]) | roc_results.json |
evidence/rita_comparison.py | D (comparación con la línea base estilo RITA) | rita_comparison_results.json |
evidence/generate_figures.py | Figuras 1-7 | figures/fig*.png/pdf |
| File | Type | Description |
|---|
data/pcaps/fib_beacon_validation.pcapng | Verdad fundamental | PCAP de beacon Fibonacci generado en laboratorio; utilizado en el Experimento B |
data/pcaps/jit_var_d30_j0_1h.pcap | Verdad fundamental | Beacon constante de 30 s, 0 % de jitter, 1 hora |
data/pcaps/jit_var_d30_j10_1h.pcap | Verdad fundamental | Beacon de 30 s, 10 % de jitter, 1 hora |
data/pcaps/jit_var_d30_j99_1h.pcap | Verdad fundamental | Beacon de 30 s, 99 % de jitter (ruido puro), 1 hora |
data/zeek/delay_var_d30_j25_combined.log | Real + inyectado | conn.log de Zeek empresarial de 2 horas con beacon inyectado de 30 s + 25 % de jitter |
data/zeek/delay_var_d30_j25_24h_combined.log | Real + inyectado | Versión de 24 horas del anterior |
reports/rita_output_v5.1.2_24h.txt | Salida real de RITA | Salida real del binario de RITA v5.1.2 sobre el conjunto de datos de 24 h (100 flujos puntuados) |
| Experimento | Resultado |
|---|
| Detección sintética (Exp A) | 3/3 clases de beacon correctas, 0 FP |
| PCAP de laboratorio (Exp B) | ADDITIVE_RECURRENCE_BEACON, rec_err=0.000, p<0.002 |
| Barrido de jitter (Exp F) | 100 % de detección con hasta un 20 % de jitter; caída abrupta al 30 % |
| Ley de potencias vs. retroceso exponencial (Exp E) | Residuos 0.40 y 0.56 > umbral 0.20; rechazados correctamente |
| ROC AUC (Exp G.5) | 0.900; TPR=1.000 con FPR=0.071 |
| RITA real v5.1.2 sobre beacon con jitter | 0.617 severidad baja (ambas herramientas detectan; clasificación distinta) |
| UWF-ZeekData22 (1M de flujos, benigno) | 0/12,083 flujos analizados marcados como ARB — 0.00 % de FPR |
| Batería de mapa logístico (Exp J) | Logístico puro: 0 % de detección; sesgado a phi con ruido ≤20 %: 100 % |
| Barrido de límites de phi (Exp I) | Ventana de aceptación [1.45, 1.80] confirmada |