T1583

Acquire Infrastructure

This detection identifies indicators that adversaries have acquired or are leveraging external infrastructure for attack operations — including virtual private servers, bulletproof hosting providers, anonymizing VPN services, and residential proxy networks. Because T1583 is a PRE-ATT&CK technique occurring outside direct victim visibility, detection focuses on observable artifacts within the target environment: authentication events originating from known hosting ASNs and VPN exit nodes, DNS resolution of anonymization service domains, and network connection patterns consistent with adversary use of acquired proxy or VPN infrastructure. High-confidence signals include privileged account sign-ins from hosting provider IP ranges (M247, Hetzner, OVH, DigitalOcean), automated tooling user-agents accessing organizational resources from VPS IPs, and connections to infrastructure linked to threat actor campaigns such as Kimsuky, Sea Turtle, and Agrius.

Microsoft Sentinel / Defender
kusto
let HostingProviderASNs = dynamic([
    9009,   // M247 Europe SRL - frequently abused bulletproof hosting
    202448, // MVPS - known bulletproof hosting
    16276,  // OVH SAS
    14061,  // DigitalOcean LLC
    63949,  // Akamai Connected Cloud (Linode)
    24940,  // Hetzner Online GmbH
    51167,  // Contabo GmbH
    47583,  // Hostinger International
    60068,  // Datacamp Limited - residential proxy
    174,    // Cogent Communications
    3257    // GTT Communications
]);
let VPNKeywords = dynamic(["vpn", "tor", "proxy", "anonymizer", "hosting", "datacenter"]);
AADSignInLogs
| where TimeGenerated >= ago(24h)
| where ResultType == "0"
| where AutonomousSystemNumber in (HostingProviderASNs)
    or NetworkLocationDetails has_any (VPNKeywords)
    or RiskEventTypes_V2 has_any ("anonymizedIPAddress", "maliciousIPAddress")
| where IPAddress !in ("127.0.0.1", "::1", "0.0.0.0")
| summarize
    SignInCount = count(),
    UniqueSourceIPs = dcount(IPAddress),
    TargetApps = make_set(AppDisplayName, 10),
    ClientApps = make_set(ClientAppUsed, 5),
    LocationDetails = make_set(tostring(LocationDetails), 5),
    FirstSeen = min(TimeGenerated),
    LastSeen = max(TimeGenerated)
    by UserPrincipalName, AutonomousSystemNumber, NetworkLocationDetails
| extend RiskScore = case(
    TargetApps has_any ("Azure Portal", "Microsoft Azure Management", "Azure Active Directory"), 9,
    UniqueSourceIPs > 5, 8,
    UniqueSourceIPs > 2, 6,
    SignInCount > 10, 5,
    4)
| where RiskScore >= 5
| project TimeGenerated = LastSeen, UserPrincipalName, RiskScore, SignInCount,
    UniqueSourceIPs, AutonomousSystemNumber, TargetApps, NetworkLocationDetails,
    FirstSeen, LastSeen
| sort by RiskScore desc, SignInCount desc
high severity medium confidence

Data Sources

Azure Active Directory Microsoft Entra ID

Required Tables

AADSignInLogs

False Positives

  • Employees legitimately connecting via corporate-approved VPN services that share ASNs with commercial hosting providers
  • Remote developers or contractors using DigitalOcean, Hetzner, or OVH hosted jump boxes for legitimate administrative access
  • Automated service accounts or CI/CD pipelines running in cloud-hosted environments that authenticate to organizational APIs
  • Security researchers or penetration testers operating from known hosting providers during authorized engagements
  • Employees traveling internationally who use commercial VPN services that route through hosting provider IP ranges

Unlock Pro Content

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

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections