THREAT-Recon-DistributedPortScanSweep CrowdStrike LogScale · LogScale

Detect Distributed Low-and-Slow Port/Service Scanning Sweep in CrowdStrike LogScale

Adversaries increasingly avoid classic single-source port scan detection (which alerts on one IP hitting many ports/hosts in a short window) by distributing the sweep across a large pool of source IPs — botnet nodes, residential proxies, or rented scanning infrastructure — with each individual source only touching a handful of destination hosts or ports. No single source ever crosses a per-IP threshold, but the aggregate campaign methodically walks the organization's entire public IP block (T1595.001 — Active Scanning: Scanning IP Blocks) looking for exposed services ahead of exploitation. This is a persistent detection gap because most SIEM scan-detection rules key off a single source IP's touch count within a window; a coordinated low-and-slow sweep spread across dozens or hundreds of source IPs, each staying under that threshold, sails through undetected. Reliable detection requires aggregating perimeter firewall deny/reset telemetry at the destination CIDR level across ALL source IPs in a rolling window, then flagging when a large number of distinct low-touch sources collectively achieve high coverage of the organization's address space — the fingerprint of a coordinated sweep rather than background internet noise.

MITRE ATT&CK

Tactic
Reconnaissance

LogScale Detection Query

CrowdStrike LogScale (LogScale)
cql
#event_simpleName=FirewallInboundConnDenied OR #event_simpleName=NetworkConnectIP4
| RemoteAddressIP4=/^(203\.0\.113\.|198\.51\.10[0-1]\.)/
| ConnectionDirection="Inbound"
| groupBy([RemoteAddressIP4], function=([count(as=TouchCount), distinct_count(LocalAddressIP4, as=DistinctDestIPs)]))
| test(DistinctDestIPs<=3)
| Signal := "LowTouchSource"

// Companion aggregate search (run after collecting the low-touch source set above):
// #event_simpleName=FirewallInboundConnDenied OR #event_simpleName=NetworkConnectIP4
// | RemoteAddressIP4=in(subset=$low_touch_sources)
// | groupBy([], function=([distinct_count(RemoteAddressIP4, as=UniqueSources), distinct_count(LocalAddressIP4, as=UniqueDestIPsSwept)]))
// | test(UniqueSources>=25 and UniqueDestIPsSwept>=50)
medium severity medium confidence

CrowdStrike LogScale query over firewall/host network telemetry ingested into Falcon LogScale (either via FirewallInboundConnDenied on hosts running Falcon Firewall Management, or via a perimeter firewall forwarder repository). First stage groups by remote source IP within the org's public CIDR prefix and flags low-touch sources (3 or fewer distinct local destination IPs contacted). The commented companion search aggregates across the resulting low-touch source set to test for the distributed-sweep thresholds (25+ unique sources, 50+ unique destinations swept), matching the two-stage KQL/SPL detection logic; CIDR prefix matching is approximated via regex since LogScale lacks a native CIDR-range function.

Data Sources

CrowdStrike Falcon Firewall ManagementCrowdStrike LogScale (perimeter firewall log forwarder repository)

Required Tables

FirewallInboundConnDenied

False Positives & Tuning

  • Known internet research scanners and vulnerability-scanning vendors with published IP ranges
  • Distributed synthetic-monitoring or health-check services probing multiple hosts from many nodes

Other platforms for THREAT-Recon-DistributedPortScanSweep


Testing Methodology

Validate this detection against 3 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 1Simulated Low-Touch Multi-Source Port Probe (Single Host, Multiple Ports)

    Expected signal: Perimeter firewall deny/reset log entries for the connection attempts to closed/filtered ports on the lab target, recorded with the source IP and each probed destination port.

  2. Test 2Simulated Coordinated Sweep (Multiple Scripted Sources, Sequential IP Block Walk)

    Expected signal: Firewall deny/reset log entries showing the same source IP touching multiple sequential destination IPs in the lab CIDR block, each with a small number of probed ports.

  3. Test 3Masscan High-Speed IP Block Sweep (Single Source, Lab Range)

    Expected signal: Firewall/NetFlow records showing SYN-only or single-packet connection attempts across every host in the lab /28 range from one source IP.


Response Playbook

Triage

  1. Confirm the aggregation pattern first: pull the list of distinct low-touch source IPs contributing to the flagged CIDR block and verify they are genuinely distinct entities (not NAT'd behind a single upstream gateway, which would understate the true source count).
  2. Cross-reference the source IP set against known-benign internet scanner ranges (Shodan, Censys, Shadowserver, GreyNoise) and any contracted attack-surface-management vendor's published scanning ranges — legitimate research/vendor scans are the most common false positive for this pattern.
  3. Check whether the swept destination IPs/ports correlate with recently disclosed CVEs or newly exposed services — a distributed sweep immediately preceding or following a high-profile vulnerability disclosure is a strong signal of targeted pre-exploitation recon rather than generic internet background noise.
  4. Determine geographic and ASN diversity of the source IP set: a sweep from a tightly clustered ASN/geography suggests a single actor's rented infrastructure; a sweep from globally dispersed residential/proxy IPs suggests a botnet-for-hire recon service.
  5. Check for a temporal pattern — does the per-source touch rate stay just under common detection thresholds (e.g., consistently 2-3 hosts per source), suggesting the adversary deliberately tuned the sweep to evade known scan-detection rules?

Containment

  1. Add the confirmed malicious low-touch source IP set to the perimeter firewall/WAF blocklist as a batch, rather than one-off IP blocks, since new sources in the same campaign will keep rotating in.
  2. If the source IPs cluster in a small number of ASNs/subnets and show no legitimate use, consider a temporary geo/ASN-level block at the perimeter for the duration of the campaign.
  3. Prioritize patching or restricting external exposure of any service/port that was specifically and repeatedly targeted across the swept hosts, since that is the likely next-stage exploitation target.
  4. Notify the vulnerability management team to fast-track scanning and remediation of any internet-facing assets identified as being probed, ahead of a possible follow-on exploitation attempt.

Evidence Collection

  1. CommonSecurityLog / firewall deny-drop-reset records: full list of source IPs, destination IPs/ports, and timestamps contributing to the flagged sweep
  2. WHOIS/ASN enrichment for the contributing source IPs to establish infrastructure ownership and geographic distribution
  3. Any successful (non-denied) connections from the same source IP set in the surrounding time window, which would indicate the sweep found and exploited an open service
  4. Threat intelligence platform lookups (GreyNoise, Shodan, AbuseIPDB) for the contributing source IPs to classify them as known-scanner, known-malicious, or unclassified

Escalation Criteria

  • !Any source IP from the sweep is subsequently observed making a successful (allowed) connection to a swept host, indicating the recon phase transitioned into access
  • !The swept destination ports/services map to a recently disclosed critical CVE affecting software known to be deployed on the organization's perimeter
  • !The source IP set overlaps with IOCs from an active threat intelligence campaign or a known botnet/scanning-as-a-service infrastructure tracked by the organization's TI feeds
  • !Repeated distributed sweeps of the same IP block recur over multiple days, suggesting sustained, deliberate reconnaissance rather than a one-off internet-wide scan pass

Investigation Guide

Related Techniques

Forensic Artifacts

  • >Perimeter firewall deny/drop/reset logs: the primary evidence source, containing source IP, destination IP/port, and timestamp for every probed connection
  • >NetFlow/IPFIX flow records showing short-lived, single-packet or SYN-only flows consistent with port scanning rather than legitimate application traffic
  • >IDS/IPS alerts for scan-signature detections (e.g., Suricata's stream/scan rules) that may have fired on individual sources without triggering aggregate correlation
  • >DNS PTR/reverse-lookup history for contributing source IPs, useful for distinguishing known research scanners from unattributed infrastructure
  • >WAF/reverse-proxy access logs if any swept host sits behind a web-facing proxy, which may show HTTP-layer probing (path/method enumeration) alongside the network-layer scan

Tuning Guidance

Build and continuously maintain an allowlist of known-benign internet research scanners (Shodan, Censys, Shadowserver, GreyNoise RIOT list) and any contracted attack-surface-management vendor's published scanning ranges — exclude these at the source-IP or ASN level before the low-touch aggregation stage, since they are the dominant false-positive source for this pattern. The PerSourceTouchCeiling (default 3) and MinDistinctSources/MinSweptHosts (default 25/50) thresholds should be baselined against 2-4 weeks of the organization's own perimeter traffic before enabling alerting, since background internet scan noise volume varies significantly by IP block size and industry. Consider lowering MinDistinctSources for smaller organizations with a narrow public IP footprint, where a coordinated sweep would involve proportionally fewer sources to achieve high coverage.


Hunting Queries

Seven-day hunt isolating every low-touch source IP against the org's perimeter block, independent of the 24h/threshold gates in the primary detection, for manual ASN/geo/TI enrichment and campaign clustering analysis (e.g., identifying whether sources rotate through the same /24 upstream range over successive days).

Hunting — KQL
kql
// Hunt: rank contributing source IPs by ASN/geography for the flagged block to distinguish
// coordinated hostile infrastructure from a legitimate distributed scanner service
let PerimeterBlocks = dynamic(["203.0.113.0/24", "198.51.100.0/23"]);
CommonSecurityLog
| where TimeGenerated > ago(7d)
| where DeviceAction in~ ("deny", "drop", "reset")
| mv-expand Block = PerimeterBlocks to typeof(string)
| where ipv4_is_in_range(DestinationIP, Block)
| summarize DistinctDestIPs = dcount(DestinationIP), TouchTimes = make_list(TimeGenerated) by SourceIP
| where DistinctDestIPs between (1 .. 3)
| sort by DistinctDestIPs desc
Hunting — SPL
spl
index=firewall (action="deny" OR action="drop" OR action="reset")
| where cidrmatch("203.0.113.0/24", dest_ip) OR cidrmatch("198.51.100.0/23", dest_ip)
| stats dc(dest_ip) as DistinctDestIPs, values(_time) as TouchTimes by src_ip
| where DistinctDestIPs <= 3
| sort - DistinctDestIPs

Atomic Red Team Tests

Test 1 Simulated Low-Touch Multi-Source Port Probe (Single Host, Multiple Ports)
linux

Uses nmap to probe a small, non-default set of ports on a single target, simulating one 'low-touch' source's contribution to a distributed sweep (stays under any single-source scan threshold). Run against a lab target only.

Command

bash
nmap -Pn -p 22,80,443,3389,8080 --max-retries 1 --scan-delay 2s <lab_target_ip>

Expected Telemetry

Perimeter firewall deny/reset log entries for the connection attempts to closed/filtered ports on the lab target, recorded with the source IP and each probed destination port.

Expected Detection

Individually below the low-touch source's DistinctDestIPs<=3 ceiling; contributes one entry to the LowTouchSources set in the KQL/SPL detection when correlated against other simulated sources.

Test 2 Simulated Coordinated Sweep (Multiple Scripted Sources, Sequential IP Block Walk)
linux

Loops nmap across a small consecutive range of lab-owned IPs from a single test host to emulate the destination-coverage pattern of a distributed sweep walking an IP block, without exceeding a per-source connection ceiling per target.

Command

bash
for ip in 10.10.10.1 10.10.10.2 10.10.10.3; do nmap -Pn -p 22,443 --max-retries 1 $ip; done

Expected Telemetry

Firewall deny/reset log entries showing the same source IP touching multiple sequential destination IPs in the lab CIDR block, each with a small number of probed ports.

Expected Detection

Simulates the aggregate 'UniqueDestIPsSwept' growth the detection watches for when correlated with other simulated low-touch sources in a lab CommonSecurityLog dataset.

Test 3 Masscan High-Speed IP Block Sweep (Single Source, Lab Range)
linux

Uses masscan to rapidly sweep a lab-owned CIDR range on a common port, simulating the raw internet-wide scanning behavior (e.g., Shodan/Censys-style or botnet worker) that feeds the low-touch source pool when spread across many source IPs.

Command

bash
masscan -p80,443 10.10.10.0/28 --rate 100

Expected Telemetry

Firewall/NetFlow records showing SYN-only or single-packet connection attempts across every host in the lab /28 range from one source IP.

Expected Detection

In production this single-source behavior would be caught by classic single-IP scan-threshold rules; used here to validate that the perimeter log pipeline captures the raw scan telemetry the distributed-sweep detection depends on.

Related Detections