Hunting c2 beaconing with frequency analysis
Skill meltedinhex/analyst-ai-pack/skills/hunting-c2-beaconing-with-frequency-analysis
Detects command-and-control beacons in network logs by analyzing connection timing: measuring inter-arrival intervals, accounting for jitter, and scoring regularity per source/destination pair to surface periodic callbacks. Activates for requests to hunt C2 beaconing, find periodic callbacks, or analyze connection-interval regularity.From its SKILL.md
npx -y skills add meltedinhex/analyst-ai-pack --skill hunting-c2-beaconing-with-frequency-analysisAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 19 stars19 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as Apache-2.0. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
3.2 KB, 520 tokens by cl100k_base, as published. Nobody here has run it
Hunting C2 Beaconing with Frequency Analysis
When to Use
- You have connection logs (proxy, firewall, Zeek/
conn.log, NetFlow) and want to find implants that call home on a schedule. - You are testing a hypothesis that a beacon is hiding in normal-looking web traffic.
- You need to rank source→destination pairs by timing regularity, allowing for jitter.
Do not use pure interval regularity as a verdict — software update checks, telemetry, and keep-alives also beacon; combine timing with destination reputation and data volume.
Prerequisites
- Connection records with timestamp, source, destination (IP/domain), and ideally bytes, over a window long enough to capture many callbacks (hours to days).
- A way to enrich destinations (reputation, age, rarity) for follow-up.
Workflow
Step 1: Group and order by pair
Bucket connections by (source, destination) and sort timestamps. Require a minimum count so the interval statistics are meaningful.
Step 2: Compute inter-arrival intervals
Derive deltas between consecutive connections per pair; the interval distribution reveals periodicity.
Step 3: Score regularity with jitter tolerance
A low coefficient of variation (std/mean) of intervals indicates a steady beacon; modern beacons add jitter, so score on tolerance rather than requiring identical intervals.
python scripts/analyst.py beacon conn.json --min-events 8
Step 4: Reduce false positives
Down-rank known update/telemetry destinations and CDNs; up-rank rare/young domains, small fixed payload sizes, and odd ports.
Step 5: Triage and confirm
For top pairs, pull payloads/JA3, destination intel, and host context; confirm via the C2/beacon config skills and escalate.
Validation
- Top candidates show consistently spaced callbacks (low CV) over many events, not a handful.
- Known-benign periodic services are filtered or explained.
- Confirmed beacons corroborate with destination reputation or payload analysis.
Pitfalls
- Too few events per pair, making the interval statistics noise.
- Requiring perfect periodicity and missing jittered beacons.
- Ignoring data-volume regularity, a strong secondary beacon signal.
References
- See
references/api-reference.mdfor the beacon scorer. - ATT&CK T1071 and inter-arrival timing analysis (linked in frontmatter).
What ships with it: 3 files
4.4 KB alongside SKILL.md, 1 of them executable
references/
- api-reference.md1.4 KB
scripts/
- analyst.pyruns2.7 KB
- LICENSE340 B