Service Exhaustion Flood
Adversaries may target the different network services provided by systems to conduct a denial of service (DoS). Adversaries often target the availability of DNS and web services through service exhaustion floods. A simple HTTP flood sends a large number of HTTP requests to a web server to overwhelm it and/or an application running on top of it, exhausting various resources required to provide the service. A SSL renegotiation attack takes advantage of a protocol feature in SSL/TLS where the adversary establishes a connection and then proceeds to make a series of renegotiation requests, exploiting the meaningful computational cost of cryptographic renegotiation to degrade or deny service when performed at volume. Both attack types target service availability without requiring exploitation of a software vulnerability.
// T1499.002 — Service Exhaustion Flood: Multi-source detection
// Branch 1: IIS HTTP flood — high request volume from single source in 5-minute windows
let FloodWindow = 5m;
let RequestFloodThreshold = 500;
let ErrorFloodThreshold = 100;
let IISFlood =
W3CIISLog
| where TimeGenerated > ago(1h)
| summarize
TotalRequests = count(),
UniqueURIs = dcount(csUriStem),
Status5xx = countif(scStatus >= 500),
Status429 = countif(scStatus == 429),
DistinctUserAgents = dcount(csUserAgent),
TotalBytesSent = sum(scBytes)
by SourceIP = cIP, TargetSite = sSiteName, TimeBin = bin(TimeGenerated, FloodWindow)
| where TotalRequests > RequestFloodThreshold or Status5xx > ErrorFloodThreshold
| extend RequestsPerSecond = round(toreal(TotalRequests) / 300, 2)
| extend FloodType = case(
UniqueURIs == 1 and TotalRequests > RequestFloodThreshold, "Single-Resource HTTP Flood",
DistinctUserAgents == 1 and TotalRequests > 1000, "Simple HTTP Flood",
Status5xx > ErrorFloodThreshold, "Service Degradation via HTTP Flood",
"HTTP Request Flood"
)
| extend DetectionSource = "IIS_Log"
| project TimeBin, SourceIP, TargetSite, TotalRequests, RequestsPerSecond,
UniqueURIs, Status5xx, Status429, DistinctUserAgents, FloodType, DetectionSource;
// Branch 2: Azure Application Gateway WAF — flood/DoS rule triggers
let WAFFlood =
AzureDiagnostics
| where TimeGenerated > ago(1h)
| where ResourceType == "APPLICATIONGATEWAYS"
| where Category == "ApplicationGatewayFirewallLog"
| where Message has_any ("flood", "DoS", "renegotiation", "connection limit", "rate limit", "SSL flood")
or ruleGroup_s has_any ("DoS", "RCE", "HTTP")
| summarize
BlockedRequests = count(),
UniqueRules = dcount(ruleId_s),
UniqueTargetURIs = dcount(requestUri_s)
by SourceIP = clientIp_s, TargetSite = hostname_s, TimeBin = bin(TimeGenerated, FloodWindow)
| where BlockedRequests > 50
| extend FloodType = "WAF_Blocked_Flood"
| extend DetectionSource = "Azure_AppGateway_WAF"
| project TimeBin, SourceIP, TargetSite, TotalRequests = BlockedRequests,
RequestsPerSecond = round(toreal(BlockedRequests) / 300, 2),
UniqueURIs = UniqueRules, Status5xx = BlockedRequests, Status429 = 0,
DistinctUserAgents = 0, FloodType, DetectionSource;
// Branch 3: CommonSecurityLog — firewall/IDS flood and SSL renegotiation alerts (Palo Alto, Fortinet, CheckPoint)
let NetworkFlood =
CommonSecurityLog
| where TimeGenerated > ago(1h)
| where Activity has_any ("flood", "DoS", "denial of service", "SSL renegotiation", "connection exhaustion", "HTTP flood", "SYN flood")
or DeviceEventClassID has_any ("flood", "dos", "renegotiation", "conn-limit")
| summarize
AlertCount = count(),
UniqueDestPorts = dcount(DestinationPort),
AffectedTargets = dcount(DestinationIP)
by SourceIP, DestinationIP, DeviceProduct, Activity, TimeBin = bin(TimeGenerated, FloodWindow)
| extend FloodType = strcat("Network_Alert: ", Activity)
| extend DetectionSource = DeviceProduct
| project TimeBin, SourceIP, TargetSite = DestinationIP, TotalRequests = AlertCount,
RequestsPerSecond = toreal(0), UniqueURIs = UniqueDestPorts, Status5xx = 0,
Status429 = 0, DistinctUserAgents = 0, FloodType, DetectionSource;
// Union all detection branches
union isfuzzy=true IISFlood, WAFFlood, NetworkFlood
| sort by TotalRequests desc Data Sources
Required Tables
False Positives
- Legitimate high-traffic events such as product launches, viral marketing campaigns, or news coverage driving genuine traffic spikes from many distributed users
- Web scraping bots, SEO crawlers, and content aggregators that rapidly enumerate site content and generate high request volumes from single IP ranges
- Load testing tools (Apache Bench, k6, Locust, JMeter, Gatling) used by development and QA teams against production or staging environments without prior notification
- CDN edge nodes, reverse proxies, or shared NAT gateways that aggregate traffic from many legitimate users behind a single source IP, inflating per-IP counts
- Automated monitoring, synthetic transaction tools, and health check agents that poll endpoints at high frequency
References (9)
- https://attack.mitre.org/techniques/T1499/002/
- https://www.cloudflare.com/learning/ddos/http-flood-ddos-attack/
- https://www.netscout.com/blog/asert/ddos-attacks-ssl-something-old-something-new
- https://pages.arbornetworks.com/rs/082-KNA-087/images/13th_Worldwide_Infrastructure_Security_Report.pdf
- https://learn.microsoft.com/en-us/iis/extensions/dynamic-ip-restrictions/using-dynamic-ip-restrictions
- https://learn.microsoft.com/en-us/windows/win32/secauthn/tls-renegotiation
- https://learn.microsoft.com/en-us/azure/web-application-firewall/ag/ag-overview
- https://docs.splunk.com/Documentation/SplunkCloud/latest/SearchReference/CommonStatsFunctions
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1499.002/T1499.002.md
Unlock Pro Content
Get the full detection package for T1499.002 including response playbook, investigation guide, and atomic red team tests.