T1584.005 CrowdStrike LogScale · LogScale

Detect Botnet in CrowdStrike LogScale

Adversaries may compromise numerous third-party systems to form a botnet that can be used during targeting. A botnet is a network of compromised systems that can be instructed to perform coordinated tasks. Instead of purchasing/renting a botnet from a booter/stresser service, adversaries may build their own botnet by compromising numerous third-party systems. Adversaries may also conduct a takeover of an existing botnet by redirecting bots to adversary-controlled C2 servers. With a botnet at their disposal, adversaries may perform follow-on activity such as large-scale phishing or Distributed Denial of Service (DDoS). Notable real-world operators include Volt Typhoon operating KV Botnet through compromised Cisco and NETGEAR SOHO routers, Sandworm's Cyclops Blink targeting SOHO network devices, HAFNIUM using compromised devices in covert proxy networks, and Axiom using large groups of compromised machines as proxy nodes.

MITRE ATT&CK

Tactic
Resource Development
Technique
T1584 Compromise Infrastructure
Sub-technique
T1584.005 Botnet
Canonical reference
https://attack.mitre.org/techniques/T1584/005/

LogScale Detection Query

CrowdStrike LogScale (LogScale)
cql
// CrowdStrike LogScale / Falcon NG-SIEM — botnet node beaconing detection
// Uses two-stage groupBy: first to bucket connections hourly, then to summarize across buckets
#event_simpleName = NetworkConnectIP4
| !cidr(RemoteIP, subnet="10.0.0.0/8")
| !cidr(RemoteIP, subnet="172.16.0.0/12")
| !cidr(RemoteIP, subnet="192.168.0.0/16")
| !cidr(RemoteIP, subnet="127.0.0.0/8")
| !cidr(RemoteIP, subnet="169.254.0.0/16")
// Compute hour bucket per event for later distinct-bucket counting
| eval(HourBucket=formatTime("%Y-%m-%d %H", field=@timestamp, timezone="UTC"))
// Stage 1: count connections per (host, dst_ip, dst_port, hour) tuple
| groupBy([ComputerName, RemoteIP, RemotePort, HourBucket],
    function=[
      count(as=HourlyConnections),
      collect(ContextImageFileName, as=ProcessNames, limit=5)
    ])
// Stage 2: aggregate across all hours per (host, dst_ip, dst_port)
| groupBy([ComputerName, RemoteIP, RemotePort],
    function=[
      sum(HourlyConnections, as=TotalConnections),
      count(as=HourlyBuckets),
      min(HourlyConnections, as=MinHourlyConnections),
      max(HourlyConnections, as=MaxHourlyConnections),
      collect(ProcessNames, as=Processes, limit=10)
    ])
// Apply thresholds matching KQL/SPL detection logic
| TotalConnections >= 20
| HourlyBuckets >= 3
// Flag IRC C2 and bot proxy ports
| eval(IRCPort=if(RemotePort=~"^(6660|6661|6662|6663|6664|6665|6666|6667|6668|6669|6697|1080|4444)$", 1, 0))
| eval(AvgPerHour=round(TotalConnections / HourlyBuckets, 1))
// Beaconing score: IRC port = 3, high-freq low-volume = 2, high-volume = 1
| eval(BeaconingScore=if(IRCPort = 1, 3, if(AvgPerHour > 10 AND TotalConnections > 50, 2, if(TotalConnections > 200, 2, if(TotalConnections > 100, 1, 0)))))
| BeaconingScore >= 1
| sort(field=BeaconingScore, order=desc, limit=200)
| table([ComputerName, RemoteIP, RemotePort, TotalConnections, HourlyBuckets, AvgPerHour, MinHourlyConnections, MaxHourlyConnections, IRCPort, BeaconingScore, Processes])
high severity medium confidence

CrowdStrike LogScale query using Falcon sensor NetworkConnectIP4 events to detect botnet node beaconing. A two-stage groupBy pipeline first buckets events by HourBucket (truncated to the hour via formatTime) per host/IP/port tuple, then collapses across all hours to yield TotalConnections and HourlyBuckets count. This faithfully replicates the KQL dcount(bin(Timestamp, 1h)) logic. Private IP ranges are excluded with !cidr operators. IRCPort detection uses regex match on RemotePort (stored as string in Falcon telemetry). BeaconingScore mirrors the KQL/SPL scoring: IRC C2 ports score 3, high-frequency low-volume patterns score 2, high-volume beaconing scores 1. Requires Falcon sensor with network connection event collection (RTR or Prevent policy with network events enabled).

Data Sources

CrowdStrike Falcon EDR sensor (NetworkConnectIP4)Falcon NG-SIEMCrowdStrike LogScale data platform

Required Tables

NetworkConnectIP4 (Falcon sensor event stream)

False Positives & Tuning

  • Hosts running legitimate high-frequency cloud sync or backup agents (OneDrive, Dropbox, S3 sync) that establish many short-lived connections to external storage endpoints — tune TotalConnections threshold upward or add RemoteIP exclusions for known cloud storage CIDR ranges
  • Developer workstations running local game servers or Minecraft instances that use IRC-adjacent port ranges for in-game chat or RCON management — verify RemoteIP against known gaming server registries and exclude authorized hosts by ComputerName
  • Enterprise application servers performing load-balanced health checks against multiple external upstream endpoints using persistent connection pools — correlate ContextImageFileName (Processes field) against approved server application inventory to distinguish web servers from malware
Download portable Sigma rule (.yml)

Other platforms for T1584.005


Testing Methodology

Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Simulate Botnet Beaconing via PowerShell Loop

    Expected signal: Sysmon Event ID 1: Process Create with Image=powershell.exe, CommandLine containing 'DownloadString' and a loop. Sysmon Event ID 3: 30 network connection attempts to 127.0.0.1:8080 over approximately 2.5 minutes. In DeviceNetworkEvents: ConnectionCount will accumulate for the powershell.exe process against the target IP. The connection will fail (no listener) but the attempt events still fire.

  2. Test 2IRC C2 Port Connection Attempt

    Expected signal: Sysmon Event ID 3: Network connection attempt from powershell.exe to 127.0.0.1:6667. DestinationPort=6667 will be logged regardless of whether the connection succeeds. In DeviceNetworkEvents: ActionType will be 'ConnectionAttempt' or 'ConnectionFailed' with RemotePort=6667.

  3. Test 3High-Frequency Outbound Connection Burst (DDoS Simulation)

    Expected signal: Sysmon Event ID 3: 150 network connection events from powershell.exe in rapid succession, each to 127.0.0.1 on different ports. The ConnectionCount in a 15-minute window will exceed 100, triggering the DDoS burst hunting query. UniquePorts will be high (random port selection), triggering ScanIndicator evaluation.

  4. Test 4DNS Query Burst to Simulated DGA Domains

    Expected signal: Sysmon Event ID 22: 60 DNS query events from powershell.exe, each for a unique random-looking domain name. The vast majority will return NXDOMAIN (non-existent domain). DNS debug log (if enabled) will show the same pattern. DnsQueryResults field will contain NXDOMAIN indicators for each failed lookup.

Unlock Pro Content

Get the full detection package for T1584.005 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections