Skip to main content
← Back to lab
SEC504 - Hacker Tools, Techniques, and Incident Handling | Printable command sheet
Lab 1.2 - Network Beacon Detection with RITA

Lab 1.2 - Network Beacon Detection with RITA

Threat Hunting | SEC504 | May 2026

Imported a falsimentis Zeek dataset into RITA and triaged a HIGH severity 98.60% beacon to 91.189.89.198 (Canonical NTP, false positive). Added 91.189.89.0/24 to the CIDR safelist, wired the malwaresum threat-intel feed into config.hjson, and re-imported. The clean run surfaced three HIGH severity beacons from 172.16.42.2 / 172.16.42.3 / 172.16.42.108 to 167.172.201.123, all with Threat Intel hits. Tracing the proxied traffic in access.log revealed the C2 was disguised as www1-google-analytics.com with ORIGINAL_DST 167.172.201.123, and an awk pivot identified four internal hosts (172.16.42.103/105/107/109) calling the same fake-analytics endpoint.

Tools: RITA, Zeek, ClickHouse, MalwareSum, awk, grep

Commands

1. Stage the falsimentis dataset

The SEC504 falsimentis dataset is a multi-day capture pre-converted to Zeek logs. Listed the logs directory to confirm the standard Zeek stack is present: conn.log, dns.log, http.log, ssl.log, files.log, x509.log, weird.log. Zeek's tab-separated format is what RITA expects on import.

2. Import Zeek logs into RITA

Ran ./rita.sh import -l log/ ~/labs/falsimentis/. RITA stood up its three containers (clickhouse, syslog-ng, rita-rita-1), ingested the logs, built the connection summary, ran beacon scoring, then ran HTTP, SSL, and DNS analytics. ClickHouse is the column store under the hood; the import is fast because it is bulk-loading into a columnar engine, not parsing on read.

./rita.sh import -l log/ ~/labs/falsimentis/
-l: tell RITA the input is Zeek log format log/: subdirectory holding the logs falsimentis: dataset name (becomes the database)

3. Open the RITA UI and read the beacon column

RITA's TUI ranks connections by severity. One HIGH severity row: 172.16.42.20 → 91.189.89.198 with a 98.60% beacon score, 3-second duration, 0 subdomains, prevalence 1/9 (11%). A high beacon score plus low prevalence is exactly the signature analysts are told to chase, but high score alone is not enough. The next step is to verify the destination.

4. Confirm or refute on MalwareSum

Looked up 91.189.89.198 on MalwareSum. The reputation report identified the IP as belonging to AS41231 Canonical Group Limited, network 91.189.88.0/21, range 91.189.88.0 – 91.189.95.255. Score 623 upvotes / 1 downvote, with comments confirming it is the Canonical NTP server. A 98.60% beacon to NTP is exactly the behavior NTP is supposed to exhibit, so this is a textbook false positive. The signal is real, but the verdict is benign.

5. Cross-check with dns.log

While in the logs directory, grepped dns.log for lolcats.org, another low-severity destination that surfaced in the RITA report. The query returned a single A-record lookup from 172.16.42.2 → 138.68.44.115, NOERROR, type A. Notable but not the priority lead — confirms RITA's prevalence column is sensible.

cd ~/labs/falsimentis/logs/
grep lolcats.org dns.log | head -1

6. Tune config.hjson - safelist Canonical NTP

Ran ./rita.sh view falsimentis to load the dataset, then opened config.hjson in gedit. The config ships with a CIDR safelist for common false-positive sources (Microsoft, Mozilla, AWS, Verizon CDN, etc.). Added "91.189.89.198/24" so future imports do not waste analyst time on the Canonical NTP traffic.

./rita.sh view falsimentis
gedit config.hjson

7. Confirm the safelist entry

Highlighted the new "91.189.89.198/24" entry inside the // array of CIDRs block. CIDR scoping is intentional: covering the /24 prevents tomorrow's NTP traffic from a sibling Canonical IP from producing the same false positive.

8. Wire in a threat-intel feed

Set threat_intel.online_feeds to ["http://malwaresum.sunsetisp.com/threatfeed"]. Threat-intel feeds are how RITA marks a destination as 'known bad' without depending on the analyst's recall. The next import will tag matching destinations with the Threat Intel icon in the UI.

9. Delete and re-import so the new config applies

Ran ./rita.sh delete -ni falsimentis to drop the dataset, then re-imported with the same import command. Config changes apply at import time, not at view time, so the delete-and-reimport step is mandatory whenever the safelist or threat-intel block changes.

./rita.sh delete -ni falsimentis
-ni: non-interactive (do not prompt)

10. Re-read the RITA UI after tuning

The Canonical NTP entry is gone (safelisted). Three new HIGH severity rows appear: 172.16.42.108, 172.16.42.3, and 172.16.42.2 all beaconing to 167.172.201.123 with 0% beacon score (suggesting a long-lived session rather than periodic beacon), durations of 1h04m to 1h49m, prevalence 7/9 (78%), and the red Threat Intel marker matched against the malwaresum feed. 78% of monitored internal IPs talking to the same external destination, with three of them maintaining hour-plus sessions, is operator-level C2 traffic.

11. Pivot to access.log - DNS-spoofed C2

Greped access.log for www1-google-analytics.com (one of the destinations listed by RITA as Low severity in the same UI). One hit: 172.16.42.107 sent a POST to http://www1-google-analytics.com/collect, but the proxy logged ORIGINAL_DST/167.172.201.123. The hostname is a typosquat of www.google-analytics.com and the real destination is the same C2 server flagged HIGH severity by the threat-intel feed. The attacker proxied C2 through a fake-analytics name to blend in with normal web traffic.

grep www1-google-analytics.com access.log | head -1

12. Read the full proxied request

Expanded the same grep to show full request lines. Multiple POSTs to /collect from internal hosts, all proxied to ORIGINAL_DST 167.172.201.123, all with text/html response bodies. /collect is the legitimate Google Analytics measurement endpoint, which is what makes the cover convincing. The HTML response (instead of the expected gif or 204) is the tell.

grep www1-google-analytics.com access.log

13. Enumerate every compromised internal host

Used awk to pull column 3 (source IP) from every access.log row matching www1-google-analytics.com, then sort -u to dedupe. Four hosts surfaced: 172.16.42.103, 172.16.42.105, 172.16.42.107, 172.16.42.109. Combined with the three hosts already flagged by RITA (172.16.42.2, .3, .108) the scope is at least seven internal endpoints touching the same C2 destination. That is the containment list for the next phase of the response.

awk '/www1-google-analytics.com/ {print $3}' access.log | sort -u
/regex/: pattern to match against each line {print $3}: emit field 3 (source IP in Zeek/Squid access.log) sort -u: deduplicate

Key Findings

  • RITA initial scan: 98.60% beacon score from 172.16.42.20 → 91.189.89.198 (refuted as Canonical NTP via MalwareSum)
  • Tuned config: added 91.189.89.198/24 to CIDR safelist; added malwaresum threat-intel feed
  • RITA post-tune: three HIGH severity beacons to 167.172.201.123 with Threat Intel hit, prevalence 7/9 internal hosts
  • C2 channel disguised as www1-google-analytics.com (typosquat), proxied to ORIGINAL_DST/167.172.201.123
  • Total compromised internal hosts identified: 172.16.42.2, .3, .103, .105, .107, .108, .109

Security Controls

  • Zeek as the always-on protocol decoder for east-west and north-south traffic
  • RITA (or similar beacon-detection layer) as a triage overlay on top of Zeek
  • Curated CIDR safelist for known-benign high-frequency destinations
  • Threat-intel feed integration for known-malicious destinations
  • DNS filtering / proxy logging to catch typosquats like www1-google-analytics.com
  • Egress segmentation so workstation subnets cannot reach arbitrary external IPs
Lab Print Sheet | Luis Javier Lozoya