T1583.003

Virtual Private Server

Adversaries may rent Virtual Private Servers (VPSs) to stage malicious infrastructure including command-and-control (C2) servers, phishing pages, payload delivery endpoints, and exfiltration destinations. VPS providers offer rapid provisioning, geographic flexibility, and—when chosen carefully—minimal registration requirements, making attribution difficult. Because VPS-hosted IPs typically carry commercial hosting ASN reputation rather than residential or known-malicious reputation, they can evade naive geo-blocking and ASN-based controls. Real-world actors documented using this technique include Gamaredon, APT28, LAPSUS$, Ember Bear (GRU Unit 29155), HAFNIUM, APT42, Moonstone Sleet, and Contagious Interview. Detection from a defender perspective focuses on three observable effects: outbound C2 beaconing FROM compromised endpoints TO VPS-hosted IPs, inbound attack traffic (scanning, exploit delivery, phishing redirectors) FROM VPS IP ranges, and identity-based signals such as authentication attempts from datacenter IP space. Because T1583.003 is a Resource Development technique (TA0042), it is not directly observable on victim endpoints—detection is necessarily inferential, relying on behavioral patterns that betray VPS-based infrastructure in use.

Microsoft Sentinel / Defender
kusto
// T1583.003 — Virtual Private Server: Detect C2 beaconing to VPS-hosted infrastructure
// Identifies non-browser processes making high-frequency repetitive outbound connections,
// enriched with Threat Intelligence indicator matches where available.
let ExcludedBrowsers = dynamic([
  "chrome.exe", "firefox.exe", "msedge.exe", "microsoftedgecp.exe",
  "iexplore.exe", "brave.exe", "opera.exe", "safari.exe", "waterfox.exe"
]);
let ExcludedSystemProcesses = dynamic([
  "svchost.exe", "wuauclt.exe", "trustedinstaller.exe", "msiexec.exe",
  "MsMpEng.exe", "ccmexec.exe", "onedrive.exe", "teams.exe"
]);
let BeaconMinConnections = 12;
let ObservationWindowMinutes = 60;
// Step 1: Find non-browser processes with high-frequency outbound public connections
let BeaconingCandidates = DeviceNetworkEvents
| where Timestamp > ago(24h)
| where ActionType in ("ConnectionSuccess", "NetworkSignatureInspected")
| where RemoteIPType == "Public"
| where InitiatingProcessFileName !in~ (ExcludedBrowsers)
| where InitiatingProcessFileName !in~ (ExcludedSystemProcesses)
| summarize
    ConnectionCount = count(),
    UniqueRemotePorts = dcount(RemotePort),
    RemotePorts = make_set(RemotePort, 5),
    TotalBytesSent = sum(SentBytes),
    TotalBytesReceived = sum(ReceivedBytes),
    FirstConnection = min(Timestamp),
    LastConnection = max(Timestamp)
  by DeviceName, AccountName, InitiatingProcessFileName,
     InitiatingProcessCommandLine, RemoteIP,
     bin(Timestamp, totimespan(strcat(tostring(ObservationWindowMinutes), "m")))
| where ConnectionCount >= BeaconMinConnections;
// Step 2: Enrich with Threat Intelligence indicators
BeaconingCandidates
| join kind=leftouter (
    ThreatIntelligenceIndicator
    | where TimeGenerated > ago(7d)
    | where isnotempty(NetworkIP)
    | summarize arg_max(TimeGenerated, *) by NetworkIP
    | project TINetworkIP = NetworkIP, ThreatType, TIConfidence = ConfidenceScore,
              TIDescription = Description, TIActive = Active
    | where TIActive == true
) on $left.RemoteIP == $right.TINetworkIP
| extend IsTIMatch = isnotempty(TINetworkIP)
| extend ConnectionsPerMinute = round(todouble(ConnectionCount) / ObservationWindowMinutes, 2)
| extend ByteRatio = iif(TotalBytesReceived > 0,
    round(todouble(TotalBytesSent) / todouble(TotalBytesReceived), 2), real(0))
| extend RiskScore = case(
    IsTIMatch and ConnectionCount >= 20, 95,
    IsTIMatch and ConnectionCount >= BeaconMinConnections, 80,
    IsTIMatch, 65,
    ConnectionCount >= 30 and UniqueRemotePorts <= 1, 60,
    ConnectionCount >= 20 and UniqueRemotePorts <= 2, 45,
    ConnectionCount >= BeaconMinConnections, 30,
    20
)
| project
    Timestamp, DeviceName, AccountName,
    InitiatingProcessFileName, InitiatingProcessCommandLine,
    RemoteIP, ConnectionCount, ConnectionsPerMinute,
    UniqueRemotePorts, RemotePorts,
    TotalBytesSent, TotalBytesReceived, ByteRatio,
    IsTIMatch, ThreatType, TIConfidence, TIDescription,
    RiskScore
| sort by RiskScore desc, ConnectionCount desc
high severity medium confidence

Data Sources

Network Traffic: Network Connection Creation Network Traffic: Network Traffic Flow Microsoft Defender for Endpoint — DeviceNetworkEvents Microsoft Sentinel — ThreatIntelligenceIndicator

Required Tables

DeviceNetworkEvents ThreatIntelligenceIndicator

False Positives

  • Software update agents (e.g., Google Update, Adobe Updater, Zoom updater) that periodically poll VPS-hosted CDN endpoints — mitigate by adding their process names to the exclusion list
  • Monitoring and observability agents (Datadog, Splunk UF, Elastic Agent, SolarWinds) that beacon frequently to cloud-hosted collection endpoints on fixed intervals
  • Endpoint security agents (CrowdStrike, Carbon Black, SentinelOne) that maintain persistent cloud connections with regular heartbeat patterns
  • Business applications with embedded telemetry or license validation that periodically connect to vendor-hosted VPS infrastructure
  • Developer workstations where IDEs, CLIs, or containers make repeated API calls to cloud development services hosted on VPS infrastructure

Unlock Pro Content

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

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections