conn.log
dns.log
http.log
ssl.log
Forensic ArtifactNetwork: Protocol AnalysisOT/ICS

Zeek (Bro) Network Protocol Logs

Zeek generates structured logs for every network connection, HTTP transaction, DNS query, SSL certificate, and protocol-specific event observed on the wire. Not an IDS — a protocol analyzer that produces forensic-grade telemetry.

Scroll

Zeek does not alert. It records. Every connection, every DNS query, every HTTP request, every SSL certificate — structured, timestamped, and queryable. For incident responders working a network intrusion, Zeek logs are frequently the single most valuable data source available — providing the ground truth of what actually traversed the wire, independent of endpoint telemetry that may have been tampered with or destroyed.

What Is Zeek?

Zeek (formerly Bro) is an open-source network security monitor that performs passive traffic analysis on network links. Originally developed in 1994 by Vern Paxson at Lawrence Berkeley National Laboratory (LBNL) and the International Computer Science Institute (ICSI), Zeek was renamed from Bro in 2018 to reflect its evolution from a research prototype into a production-grade network analysis framework used by governments, critical infrastructure operators, and enterprises worldwide.

Unlike traditional intrusion detection systems (Snort, Suricata) that match packets against signature rulesets and produce alerts, Zeek operates as a protocol analyzer. It reassembles TCP streams, parses application-layer protocols (HTTP, DNS, SSL/TLS, SMB, SSH, SMTP, FTP, MODBUS, DNP3, and dozens more), and generates structured log entries for every observed transaction. A single HTTP request produces a log entry containing the timestamp, source and destination IPs, destination port, HTTP method, Host header, URI, User-Agent, referrer, response code, response body length, and MIME type. This level of detail is not available from NetFlow, firewall logs, or packet captures without manual dissection.

Zeek operates at the session layer and above. It does not store raw packets (that is the job of PCAP). Instead, it distills every network transaction into a structured, searchable record. A 24-hour PCAP from a moderately active network might consume 500 GB of disk. The equivalent Zeek logs for the same traffic typically consume 2–5 GB — a 100x reduction — while retaining the metadata investigators actually need: who talked to whom, on what port, using what protocol, for how long, and how many bytes in each direction.

Key Insight

Zeek does not alert. It records. Every connection, every DNS query, every HTTP request, every SSL certificate — structured, timestamped, and queryable. This is its forensic power: Zeek provides a complete, protocol-aware record of network activity without requiring an analyst to have predicted what to look for in advance.

Zeek’s architecture consists of an event engine that processes packets and generates events, and a policy script interpreter (written in the Zeek scripting language) that decides what to log. This scripting layer is what makes Zeek extensible: organizations can write custom scripts to extract fields from proprietary protocols, flag specific patterns, or enrich logs with threat intelligence. Corelight, the commercial company founded by Zeek’s creator, provides enterprise-grade Zeek sensors with additional protocol parsers, encrypted traffic analysis, and cloud integrations.

Location & Format

Default Paths

DeploymentPathNotes
Standalone Zeek/opt/zeek/logs/Default installation path; current/ holds live logs, dated directories hold rotated archives
SecurityOnion/nsm/zeek/logs/Pre-packaged sensor distribution; logs also ingested into Elasticsearch/Kibana
Corelight SensorStreamed to SIEMAppliance-based; logs typically forwarded via Kafka, Splunk HEC, or S3
SELKS/Arkime/opt/zeek/logs/ or customVaries by deployment configuration

Log Format

By default, Zeek writes logs in TSV (tab-separated values) format. Each log file begins with header lines (prefixed with #) that define the field separator, field names, and field types. This self-describing format makes Zeek logs grep-friendly and parseable with standard Unix tools (awk, cut, sort). Zeek can also be configured to output in JSON format (via @load policy/tuning/json-logs), which is preferred for SIEM ingestion and tools like jq.

Key Log Files

Log FileDescriptionKey FieldsForensic Value
conn.logEvery TCP/UDP/ICMP connection observedts, uid, id.orig_h, id.resp_h, id.resp_p, proto, service, duration, orig_bytes, resp_bytes, conn_state, missed_bytesFoundation log — every other log references back to conn.log via the uid field
dns.logEvery DNS query and responsets, uid, query, qtype_name, rcode_name, answers, TTLsC2 domain resolution, DNS tunneling detection, DGA domain identification
http.logEvery HTTP request/response pairts, uid, host, uri, method, user_agent, status_code, response_body_len, referrerWebshell callbacks, malware download URIs, data exfiltration over HTTP
ssl.logEvery SSL/TLS handshakets, uid, server_name, subject, issuer, ja3, ja3s, validation_status, establishedJA3/JA3S fingerprinting, self-signed certificate detection, expired/revoked certs
files.logEvery file observed in network trafficts, fuid, source, mime_type, filename, md5, sha1, sha256, total_bytesMalware download hashes, exfiltrated file identification, file type verification
x509.logX.509 certificate detailsts, id, certificate.subject, certificate.issuer, certificate.not_valid_before, certificate.not_valid_after, san.dnsPhishing infrastructure (Let’s Encrypt certs on suspicious domains), C2 certificate reuse
notice.logZeek-generated alerts and noticests, uid, note, msg, src, dst, pSelf-signed cert warnings, SSL validation failures, address scan detection
weird.logProtocol anomalies and violationsts, uid, name, addl, sourceProtocol evasion attempts, malformed packets, tunneling indicators
smb_mapping.logSMB share mappingsts, uid, path, share_typeLateral movement via admin shares (C$, ADMIN$), ransomware propagation
kerberos.logKerberos authentication eventsts, uid, client, service, success, error_msgPass-the-ticket, Kerberoasting, golden ticket detection
UID Correlation

The uid field is the forensic backbone of Zeek logs. Every connection in conn.log receives a unique identifier. When that connection generates DNS, HTTP, SSL, or file events, those log entries carry the same uid. This means an investigator can start with a suspicious conn.log entry and immediately pivot to see the DNS query that resolved the destination, the HTTP request that was made, the SSL certificate that was presented, and the file that was transferred — all linked by a single identifier.

What It Reveals

Zeek logs answer a comprehensive class of investigative questions that span network reconnaissance, lateral movement, command-and-control, and data exfiltration. The following questions are directly answerable from Zeek data:

Investigative Benchmark

A connection in conn.log with a 60-second interval, less than 5% timing jitter, consistent payload sizes (200–300 bytes), and a destination IP not in any corporate whitelist is a C2 beacon until proven otherwise. Zeek provides the raw data to detect this pattern; tools like RITA automate the statistical analysis.

Forensic Use Cases

1. C2 Beacon Detection

Command-and-control beacons are designed to blend into normal traffic, but they cannot hide their timing patterns from statistical analysis of conn.log. An implant configured to call home every 60 seconds with 10% jitter produces connections at intervals of 54–66 seconds. Over 24 hours, this generates approximately 1,440 connections to the same destination — a pattern that is trivially detectable in Zeek data. The investigator extracts all connections from a suspect host, computes the inter-arrival time distribution, and identifies clusters with low standard deviation. The orig_bytes and resp_bytes fields further confirm the pattern: C2 heartbeats produce consistent, small payload sizes (check-in requests of 200–400 bytes, responses of 100–200 bytes), with occasional larger responses when the operator issues commands or stages payloads.

2. DNS Tunneling

DNS tunneling encodes data in DNS queries (typically TXT or CNAME records) to exfiltrate information through networks that allow DNS but block other outbound protocols. Zeek’s dns.log captures the full query string, response type, and answer content. Indicators include: abnormally long subdomain labels (base64-encoded data produces 40–60 character subdomains), high query volume to a single domain (thousands of TXT queries to data.evil.com in an hour), low TTL values in responses, and query types that are unusual for the queried domain (TXT records for domains that serve no legitimate TXT content). A single domain receiving more than 500 unique subdomain queries per hour from a single internal host is almost certainly DNS tunneling — legitimate DNS activity for a single domain rarely exceeds 10–20 queries per hour per host.

3. Data Exfiltration Over HTTP/HTTPS

When an adversary exfiltrates data over HTTP, http.log records the full URI, including the target host, path, and query parameters. Large POST requests to cloud storage APIs (api.mega.co.nz, content.dropboxapi.com, storage.googleapis.com) with request_body_len in the megabyte range are direct evidence of exfiltration. For HTTPS exfiltration, the payload is encrypted, but conn.log still records the total bytes transferred: a connection to a suspicious IP with 2.8 GB in orig_bytes and 4 KB in resp_bytes is a unidirectional outbound transfer regardless of encryption. The ssl.log JA3 fingerprint can further identify the tool used (curl, wget, rclone, and custom malware all produce distinctive JA3 hashes).

4. Lateral Movement Detection

Zeek monitors internal-to-internal traffic on the segments where its sensor is deployed. Lateral movement via SMB/RDP/WinRM produces characteristic conn.log entries: internal source IP to internal destination IP on ports 445, 3389, or 5985/5986. smb_mapping.log records share mappings including administrative shares (C$, ADMIN$, IPC$) that are commonly used for tool staging and remote execution. kerberos.log captures authentication events, enabling detection of pass-the-hash, pass-the-ticket, and Kerberoasting attacks. A workstation initiating SMB connections to 15 servers within a 10-minute window — especially using ADMIN$ shares — is a textbook lateral movement pattern.

5. OT/ICS Network Anomaly Detection

In operational technology environments, Zeek provides visibility into protocols that traditional security tools cannot parse. With the appropriate protocol analyzers loaded, Zeek can log MODBUS, DNP3, BACnet, EtherNet/IP, and S7comm transactions. In our Volt Typhoon OT investigation, a Zeek sensor deployed on a SPAN port of the ICS network switch identified a Raspberry Pi implant beaconing to an external IP every 300 seconds. The device was not in the asset inventory, and its MAC OUI resolved to “Raspberry Pi Trading Ltd” — a manufacturer that had no business being on an industrial control network. Without Zeek, the implant would have continued operating undetected: the OT network had no endpoint detection, no firewall logging, and no packet capture. Zeek’s conn.log was the only evidence that the device existed and was communicating externally.

Acquisition & Deployment

Deployment Note

Zeek logs are generated on the sensor, not on the endpoints being monitored. Unlike host-based artifacts (Prefetch, SRUM, Event Logs), Zeek data cannot be collected with KAPE or Velociraptor endpoint agents. Logs must be retrieved from the sensor itself or from the SIEM/data lake where they are forwarded.

Sensor Deployment

Zeek requires visibility into raw network traffic. There are two primary methods for providing this visibility:

Log Collection

BASH / COLLECTION
# SecurityOnion: Current (live) logs
ls /nsm/zeek/logs/current/
# conn.log  dns.log  http.log  ssl.log  files.log  x509.log  ...

# SecurityOnion: Archived logs by date
ls /nsm/zeek/logs/2026-03-15/
# conn.15:00:00-16:00:00.log.gz  dns.15:00:00-16:00:00.log.gz  ...

# Standalone Zeek: Same structure under /opt/zeek/logs/
ls /opt/zeek/logs/current/
ls /opt/zeek/logs/2026-03-15/

# Collect all logs from a specific date range for analysis
mkdir -p /evidence/zeek-collection
cp -r /nsm/zeek/logs/2026-03-10/ /evidence/zeek-collection/
cp -r /nsm/zeek/logs/2026-03-11/ /evidence/zeek-collection/
cp -r /nsm/zeek/logs/2026-03-12/ /evidence/zeek-collection/

# Decompress archived logs for analysis
gunzip /evidence/zeek-collection/2026-03-10/*.gz

Remote Collection via SCP

BASH / REMOTE
# Collect from remote sensor over SSH
scp -r analyst@sensor01:/nsm/zeek/logs/2026-03-10/ /evidence/zeek/sensor01/
scp -r analyst@sensor01:/nsm/zeek/logs/2026-03-11/ /evidence/zeek/sensor01/

# Alternatively, use rsync for large collections with resume capability
rsync -avz --progress analyst@sensor01:/nsm/zeek/logs/ /evidence/zeek/sensor01/ \
      --include='2026-03-1*/' --include='2026-03-1*/**' --exclude='*'

Parsing Tools & Analysis

ToolAuthorTypeBest For
zeek-cutZeek ProjectCLI (native)Field extraction from TSV logs; column selection without awk
jqStephen DolanCLIParsing JSON-formatted Zeek logs; complex filtering and transformation
RITAActive CountermeasuresCLI + MongoDBAutomated beaconing detection, DNS tunneling analysis, long connection identification
Zui (formerly Brim)Brim DataGUI desktop appInteractive log exploration with Zed query language; drag-and-drop PCAP + Zeek
zq / zedBrim DataCLIZed data lake queries from the command line; powerful aggregation and join operations
grep / awk / cutGNUCLITSV logs are natively grep-friendly; fast ad-hoc searches
Splunk / ElasticCommercialSIEMEnterprise-scale search, correlation, dashboards; JSON Zeek logs ingest directly

zeek-cut: Native Field Extraction

BASH / ZEEK-CUT
# Extract source IP, destination IP, destination port, and bytes from conn.log
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p orig_bytes resp_bytes

# Find all connections to a specific C2 IP
cat conn.log | zeek-cut ts id.orig_h id.resp_h id.resp_p service duration orig_bytes | \
    grep "198.51.100.47"

# List all DNS queries sorted by frequency (top talkers)
cat dns.log | zeek-cut query | sort | uniq -c | sort -rn | head -20

# Find HTTP requests with suspicious User-Agent strings
cat http.log | zeek-cut ts host uri user_agent | grep -i "python-requests\|curl\|wget\|powershell"

# Extract all SSL certificates that are self-signed
cat ssl.log | zeek-cut ts server_name subject issuer validation_status | \
    grep "self signed"

# Find all file transfers with MD5 hashes (for VirusTotal lookup)
cat files.log | zeek-cut ts source mime_type filename md5 sha256 total_bytes | \
    grep -v "^#" | grep -v "^$"

RITA: Automated Beacon Detection

BASH / RITA
# Import Zeek logs into RITA database
rita import /evidence/zeek/2026-03-10/ --database case_2026_03

# Analyze for beaconing behavior
rita show-beacons case_2026_03

# Output: Source, Destination, Connections, Score, Avg Bytes, Intvl Range
# 10.10.5.22    198.51.100.47    1437    0.982    287    54-66
# Score of 0.982 = near-certain beacon (1.0 = perfect regularity)

# Show DNS tunneling indicators
rita show-exploded-dns case_2026_03

# Show long-duration connections (potential C2 or persistent tunnels)
rita show-long-connections case_2026_03

Python: Beaconing Detection Script

PYTHON / BEACON ANALYSIS
# Detect C2 beaconing patterns in conn.log

import pandas as pd
import numpy as np

# Load conn.log (TSV format, skip comment lines)
df = pd.read_csv('/evidence/zeek/conn.log', sep='\t', comment='#',
                 names=['ts','uid','orig_h','orig_p','resp_h','resp_p',
                        'proto','service','duration','orig_bytes',
                        'resp_bytes','conn_state','local_orig',
                        'local_resp','missed_bytes','history',
                        'orig_pkts','orig_ip_bytes','resp_pkts',
                        'resp_ip_bytes','tunnel_parents'])

# Group by source-destination pair
pairs = df.groupby(['orig_h', 'resp_h'])

for (src, dst), group in pairs:
    if len(group) < 50:  # Need sufficient samples
        continue

    # Calculate inter-arrival times
    times = group['ts'].sort_values().diff().dropna()
    mean_interval = times.mean()
    std_interval = times.std()

    # Jitter ratio: low std/mean = regular beaconing
    if mean_interval > 0:
        jitter = std_interval / mean_interval
        if jitter < 0.15 and 10 < mean_interval < 3600:
            print(f"BEACON: {src} -> {dst}"
                  f" | conns={len(group)}"
                  f" | interval={mean_interval:.1f}s"
                  f" | jitter={jitter:.3f}")
Reading the Output

A jitter ratio below 0.15 (15%) with an interval between 10 seconds and 1 hour is a strong beacon indicator. Human-driven traffic is inherently irregular (jitter > 0.5). Automated heartbeats are regular. The lower the jitter ratio, the higher the confidence that the traffic is automated C2 communication.

Retention & Persistence

PropertyZeek StandaloneSecurityOnionCorelight (Enterprise)
Default retentionConfigurable; depends on disk allocationConfigurable via so-manage; Elasticsearch retention separate from raw logsStreamed to customer SIEM; retention governed by SIEM policy
Log rotationcurrent/ holds live logs; rotated hourly into YYYY-MM-DD/ directoriesSame; older directories compressed (.gz) and eventually purged by cronN/A — sensor does not retain locally
Typical retentionDays to weeks on sensor; longer in SIEM7–30 days of raw logs; 30–90 days in Elasticsearch90–365 days in customer data lake
Disk consumption~1–5 GB/day per 1 Gbps sustained trafficSimilar; Elasticsearch indices add 2–3x overheadSimilar; compressed in transit
vs. PCAP storageZeek logs consume roughly 1/100th the disk space of equivalent PCAP. A 500 GB/day PCAP environment produces approximately 2–5 GB/day of Zeek logs.
Retention Planning

The most common failure in network forensics is insufficient retention. By the time a breach is discovered (median dwell time: 10–21 days for sophisticated adversaries), the relevant Zeek logs may have already rotated off the sensor. Best practice: stream Zeek logs to a dedicated data lake or SIEM with at least 90 days of retention. Raw PCAP can have shorter retention (7–14 days) since Zeek logs preserve the metadata investigators need most.

Anti-Forensics Resilience

Zeek logs are a network-level artifact generated on a dedicated sensor that is architecturally separate from the systems being monitored. This separation provides inherent resilience against anti-forensics techniques that target endpoints.

Anti-Forensics TechniqueEffect on Zeek LogsExplanation
Endpoint log deletionNoneZeek runs on the sensor, not the compromised endpoint. Clearing Event Logs, Prefetch, or SRUM on the victim machine has zero effect on Zeek data.
TimestompingNoneZeek timestamps are generated by the sensor clock at packet capture time, not derived from endpoint filesystem metadata.
Encrypted C2 (TLS/SSL)Partial evasionPayload content is hidden, but conn.log still records connection metadata: source, destination, port, duration, orig_bytes, resp_bytes. ssl.log captures the certificate, SNI, and JA3/JA3S fingerprints. The adversary cannot hide that the connection happened or how much data was transferred.
Domain frontingPartial evasionThe SNI field in ssl.log shows the fronted domain (e.g., cdn.example.com), not the true backend. However, the JA3 fingerprint and connection behavior pattern (beaconing) remain detectable.
Protocol tunneling (DNS, ICMP)DetectableZeek logs the tunneling protocol transactions. DNS tunneling produces anomalous query patterns visible in dns.log. ICMP tunneling produces anomalous payload sizes in conn.log.
Sensor compromiseFull evasionIf the adversary gains access to the Zeek sensor itself, they can delete or modify logs. This is why sensors should be hardened: no inbound services, separate management VLAN, read-only log forwarding to SIEM.
Traffic on unmonitored segmentsFull evasionZeek only sees traffic on the segments where its sensor interface is deployed. Air-gapped exfiltration, USB-based data theft, or traffic on segments without a TAP/SPAN are invisible to Zeek.
Why Zeek Survives

The adversary controls the endpoint. They do not control the network sensor. Encrypted traffic hides the payload but not the connection metadata — and connection metadata (who, when, how much, how often) is precisely what incident responders need to scope a compromise. An attacker can encrypt their C2 channel, but they cannot prevent conn.log from recording that 10.10.5.22 connected to 198.51.100.47:443 every 60 seconds for 14 days and transferred 847 MB outbound.

MITRE ATT&CK Detection Mapping

Zeek logs provide evidentiary support for detecting the following MITRE ATT&CK techniques:

TechniqueNameZeek Evidence
T1071 T1071Application Layer ProtocolHTTP C2 traffic in http.log (suspicious URIs, unusual User-Agents, POST to known C2 frameworks); DNS C2 in dns.log; HTTPS C2 via JA3 fingerprinting in ssl.log
T1572 T1572Protocol TunnelingDNS tunneling visible in dns.log (long subdomain labels, high TXT query volume); ICMP tunneling via anomalous payload sizes in conn.log; SSH tunneling via long-duration SSH sessions with data transfer
T1048 T1048Exfiltration Over Alternative ProtocolData exfiltration over DNS, ICMP, or non-standard ports; high orig_bytes on unexpected protocols in conn.log
T1095 T1095Non-Application Layer ProtocolRaw TCP/UDP connections without recognized application-layer protocol in conn.log (service field is empty or “-”); custom binary protocols used by implants
T1573 T1573Encrypted ChannelJA3/JA3S fingerprints in ssl.log matching known malware families (Cobalt Strike, Metasploit, Sliver); self-signed certificates; certificates with anomalous validity periods
T1046 T1046Network Service DiscoveryPort scanning visible in conn.log as many short-lived connections from a single source to multiple destination ports; conn_state values of “REJ” (rejected) or “S0” (SYN without response) indicate probing

Related Artifacts & Case Studies

Corroborating Artifacts

ArtifactRelationship to ZeekCross-Correlation Value
PCAP (Full Packet Capture)Raw packets for the same traffic Zeek analyzedZeek identifies the suspicious connection; PCAP provides the full payload for deep analysis, malware extraction, and evidence preservation
NetFlow / IPFIXFlow-level summaries from routers and switchesNetFlow confirms traffic volumes and paths across network segments Zeek does not monitor; lower fidelity but broader coverage
DNS Query Logs (Resolver)Server-side DNS logs from recursive resolversZeek captures DNS queries at the wire level; resolver logs capture queries from all clients, including those on unmonitored segments
Firewall / Proxy LogsConnection allow/deny decisions with source NAT resolutionFirewall logs reveal the public IP (post-NAT) for outbound connections; proxy logs provide URL-level detail for HTTP/HTTPS traffic
SRUM.dbPer-application network usage on Windows endpointsZeek shows what happened on the wire; SRUM shows which application on which endpoint was responsible for the traffic
Windows Event LogsProcess creation, authentication, service eventsZeek identifies the network connection; Event Logs identify the process and user account that initiated it

Case Study

DFIR Case Study — Volt Typhoon OT Intrusion

Volt Typhoon OT Network Compromise — A Zeek sensor deployed on the ICS network SPAN port identified a Raspberry Pi implant beaconing to external infrastructure every 300 seconds. The device had been physically placed inside a cable conduit in the plant. conn.log provided the complete communication timeline: 847 MB exfiltrated over 14 days to a VPS in a non-attributable hosting provider. The OT network had no endpoint detection, no firewall logging between segments, and no PCAP — Zeek was the only source of forensic evidence for the entire network intrusion.

References

  1. Zeek Project, “Zeek Documentation” — https://docs.zeek.org/
  2. SecurityOnion Solutions, “SecurityOnion Documentation” — https://docs.securityonion.net/
  3. Active Countermeasures, “RITA — Real Intelligence Threat Analytics” — https://www.activecountermeasures.com/free-tools/rita/
  4. Corelight, “Zeek and Network Detection and Response” — https://corelight.com/blog
  5. SANS Institute, “SEC503: Network Monitoring and Threat Detection In-Depth” — https://www.sans.org/cyber-security-courses/network-monitoring-threat-detection/
  6. Salesforce Engineering, “JA3 — A Method for Profiling SSL/TLS Clients” — https://github.com/salesforce/ja3
  7. Brim Data, “Zui (formerly Brim) — Desktop App for Zeek and PCAP” — https://zui.brimdata.io/
  8. Vern Paxson, “Bro: A System for Detecting Network Intruders in Real-Time,” Computer Networks, 1999 — https://www.icir.org/vern/papers/bro-CN99.pdf

Mjolnir Security — Digital Forensics & Incident Response

Mjolnir Security provides 24/7 incident response, digital forensics, and expert witness testimony. Our DFIR team deploys and analyzes Zeek sensors for network intrusion investigations, OT/ICS security assessments, and advanced persistent threat hunts.

Digital ForensicsIncident ResponseNetwork ForensicsOT/ICS SecurityThreat HuntingExpert Witness

mjolnirsecurity.com — 24/7: +1 833 403 5875