← Back to SOC feed Coverage →

Connectivity Failures by Domain

kql MEDIUM Azure-Sentinel
DeviceNetworkEvents
huntingmicrosoftofficial
This rule was pulled from an open-source repository and enriched with AI. Validate in a test environment before deploying to production.
View original rule at Azure-Sentinel →
Retrieved: 2026-06-02T11:00:00Z · Confidence: medium

Hunt Hypothesis

Adversaries may attempt to disrupt or evade detection by causing connectivity failures to Defender for Endpoint URLs, which could mask their lateral movement or data exfiltration activities. Proactively hunting for such anomalies in Azure Sentinel can help identify potential sabotage or evasion tactics early, improving incident response and reducing dwell time.

KQL Query

let TargetURLs = dynamic(['winatp-gw-cus.microsoft.com', 'winatp-gw-eus.microsoft.com', 'winatp-gw-weu.microsoft.com',
    'winatp-gw-neu.microsoft.com', 'winatp-gw-uks.microsoft.com', 'winatp-gw-ukw.microsoft.com', 'winatp-gw-usgv.microsoft.com',
    'winatp-gw-usgt.microsoft.com', 'eu.vortex-win.data.microsoft.com', 'us.vortex-win.data.microsoft.com',
    'uk.vortex-win.data.microsoft.com', 'events.data.microsoft.com', 'settings-win.data.microsoft.com', 'eu-v20.events.data.microsoft.com',
    'uk-v20.events.data.microsoft.com', 'us-v20.events.data.microsoft.com', 'us4-v20.events.data.microsoft.com',
    'us5-v20.events.data.microsoft.com', 'ctldl.windowsupdate.com']);
DeviceNetworkEvents
| where isnotempty(RemoteUrl) and ActionType == 'ConnectionFailed'
| extend Domain = case(RemoteUrl contains "//", parse_url(RemoteUrl).Host, RemoteUrl)
| where Domain in(TargetURLs)
| summarize (LastConnectionFailure, DeviceName) = arg_max(Timestamp, DeviceName), ConnectionFailures = count(), DistinctMachines = dcount(DeviceId) by Domain
| order by DistinctMachines desc

Analytic Rule Definition

id: a4f7b0f0-93ad-47c9-bcce-dc08d8d04818
name: Connectivity Failures by Domain
description: |
  This query is designed to help troubleshoot connectivity issues to Microsoft Defender for Endpoint URLs.
  It provides a summary of the number of failures which occurred, the number of distinct machines that failed
  to connect to the URL, and sorts them by the sum of the overall number of failures recorded.
requiredDataConnectors:
- connectorId: MicrosoftThreatProtection
  dataTypes:
  - DeviceNetworkEvents
tactics:
- Malware, component
query: |
  let TargetURLs = dynamic(['winatp-gw-cus.microsoft.com', 'winatp-gw-eus.microsoft.com', 'winatp-gw-weu.microsoft.com',
      'winatp-gw-neu.microsoft.com', 'winatp-gw-uks.microsoft.com', 'winatp-gw-ukw.microsoft.com', 'winatp-gw-usgv.microsoft.com',
      'winatp-gw-usgt.microsoft.com', 'eu.vortex-win.data.microsoft.com', 'us.vortex-win.data.microsoft.com',
      'uk.vortex-win.data.microsoft.com', 'events.data.microsoft.com', 'settings-win.data.microsoft.com', 'eu-v20.events.data.microsoft.com',
      'uk-v20.events.data.microsoft.com', 'us-v20.events.data.microsoft.com', 'us4-v20.events.data.microsoft.com',
      'us5-v20.events.data.microsoft.com', 'ctldl.windowsupdate.com']);
  DeviceNetworkEvents
  | where isnotempty(RemoteUrl) and ActionType == 'ConnectionFailed'
  | extend Domain = case(RemoteUrl contains "//", parse_url(RemoteUrl).Host, RemoteUrl)
  | where Domain in(TargetURLs)
  | summarize (LastConnectionFailure, DeviceName) = arg_max(Timestamp, DeviceName), ConnectionFailures = count(), DistinctMachines = dcount(DeviceId) by Domain
  | order by DistinctMachines desc

Required Data Sources

Sentinel TableNotes
DeviceNetworkEventsEnsure this data connector is enabled

MITRE ATT&CK Context

References

False Positive Guidance

Original source: https://github.com/Azure/Azure-Sentinel/blob/main/Hunting Queries/Microsoft 365 Defender/Troubleshooting/Connectivity Failures by Domain.yaml