T1583.003 Google Chronicle · YARA-L

Detect Virtual Private Server in Google Chronicle

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.

MITRE ATT&CK

Tactic
Resource Development
Technique
T1583 Acquire Infrastructure
Sub-technique
T1583.003 Virtual Private Server
Canonical reference
https://attack.mitre.org/techniques/T1583/003/

YARA-L Detection Query

Google Chronicle (YARA-L)
yaral
rule t1583_003_vps_c2_beaconing {
  meta:
    author = "Detection Engineering"
    description = "Detects C2 beaconing to VPS-hosted infrastructure — repeated outbound connections from non-browser processes to the same public IP within a 1-hour window."
    mitre_attack_technique = "T1583.003"
    mitre_attack_tactic = "TA0042 - Resource Development"
    reference = "https://attack.mitre.org/techniques/T1583/003/"
    severity = "MEDIUM"
    priority = "MEDIUM"

  events:
    $e.metadata.event_type = "NETWORK_CONNECTION"
    $e.network.direction = "OUTBOUND"

    // Exclude private, loopback, and link-local address space
    not re.regex($e.target.ip, `^(10\.|172\.(1[6-9]|2[0-9]|3[01])\.|192\.168\.|127\.|169\.254\.)`)
    $e.target.ip != "::1"
    $e.target.ip != ""

    // Exclude known-safe browser processes
    not re.regex($e.principal.process.file.full_path, `(?i)(chrome|firefox|msedge|MicrosoftEdgeCP|iexplore|brave|opera|safari|waterfox)\.exe`)

    // Exclude common noisy system processes
    not re.regex($e.principal.process.file.full_path, `(?i)(svchost|MsMpEng|wuauclt|TrustedInstaller|msiexec|ccmexec|teams|OneDrive)\.exe`)

    // Bind aggregation dimensions
    $hostname = $e.principal.hostname
    $process  = $e.principal.process.file.full_path
    $dest_ip  = $e.target.ip

  match:
    $hostname, $process, $dest_ip over 1h

  outcome:
    $connection_count  = count($e.metadata.id)
    $unique_dest_ports = count_distinct($e.target.port)
    $sample_cmdline    = array_distinct($e.principal.process.command_line)[0]
    $risk_score = if(
      $connection_count >= 50 and $unique_dest_ports <= 1, 95,
      if($connection_count >= 30 and $unique_dest_ports <= 2, 75,
        if($connection_count >= 20, 55, 30)
      )
    )
    $beacon_risk = if(
      $connection_count >= 50 and $unique_dest_ports <= 1,
      "CRITICAL - Highly Regular Single-Port Beaconing",
      if($connection_count >= 30 and $unique_dest_ports <= 2,
        "HIGH - Low Port Variance Repetitive Connections",
        if($connection_count >= 20,
          "MEDIUM - Elevated Outbound Connection Frequency",
          "LOW - Above Threshold Outbound Frequency"
        )
      )
    )

  condition:
    $e and $connection_count >= 12
}
medium severity medium confidence

Chronicle YARA-L 2.0 rule detecting C2 beaconing to VPS-hosted infrastructure. Matches NETWORK_CONNECTION UDM events with OUTBOUND direction from non-browser, non-system processes to public IP space, aggregated over a 1-hour match window. Fires when the same (host, process, destination IP) triple accumulates 12 or more connections within the window. Computes a risk score and beacon risk tier as outcome fields for use in prioritization. Requires endpoint telemetry forwarded to Chronicle via the Chronicle Forwarder, Google Security Operations sensor, or Sysmon logs parsed by a Chronicle parser.

Data Sources

Chronicle UDM NETWORK_CONNECTION events from endpoint agentsSysmon Event ID 3 parsed by Chronicle Windows Sysmon parserCrowdStrike Falcon or Carbon Black EDR forwarded to Chronicle

Required Tables

UDM events (metadata.event_type = NETWORK_CONNECTION)Entity graph (principal.hostname, principal.process.file.full_path)

False Positives & Tuning

  • Application performance monitoring (APM) agents such as AppDynamics, Dynatrace OneAgent, and New Relic APM make continuous high-frequency connections to their SaaS collectors; these agents run from non-browser process paths and will match this rule — exclude by process path regex after confirming the destination IP belongs to the APM vendor.
  • Custom keepalive probes embedded in legacy in-house applications that heartbeat to a load balancer or health-check endpoint every few seconds will accumulate rapidly; identify via process name and correlate with application inventory to create targeted exclusions.
  • Remote management and RMM agents (ConnectWise Automate ltsvc.exe, Kaseya, AnyDesk, TeamViewer) maintain persistent connections and reconnect frequently; correlate with IT asset management data and exclude approved RMM process hashes.
Download portable Sigma rule (.yml)

Other platforms for T1583.003


Testing Methodology

Validate this detection against 4 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 1Simulate C2 Beacon via PowerShell HTTP Check-in to VPS-like Endpoint

    Expected signal: Sysmon Event ID 1: Process Create with Image=powershell.exe and CommandLine containing '-WindowStyle Hidden' and 'Invoke-WebRequest'. Sysmon Event ID 3: 15 network connections from powershell.exe to 127.0.0.1:8443 at approximately 5-second intervals. PowerShell ScriptBlock Log Event ID 4104 with the full script body.

  2. Test 2Simulate VPS Payload Download via LOLBin (certutil)

    Expected signal: Sysmon Event ID 1: Process Create with Image=certutil.exe and CommandLine containing '-urlcache' and '-f'. Sysmon Event ID 3: Network Connection from certutil.exe to 127.0.0.1:8080. Sysmon Event ID 11: File Create attempt for %TEMP%\df00tech-vps-test.exe (may not succeed if no listener). Security Event ID 4688 (if command line auditing enabled).

  3. Test 3Simulate VPS-based Reconnaissance Inbound Scan Detection (nmap from localhost)

    Expected signal: Linux auditd: syscall execve for nmap with full argument list. Syslog: nmap process execution. Network: TCP SYN packets to localhost ports 22, 80, 443, 3389, 8080, 8443. If monitoring inbound scan patterns on perimeter, this generates SYN packets with no corresponding application connection.

  4. Test 4Simulate Azure AD Authentication from VPS IP Range via PowerShell Graph API Call

    Expected signal: Sysmon Event ID 1: Process Create with Image=powershell.exe. Sysmon Event ID 3: Network Connection from powershell.exe to login.microsoftonline.com:443. Sysmon Event ID 22 (DNS Query): DNS resolution of login.microsoftonline.com. PowerShell ScriptBlock Log Event ID 4104.

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