Sandworm / UAC-0145 — SopraVPN Fake-Recruiter Campaign
Executive Summary
Sandworm (GRU Unit 74455 / APT44 / Seashell Blizzard), through its sub-cluster UAC-0145, is running a patient, human-driven social-engineering campaign against Ukrainian IT and system-administrator professionals, active since at least May 2026 and formally attributed by CERT-UA on 2026-08-08 (advisory cert.gov.ua/article/6318863), with independent corroboration published 2026-08-10/11 by The Record, BleepingComputer, The Hacker News and TechTimes.
Attackers pose as recruiters — impersonating an IT firm called "ATLAS Business Group" — after reviewing victim résumés on legitimate job-search platforms. Contact moves from the job site's chat to Telegram, where a fake HR manager claiming to screen for Sopra Steria Bulgaria (a real company, not affiliated with the attackers) runs a preliminary chat, followed by a Zoom interview with an English-speaking man reported as 30–35 years old — CERT-UA itself could not rule out that the interviewer was an AI-generated persona. A follow-up email delivers a WireGuard VPN configuration for a bogus "technical assessment," deliberately built to fail to connect.
When the connection fails, the fake recruiter directs the victim to a spoofed site styled to resemble Sopra Steria Bulgaria (soprasteria-bg[.]com) to download "SopraVPN," a trojanized WireGuard client hosted on SourceForge. SopraVPN is compiled from genuine WireGuard source code with a backdoored config parser: a non-standard SymmetricKey option in the .conf file carries a BASE64-encoded AES-256-GCM blob (nonce + ciphertext + tag); the AES-256 key is the 32-byte decode of the config's own PrivateKey value; the decrypted PowerShell/command payload is then handed to WireGuard's legitimate runScriptCommand mechanism — the same internal call the standard PostUp option uses — so the attacker's command runs automatically and silently the moment the tunnel comes up. A second layer of obfuscation replaces stock Base64 with a custom alphabet, shuffled via Fisher-Yates and seeded from the CRC32 of the SymmetricKey value, hiding PrivateKey/PublicKey from casual inspection. The malicious code lives in data the config file carries, not in the binary — a plain hash/signature check of the SopraVPN executable alone will not reveal the backdoor.
On Windows, the decrypted command creates a scheduled task and downloads a second-stage payload from the internet. On Linux, it uses cURL to retrieve a second-stage executable from attacker infrastructure reached through the newly-established VPN tunnel itself (the malicious config embeds the attacker's own DNS server IP); CERT-UA's captured artifact shows the drop staged at /usr/libexec/timesyncd-check, masquerading as a systemd time-sync helper.
This is a different initial-access chain than the previously published UAC-0145 ClickFix/EtherHiding HuntPack (CAPTCHA lures, a distinct typosquat C2 domain, GHETTOVIBE/FLUIDLEECH/FREAKYPOLL). No CAPTCHA, no browser paste — the lure here is a fabricated hiring process and the payload is a config file, not a script. Detection priorities are (1) exact hash/filename matching on the SopraVPN binary and malicious .conf artifacts, (2) the anomalous-child-process fingerprint of a WireGuard-family parent spawning PowerShell (Windows) or an unexpected shell/cURL chain (Linux) — a legitimate WireGuard tunnel service never does this, (3) network/DNS activity to the campaign's confirmed lure and C2 infrastructure, and (4) the exact Linux host artifact path /usr/libexec/timesyncd-check.
Defender priority: the victims of this chain are, by design, system administrators and IT staff with privileged network access. A single successful SopraVPN install can hand the attacker a persistent scheduled-task foothold and a live route into the corporate perimeter riding on top of what the victim believes is a "corporate VPN." CERT-UA's own top recommendation — restrict corporate resource access to managed, EDR-enrolled devices, including personally-owned equipment used for "hiring assessments" — closes the single biggest gap this campaign is built to exploit.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| T1 | CERT-UA — "Соціальна інженерія у виконанні UAC-0145: компрометація у процесі працевлаштування," published 2026-08-08 (article 6318863) | Primary, government-issued advisory. Full TTP write-up plus every atomic indicator in this pack: 5 file hashes (MD5+SHA256), 4 domains, 1 IP, 2 host artifacts, 2 email addresses, 1 Telegram handle. | Yes — sole IOC source; all hash/IP/domain values transcribed verbatim from this snapshot |
| T2 | The Hacker News — "Sandworm-Linked UAC-0145 Uses Fake Job Interviews to Push VPN That Can Run Commands," Ravie Lakshmanan, 2026-08-11 | Corroborates the full technical chain; independently identifies a third SourceForge project (soprasteriavpn) not named in the CERT-UA advisory text (cached-search find, project itself unavailable for download). | Yes — narrative corroboration + one additional SourceForge project name (used as a hunt lead, not an atomic IOC since it was never confirmed downloadable) |
| T2 | BleepingComputer — "Sandworm hackers target IT pros with trojanized WireGuard VPN client," Bill Toulas, 2026-08-11 | Corroborates the chain with concise phrasing; confirms attacker impersonation used addresses "similar to the company's office in Bulgaria." | Yes — corroboration and alert-copy phrasing |
| T2/3 | The Record / Recorded Future News — "Russian military hackers pose as recruiters to target Ukrainian IT workers," Daryna Antoniuk, 2026-08-10 | Independent corroboration; notes the Telegram account @Sales_ManagerABG-style handle was still reachable at publish time although the job ad had been removed, and situates the campaign in Sandworm's broader history (2015/2016 grid attacks, NotPetya). | Partial — narrative/attribution context only, no new atomic IOCs |
| T2/3 | TechTimes — "Sandworm Recruiter Scam Targets Ukrainian Sysadmins, Deploys Hidden WireGuard Trojan," Kyle Belmonte, 2026-08-11 | Deep secondary analysis: frames this as Sandworm's first confirmed adoption of the DPRK-style "Contagious Interview" technique; cross-references UAC-0145's other 2026 tracks (ClickFix/EtherHiding, fake Notepad++/UAC-0099); provides concrete defender guidance (verify recruiters through official channels, inspect configs for unfamiliar keys). | Yes — context and defender guidance folded into §1 and §12; no new atomic IOCs |
Security note (pipeline integrity): all five fetched sources were reviewed for embedded instructions directed at an AI analysis pipeline (prompt-injection). None was found — every source is ordinary news/advisory prose, treated throughout as data to analyze, never as instructions to execute. The one literal attacker-authored shell command quoted in the CERT-UA advisory (the Linux timesyncd-check downloader one-liner) is reproduced in this pack strictly as a host indicator/behavioral signature for detection engineering — it was never executed or treated as a directive.
Web-hunter decision: CERT-UA is treated as the sole authoritative source for atomic indicators; the four secondary sources are used only for narrative corroboration, dating, and defender framing. Every hash, domain, IP, filename and host-path value in §4 and §10 is copied character-for-character from the saved CERT-UA snapshot (Sandworm-SopraVPN-Hunt-sources/01-certua-advisory-6318863.txt) rather than from secondary paraphrase, to eliminate transcription drift between sources.
Hunt Brief & Attack Chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Recon — attacker reviews victim résumés on legitimate job-search platforms. | None (human-layer, off-platform) | Not observable in Falcon |
| 2 | Rapport — contact via job-site chat, moved to Telegram (@Sales_ManagerABG-style handle) posing as "ATLAS Business Group," then a Zoom interview with a possibly AI-generated interviewer. | None (human-layer) | Not observable in Falcon — user-awareness control only (§12) |
| 3 | Delivery — email with a WireGuard .conf for a bogus "corporate VPN" technical assessment, deliberately built to fail, sent from an address mimicking Sopra Steria. | Email gateway; file-write if the attachment is saved to disk | Native mail-gateway hunt (§7) |
| 4 | Lure pivot — fake recruiter points the victim to soprasteria-bg[.]com, which links to a "SopraVPN" download hosted on SourceForge. | DnsRequest / NetworkConnectIP4 to the lure domains + SourceForge; file write of sopravpn*.exe | Q4, Q7 |
| 5 | Install & connect — victim runs SopraVPN.exe / sopravpn_v*.exe and imports the malicious .conf carrying the SymmetricKey value. | ProcessRollup2 (filename/hash match) | Q1 |
| 6 | Backdoor trigger — WireGuard's PostUp/runScriptCommand mechanism decrypts the AES-256-GCM payload (keyed by SymmetricKey + PrivateKey) and executes it the instant the tunnel comes up. | ProcessRollup2 parent-child anomaly | Q2 |
| 7 | Windows persistence + 2nd stage — decrypted PowerShell registers a scheduled task and downloads a payload from the internet. | ProcessRollup2 (schtasks.exe /create), NetworkConnectIP4/DnsRequest for the download | Q3 |
| 8 | Linux 2nd stage — cURL retrieves an executable from attacker infrastructure reached through the tunnel; drop staged at /usr/libexec/timesyncd-check. | ProcessRollup2 (curl), file-write telemetry if available | Q6 |
| 9 | C2 check-in — HTTPS call to douncloud[.]site carrying a %UUID%---%MACHINEGUID%-shaped beacon value; rogue WireGuard endpoint at 139.28.36[.]23 udp/51820. | DnsRequest/NetworkConnectIP4 | Q4, Q5, Q8 |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| sha256 | 4646ea832a61c9f7bdb11fee64ad82ae6d9856d2f3a4b36a8a4a571145be1260 | High | detect | sopravpn_v7__1_.exe | 2027-02-23 |
| sha256 | aeb702f65445d12605a84be6fa31545c71be0bf619b1cbedbee5800a43fc6793 | High | detect | SopraVPN.exe (variant 1) | 2027-02-23 |
| sha256 | 6a60152f7c83d3416925316b75eb7720953cdd69aae9f0e088c789c25f51437f | High | detect | SopraVPN.exe (variant 2) | 2027-02-23 |
| sha256 | 480ab92995295378c9b30b8b6fb61516313ed7482eb893967841b05e233fe341 | High | hunt | sopraconf.conf — malicious Windows VPN config | 2026-11-23 |
| sha256 | 22a21958a2c4752214192175793c13acae2f6d766007d55d2140f1570ae1df67 | High | hunt | sopraconfLinux.conf — malicious Linux VPN config | 2026-11-23 |
| md5 | bf6670760305228fd83a5e1467a99d91 | High | enrich | sopravpn_v7__1_.exe (MD5) | 2026-11-23 |
| md5 | be11cc798c239b9d4eaa76ab03d07168 | High | enrich | SopraVPN.exe variant 1 (MD5) | 2026-11-23 |
| md5 | 676f44c7fa03693247d0dd5c3a0e13f7 | High | enrich | SopraVPN.exe variant 2 (MD5) | 2026-11-23 |
| md5 | d478e96bfb0f3a586c6d17d8bfc874ea | High | enrich | sopraconf.conf (MD5) | 2026-11-23 |
| md5 | 088acb50f7a7e54f887da7b561e18613 | High | enrich | sopraconfLinux.conf (MD5) | 2026-11-23 |
| domain | soprasteria-bg.com | High | detect | Spoofed Sopra Steria Bulgaria lure site; registered 2026-07-16 | 2027-02-23 |
| domain | soprasteriabg.com | High | detect | Related spoof domain (no hyphen); registered 2026-05-14 | 2027-02-23 |
| domain | atlasgroup-ua.com | High | detect | Fake "ATLAS Business Group" recruiter site; registered 2026-02-10 | 2027-02-23 |
| domain | douncloud.site | High | detect | C2 check-in domain (subid=%UUID%---%MACHINEGUID%) | 2027-02-23 |
| ipv4 | 139.28.36.23 | High | detect | Rogue WireGuard endpoint, udp/51820 | 2027-02-23 |
| url | hxxps://sourceforge[.]net/projects/soprabulgariavpn/files/sopravpn_v10.exe/download | Medium | hunt | Trojanized installer on SourceForge (legitimate platform abused) | 2026-11-23 |
| url | hxxps://sourceforge[.]net/projects/sopravpn/files/sopravpn_v5.exe/download | Medium | hunt | Trojanized installer, alternate version | 2026-11-23 |
| url | https://sourceforge[.]net/projects/sopravpn/files/sopravpn.exe/download | Medium | hunt | Trojanized installer, alternate version | 2026-11-23 |
mike.weitzman@soprasteria-bg[.]com | Medium | pivot | Fake HR/recruiter sender address | 2026-09-23 | |
alex.boichenkoit@ukr[.]net | Medium | pivot | Secondary contact address named in the advisory | 2026-09-23 | |
| other | @Sales_ManagerABG (Telegram) | Medium | pivot | Fake "ATLAS Business Group" recruiter Telegram handle | 2026-09-23 |
| filepath | /usr/libexec/timesyncd-check | High | hunt | Linux 2nd-stage drop path; masquerades as a systemd-timesyncd helper | 2026-11-23 |
| filepath | \Microsoft\Windows\ApplicationData\Microsoft (Scheduled Task) | Medium | hunt | Windows scheduled-task path used for persistence / 2nd stage | 2026-11-23 |
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows endpoints (IT/sysadmin workstations) | ProcessRollup2, SyntheticProcessRollup2, NetworkConnectIP4, DnsRequest, scheduled-task creation telemetry | Critical | Low — native Falcon sensor coverage |
| Linux endpoints/servers (sysadmin jump boxes) | ProcessRollup2, NetworkConnectIP4, DnsRequest | Critical | Medium — cURL traffic issued through an already-established WireGuard interface may not always attribute cleanly to the initiating process on every sensor version; validate in tenant |
| Email gateway | Attachment/link inspection for .conf files and links to the lure domains | High | Medium — native mail-gateway hunt, not Falcon CQL (§7) |
| DNS / network egress | DnsRequest, NetworkConnectIP4 for campaign domains/IP | High | Low |
| Personal/BYOD devices used for "technical assessments" | None if unmanaged — CERT-UA explicitly flags this as the core exposure | Critical | High — closed only by policy (§12 Near-term #4), not by telemetry |
| Identity / SSO | Not directly targeted by this chain; monitor for anomalous logons originating from a newly-SopraVPN-infected host | Medium | N/A to this specific hunt — downstream pivot risk only |
ATT&CK Mapping
| Tactic | Technique | Name | Observed behavior |
|---|---|---|---|
| Reconnaissance | T1593.001 | Search Open Websites/Domains: Social Media | Attacker reviews victim résumés on job-search platforms before making contact |
| Resource Development | T1585.001 | Establish Accounts: Social Media Accounts | Fake recruiter personas and Telegram handle posing as ATLAS Business Group / Sopra Steria HR |
| Resource Development | T1583.001 | Acquire Infrastructure: Domains | soprasteria-bg[.]com, soprasteriabg[.]com, atlasgroup-ua[.]com, douncloud[.]site registered for the campaign |
| Resource Development | T1608.001 | Stage Capabilities: Upload Malware | Trojanized SopraVPN installers staged on SourceForge |
| Resource Development | T1587.001 | Develop Capabilities: Malware | Custom-compiled WireGuard fork with a SymmetricKey/AES-256-GCM backdoor |
| Initial Access | T1566.003 | Phishing: Spearphishing via Service | Contact via job-platform chat and Telegram rather than direct email |
| Initial Access | T1204.002 | User Execution: Malicious File | Victim manually downloads and runs SopraVPN.exe / sopravpn_v*.exe |
| Execution | T1059.001 | Command and Scripting Interpreter: PowerShell | Windows payload decrypted and run via runScriptCommand |
| Execution | T1059.004 | Command and Scripting Interpreter: Unix Shell | Linux payload invoked through the same mechanism, using cURL |
| Persistence | T1053.005 | Scheduled Task/Job: Scheduled Task | Windows PowerShell command registers a scheduled task for 2nd-stage retrieval |
| Defense Evasion | T1027 | Obfuscated Files or Information | AES-256-GCM payload hidden inside VPN config values (SymmetricKey), not the binary |
| Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | Custom Fisher-Yates-shuffled Base64 alphabet, seeded from CRC32(SymmetricKey), decodes PrivateKey/PublicKey before use |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | SopraVPN branding mimics Sopra Steria; binary built from genuine WireGuard source and behaves like a real VPN client |
| Command and Control | T1572 | Protocol Tunneling | Linux 2nd-stage executable retrieved via cURL, routed through the established WireGuard tunnel to attacker-internal infrastructure |
| Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | douncloud[.]site check-in over HTTPS with a UUID/MachineGUID beacon value |
| Command and Control | T1105 | Ingress Tool Transfer | Scheduled task (Windows) / cURL (Linux) retrieve the second-stage payload |
Native Audit-Log Hunts
Email gateway
Search inbound mail for .conf attachments whose content contains the string SymmetricKey (not a legitimate WireGuard option), and for links to soprasteria-bg.com, soprasteriabg.com or atlasgroup-ua.com.
DNS resolver / firewall logs
Alert on any resolution of soprasteria-bg.com, soprasteriabg.com, atlasgroup-ua.com, douncloud.site; feed all four to an RPZ/sinkhole (Playbook 1, §13).
Windows Event Log / Sysmon
Security 4698 (scheduled task created) correlated with a parent process named sopravpn*.exe/SopraVPN.exe in the prior five minutes; Sysmon Event ID 1 with ParentImage matching a SopraVPN/WireGuard-family binary and Image=powershell.exe.
Linux auditd
execve records for /usr/bin/curl (or execution of /usr/libexec/timesyncd-check itself) with a parent process from a WireGuard-family binary (wg-quick, wireguard, sopravpn); ausearch -f /usr/libexec/timesyncd-check (Playbook 5, §13).
Config-file content review
grep -RIl "SymmetricKey" against any .conf/.ini file imported for VPN use across managed endpoints. This string does not exist in stock WireGuard and is a hard indicator on its own, independent of any hash or filename.
Proxy / secure web gateway logs
Downloads from sourceforge.net/projects/soprabulgariavpn, /sopravpn, or /soprasteriavpn.
Security-awareness reporting channel (non-technical)
Review any employee reports of a "recruiter" contact referencing ATLAS Business Group or Sopra Steria Bulgaria that asked for a VPN client install as part of a "technical assessment" — this is the highest-value early-warning signal and predates any endpoint telemetry.
CrowdStrike LogScale CQL Hunt Queries
Looks for: execution of the SopraVPN binary by exact filename pattern or by one of the three published SHA256 hashes. FP: none expected — the only source of noise would be a legitimate internal tool coincidentally named "SopraVPN."
// HUNT: SopraVPN Trojanized WireGuard Client — Execution // MITRE: T1204.002, T1036.005 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 (Windows + Linux) // FALSE POSITIVES: none expected from filename/hash match alone // LOOKBACK: 90d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | (FileName=/^(SopraVPN(\.exe)?|sopravpn_v[0-9]+(__[0-9]+_)?(\.exe)?)$/i or SHA256HashData=/^(4646ea832a61c9f7bdb11fee64ad82ae6d9856d2f3a4b36a8a4a571145be1260|aeb702f65445d12605a84be6fa31545c71be0bf619b1cbedbee5800a43fc6793|6a60152f7c83d3416925316b75eb7720953cdd69aae9f0e088c789c25f51437f)$/i) | table([@timestamp, ComputerName, UserName, FileName, ImageFileName, SHA256HashData, CommandLine, ParentBaseFileName], limit=max) | sort(@timestamp, order=desc)
Looks for: the config-triggered backdoor firing — a WireGuard/SopraVPN-family parent process spawning an interpreter or shell child at tunnel-up. FP: legitimate WireGuard PostUp/PostDown hooks on Linux routinely spawn ip/iptables as children of wg-quick — this is expected and must be excluded; a PowerShell child on Windows is not stock WireGuard behavior and is high-fidelity on its own.
// HUNT: WireGuard/SopraVPN Parent Spawning PowerShell or Shell (Config-Triggered Backdoor Execution) // MITRE: T1059.001, T1059.004, T1027, T1140 // CONF: high FP: medium COST: medium | REQUIRES: ProcessRollup2 (parent/child correlation) // FALSE POSITIVES: legitimate wg-quick PostUp/PostDown hooks spawning ip/iptables/resolvconf on Linux // TUNING: exclude Linux children ip, iptables, ip6tables, resolvconf, nft spawned by wg-quick/wireguard (stock PostUp/PostDown behavior) — investigate every powershell.exe or curl child instead // LOOKBACK: 90d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(SopraVPN(\.exe)?|sopravpn_v[0-9]+(__[0-9]+_)?(\.exe)?|wireguard(\.exe)?|wg-quick)$/i | FileName=/^(powershell(\.exe)?|pwsh(\.exe)?|cmd(\.exe)?|curl(\.exe)?|bash|sh)$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: the Windows-side persistence step — a scheduled task registered shortly after (or by) a SopraVPN-family process. FP: schtasks.exe /create is also used by many legitimate installers and IT deployment tooling.
// HUNT: Scheduled Task Creation Following SopraVPN Execution (Windows Persistence) // MITRE: T1053.005 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 (schtasks.exe invocation) // FALSE POSITIVES: schtasks.exe is used by many legitimate installers and IT deployment tools // TUNING: correlate against a SopraVPN/sopravpn_v*/wireguard parent or a process launched from Downloads/Temp within the prior 10 minutes on the same host; exclude schtasks.exe invocations from known deployment tools (SCCM, Intune, PDQ, Ninite) by ParentBaseFileName // LOOKBACK: 90d #event_simpleName=ProcessRollup2 | FileName=/^schtasks(\.exe)?$/i | CommandLine=/\/create/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: DNS resolution or a direct connection to any of the four CERT-UA-published campaign domains, or to the rogue WireGuard endpoint IP. FP: none expected — these are campaign-registered domains and a rogue endpoint, not shared/CDN infrastructure.
// HUNT: Network/DNS Activity to Confirmed SopraVPN Campaign Infrastructure // MITRE: T1071.001, T1583.001 // CONF: high FP: low COST: low | REQUIRES: DnsRequest, NetworkConnectIP4 // FALSE POSITIVES: none expected — campaign-registered infrastructure, not shared/CDN // LOOKBACK: 90d #event_simpleName=/DnsRequest|NetworkConnectIP4/ | (DomainName=/^(www\.)?(soprasteria-bg|soprasteriabg|atlasgroup-ua)\.com$/i or DomainName=/^(www\.)?douncloud\.site$/i or RemoteAddressIP4="139.28.36.23") | table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName, RemoteAddressIP4, RemotePort], limit=200) | sort(@timestamp, order=desc)
Looks for: a WireGuard handshake specifically to the rogue endpoint IP on its published port. FP: none on the specific IP; do not broaden to "any UDP/51820" without re-adding the IP filter, since legitimate corporate WireGuard endpoints also use that port.
// HUNT: WireGuard Tunnel Established to Rogue SopraVPN Endpoint (UDP/51820) // MITRE: T1572, T1090 // CONF: high FP: low COST: low | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: none on the specific IP; do not drop the RemoteAddressIP4 filter // LOOKBACK: 90d #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4="139.28.36.23" | RemotePort=51820 | table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort, Protocol_decimal], limit=200) | sort(@timestamp, order=desc)
Looks for: the exact CERT-UA-published Linux drop path, plus general cURL activity for pivoting. FP: curl is a common admin utility; the exact path /usr/libexec/timesyncd-check is not a real systemd component and is high-fidelity on its own regardless of parent process.
// HUNT: Linux Second-Stage Retrieval via cURL — timesyncd-check Masquerade // MITRE: T1105, T1036.005, T1059.004 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 (Linux) // FALSE POSITIVES: curl is a common admin utility on its own; the exact path is the high-fidelity signal // TUNING: if broadening beyond the exact timesyncd-check path, require the parent process to be a WireGuard-family binary (wireguard, wg-quick, sopravpn, sopraconf) before treating a bare curl hit as actionable // LOOKBACK: 90d #event_simpleName=ProcessRollup2 | platform=Lin | (CommandLine=/timesyncd-check/i or FileName=/^curl$/i) | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200) | sort(@timestamp, order=desc)
Looks for: any connection to SourceForge, as a pivot lead only. FP: SourceForge is a widely-used legitimate software distribution platform; this query alone will catch large amounts of benign developer/IT traffic and must never be used standalone.
// HUNT: SourceForge Download of SopraVPN-Branded Installer (Trusted-Platform Abuse) // MITRE: T1608.001, T1204.002 // CONF: medium FP: high COST: low | REQUIRES: DnsRequest, NetworkConnectIP4 // FALSE POSITIVES: SourceForge is widely-used legitimate software distribution; this query alone catches large amounts of benign developer/IT traffic // TUNING: never alert on this query alone; require a same-host, same-session correlation with Q1 (SopraVPN hash/filename match) or a file write of a *.exe named sopravpn*/soprabulgariavpn*/soprasteriavpn* within minutes of the SourceForge connection before treating as actionable // LOOKBACK: 90d #event_simpleName=/DnsRequest|NetworkConnectIP4/ | DomainName=/^(www\.)?sourceforge\.net$/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName, RemoteAddressIP4], limit=200) | sort(@timestamp, order=desc)
Looks for: a regular-interval query pattern to the C2 domain, per host/process, as a beaconing-cadence signal that survives infrastructure rotation better than a static match alone. FP: legitimate scheduled telemetry/update agents on the same host can produce a similar regular-interval pattern to an unrelated .site domain.
// HUNT: Periodic Beaconing to SopraVPN C2 Domain (douncloud[.]site) or Look-Alike Infrastructure // MITRE: T1071.001, T1583.001 // CONF: medium FP: medium COST: medium | REQUIRES: DnsRequest // FALSE POSITIVES: legitimate scheduled telemetry/monitoring agents can produce a similar regular-interval pattern // TUNING: raise the count threshold (default >=5 in the lookback window) if the environment has other frequent internal callers to unrelated .site domains; exclude known monitoring/APM agents by ContextBaseFileName // LOOKBACK: 7d #event_simpleName=DnsRequest | DomainName=/^(www\.)?douncloud\.site$/i | groupBy([aid, ComputerName, ContextBaseFileName], function=[count(as=QueryCount), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=500) | QueryCount>=5 | table([ComputerName, ContextBaseFileName, QueryCount, FirstSeen, LastSeen], limit=200) | sort(QueryCount, order=desc)
CrowdStrike Custom IOA Recommendations
Three queries are near-zero-FP path/hash matches strong enough to promote directly; one more promotes with a correlation constraint. The rest stay investigate-only.
| IOA name | From | Pattern | Exclusions | Action |
|---|---|---|---|---|
| SopraVPN · Trojanized Client Execution | Q1 | Process Creation — filename/hash match on the published SopraVPN artifacts | None known | Prevent (Critical) — hash/filename match has no benign use case |
| SopraVPN · Rogue WireGuard Endpoint | Q5 | Network Connection — UDP/51820 to 139.28.36.23 | None known | Prevent (Critical) at the network layer / Detect (Critical) at the endpoint |
| SopraVPN · Linux timesyncd-check Masquerade | Q6 | Process/File — exact path /usr/libexec/timesyncd-check | None known | Detect (Critical) — promote to Prevent after a short pilot |
| SopraVPN · Scheduled Task Following Execution | Q3 | Process Creation — schtasks.exe /create correlated with a SopraVPN/WireGuard-family parent within 10 minutes | Known deployment tooling (SCCM, Intune, PDQ, Ninite) by ParentBaseFileName | Detect (High) — move to Prevent only after a clean two-week baseline |
Investigate-only (do not promote yet)
- Q2 — the parent-child PowerShell/shell fingerprint has a real benign population on the Linux
PostUpside; baseline for 14 days and fold the exclusions into the rule before promotion. - Q7 — SourceForge is legitimate infrastructure; never promote to an IOA on its own. Keep as a pivot lead only, correlated against Q1.
- Q8 — beaconing cadence needs an environment-specific threshold; baseline for 14 days before any alerting action.
- Q4 — better served by Falcon IOC Management (§10) than by an IOA, since it is pure atomic domain/IP matching.
Deployment path
- Endpoint security → Custom IOA rule groups → create a Windows/Linux rule group named
Sandworm-SopraVPN. - Add each rule in Monitor action first; assign the group to a pilot prevention policy covering a small subset of workstations.
- Review hits daily for 14 days, folding every benign hit into the rule's exclusion list.
- Promote to Detect (Q3) and Prevent (Q1, Q5, Q6) estate-wide.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,4646ea832a61c9f7bdb11fee64ad82ae6d9856d2f3a4b36a8a4a571145be1260,prevent,critical,2027-02-23,SopraVPN trojanized WireGuard installer (sopravpn_v7),campaign:Sandworm-SopraVPN sha256,aeb702f65445d12605a84be6fa31545c71be0bf619b1cbedbee5800a43fc6793,prevent,critical,2027-02-23,SopraVPN.exe trojanized WireGuard client (variant 1),campaign:Sandworm-SopraVPN sha256,6a60152f7c83d3416925316b75eb7720953cdd69aae9f0e088c789c25f51437f,prevent,critical,2027-02-23,SopraVPN.exe trojanized WireGuard client (variant 2),campaign:Sandworm-SopraVPN sha256,480ab92995295378c9b30b8b6fb61516313ed7482eb893967841b05e233fe341,detect,high,2026-11-23,malicious Windows WireGuard config with SymmetricKey backdoor,campaign:Sandworm-SopraVPN sha256,22a21958a2c4752214192175793c13acae2f6d766007d55d2140f1570ae1df67,detect,high,2026-11-23,malicious Linux WireGuard config with SymmetricKey backdoor,campaign:Sandworm-SopraVPN domain,soprasteria-bg.com,detect,high,2027-02-23,spoofed Sopra Steria Bulgaria lure site,campaign:Sandworm-SopraVPN domain,soprasteriabg.com,detect,high,2027-02-23,related spoof domain,campaign:Sandworm-SopraVPN domain,atlasgroup-ua.com,detect,high,2027-02-23,fake ATLAS Business Group recruiter site,campaign:Sandworm-SopraVPN domain,douncloud.site,detect,critical,2027-02-23,SopraVPN C2 check-in domain,campaign:Sandworm-SopraVPN ipv4,139.28.36.23,detect,critical,2027-02-23,rogue WireGuard endpoint udp/51820,campaign:Sandworm-SopraVPN # md5 companions (Falcon IOC Management accepts md5 as its own type row if preferred over sha256): md5,bf6670760305228fd83a5e1467a99d91,detect,high,2026-11-23,sopravpn_v7__1_.exe (MD5),campaign:Sandworm-SopraVPN md5,be11cc798c239b9d4eaa76ab03d07168,detect,high,2026-11-23,SopraVPN.exe variant 1 (MD5),campaign:Sandworm-SopraVPN md5,676f44c7fa03693247d0dd5c3a0e13f7,detect,high,2026-11-23,SopraVPN.exe variant 2 (MD5),campaign:Sandworm-SopraVPN
BEHAVIORAL SIGNALS - Sandworm SopraVPN campaign (no atomic indicator required)
B1 Config key "SymmetricKey" present in any WireGuard .conf file. Stock
WireGuard has no such option — this string alone is a hard indicator.
B2 AES-256-GCM key = 32-byte decode of the same config's own "PrivateKey"
value (self-referential key derivation — not how a real corporate VPN
key is ever provisioned).
B3 Custom Base64 alphabet: Fisher-Yates shuffle seeded by CRC32("SymmetricKey"
value) applied to PrivateKey/PublicKey encoding.
B4 Parent: SopraVPN.exe | sopravpn_v*.exe | wireguard.exe | wg-quick ->
Child: powershell.exe (Windows) or curl/sh/bash (Linux) shortly after
tunnel-up. Stock WireGuard PostUp only spawns ip/iptables/resolvconf.
B5 Host artifact (Linux): /usr/libexec/timesyncd-check — not a genuine
systemd-timesyncd component.
B6 Host artifact (Windows): scheduled task under
\Microsoft\Windows\ApplicationData\Microsoft created within minutes of
a SopraVPN-family process running.
B7 Outbound HTTPS to a .site domain carrying a query/path value shaped like
%UUID%---%MACHINEGUID% (douncloud[.]site check-in pattern).
SANDWORM SOPRAVPN CAMPAIGN — reference (CERT-UA article 6318863)
Malware / tooling: SopraVPN (trojanized WireGuard client)
sopraconf.conf / sopraconfLinux.conf (malicious VPN configs)
Threat actor: Sandworm | APT44 | Seashell Blizzard | UAC-0002 | UAC-0145 (sub-cluster)
Impersonated brand: Sopra Steria (Bulgaria office) — soprasteria-bg[.]com is NOT
affiliated with the real company
Fake recruiter: "ATLAS Business Group" — atlasgroup-ua[.]com
Platform abused: SourceForge (sourceforge.net/projects/soprabulgariavpn,
/sopravpn, /soprasteriavpn)
Telegram handle: @Sales_ManagerABG (style/format observed by CERT-UA)
RELATED UAC-0145 TRACK (different vector — do not conflate)
UAC0145-ClickFix-Hunt ClickFix CAPTCHA lures, a distinct typosquat C2 domain,
GHETTOVIBE/FLUIDLEECH/FREAKYPOLL/SMARTAXE/COWARDDUCK —
a separate, previously-published HuntPack (see that
pack's own IOC set; not repeated here)
AUDIT CHECKLIST - run per host / per fleet, compare against intended baseline # 1. Managed-device / EDR coverage audit (CERT-UA's core recommendation) # List all devices with corporate VPN/resource access NOT enrolled in EDR — # this campaign's entire payload depends on an unmanaged endpoint. # 2. Confirm conditional access / NAC blocks unmanaged devices from corporate # resources, including BYOD used for "hiring assessments" (see Playbook 4). # 3. Endpoint config sweep — any hit below is a hard indicator: grep -RIl "SymmetricKey" / --include=*.conf 2>/dev/null # 4. Inventory installed VPN clients; flag any binary named SopraVPN* or # sopravpn_v*.exe / sopraconf*.conf not sourced from the official # WireGuard installer. # 5. Confirm security-awareness training / hiring-process policy explicitly # warns IT staff never to install software provided by a prospective # employer before an offer is signed.
Detection Validation Gates
| Gate | Test | Pass criterion |
|---|---|---|
| G1 · Telemetry ready | Confirm ProcessRollup2, DnsRequest, NetworkConnectIP4 are all present for a representative Windows host and a representative Linux host over the last 24h | All three event types return rows on both platforms. Linux sensor density on sysadmin jump boxes is historically lower — verify explicitly, don't assume parity with the Windows fleet. |
| G2 · Benign baseline | Run Q2, Q3, Q7, Q8 across 14 days with no exclusions | Each query's benign population is enumerated and written into its TUNING line before promotion |
| G3 · Positive control — hash/filename match | In an isolated lab VM only, place a benign, clearly-labelled test file named SopraVPN.exe and confirm the filename regex fires (do NOT use a real campaign sample) | Q1 returns the event; confirm the SHA256 arm separately with a labelled test hash |
| G4 · Positive control — parent/child | On the same lab host, spawn powershell.exe as a child of a process temporarily renamed SopraVPN.exe | Q2 returns the event within the expected ingest delay |
| G5 · Positive control — network | From the lab host, attempt (and expect to fail/be blocked at the firewall) a connection to 139.28.36.23:51820/udp | Q4 and Q5 both return the connection attempt |
| G6 · Negative control | Confirm Q1, Q5 and Q6 produce zero hits on a 7-day window of a known-clean OU | Zero hits, or every hit explained and excluded |
| G7 · IOC ingest | Import the §10 CSV into Falcon IOC Management | All 13 rows accepted with no format errors |
| G8 · Promotion | 14 days of clean pilot running for the four §9 IOA candidates | Fewer than one unexplained detection per 1,000 endpoints per week before moving Q1/Q5/Q6 to Prevent |
Use only benign, clearly-labelled test artifacts for the positive controls, in an isolated lab VM, and remove them immediately afterwards. Never stage a real SopraVPN sample or connect a production host to the published C2 infrastructure.
Hardening — Tiered
This campaign succeeds by exploiting trust at three layers: the hiring process itself (human), the VPN config file (technical, but invisible to binary-only inspection), and the unmanaged endpoint (policy). The controls below close each layer independently, since any one alone still leaves the others exposed.
- Block/sinkhole DNS for
soprasteria-bg.com,soprasteriabg.com,atlasgroup-ua.com,douncloud.siteat the resolver/firewall. MITRE M1037 (Filter Network Traffic) · M1021 (Restrict Web-Based Content). Verify:nslookup soprasteria-bg.com <resolver>returns a sinkhole address or NXDOMAIN. - Import the §10 CSV into Falcon IOC Management: the five published SHA256/MD5 hashes at Prevent, domains and IP at Detect/Prevent. MITRE M1040 (Behavior Prevention on Endpoint) · M1049 (Antivirus/Antimalware). Verify: Falcon console → IOC Management shows all hashes in the intended state.
- Publish an internal advisory to IT/sysadmin staff: never install VPN clients or any software provided by a prospective employer before an accepted offer; verify any "Sopra Steria" or similar recruiter contact through the company's official site directly, never through a link the recruiter supplies. MITRE M1017 (User Training). Verify: advisory sent and acknowledgement tracked via the security-awareness platform.
- Enforce that corporate resources (VPN, SSO, code repos) are reachable only from managed, EDR-enrolled devices — CERT-UA's explicit recommendation, and applies even to personal devices staff might use for interviews. MITRE M1030 (Network Segmentation) · CIS Control 12 (Network Infrastructure Management). Platform: Conditional Access (Entra ID) or NAC. Verify: attempt VPN/SSO login from an unmanaged test device and confirm block (Playbook 4, §13).
- Deploy an application-control rule (AppLocker/WDAC) blocking execution of unsigned/unknown VPN-client binaries named
SopraVPN*outside an approved allowlist. MITRE M1038 (Execution Prevention) · CIS Microsoft Windows Benchmark §Application Control. Verify: attempt to run a benign, clearly-labelled test binary namedSopraVPN-test.exein a lab VM and confirm block + event log entry (Playbook 3, §13).
- Roll out a managed, centrally-provisioned corporate VPN client (a single approved WireGuard/IPsec build, digitally signed, distributed only via MDM/SCCM — never via a link a third party supplies), so "download a custom VPN client from a recruiter" can never be a plausible instruction to staff. MITRE M1045 (Code Signing) · M1030 (Network Segmentation). Verify: MDM/app inventory shows only the approved signed VPN client fleet-wide.
- Formalize a hiring-process security policy (HR + Security jointly owned) defining what a legitimate technical assessment can and cannot ask a candidate to install, with mandatory Security sign-off before any candidate-facing "test environment" instructions are sent. ⚠ best-practice, no formal CIS/NIST benchmark for this HR-security control — it directly closes the human-layer gap this entire campaign exploits. Verify: policy document exists, signed by HR + Security leads, referenced in the recruiter onboarding checklist.
Deployable Playbooks
Playbook 1 — DNS sinkhole for campaign domains (BIND RPZ)
; Prerequisites: BIND 9.8+ with a configured response-policy zone (RPZ); ; rndc reload permission ; Reboot required: No (rndc reload takes effect immediately, no service restart) ; Rollback: remove the four CNAME records below from the RPZ zone file and ; rndc reload again ; /etc/bind/db.rpz.sandworm-sopravpn — add these records soprasteria-bg.com CNAME rpz-drop. soprasteriabg.com CNAME rpz-drop. atlasgroup-ua.com CNAME rpz-drop. douncloud.site CNAME rpz-drop. ; then: rndc reload ; Verify: dig @<resolver> soprasteria-bg.com ; expect NXDOMAIN or the sinkhole address
Playbook 2 — Falcon Custom IOC bulk import (falconpy)
# Prerequisites: pip install crowdstrike-falconpy; an API client with the
# "IOC Manager Write" scope
# Reboot required: No
# Rollback: delete the imported indicators via IOC.indicator_delete() using
# the returned indicator IDs, or set action="no_action" on each
# to soft-disable without deleting
from falconpy import IOC
falcon = IOC(client_id="REPLACE_WITH_CLIENT_ID", client_secret="REPLACE_WITH_CLIENT_SECRET")
indicators = [
{"type": "sha256", "value": "4646ea832a61c9f7bdb11fee64ad82ae6d9856d2f3a4b36a8a4a571145be1260",
"action": "prevent", "severity": "critical", "platforms": ["windows"],
"description": "SopraVPN trojanized WireGuard installer (sopravpn_v7)",
"tags": ["campaign:Sandworm-SopraVPN"]},
{"type": "sha256", "value": "aeb702f65445d12605a84be6fa31545c71be0bf619b1cbedbee5800a43fc6793",
"action": "prevent", "severity": "critical", "platforms": ["windows"],
"description": "SopraVPN.exe trojanized WireGuard client (variant 1)",
"tags": ["campaign:Sandworm-SopraVPN"]},
{"type": "domain", "value": "soprasteria-bg.com", "action": "detect",
"severity": "high", "platforms": ["windows", "linux", "mac"],
"description": "spoofed Sopra Steria Bulgaria lure site",
"tags": ["campaign:Sandworm-SopraVPN"]},
{"type": "domain", "value": "douncloud.site", "action": "detect",
"severity": "critical", "platforms": ["windows", "linux", "mac"],
"description": "SopraVPN C2 check-in domain",
"tags": ["campaign:Sandworm-SopraVPN"]},
{"type": "ipv4", "value": "139.28.36.23", "action": "detect",
"severity": "critical", "platforms": ["windows", "linux", "mac"],
"description": "rogue WireGuard endpoint udp/51820",
"tags": ["campaign:Sandworm-SopraVPN"]},
]
response = falcon.indicator_create(comment="Sandworm SopraVPN campaign import", indicators=indicators)
print(response["status_code"], response["body"])
Playbook 3 — Windows AppLocker deny rule for SopraVPN-named binaries
# Prerequisites: AppLocker policy service (Application Identity, AppIDSvc) # running; Group Policy or Intune available to push the rule # Reboot required: No (gpupdate + AppIDSvc restart is sufficient) # Rollback: remove the deny rule from the AppLocker policy XML and re-push, # or set the rule to "Audit only" to stop enforcing without deleting it # Deny rule (path-based), added to an AppLocker XML policy: # <FilePathRule Id="..." Name="Block SopraVPN / unapproved VPN clients" # Description="Sandworm SopraVPN campaign" UserOrGroupSid="S-1-1-0" # Action="Deny"> # <Conditions> # <FilePathCondition Path="*\SopraVPN*.exe" /> # </Conditions> # </FilePathRule> # Verify the policy is enforced (not Audit-only): Get-AppLockerPolicy -Effective -Xml | Select-String "SopraVPN" # Force a re-evaluation on the target host: gpupdate /target:computer /force Restart-Service -Name AppIDSvc -Force
Playbook 4 — Conditional Access: require compliant device for VPN + SSO
# Prerequisites: Entra ID P1 (Conditional Access) or an equivalent NAC/ZTNA
# enforcement point in front of the VPN concentrator and SSO
# Reboot required: No
# Rollback: set the policy State to "Off" rather than deleting it, so the
# exact configuration can be re-enabled without rebuilding it
# Conditional Access policy (Entra ID), summarized:
Name: Require compliant device for VPN + SSO
Assignments: All users -> Target resource: corporate VPN app registration, SSO apps
Conditions: Client apps = All; Device platforms = All
Grant control: Require device to be marked as compliant (blocks unmanaged/BYOD)
State: Report-only for 1 week, then Enforced
# Verify (Microsoft Graph PowerShell):
Get-MgIdentityConditionalAccessPolicy -Filter "displayName eq 'Require compliant device for VPN + SSO'" |
Select-Object DisplayName, State
Playbook 5 — Linux auditd watch for timesyncd-check and curl
#!/usr/bin/env bash # Prerequisites: auditd installed and running (auditctl available) # Reboot required: No (auditctl -R takes effect immediately; the rules file # in /etc/audit/rules.d/ persists it across a future reboot) # Rollback: auditctl -D to clear all custom rules, or remove the specific # watch lines below from the rules file and re-run augenrules --load # Watch the exact masquerade path CERT-UA published echo '-w /usr/libexec/timesyncd-check -p wax -k sandworm_sopravpn' >> /etc/audit/rules.d/sandworm-sopravpn.rules # Watch curl execution — pair with process-ancestry review in Falcon (Q6) echo '-w /usr/bin/curl -p x -k sandworm_sopravpn_curl' >> /etc/audit/rules.d/sandworm-sopravpn.rules augenrules --load auditctl -l | grep sandworm_sopravpn # Query after the fact: ausearch -k sandworm_sopravpn -i
Containment Runbook
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| P0 · Triage 0–30 min | Confirm the hit is genuine: pull the full process tree around the SopraVPN/wireguard process, the imported .conf file, and any child PowerShell/cURL process. Determine whether the tunnel actually came up. | SOC L1 | Process tree, imported config file (do not delete yet), network connection log |
| P1 · Isolate within 1 h | Network-contain the host via Falcon RTR. Do not reimage yet. Block outbound to douncloud.site and 139.28.36.23 org-wide immediately upon the first confirmed hit. | SOC L2 / Network | Containment timestamp; Falcon host ID; pre-block firewall/DNS logs |
| P2 · Scope 1–4 h | Run Q1–Q8 estate-wide over maximum retention. Identify every host that resolved campaign infrastructure or ran a SopraVPN-family binary. Ask the affected user for the recruiter's Telegram handle and email to widen the IOC set. | Threat hunting | Query result exports; affected-host list; recruiter contact details for CERT-UA reporting |
| P3 · Eradicate 4–24 h | Remove SopraVPN*.exe and sopraconf*.conf from disk; remove the matched scheduled task (Windows) or /usr/libexec/timesyncd-check (Linux). Rotate any credentials the affected sysadmin used post-infection (local admin, domain admin if elevated, any secrets stored on the box). If the scheduled task or cURL retrieval actually executed, treat the second-stage payload as unknown and reimage rather than clean. | IR + Endpoint Eng + IAM | File hash + path + timestamps logged before deletion; credential-rotation ticket |
| P4 · Block same day | Import the §10 IOC set fleet-wide. Push the §12 Immediate hardening items. Add the campaign domains to the SWG denylist. | Endpoint ops + network | IOC import receipt; DNS sinkhole config version |
| P5 · Notify 24–48 h | Report the fake recruiter contact to CERT-UA (cert.gov.ua / @CERT_UA) or the equivalent national CSIRT, and preserve the Telegram/email thread as evidence. If SourceForge project pages are still live, consider a takedown report to SourceForge. | IR lead + HR | Notification record; CERT case reference; exported chat transcript, sender email headers |
| P6 · Recover 2–7 d | Re-enroll the host in EDR, confirm managed-device compliance, and restore VPN/SSO access only after a clean sweep. Re-run Q1–Q8 at 7 and 30 days to catch dormant re-persistence. | IT Ops + IR | Compliance scan result; clean-sweep evidence |
| P7 · Learn within 2 w | Fold every benign hit into the query TUNING lines. Promote the §9 IOA candidates. Debrief the affected employee and run a targeted awareness push using the real lure as the example. | Detection engineering + HR | Updated pack (bump to v0.2); IOA rule group export |
Escalation trigger: a confirmed tunnel-up (Q4/Q5 hit) plus any child-process activity off the WireGuard binary (Q2, Q3, or Q6) means the backdoor fired, not just installed. Escalate to full incident response immediately — Sandworm's historical pattern is foothold, credential harvesting, lateral movement, then potentially destructive action against Ukrainian and allied infrastructure.
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1593.001, T1585.001, T1583.001 | Résumé harvesting, fake recruiter personas, campaign domain registration | — | — | GAP — pre-compromise, human-layer; not observable in Falcon, covered only by the awareness control in §12 |
| T1204.002 | SopraVPN install and execution | Q1 | Yes (candidate) | GOOD |
| T1027, T1140 | AES-256-GCM payload hidden in config; custom Base64 alphabet | — | — | GAP — requires static config-content inspection, not process/network telemetry; covered by the native grep SymmetricKey hunt in §7 |
| T1059.001, T1059.004 | Decrypt-and-execute backdoor trigger (PowerShell / shell) | Q2 | Investigate-only | PARTIAL — real benign population on the Linux PostUp side requires baselining |
| T1053.005, T1105 | Windows scheduled-task 2nd stage | Q3 | Yes (candidate, correlated) | GOOD |
| T1105, T1036.005 | Linux cURL 2nd stage / timesyncd-check masquerade | Q6 | Yes (candidate) | GOOD |
| T1071.001, T1583.001 | DNS/network to confirmed lure and C2 infrastructure | Q4, Q8 | No (IOC-managed instead) | GOOD for static IOCs; PARTIAL for cadence-based Q8 pending baseline |
| T1572, T1090 | WireGuard tunnel to rogue endpoint / tunneled 2nd-stage retrieval | Q5 | Yes (candidate) | GOOD for the outer tunnel connection; PARTIAL for the tunneled payload itself — Falcon cannot see inside the encrypted tunnel traffic |
| T1608.001 | SourceForge hosting of the trojanized installer | Q7 | No (pivot-only) | PARTIAL — high FP, DNS-level only, must be correlated with Q1 |
Known gaps and what to do about them
- Human-layer recon/resource-dev (3 gaps). Everything before the malicious download happens off any endpoint you control. Closing this is a policy and awareness problem (§12 Immediate #3, Strategic #2), not a detection problem.
- Config-content backdoor. The
SymmetricKeystring and the custom Base64 alphabet live inside a data file, not in process/network telemetry — Falcon's process and network event model cannot inspect arbitrary config-file contents. The nativegrephunt in §7 and the endpoint audit in §10 are the only coverage for this specific technique. - Encrypted tunnel payload. Once the WireGuard tunnel is up, the Linux second-stage cURL retrieval travels inside it — Falcon sees the outer tunnel connection (Q5) but not the inner HTTP(S)/plaintext request to attacker infrastructure.
Validation summary: gates G1–G8 in §11 govern promotion. G1 (telemetry present, both platforms) and G3–G5 (positive controls) must pass before any query is treated as coverage; G2 and G6 (baseline and negative control) must pass before any IOA moves past Monitor; G8 governs the move to Prevent. A query that has not passed its gate is a hypothesis, not a detection.
Hunt Summary Ticket
TITLE: Sandworm/UAC-0145 Fake-Recruiter SopraVPN Trojanized WireGuard Hunt
SEVERITY: High - nation-state, privileged-access targeting, confirmed atomic IOCs
SCOPE: Windows + Linux endpoints belonging to IT/sysadmin staff; email gateway;
DNS/network egress; managed-device compliance posture
HYPOTHESIS: A fake-recruiter social-engineering chain (job platform -> Telegram ->
Zoom -> bogus VPN "technical assessment") has delivered SopraVPN, a
trojanized WireGuard client that decrypts and executes attacker commands
hidden in the VPN config file (SymmetricKey / AES-256-GCM), and additional
hosts may be compromised via scheduled task (Windows) or VPN-tunneled
cURL retrieval (Linux).
QUERIES: Q1 SopraVPN execution (hash/filename) CONF high FP low
Q2 WireGuard parent spawning PS/shell CONF high FP med
Q3 Scheduled task after SopraVPN CONF high FP med
Q4 Network/DNS to campaign infrastructure CONF high FP low
Q5 UDP/51820 to rogue endpoint CONF high FP low
Q6 Linux cURL / timesyncd-check masquerade CONF high FP med
Q7 SourceForge download (pivot only) CONF med FP high
Q8 Beaconing to douncloud[.]site CONF med FP med
DO FIRST: 1. Run Q1 and Q4 against the last 90 days; either firing is a confirmed
incident, not a hunt lead.
2. If either fires, isolate the host (Falcon RTR contain) before running
Q2/Q3/Q6 to scope the blast radius.
3. Import the section 10 IOC CSV at Prevent for the published hashes.
4. Sinkhole the four campaign domains (Playbook 1).
FINDINGS: [pending - record hit counts per query and the referring recruiter
contact details]
GAPS: Recon/resource-dev stages are human-layer, not visible in Falcon (see
s15). Config-content backdoor (SymmetricKey string) requires a native
file-content hunt (s7), not CQL. Tunneled 2nd-stage retrieval on Linux
is invisible once inside the WireGuard tunnel.
ACTIONS: Immediate - DNS sinkhole, IOC import, user briefing on the hiring-lure
pattern
Near term - managed-device-only access to corporate resources,
AppLocker/WDAC deny rule for SopraVPN-named binaries
Strategic - single MDM-distributed signed corporate VPN client,
formal HR+Security hiring-process policy
OWNER: HuntPack
VERSION: v0.1 - 2026-08-23
Changelog
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| T1 | CERT-UA — Соціальна інженерія у виконанні UAC-0145: компрометація у процесі працевлаштування (article 6318863) | Primary. Full campaign narrative, technical backdoor mechanism, and every atomic indicator in this pack. | 2026-08-23 |
| T2 | The Hacker News — Sandworm-Linked UAC-0145 Uses Fake Job Interviews to Push VPN That Can Run Commands | Corroboration; additional SourceForge project name (hunt lead only). | 2026-08-23 |
| T2 | BleepingComputer — Sandworm hackers target IT pros with trojanized WireGuard VPN client | Corroboration and alert-copy phrasing. | 2026-08-23 |
| T2/3 | The Record / Recorded Future News — Russian military hackers pose as recruiters to target Ukrainian IT workers | Independent corroboration; Telegram-handle context; broader Sandworm history. | 2026-08-23 |
| T2/3 | TechTimes — Sandworm Recruiter Scam Targets Ukrainian Sysadmins, Deploys Hidden WireGuard Trojan | Deep secondary analysis, "Contagious Interview" framing, and defender guidance. | 2026-08-23 |
| Ref | MITRE ATT&CK T1204.002 — User Execution: Malicious File | Technique mapping for the SopraVPN install step. | 2026-08-23 |
| Ref | MITRE ATT&CK T1027 — Obfuscated Files or Information | Technique mapping for the config-hidden AES-256-GCM payload. | 2026-08-23 |
| Ref | CIS Benchmarks (Microsoft Windows) | Baseline citation for §12 application-control hardening. | 2026-08-23 |