Vasilek Backdoor Hidden in VMware Tools (Partisan Zmiy / Cyber Partisans)
Executive Summary
Attacker objective. Solar 4RAYS reports that the Belarus-aligned group it tracks as Partisan Zmiy, also known as the Cyber Partisans, held access to a Russian medical organization for about two years (earliest traces in early 2024, discovered December 2025) without any destructive action [1][2]. Solar assesses the access was kept for espionage and for trusted-relationship attacks against the organization's subsidiary medical institutions, and notes the actors reached domain controllers and central management systems [1][4]. The entry vector was not established [3].
What the intrusion looks like on a host. The actors used a trusted but unused VMware Tools installation as a hiding place. A new custom loader-scheduler, authd.exe, runs as the Windows service vmauad (display name VMware Auth Adapter) and launches other tools from fixed paths on a cron-style schedule: a GOST tunnel every Saturday 22:00 to 23:00, and, once, 480 minutes after the service starts, the Vasilek backdoor (internal version 1.5.8) and a second GOST [1]. Shortly before discovery the genuine vmtools.dll was replaced with an unsigned library and the original kept as vmtoolsd.dll [1]. Vasilek takes commands from, and returns results to, a Telegram group through the public Bot API; DNS tunnels (DNSCat2 and PartisanDNS) and a GOST plus 3proxy chain gave the actors fallback channels [1].
Highest-value defensive angle. Behavior beats indicators here: the actors rotated different tools through the same paths, bind payloads to the host name, and run on a delayed or nightly schedule. The cheapest durable detections are an Authenticode check on every executable in the VMware Tools folder (Solar says this alone would have exposed the loader, GOST and Vasilek binaries and the swapped library), the five masquerading service names, children of the loader, and a Telegram Bot API lookup from a server or an unsigned binary. Atomic indicators (twelve file hashes, nine network domains, nineteen generated domains, three IPs) all trace to Solar's appendix and ship as detect only.
Defender priority. Run Q1, Q2 and Q8 today on every Windows host and server that has VMware Tools or any unused virtualization software installed, and on domain controllers regardless. Solar's own conclusion is that Vasilek on a host almost always means a multi-tool intrusion: also hunt DNS tunnels, proxy chains, lateral movement tools and delayed destructive payloads, because this group is otherwise known for wipers [1].
Scope note. Solar's report mentions the Pryanik wiper, the Evlx event-log clearer, a FortiClient VPN decoy installer and an unrelated phishing malware named HypeAgent in other activity [2]. Those are background only; none of their indicators are in this pack.
Source Review & Web Hunter Notes
| # | Source | Tier | What it contributed | Carry forward |
|---|---|---|---|---|
| 1 | Solar 4RAYS: Partisan Zmiy: снова на радаре (Russian language, page date 02.10.2026) | T1 | Primary report. Services, file paths, loader behavior and configuration, schedule, Vasilek command table, MITRE matrix, and the IOC appendices (all hashes, domains, IPs). Translated by the analyst from Russian; every indicator copied from the saved snapshot | yes |
| 2 | The Hacker News: Hackers Hid Vasilek Backdoor in VMware Tools During 2-Year Russian Healthcare Intrusion (2026-10-21) | T2 | English summary of the Solar report; corroborates loader, schedule, version 1.5.8, move_cursor, and names other tools of the group as background | partial |
| 3 | Cyber Security News: Hackers Hide Vasilek Backdoor Inside VMware Tools (2026-10-07) | T2 | Reprints Solar's indicator appendix and notes that Solar's narrative and appendix disagree on what vmtools.dll loads. States the entry vector was not established | partial |
| 4 | Cyberpress: Partisan Zmiy Hackers Use Telegram-Controlled Vasilek Backdoor to Spy on Healthcare Networks (2026-10-07) | T2 | Corroborates incident background (antivirus alerts for Vasilek and GOST, domain controller access, no destructive action) | partial |
| 5 | Kaspersky ICS CERT: TTPs of Cyber Partisans activity aimed at espionage and disruption (2025-06-05) | T1 | Background only: first public description of Vasilek (Telegram group control, token impersonation loader). No indicator from this page is used | background |
| - | SC Media brief (scworld.com) | T2 | Fetch returned HTTP 403 (a bot-challenge page) on two attempts and the page was not retrievable; not cited and nothing depends on it | no |
Web hunter decisions and discrepancies
- Publication date. The Solar page itself shows 02.10.2026 and Cyber Security News and Cyberpress covered it on 7 October 2026; The Hacker News ran its summary on 21 October 2026. Reports dated "20 or 21 October" reflect the later press coverage, not the Solar publication date.
- Corroboration is thin. Sources 2 to 4 all derive from Solar and source 3 reprints its appendix, so the indicators have one originating source. That is why nothing ships at prevent or critical severity (Section 10).
- Solar contradicts itself on vmtools.dll. The narrative says the replaced library is the Vasilek backdoor; the appendix labels the same hash as loading PartisanDNS. Both are preserved [1][3]. Hunt the file by path and signature, not by assumed payload.
- The same path hosted different tools.
rpctool32.exeappears with two hashes (3proxy and Vasilek) andmsadcs32.dllwith two PartisanDNS hashes, so a hash alone is not a complete test for a path [1]. - Solar's ATT&CK label T1574.004 is named "Dylib Hijacking" in the matrix, which is a macOS-oriented technique; for a Windows DLL swap T1574.001 or T1574.002 may fit better. The pack carries Solar's ID and flags this as analyst inference.
- Excluded as not part of this intrusion: four earlier-known domains Solar lists only for comparison (each differs by one leading character from an incident domain) and the other-campaign tools named in the scope note in Section 1.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
- H1, high. A service named vmauad (or one of four System32 DLL services) exists and runs a binary from the VMware Tools folder or System32 with an odd display name. Techniques T1543.003, T1036.004. Queries Q1, Q2.
- H2, high. Unsigned executables with the names authd, vmtoolsd32 or rpctool32 run from the VMware Tools folder, or WsusService.exe runs from UpdateServicesPackages. T1036.005. Q2, Q4.
- H3, high. The loader or the masquerade tools spawn children: a shell, a tunnel, a proxy. T1059.003, T1090. Q8.
- H4, medium. Files are written into the VMware Tools folder by something other than the installer, including the vmtools.dll swap and Vasilek self-update files. T1574.004 (as labelled by Solar), T1105. Q3.
- H5, high. Hosts resolve the published C2 and PartisanDNS domains; non-browser processes query the Telegram Bot API. T1071.004, T1568.002, T1102.002. Q5, Q6, Q7.
- H6, medium. Earlier lateral movement used WMI remote execution with output to ADMIN$, and the AppMgmt service parameters were temporarily swapped. T1047, T1021.002, T1569.002. Q9, Q10.
Attack chain
| Step | Behavior (source) | Telemetry in plain terms | Hunt angle |
|---|---|---|---|
| 1 Access | Entry vector not established; legitimate RDP and SMB command execution used inside the network [1][3] | Logon events with logon type (CrowdStrike: UserLogon. SentinelOne: Login. Defender: DeviceLogonEvents) | Not queried: unscoped, high volume. See Section 7 |
| 2 Remote execution | Impacket wmiexec style: cmd.exe with output to \\127.0.0.1\ADMIN$\__<ts>.<us>, earliest 2024 trace [1] | Process creation with command line, path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q9 |
| 3 Service swap | AppMgmt service parameters temporarily overwritten to run a payload, then restored [1] | Registry value set, autostart (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) | Q10 |
| 4 Persistence | Five services: vmauad, tpvmmon, aweman32, msadcs32, uplay_r164; System log event 7045 [1] | Service created (CrowdStrike: CreateService. SentinelOne: see Section 7. Defender: confirm the service-installed action in DeviceEvents) | Q1, Section 7 |
| 5 Hijack | vmtools.dll replaced by an unsigned DLL, original kept as vmtoolsd.dll (December 2025) [1] | Executable or file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Q3, Q4. Module load of the DLL is a gap (see Section 15) |
| 6 Loader start | vmauad runs authd.exe; optional host-name SHA-256 check (token was empty in the sample); three scheduled tasks [1] | Process creation with command line, path and parent | Q2, Q8 |
| 7 Tunnel | GOST (vmtoolsd32.exe) Saturday 22:00 to 23:00, second GOST (WsusService.exe) and 3proxy; gost.yml configuration [1] | Process creation; outbound network connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Q2, Q8, Q4 |
| 8 Backdoor | rpctool32.exe (Vasilek 1.5.8) once at service start plus 480 minutes; commands include shell, file transfer, screenshots, keylogger, runas elevation, mute, self-update, self-delete [1] | Process creation with parent; DNS lookup with the requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse) | Q8, Q7 |
| 9 C2 and exfil | Telegram Bot API (api.telegram.org); backup DNS tunnels to listed domains and generated domains; proxy settings inherited [1] | DNS lookup; outbound network connection | Q5, Q6, Q7 |
| 10 Anti-forensics | Timestomping to VMware Tools dates, file rotation across paths, outgoing-message mute, self-delete [1] | No dedicated telemetry for timestamps (gap); file writes and process creation partly cover | Q3, Q8; timestamp gap |
Consolidated IOC Table
All values below were read from the saved Solar snapshot (source 1) and re-checked against the Cyber Security News reprint (source 3). Domains are shown defanged. Importable rows are in Section 10; every one is detect except the two Cloudflare IPs (no_action), and nothing ships at prevent or critical severity because the originating source is single. A hash on a path that Solar says hosted several tools is reliable for that sample only.
File hashes (SHA256)
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| sha256 | cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13 | medium | detect | msadcs32.dll (System32): PartisanDNS |
| sha256 | e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1 | medium | detect | tpvmmon.dll and omega.dll (System32): DNSCat2 packed with UPX |
| sha256 | 07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7 | medium | detect | aweman32.dll (System32): DNSCat2 packed with UPX |
| sha256 | 4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3 | medium | detect | msadcs32.dll and msadcs32.bak (System32): PartisanDNS |
| sha256 | 8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869 | medium | detect | uplay_r164.dll (System32): DNSCat2 packed with UPX |
| sha256 | 5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2 | medium | detect | VMware Tools\authd.exe: custom loader-scheduler (service vmauad) |
| sha256 | c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766 | medium | detect | VMware Tools\rpctool32.exe: 3proxy |
| sha256 | 87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c | medium | detect | VMware Tools\rpctool32.exe: Vasilek backdoor |
| sha256 | d7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b | medium | detect | VMware Tools\vmtoolsd32.exe: GOST tunnel |
| sha256 | e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513 | medium | detect | C:\Windows\fstab.exe: PartisanDNS |
| sha256 | 5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742 | medium | detect | E:\WSUS\UpdateServicesPackages\WsusService.exe: GOST tunnel (deleted before analysis) |
| sha256 | 125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc | medium | detect | VMware Tools\vmtools.dll: substituted library that loads PartisanDNS per Solar appendix |
Domains
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| domain | c0ce[.]org | medium | detect | Named by Solar as C2 for the incident DNSCat2 tunnels, or reused infrastructure (gov-by[.]com) |
| domain | p7cp[.]org | medium | detect | Named by Solar as C2 for the incident DNSCat2 tunnels, or reused infrastructure (gov-by[.]com) |
| domain | f91j[.]org | medium | detect | Named by Solar as C2 for the incident DNSCat2 tunnels, or reused infrastructure (gov-by[.]com) |
| domain | w3a01[.]net | medium | detect | Named by Solar as C2 for the incident DNSCat2 tunnels, or reused infrastructure (gov-by[.]com) |
| domain | gov-by[.]com | medium | detect | Named by Solar as C2 for the incident DNSCat2 tunnels, or reused infrastructure (gov-by[.]com) |
| domain | okkgb[.]com | medium | detect | Network indicator listed by Solar with no role stated |
| domain | c-oh[.]com | medium | detect | Network indicator listed by Solar with no role stated |
| domain | 89e[.]org | medium | detect | Network indicator listed by Solar with no role stated |
| domain | parker-inc[.]com | medium | detect | Network indicator listed by Solar with no role stated |
| domain (generated) | vpnosljjk[.]pro | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]top | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]link | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]cyou | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]pro | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]me | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]my | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]buzz | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]info | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]space | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]in | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]sbs | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]work | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]casa | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]lol | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]lat | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]net | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]org | low | detect | PartisanDNS generated-domain set |
| domain (generated) | vfvnfaq[.]com | low | detect | PartisanDNS generated-domain set |
IP addresses
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| ipv4 | 172[.]67[.]210[.]25 | low | no_action | Labelled Cloudflare by Solar: shared CDN address, pivot only |
| ipv4 | 104[.]21[.]34[.]242 | low | no_action | Labelled Cloudflare by Solar: shared CDN address, pivot only |
| ipv4 | 199[.]59[.]243[.]228 | low | detect | Labelled Amazon by Solar; role not stated, may be reassigned |
Host and behavioral indicators (not importable as atomic IOCs)
| Type | Value | Context |
|---|---|---|
| service name | vmauad, tpvmmon, aweman32, msadcs32, uplay_r164 | Display names: VMware Auth Adapter, Windows Insiders Service, Windows Channels Service, Sybase Inc. Product File, Access FT Imager Service [1] |
| file path | C:\Program Files\VMware\VMware Tools\{authd.exe, vmtoolsd32.exe, rpctool32.exe, vmtools.dll, vmtoolsd.dll, gost.yml} | Loader, GOST, Vasilek or 3proxy, swapped library, retained original, GOST configuration [1] |
| file path | E:\WSUS\UpdateServicesPackages\WsusService.exe, C:\Update\169\WSUSSCAN.exe | GOST disguised as WSUS (deleted before analysis); unknown file known only by SHA1 c4e623ab0a15db0896bf8a68eb9b45ebe6ae2f28 [1] |
| file path | C:\Windows\System32\{tpvmmon, aweman32, msadcs32, uplay_r164}.dll, omega.dll, msadcs32.bak, C:\Windows\fstab.exe | DNSCat2 and PartisanDNS carriers [1] |
| file name | new.bak, old-<timestamp>.bak, [HOSTNAME]-tun.yml, MySong.mp3 | Vasilek self-update, GOST config upload name, debug command artifact [1] |
| file pattern | C:\Windows\__<unix timestamp>.<microseconds> | Residual wmiexec-style output file [1] |
| schedule | Saturday 22:00 to 23:00; +480 minutes once after service start | Loader configuration [1] |
| telegram | api.telegram.org bot methods getUpdates, sendMessage, sendDocument, getFile, getChat, deleteMessage, answerCallbackQuery; recovered group chat id -1002113172843 (not visible in network telemetry) | Vasilek C2 [1] |
| registry | HKLM\SYSTEM\CurrentControlSet\Services\AppMgmt (Parameters subkey), Policies\System\ConsentPromptBehaviorAdmin read | Service swap; UAC check before runas [1] |
Affected Surface & Telemetry Matrix
| Surface | Telemetry in plain terms | Priority | Gap |
|---|---|---|---|
| Windows servers and workstations with VMware Tools (VMs and hosts that carry an unused install) | Process creation with command line, path and parent (CrowdStrike: ProcessRollup2, SyntheticProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); file written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | high | Authenticode population must be validated per tenant; module load of vmtools.dll is not queried |
| Windows service control manager | Service created (CrowdStrike: CreateService. SentinelOne: confirm the event name in your tenant. Defender: confirm the service-installed action in DeviceEvents); System log 7045 and Security 4697 as native sources | high | Native log is the authoritative record; Solar says 7045 survived file rotation |
| Domain controllers and central management servers | Same process, service and registry telemetry; logon events (CrowdStrike: UserLogon. SentinelOne: Login. Defender: DeviceLogonEvents) | high | Solar states DC access was obtained; sensor coverage on DCs is the first thing to verify |
| DNS resolvers and egress proxy | DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse); resolver and proxy logs for api.telegram.org and tunnel traffic | medium | Outside endpoint telemetry: JA3 or JA4 of the embedded TLS stack and DNS tunnel volume analytics live on network sensors |
| Registry | Registry value set, autostart (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) | medium | Key last-write time ordering (Solar's AppMgmt clue) is a forensic check, not an event |
| Trusted-subsidiary links | Authentication and remote-access logs on both sides of trust relationships | medium | Outside endpoint telemetry; needs the partner organizations' cooperation |
| Screenshots, keylogging, clipboard, runas, cursor movement | No dedicated endpoint events for these Vasilek capabilities | low | No mappable telemetry; covered only through the process and network behavior that surrounds them |
ATT&CK Mapping
| Tactic | Technique | Observed behavior (Solar) | Query or control |
|---|---|---|---|
| Execution | T1047 WMI | Remote command with output to ADMIN$ | Q9 |
| Execution | T1569.002 Service Execution | Payload run by temporarily swapping AppMgmt parameters | Q10 |
| Execution | T1059.003 Windows Command Shell | Vasilek commands c, ci, cl, cil, cr, reset | Q8 |
| Execution | T1106 Native API | CreateProcessA in loader, ShellExecuteA in Vasilek | No telemetry (gap) |
| Persistence | T1543.003 Windows Service | tpvmmon, aweman32, msadcs32, uplay_r164, vmauad | Q1, Q2 |
| Persistence | T1574.004 as labelled by Solar (analyst note: T1574.001 or .002 may fit a DLL swap) | vmtools.dll replaced; original kept as vmtoolsd.dll | Q3, Q4; Hardening 2 and 4 |
| Privilege escalation | T1548.004 Elevated Execution with Prompt | cadmin and force_cadmin check ConsentPromptBehaviorAdmin and relaunch with runas | Partial via Q8 and Q2 |
| Defense evasion | T1480.001 Environmental Keying | SHA-256 of host name in loader and Vasilek | No detection (gap); explains sandbox silence |
| Defense evasion | T1036.004 and T1036.005 Masquerading | Service display names; tools named for VMware and WSUS components | Q1, Q2, Q3 |
| Defense evasion | T1070.006 Timestomp | File dates set to VMware Tools dates (2020) | Gap; forensic timeline check in Section 7 |
| Defense evasion | T1070.004 File Deletion | Vasilek self-delete through cmd /c del | Q8 |
| Defense evasion | T1027, T1027.002, T1140 | OLLVM obfuscation, UPX-packed DNSCat2, XOR and Vigenere string encryption | Q4 (hashes); static, no behavior query |
| Defense evasion | T1112 Modify Registry; T1497.001 System Checks | AppMgmt parameter swap; working-set size check | Q10; none |
| Discovery | T1082, T1016, T1010 | System report (v, vv), proxy settings, active window tracking | No telemetry (gap) |
| Lateral movement | T1021.001 RDP; T1021.002 SMB and Admin Shares | Legitimate RDP access; output collected through ADMIN$ | Section 7 native hunt; Q9 |
| Collection | T1113 Screen Capture; T1056.001 Keylogging | screenshot, ss, key_on, key_off, key_flush | No telemetry (gap) |
| Command and control | T1102.002 Bidirectional Web Service | Telegram Bot API group chat | Q7, Section 7 |
| Command and control | T1071.004 DNS; T1568.002 DGA | PartisanDNS and DNSCat2 over DNS; generated domains | Q5 |
| Command and control | T1573.002 Encrypted Channel; T1090 Proxy; T1105 Ingress Tool Transfer | Embedded TLS stack, GOST and 3proxy, wget and #UPLOAD | Q2, Q3, Q4, Q8; JA3 or JA4 outside endpoint telemetry |
| Exfiltration | T1041 Exfiltration Over C2 | dwl uploads files to the Telegram group | Q7 |
Native Audit-Log Hunts
7.1 Service creation (System log 7045 and Security 4697)
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} |
Where-Object { $_.Message -match 'vmauad|tpvmmon|aweman32|msadcs32|uplay_r164|VMware Auth Adapter|Windows Insiders Service|Windows Channels Service|Sybase Inc\. Product File|Access FT Imager Service' } |
Select-Object TimeCreated, MachineName, Message
Solar says these creation events remained in the System log after the actors rotated files [1]. Run the same filter against forwarded logs for the longest retention you have.
7.2 Signature sweep of the VMware Tools folder (read-only)
Get-ChildItem 'C:\Program Files\VMware\VMware Tools' -Include *.exe,*.dll -Recurse -ErrorAction SilentlyContinue |
ForEach-Object { $s = Get-AuthenticodeSignature $_.FullName
[pscustomobject]@{ File=$_.FullName; Status=$s.Status; Signer=$s.SignerCertificate.Subject; Modified=$_.LastWriteTime; Created=$_.CreationTime } } |
Where-Object { $_.Status -ne 'Valid' -or $_.Signer -notmatch 'VMware' }
Solar states that signature checking trusted-software folders would have exposed authd.exe, vmtoolsd32.exe, rpctool32.exe and the swapped vmtools.dll [1]. Also list vmtoolsd.dll and *.bak.
7.3 Services whose DLL or binary sits in System32 under an odd name
Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'VMware Tools\\authd|tpvmmon|aweman32|msadcs32|uplay_r164' } |
Select-Object Name, DisplayName, PathName, StartMode, State
# Also inspect HKLM\SYSTEM\CurrentControlSet\Services\*\Parameters ServiceDll for unsigned DLLs
7.4 Timestomp and registry timeline checks
Compare file creation time with last-write time and with the installer date for VMware Tools files (Solar saw 29.05.2020 stamped on vmtoolsd32.exe) [1]. Compare the last-write time of HKLM\SYSTEM\CurrentControlSet\Services\AppMgmt with its Parameters subkey: a service key newer than its parameters is the pattern Solar used to infer the swap-and-restore [1].
7.5 SMB and WMI remote execution
Search the Microsoft-Windows-SMBServer/Security log for event ID 1015, which Solar says preserved traces of remote command execution [1]. Search for an empty C:\Windows\__<digits>.<digits> file, the leftover of wmiexec-style output.
7.6 Network, proxy and DNS
- Resolver and proxy logs: lookups of
api.telegram.orgfrom servers and domain controllers; long-poll style requests (about 60 seconds) from non-browser user agents. - Solar notes the embedded TLS stack (TLSe with LibTomCrypt) makes the TLS ClientHello likely distinct from browsers and Windows components, so a JA3 or JA4 baseline can single it out [1]. No fingerprint value is published, so build your own from a known sample.
- DNS analytics: high-volume lookups of one label across many suffixes (the vfvnfaq pattern) and tunnel-like TXT or long-label traffic.
7.7 Sysmon, if deployed
Event ID 7 (image loaded) for vmtools.dll with an invalid signature, event ID 1 for the masquerade process names, event ID 11 for file creation in the VMware Tools folder, and event ID 12 or 13 on the AppMgmt service key. Module load is the one stage the CQL queries below do not cover.
Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Pick your portal. Microsoft documents a Share link in advanced hunting but not its URL format, so each "Copy & open Defender" button copies the query and opens Advanced hunting: paste it into the editor.
Honest limits. authd.exe and vmtools.dll are also genuine VMware file names, so no query here trusts a name alone: each one adds an unsigned test, an installer-writer exclusion or a parent test, and carries an FP note. Module loads of the swapped DLL, screenshots, keylogging, the host-name check and timestomping have no query (Section 15). Two field notes: AuthenticodeHashData, ServiceDisplayName, ServiceImagePath and ContextBaseFileName should be confirmed on one real row in your tenant before you rely on a zero result. Backslashes in regex are written as \\ and no regex contains an unescaped forward slash.
Looks for: Solar found five malicious Windows services: vmauad (display name VMware Auth Adapter, running the loader authd.exe from the VMware Tools folder) and four services that run DLLs from System32 (tpvmmon, aweman32, msadcs32, uplay_r164). Solar notes the creation events survived in the System log (event ID 7045) even after the actors swapped files. This query matches the creation by the odd display names or by the image paths.
Known limitations and deployment notes
- PowerQuery: A service created through an API that never writes the DisplayName or ImagePath values to the registry is not seen.
- PowerQuery: Rows are registry writes, so a later edit of an existing service value matches as well as a new install.
- PowerQuery assumes: A service install writes DisplayName and ImagePath values that surface as Registry Value Modified events.
- PowerQuery assumes: Image paths are matched with a literal backslash separator, as Windows reports them.
- PowerQuery assumes: Matching is case-insensitive, which reproduces the CQL /i intent.
- KQL – Defender XDR: A service created through an API that never writes the DisplayName or ImagePath values to the registry is not seen.
- KQL – Defender XDR assumes: A service install writes DisplayName and ImagePath values that surface as RegistryValueSet rows.
- KQL – Defender XDR assumes: Image paths are matched with a literal backslash separator, as Windows reports them.
// HUNT: Service creation with a masquerading display name or the loader and DLL service paths // MITRE: T1543.003, T1036.004 // CONF: high // FP: low // COST: low // REQUIRES: CreateService (service installed) with service fields; ServiceDisplayName and ServiceImagePath are the standard field names but ⚠ validate in tenant against one real CreateService row // FALSE POSITIVES: none expected for these exact display names and paths; a genuine product with an identical display name is the only collision // LOOKBACK: 7d (set with the console time picker) #event_simpleName=CreateService | ServiceDisplayName=/^(VMware Auth Adapter|Windows Insiders Service|Windows Channels Service|Sybase Inc\. Product File|Access FT Imager Service)$/i or ServiceImagePath=/VMware Tools\\authd\.exe/i or ServiceImagePath=/\\System32\\(tpvmmon|aweman32|msadcs32|uplay_r164)\.dll/i | table([@timestamp, aid, ComputerName, UserName, ServiceDisplayName, ServiceImagePath, ContextBaseFileName]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.type: Event typeregistry.keyPath: Registry key pathregistry.valueName: Registry value nameregistry.value: Registry value data
Recommended fields
src.process.name: Writer process
Optional fields
src.process.user: Writer user
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * registry.valueName = * registry.value = * | limit 5 | columns event.type, registry.keyPath, registry.valueName, registry.value
// HUNT: Service creation with a masquerading display name or the loader and DLL service paths
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1543.003, T1036.004
// CONF: high | FP: low
// FALSE POSITIVES: none expected for these exact display names and paths; a genuine product with an identical display name is the only collision
// EQUIVALENCE: approximate-analytic - SentinelOne has no service-install event with a display-name field, so the hunt reads the service key instead: a registry write of the DisplayName or ImagePath value under a Services key, tested against the same display names and the same loader and DLL image paths. The service is seen when its values are written, not when the service manager registers it.
// REQUIRES: SentinelOne EDR registry telemetry (event type Registry Value Modified) with registry.keyPath, registry.valueName and registry.value populated
// TUNING: A genuine product with an identical display name is the only expected collision; exclude it by writer process after reviewing real rows.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A service created through an API that never writes the DisplayName or ImagePath values to the registry is not seen. Rows are registry writes, so a later edit of an existing service value matches as well as a new install.
// VALIDATION LEVEL: static-reviewed
event.type = 'Registry Value Modified' registry.keyPath matches '.Services.' registry.valueName in:anycase ('DisplayName', 'ImagePath') (registry.value matches '^(VMware Auth Adapter|Windows Insiders Service|Windows Channels Service|Sybase Inc\\. Product File|Access FT Imager Service)$' or registry.value matches 'VMware Tools\\\\authd\\.exe' or registry.value matches '\\\\System32\\\\(tpvmmon|aweman32|msadcs32|uplay_r164)\\.dll')
| columns event.time, endpoint.name, src.process.user, src.process.name, registry.keyPath, registry.valueName, registry.value
| sort -event.time
| limit 200Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: Event timeActionType: Registry actionRegistryKey: Registry keyRegistryValueName: Registry value nameRegistryValueData: Registry value data
Recommended fields
InitiatingProcessFileName: Writer process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | where ActionType == "RegistryValueSet" | project Timestamp, ActionType, RegistryKey, RegistryValueName, RegistryValueData | take 5
// HUNT: Service creation with a masquerading display name or the loader and DLL service paths
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1543.003, T1036.004
// CONF: high | FP: low
// FALSE POSITIVES: none expected for these exact display names and paths; a genuine product with an identical display name is the only collision
// EQUIVALENCE: approximate-analytic - Defender does not record a service display name on a service-creation row, so the hunt reads the service key: a RegistryValueSet of DisplayName or ImagePath under a Services key, tested against the same display names and image paths.
// REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents)
// TUNING: A genuine product with an identical display name is the only expected collision; exclude it by InitiatingProcessFileName after reviewing real rows.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A service created through an API that never writes the DisplayName or ImagePath values to the registry is not seen.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceRegistryEvents
| where Timestamp >= ago(7d)
| where ActionType == "RegistryValueSet"
| where RegistryKey contains "\\Services\\"
| where RegistryValueName in~ ("DisplayName", "ImagePath")
| where RegistryValueData matches regex @"(?i)^(VMware Auth Adapter|Windows Insiders Service|Windows Channels Service|Sybase Inc\. Product File|Access FT Imager Service)$" or RegistryValueData matches regex @"(?i)VMware Tools\\authd\.exe" or RegistryValueData matches regex @"(?i)\\System32\\(tpvmmon|aweman32|msadcs32|uplay_r164)\.dll"
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RegistryKey, RegistryValueName, RegistryValueData
| sort by Timestamp desc
| take 200Looks for: The loader authd.exe and the tools it schedules (vmtoolsd32.exe GOST, rpctool32.exe Vasilek or 3proxy) sit in C:\Program Files\VMware\VMware Tools\, and a second GOST copy ran as WsusService.exe from E:\WSUS\UpdateServicesPackages\. Solar states these files were unsigned while genuine VMware binaries are signed. authd.exe is also a name genuine VMware products can use, so the signature test is the discriminator, not the name. FP: a genuine signed VMware binary named authd.exe (excluded by the unsigned filter), an unsigned in-house tool that happens to carry one of these names, and sensors that do not populate the authenticode field on a given host.
Known limitations and deployment notes
- PowerQuery: If the sensor leaves tgt.process.publisher empty for signed binaries the hunt also returns the genuine signed copies.
- PowerQuery assumes: tgt.process.publisher is empty for an unsigned binary and populated for a signed one; this field is attested by symmetry only, so verify it on a tenant.
- PowerQuery assumes: The package-store test is a substring of the image path rather than a path-segment match.
- PowerQuery assumes: Names and folders match case-insensitively, which reproduces the CQL /i intent.
- KQL – Defender XDR: A masquerade that forges a company name in its version information is not caught, and a signed copy with no version information is.
- KQL – Defender XDR: The CQL's signature test has no created-process equivalent in this table.
- KQL – Defender XDR assumes: An implant that carries no version information has an empty ProcessVersionInfoCompanyName.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Masquerade executables (authd, vmtoolsd32, rpctool32, WsusService) running unsigned from VMware Tools or UpdateServicesPackages // MITRE: T1036.005, T1543.003, T1090 // CONF: high // FP: medium // COST: low // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 with ImageFileName and AuthenticodeHashData (absent on unsigned files per the v3 reference); ⚠ validate in tenant that AuthenticodeHashData is populated for signed VMware binaries before trusting a zero result // FALSE POSITIVES: genuine VMware authd.exe (signed), unsigned in-house tool reusing a name, sensors without authenticode population // TUNING: keep the unsigned filter; exclude only after confirming the SHA256HashData against the vendor package for your VMware Tools version; never exclude by file name or folder alone // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | (FileName=/^(authd|vmtoolsd32|rpctool32)\.exe$/i and ImageFileName=/\\VMware Tools\\[^\\]+$/i) or (FileName=/^WsusService\.exe$/i and ImageFileName=/\\UpdateServicesPackages\\/i) | AuthenticodeHashData!=* | table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typetgt.process.name: Created process nametgt.process.image.path: Created process pathtgt.process.publisher: Created process signer. Attested by symmetry only; verify it is populated on signed binaries.
Recommended fields
src.process.name: Creator process
Optional fields
tgt.process.image.sha256: Hash
Readiness test
event.type = 'Process Creation' tgt.process.name = * tgt.process.image.path = * | limit 5 | columns event.type, tgt.process.name, tgt.process.image.path, tgt.process.publisher
// HUNT: Masquerade executables (authd, vmtoolsd32, rpctool32, WsusService) running unsigned from VMware Tools or UpdateServicesPackages
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1036.005, T1543.003, T1090
// CONF: high | FP: medium
// FALSE POSITIVES: genuine VMware authd.exe (signed), unsigned in-house tool reusing a name, sensors without authenticode population
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the three VMware Tools masquerade names in a VMware Tools folder, or WsusService.exe in the package store, with no signer. The new process is tgt.process.*. The unsigned test is an absent publisher, which is the nearest attested signer field.
// REQUIRES: SentinelOne EDR process-creation telemetry with tgt.process.image.path and a populated tgt.process.publisher for signed binaries
// TUNING: Keep the unsigned filter; exclude only after confirming the SHA-256 against the vendor package for your VMware Tools version; never exclude by file name or folder alone.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: If the sensor leaves tgt.process.publisher empty for signed binaries the hunt also returns the genuine signed copies.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' ((tgt.process.name in:anycase ('authd.exe', 'vmtoolsd32.exe', 'rpctool32.exe') and tgt.process.image.path matches '\\\\VMware Tools\\\\[^\\\\]+$') or (tgt.process.name in:anycase ('WsusService.exe') and tgt.process.image.path contains 'UpdateServicesPackages')) !(tgt.process.publisher = *)
| columns event.time, endpoint.name, src.process.user, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, src.process.name, tgt.process.image.sha256
| sort -event.time
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process pathProcessVersionInfoCompanyName: Version-info company name
Recommended fields
InitiatingProcessFileName: Initiating process
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath, ProcessVersionInfoCompanyName | take 5
// HUNT: Masquerade executables (authd, vmtoolsd32, rpctool32, WsusService) running unsigned from VMware Tools or UpdateServicesPackages
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1036.005, T1543.003, T1090
// CONF: high | FP: medium
// FALSE POSITIVES: genuine VMware authd.exe (signed), unsigned in-house tool reusing a name, sensors without authenticode population
// EQUIVALENCE: approximate-analytic - Same masquerade names and folders on process creation, but DeviceProcessEvents has no signature column for the created process, so the unsigned test becomes an empty company name in the version info.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Keep the version-info test; exclude only after confirming the hash against the vendor package for your VMware Tools version; never exclude by file name or folder alone.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A masquerade that forges a company name in its version information is not caught, and a signed copy with no version information is. The CQL's signature test has no created-process equivalent in this table.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where (FileName in~ ("authd.exe", "vmtoolsd32.exe", "rpctool32.exe") and FolderPath matches regex @"(?i)\\VMware Tools\\[^\\]+$") or (FileName =~ "WsusService.exe" and FolderPath contains "UpdateServicesPackages")
| where isempty(ProcessVersionInfoCompanyName)
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, FileName, FolderPath, ProcessCommandLine, InitiatingProcessFileName, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: In December 2025 the actors replaced vmtools.dll and kept the original beside it as vmtoolsd.dll; Vasilek self-update drops new.bak and renames the running file to old-<timestamp>.bak. This looks for those names being written inside the VMware Tools folder by any writer except the usual VMware installers. Solar says these paths were reused for different tools over time, so a hit on the same path with a new hash is expected. FP: legitimate VMware Tools install, upgrade or repair writes (excluded by writer name), and software deployment tools that stage VMware Tools packages.
Known limitations and deployment notes
- PowerQuery: The CQL only fires on files the sensor classified as executable; here a non-executable file with one of these names also matches.
- PowerQuery: A rename onto one of these names may report the old path, so a swap by rename can be missed.
- PowerQuery assumes: A single dot in the path pattern stands for one backslash.
- PowerQuery assumes: File Modification is included because a swapped DLL may be overwritten in place.
- PowerQuery assumes: Matching is case-insensitive, which reproduces the CQL /i intent.
- KQL – Defender XDR: The CQL only fires on files the sensor classified as executable; here a non-executable file with one of these names also matches.
- KQL – Defender XDR assumes: FolderPath holds a path that contains the VMware Tools folder, whether or not the sensor appends the file name.
// HUNT: PE file written to VMware Tools folder under attacker file names by a non-installer writer // MITRE: T1574.004, T1036.005, T1105, T1070.006 // CONF: medium // FP: medium // COST: low // REQUIRES: NewExecutableWritten or PeFileWritten with TargetFileName and ContextBaseFileName (writer process); ⚠ validate ContextBaseFileName in tenant. Non-PE .bak copies appear only if the sensor classifies the content as a PE // FALSE POSITIVES: VMware Tools upgrade or repair, deployment agents staging the package // TUNING: extend the writer exclusion with your own deployment agent (for example your software distribution client) after confirming it on real rows; do not exclude msiexec.exe and then forget that an attacker can also run msiexec // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(NewExecutableWritten|PeFileWritten)$/ | TargetFileName=/\\VMware Tools\\(authd\.exe|vmtoolsd32\.exe|rpctool32\.exe|vmtools\.dll|vmtoolsd\.dll|new\.bak|old-[^\\]*\.bak)$/i | ContextBaseFileName!=/^(msiexec|VMwareToolsUpgrader|setup|setup64)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- File Creation
- File Modification
Required fields
event.type: Event typetgt.file.path: Written file pathsrc.process.name: Writer process
Recommended fields
src.process.user: Writer user
Optional fields
tgt.file.sha256: Hash
Readiness test
event.type = 'File Creation' tgt.file.path = * src.process.name = * | limit 5 | columns event.type, tgt.file.path, src.process.name
// HUNT: PE file written to VMware Tools folder under attacker file names by a non-installer writer
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1574.004, T1036.005, T1105, T1070.006
// CONF: medium | FP: medium
// FALSE POSITIVES: VMware Tools upgrade or repair, deployment agents staging the package
// EQUIVALENCE: approximate-analytic - Same target-path and writer-exclusion predicate, but SentinelOne reports every file creation or modification rather than only files the sensor classified as executable, so the hunt is keyed on the attacker file names alone. The writer is the acting process, src.process.*.
// REQUIRES: SentinelOne EDR file telemetry (File Creation and File Modification) with tgt.file.path and src.process.name populated
// TUNING: Extend the writer exclusion with your own deployment agent after confirming it on real rows; do not exclude msiexec.exe and then forget that an attacker can also run msiexec.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The CQL only fires on files the sensor classified as executable; here a non-executable file with one of these names also matches. A rename onto one of these names may report the old path, so a swap by rename can be missed.
// VALIDATION LEVEL: static-reviewed
event.type in ('File Creation', 'File Modification') tgt.file.path matches '.VMware Tools.(authd\\.exe|vmtoolsd32\\.exe|rpctool32\\.exe|vmtools\\.dll|vmtoolsd\\.dll|new\\.bak|old-[^\\\\]*\\.bak)$' !(src.process.name in:anycase ('msiexec.exe', 'VMwareToolsUpgrader.exe', 'setup.exe', 'setup64.exe'))
| columns event.time, endpoint.name, src.process.user, tgt.file.path, src.process.name, tgt.file.sha256
| sort -event.time
| limit 200Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeActionType: File actionFolderPath: Written file folderFileName: Written file nameInitiatingProcessFileName: Writer process
Optional fields
SHA1: Hash. SHA256 is often unpopulated; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, FolderPath, FileName, InitiatingProcessFileName | take 5
// HUNT: PE file written to VMware Tools folder under attacker file names by a non-installer writer
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1574.004, T1036.005, T1105, T1070.006
// CONF: medium | FP: medium
// FALSE POSITIVES: VMware Tools upgrade or repair, deployment agents staging the package
// EQUIVALENCE: approximate-analytic - Same target-folder, file-name and writer-exclusion predicate on file events; Defender reports every created or modified file rather than only files classified as executable, so the file names carry the selection.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Extend the writer exclusion with your own deployment agent after confirming it on real rows; do not exclude msiexec.exe and then forget that an attacker can also run msiexec.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The CQL only fires on files the sensor classified as executable; here a non-executable file with one of these names also matches.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(7d)
| where ActionType in~ ("FileCreated", "FileModified")
| where FolderPath contains "\\VMware Tools\\"
| where FileName in~ ("authd.exe", "vmtoolsd32.exe", "rpctool32.exe", "vmtools.dll", "vmtoolsd.dll", "new.bak") or FileName matches regex @"(?i)^old-[^\\]*\.bak$"
| where InitiatingProcessFileName !in~ ("msiexec.exe", "VMwareToolsUpgrader.exe", "setup.exe", "setup64.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, FolderPath, FileName, InitiatingProcessFileName, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: Exact match on the twelve SHA256 values Solar published for this intrusion, across process starts and file writes. Because actors rotated different tools through the same paths, a hash miss on a masquerade path is not clearance: run Q2 and Q3 as well. All twelve ship as detect only (see Section 10).
Known limitations and deployment notes
- PowerQuery: A file that was neither written nor executed inside the lookback window is not seen.
- PowerQuery assumes: SHA-256 is populated on process-creation and file events on the tenant; a sensor that records only SHA-1 returns nothing.
- PowerQuery assumes: Hash values are lower-case hex and are compared case-insensitively.
- KQL – Defender XDR: Files that were written but never executed are not covered: that half needs a file-event table.
- KQL – Defender XDR: SHA256 is often unpopulated in DeviceProcessEvents and the CQL carries no SHA1 values, so a tenant with sparse SHA256 sees fewer hits than the CQL tab.
- KQL – Defender XDR assumes: SHA256 is populated on the tenant's process-creation rows; Microsoft documents it as usually not populated.
// HUNT: SHA256 match on Solar-published files for this intrusion // MITRE: T1543.003, T1574.004, T1090, T1071.004 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2, NewExecutableWritten or PeFileWritten carrying SHA256HashData // FALSE POSITIVES: none expected; GOST and 3proxy are open-source tools, so a hit on those two hashes is the attacker-built copy, but hits should still be reviewed by an analyst rather than auto-actioned // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|NewExecutableWritten|PeFileWritten)$/ | in(field=SHA256HashData, values=["cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13", "e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1", "07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7", "4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3", "8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869", "5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2", "c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766", "87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c", "d7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b", "e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513", "5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742", "125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc"]) | table([@timestamp, aid, ComputerName, UserName, #event_simpleName, SHA256HashData, FileName, ImageFileName, TargetFileName, CommandLine]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
- File Modification
Required fields
event.type: Event typetgt.process.image.sha256: Created process hashtgt.file.sha256: Written file hash
Recommended fields
tgt.process.image.path: Created process pathtgt.file.path: Written file path
Readiness test
event.type = 'Process Creation' tgt.process.image.sha256 = * | limit 5 | columns event.type, tgt.process.image.sha256, tgt.file.sha256
// HUNT: SHA256 match on Solar-published files for this intrusion
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1543.003, T1574.004, T1090, T1071.004
// CONF: high | FP: low
// FALSE POSITIVES: none expected; GOST and 3proxy are open-source tools, so a hit on those two hashes is the attacker-built copy, but hits should still be reviewed by an analyst rather than auto-actioned
// EQUIVALENCE: equivalent-with-schema-assumptions - Same twelve SHA-256 values matched on the same two populations: an executed image on process creation and a written file on file creation or modification. The hash sits on the created process (tgt.process.image.sha256) and on the written file (tgt.file.sha256).
// REQUIRES: SentinelOne EDR process and file telemetry with SHA-256 populated on tgt.process.image.sha256 and tgt.file.sha256
// TUNING: Review every hit as an analyst rather than auto-actioning it; GOST and 3proxy are open-source tools, so a hit on those hashes is the attacker-built copy.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A file that was neither written nor executed inside the lookback window is not seen.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' and tgt.process.image.sha256 in:anycase ('cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13', 'e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1', '07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7', '4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3', '8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869', '5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2', 'c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766', '87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c', 'd7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b', 'e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513', '5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742', '125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc')) or (event.type in ('File Creation', 'File Modification') and tgt.file.sha256 in:anycase ('cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13', 'e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1', '07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7', '4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3', '8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869', '5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2', 'c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766', '87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c', 'd7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b', 'e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513', '5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742', '125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc'))
| columns event.time, endpoint.name, event.type, tgt.process.name, tgt.process.image.path, tgt.process.image.sha256, tgt.process.cmdline, tgt.file.path, tgt.file.sha256
| sort -event.time
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeSHA256: Created process hash
Recommended fields
FolderPath: Created process path
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | where isnotempty(SHA256) | project Timestamp, SHA256 | take 5
// HUNT: SHA256 match on Solar-published files for this intrusion
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1543.003, T1574.004, T1090, T1071.004
// CONF: high | FP: low
// FALSE POSITIVES: none expected; GOST and 3proxy are open-source tools, so a hit on those two hashes is the attacker-built copy, but hits should still be reviewed by an analyst rather than auto-actioned
// EQUIVALENCE: telemetry-gap - One table per query: this pivot covers only the executed-image half of the hash match, on process creation. The written-file half lives in another table and is left to the CQL tab.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) with SHA256 populated
// TUNING: Review every hit as an analyst rather than auto-actioning it; run the CQL tab for the written-file half.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Files that were written but never executed are not covered: that half needs a file-event table. SHA256 is often unpopulated in DeviceProcessEvents and the CQL carries no SHA1 values, so a tenant with sparse SHA256 sees fewer hits than the CQL tab.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where SHA256 in~ ("cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13", "e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1", "07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7", "4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3", "8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869", "5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2", "c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766", "87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c", "d7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b", "e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513", "5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742", "125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, FileName, FolderPath, SHA256, ProcessCommandLine, InitiatingProcessFileName
| sort by Timestamp desc
| take 200Looks for: Matches the nine domains Solar lists as network indicators (five are named as C2 for the DNSCat2 tunnels or as reused infrastructure) plus the PartisanDNS generated-domain set (vpnosljjk and the vfvnfaq label under eighteen suffixes). It matches the domain and any subdomain, which is how DNS tunnels carry data. Only the listed generated domains are covered; the generation algorithm itself is not published.
Known limitations and deployment notes
- PowerQuery: The CQL also collects the process id behind each lookup; this card shows one process name per group instead.
- PowerQuery assumes: event.dns.request holds the queried name; the vendor field documentation also names dns.request, so confirm which one your tenant populates.
- PowerQuery assumes: Matching is case-insensitive, which reproduces the CQL /i intent.
- PowerQuery assumes: The three hyphenated names (gov-by.com, c-oh.com, parker-inc.com) are matched with the hyphen in a character class, so the labels by.com, inc.com and oh.com read as the CQL writes them.
- KQL – Defender XDR: The CQL also collects the process id behind each lookup; this card does not.
- KQL – Defender XDR assumes: The queried name is in AdditionalFields under DnsQueryString or QueryName; the readiness test prints the field so you can see which key your tenant populates.
- KQL – Defender XDR assumes: The DnsQueryResponse action type is attested in Microsoft hunting-query repositories rather than on the Learn table page.
- KQL – Defender XDR assumes: The three hyphenated names (gov-by.com, c-oh.com, parker-inc.com) are matched with the hyphen in a character class, so the labels by.com, inc.com and oh.com read as the CQL writes them.
// HUNT: DnsRequest for published C2 and PartisanDNS domains (including subdomains used for tunnelling) // MITRE: T1071.004, T1568.002, T1090 // CONF: high // FP: low // COST: low // REQUIRES: DnsRequest with DomainName; host must resolve through a path the sensor sees // FALSE POSITIVES: none expected for these names // LOOKBACK: 7d (set with the console time picker) #event_simpleName=DnsRequest | DomainName=/(^|\.)(c0ce\.org|p7cp\.org|f91j\.org|w3a01\.net|gov\-by\.com|okkgb\.com|c\-oh\.com|89e\.org|parker\-inc\.com|vpnosljjk\.pro|vfvnfaq\.(top|link|cyou|pro|me|my|buzz|info|space|in|sbs|work|casa|lol|lat|net|org|com))$/i | groupBy([aid, ComputerName, DomainName], function=[count(as=Lookups), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen), collect([ContextProcessId])], limit=500) | sort(Lookups, order=desc, limit=200)
2 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.type: Event typeevent.dns.request: Queried name
Recommended fields
endpoint.name: Host
Optional fields
src.process.name: Querying process
Fallbacks
event.dns.request→dns.request: Only the name of the queried-name field changes; check which one the tenant populates.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.type, event.dns.request, src.process.name
// HUNT: DnsRequest for published C2 and PartisanDNS domains (including subdomains used for tunnelling) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1071.004, T1568.002, T1090 // CONF: high | FP: low // FALSE POSITIVES: none expected for these names // EQUIVALENCE: equivalent-with-schema-assumptions - Same domain-suffix pattern matched on the DNS lookup name and grouped by host and name with a count and first and last seen. The name is read from event.dns.request, the attested DNS field. // REQUIRES: SentinelOne EDR DNS telemetry (event type DNS Resolved) with event.dns.request populated; the host must resolve through a path the sensor sees // TUNING: None expected for these names; escalate every hit. // LOOKBACK: 7d (set with the console time picker) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The CQL also collects the process id behind each lookup; this card shows one process name per group instead. // VALIDATION LEVEL: static-reviewed event.type = 'DNS Resolved' event.dns.request matches '(^|\\.)(c0ce\\.org|p7cp\\.org|f91j\\.org|w3a01\\.net|gov[-]by\\.com|okkgb\\.com|c[-]oh\\.com|89e\\.org|parker[-]inc\\.com|vpnosljjk\\.pro|vfvnfaq\\.(top|link|cyou|pro|me|my|buzz|info|space|in|sbs|work|casa|lol|lat|net|org|com))$' | group lookups = count(), first_seen = min(event.time), last_seen = max(event.time), process_name = any(src.process.name) by endpoint.name, event.dns.request | sort -lookups | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Event actionAdditionalFields: DNS answer details
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields | take 5
// HUNT: DnsRequest for published C2 and PartisanDNS domains (including subdomains used for tunnelling) // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1071.004, T1568.002, T1090 // CONF: high | FP: low // FALSE POSITIVES: none expected for these names // EQUIVALENCE: equivalent-with-schema-assumptions - Same domain-suffix pattern matched on the DNS lookup name. Defender has no endpoint DNS table, so the name is read from the DnsQueryResponse action's additional fields. // REQUIRES: Defender for Endpoint DNS events recorded as DeviceEvents with ActionType DnsQueryResponse // TUNING: None expected for these names; escalate every hit. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The CQL also collects the process id behind each lookup; this card does not. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0 DeviceEvents | where Timestamp >= ago(7d) | where ActionType == "DnsQueryResponse" | extend QueriedName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"])) | where QueriedName matches regex @"(?i)(^|\.)(c0ce\.org|p7cp\.org|f91j\.org|w3a01\.net|gov[-]by\.com|okkgb\.com|c[-]oh\.com|89e\.org|parker[-]inc\.com|vpnosljjk\.pro|vfvnfaq\.(top|link|cyou|pro|me|my|buzz|info|space|in|sbs|work|casa|lol|lat|net|org|com))$" | summarize Lookups = count(), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName, QueriedName | sort by Lookups desc | take 200
Looks for: Solar lists three IPs without roles: two labelled Cloudflare and one labelled Amazon. Cloudflare addresses front many unrelated sites, so a connection alone proves nothing. This hunt keeps browsers out and returns the initiating process so an analyst can judge whether a backdoor, service or tunnel tool made the call. FP: any non-browser application that uses a Cloudflare-fronted service (updaters, collaboration clients, security agents) can connect to those two addresses; the Amazon-labelled address may be reassigned.
Known limitations and deployment notes
- PowerQuery: The addresses are shared hosting, so a hit is a pivot and not a verdict.
- PowerQuery assumes: IP Connect covers outbound connections from the endpoint.
- PowerQuery assumes: The browser exclusion matches the process name case-insensitively.
- KQL – Defender XDR: The addresses are shared hosting, so a hit is a pivot and not a verdict.
- KQL – Defender XDR: Failed or blocked connection attempts are not included.
- KQL – Defender XDR assumes: A completed outbound connection is recorded as ConnectionSuccess.
// HUNT: NetworkConnectIP4 to the published IPs from a non-browser process // MITRE: T1071.001, T1090 // CONF: low // FP: medium // COST: low // REQUIRES: NetworkConnectIP4 with RemoteAddressIP4 and ContextBaseFileName // FALSE POSITIVES: updaters and SaaS clients behind the same CDN addresses // TUNING: treat as a pivot, not a detection: escalate only when the initiating process is unsigned, sits in a VMware Tools or System32 masquerade path, or also appears in Q1 to Q5; expire the IP list after 30 days // LOOKBACK: 7d (set with the console time picker) #event_simpleName=NetworkConnectIP4 | in(field=RemoteAddressIP4, values=["172.67.210.25", "104.21.34.242", "199.59.243.228"]) | ContextBaseFileName!=/^(chrome|msedge|firefox|iexplore|brave)\.exe$/i | groupBy([aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=[count(as=Connections), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)], limit=500) | sort(Connections, order=desc, limit=200)
3 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.type: Event typedst.ip.address: Destination addresssrc.process.name: Connecting process
Recommended fields
dst.port.number: Destination port
Readiness test
event.type = 'IP Connect' dst.ip.address = * src.process.name = * | limit 5 | columns event.type, dst.ip.address, dst.port.number, src.process.name
// HUNT: NetworkConnectIP4 to the published IPs from a non-browser process
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071.001, T1090
// CONF: low | FP: medium
// FALSE POSITIVES: updaters and SaaS clients behind the same CDN addresses
// EQUIVALENCE: equivalent-with-schema-assumptions - Same three destination addresses, the same browser exclusion, and the same grouping by host, process, address and port. The connecting process is the acting process, src.process.*, on an IP Connect event.
// REQUIRES: SentinelOne EDR network telemetry (event type IP Connect) with dst.ip.address and src.process.name populated
// TUNING: Treat as a pivot, not a detection: escalate only when the initiating process is unsigned, sits in a VMware Tools or System32 masquerade path, or also appears in Q1 to Q5; expire the IP list after 30 days.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The addresses are shared hosting, so a hit is a pivot and not a verdict.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' dst.ip.address in ('172.67.210.25', '104.21.34.242', '199.59.243.228') !(src.process.name in:anycase ('chrome.exe', 'msedge.exe', 'firefox.exe', 'iexplore.exe', 'brave.exe'))
| group connections = count(), first_seen = min(event.time), last_seen = max(event.time) by endpoint.name, src.process.name, dst.ip.address, dst.port.number
| sort -connections
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeActionType: Connection actionRemoteIP: Remote addressInitiatingProcessFileName: Connecting process
Recommended fields
RemotePort: Remote port
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | where ActionType == "ConnectionSuccess" | project Timestamp, ActionType, RemoteIP, InitiatingProcessFileName | take 5
// HUNT: NetworkConnectIP4 to the published IPs from a non-browser process
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1071.001, T1090
// CONF: low | FP: medium
// FALSE POSITIVES: updaters and SaaS clients behind the same CDN addresses
// EQUIVALENCE: equivalent-with-schema-assumptions - Same three destination addresses, the same browser exclusion, and the same grouping by host, process, address and port. Successful connections stand in for the CQL's outbound connect events.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: Treat as a pivot, not a detection: escalate only when the initiating process is unsigned, sits in a VMware Tools or System32 masquerade path, or also appears in Q1 to Q5; expire the IP list after 30 days.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The addresses are shared hosting, so a hit is a pivot and not a verdict. Failed or blocked connection attempts are not included.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(7d)
| where ActionType == "ConnectionSuccess"
| where RemoteIP in ("172.67.210.25", "104.21.34.242", "199.59.243.228")
| where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "firefox.exe", "iexplore.exe", "brave.exe")
| summarize Connections = count(), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName, InitiatingProcessFileName, RemoteIP, RemotePort
| sort by Connections desc
| take 200Looks for: Vasilek builds https://api.telegram.org/bot<token>/<method> and calls getUpdates (60 second long poll), sendMessage, sendDocument and getFile. Telegram itself is a legitimate service, so this ships as a hunt only and never as an IOC prevent. The query resolves each lookup to its process and drops browsers and the desktop client, leaving servers and unusual binaries. Corporate proxy settings are inherited by the backdoor, so the host may query through the proxy rather than directly. FP: admin scripts and monitoring bots that alert through Telegram, the Telegram desktop updater, and chat integrations that use the Bot API.
Known limitations and deployment notes
- PowerQuery: A lookup made through a system resolver service may be attributed to that service rather than the real caller.
- PowerQuery assumes: On a DNS Resolved event the acting process is src.process.* and its parent is src.process.parent.*.
- PowerQuery assumes: event.dns.request holds the queried name; the vendor field documentation also names dns.request, so confirm which one your tenant populates.
- PowerQuery assumes: Process names match case-insensitively.
- KQL – Defender XDR: A lookup made through a system resolver service may be attributed to that service rather than the real caller.
- KQL – Defender XDR assumes: The queried name is in AdditionalFields under DnsQueryString or QueryName; the readiness test prints the field so you can see which key your tenant populates.
- KQL – Defender XDR assumes: The DnsQueryResponse action type is attested in Microsoft hunting-query repositories rather than on the Learn table page.
// HUNT: DnsRequest for api.telegram.org resolved to a non-browser, non-Telegram process // MITRE: T1102.002, T1041, T1071.001 // CONF: medium // FP: medium // COST: medium // REQUIRES: DnsRequest plus ProcessRollup2 or SyntheticProcessRollup2 joined on aid and process id; a long-running process started before the lookback window needs the Synthetic event; if a proxy resolves DNS for the host, run this against proxy logs instead // FALSE POSITIVES: admin bots, Telegram desktop updater, chat integrations // TUNING: allowlist the specific hashes of approved automation and keep the rest; servers and domain controllers should never need this lookup, so raise severity there // LOOKBACK: 7d (set with the console time picker) #event_simpleName=DnsRequest | DomainName=/^api\.telegram\.org$/i | rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal) | join(query={#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName!=/^(chrome|msedge|firefox|iexplore|brave|Telegram|Update)\.exe$/i}, field=[aid, TargetProcessId_decimal], include=[FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData]) | table([@timestamp, aid, ComputerName, DomainName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- DNS Resolved
Required fields
event.type: Event typeevent.dns.request: Queried namesrc.process.name: Querying process
Recommended fields
src.process.image.path: Querying process path
Optional fields
src.process.image.sha256: Hash
Fallbacks
event.dns.request→dns.request: Only the name of the queried-name field changes; check which one the tenant populates.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * src.process.name = * | limit 5 | columns event.type, event.dns.request, src.process.name
// HUNT: DnsRequest for api.telegram.org resolved to a non-browser, non-Telegram process
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1102.002, T1041, T1071.001
// CONF: medium | FP: medium
// FALSE POSITIVES: admin bots, Telegram desktop updater, chat integrations
// EQUIVALENCE: equivalent-with-schema-assumptions - Same lookup name and the same process exclusion. SentinelOne stamps the querying process on the DNS event itself, so the CQL's join back to the process-start event is not needed; the process is src.process.* on a DNS Resolved event.
// REQUIRES: SentinelOne EDR DNS telemetry (event type DNS Resolved) with the querying process populated; if a proxy resolves DNS for the host, run this against proxy logs instead
// TUNING: Allowlist the specific hashes of approved automation and keep the rest; servers and domain controllers should never need this lookup, so raise severity there.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A lookup made through a system resolver service may be attributed to that service rather than the real caller.
// VALIDATION LEVEL: static-reviewed
event.type = 'DNS Resolved' event.dns.request matches '^api\\.telegram\\.org$' !(src.process.name in:anycase ('chrome.exe', 'msedge.exe', 'firefox.exe', 'iexplore.exe', 'brave.exe', 'Telegram.exe', 'Update.exe'))
| columns event.time, endpoint.name, event.dns.request, src.process.name, src.process.image.path, src.process.cmdline, src.process.parent.name, src.process.image.sha256
| sort -event.time
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Event actionAdditionalFields: DNS answer detailsInitiatingProcessFileName: Querying process
Recommended fields
InitiatingProcessFolderPath: Querying process path
Optional fields
InitiatingProcessSHA256: Hash. SHA256 is often unpopulated; InitiatingProcessSHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields, InitiatingProcessFileName | take 5
// HUNT: DnsRequest for api.telegram.org resolved to a non-browser, non-Telegram process
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1102.002, T1041, T1071.001
// CONF: medium | FP: medium
// FALSE POSITIVES: admin bots, Telegram desktop updater, chat integrations
// EQUIVALENCE: equivalent-with-schema-assumptions - Same lookup name and the same process exclusion. The DNS action row already names the initiating process, so the CQL's join back to the process-start event is not needed.
// REQUIRES: Defender for Endpoint DNS events recorded as DeviceEvents with ActionType DnsQueryResponse
// TUNING: Allowlist the specific hashes of approved automation and keep the rest; servers and domain controllers should never need this lookup, so raise severity there.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A lookup made through a system resolver service may be attributed to that service rather than the real caller.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceEvents
| where Timestamp >= ago(7d)
| where ActionType == "DnsQueryResponse"
| extend QueriedName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"]))
| where QueriedName =~ "api.telegram.org"
| where InitiatingProcessFileName !in~ ("chrome.exe", "msedge.exe", "firefox.exe", "iexplore.exe", "brave.exe", "Telegram.exe", "Update.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, QueriedName, InitiatingProcessFileName, InitiatingProcessFolderPath, InitiatingProcessCommandLine, InitiatingProcessParentFileName, InitiatingProcessSHA256
| sort by Timestamp desc
| take 200Looks for: The loader starts vmtoolsd32.exe (GOST) every Saturday 22:00 to 23:00 and, once, 480 minutes after the service starts, launches rpctool32.exe (Vasilek) and a second GOST. Vasilek then runs operator commands through the Windows shell and removes itself with cmd /c del. Any process whose parent is one of these names is a strong lead, and the weekday and hour columns let you check the Saturday window. FP: a genuine signed authd.exe from a VMware product spawning its own helpers; confirm with Q2 (unsigned) and the parent path before escalating.
Known limitations and deployment notes
- PowerQuery: The CQL's weekday and hour-of-day columns are not derived here; read them from event.time.
- PowerQuery assumes: On a Process Creation event src.process.* is the creator of tgt.process.*.
- PowerQuery assumes: src.process.name carries no path, so the unsigned test lives on the Q2 card.
- PowerQuery assumes: Names match case-insensitively.
- KQL – Defender XDR: The initiating-process name carries no path, so the unsigned test lives on the Q2 card.
- KQL – Defender XDR assumes: Weekday is a number from 0 (Sunday) to 6 (Saturday), in UTC.
// HUNT: Process creation with parent authd.exe, vmtoolsd32.exe or rpctool32.exe, with weekday and hour in UTC // MITRE: T1059.003, T1090, T1070.004, T1548.004 // CONF: high // FP: medium // COST: low // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 with ParentBaseFileName; ParentBaseFileName carries no path, so pair with Q2 for the unsigned test // FALSE POSITIVES: genuine VMware authd.exe helpers // TUNING: if your estate legitimately runs a signed authd.exe, keep the vmtoolsd32 and rpctool32 parents (never genuine VMware names per Solar) and join Q2 to restrict authd.exe to unsigned copies // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(authd|vmtoolsd32|rpctool32)\.exe$/i | Weekday := formatTime("%a", field=@timestamp) | HourUtc := formatTime("%H", field=@timestamp) | table([@timestamp, Weekday, HourUtc, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc)
2 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typesrc.process.name: Creator process name
Recommended fields
tgt.process.name: Created process nametgt.process.cmdline: Created command line
Optional fields
tgt.process.image.sha256: Hash
Readiness test
event.type = 'Process Creation' src.process.name = * | limit 5 | columns event.type, src.process.name, tgt.process.name
// HUNT: Process creation with parent authd.exe, vmtoolsd32.exe or rpctool32.exe, with weekday and hour in UTC
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1059.003, T1090, T1070.004, T1548.004
// CONF: high | FP: medium
// FALSE POSITIVES: genuine VMware authd.exe helpers
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the creator is one of the three masquerade names. On a Process Creation event the creator is src.process.* and the new process is tgt.process.*, so the CQL's parent field maps to src.process.name.
// REQUIRES: SentinelOne EDR process-creation telemetry with the creator process name populated
// TUNING: If your estate legitimately runs a signed authd.exe, keep the vmtoolsd32.exe and rpctool32.exe creators (never genuine VMware names) and pair with Q2 to restrict authd.exe to unsigned copies.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The CQL's weekday and hour-of-day columns are not derived here; read them from event.time.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('authd.exe', 'vmtoolsd32.exe', 'rpctool32.exe')
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256
| sort -event.time
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Initiating process
Recommended fields
FileName: Created processProcessCommandLine: Created command line
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName | take 5
// HUNT: Process creation with parent authd.exe, vmtoolsd32.exe or rpctool32.exe, with weekday and hour in UTC
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1059.003, T1090, T1070.004, T1548.004
// CONF: high | FP: medium
// FALSE POSITIVES: genuine VMware authd.exe helpers
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the initiating process is one of the three masquerade names. The CQL's parent field is InitiatingProcessFileName. Weekday and hour are derived from Timestamp, which is UTC.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: If your estate legitimately runs a signed authd.exe, keep the vmtoolsd32.exe and rpctool32.exe creators (never genuine VMware names) and pair with Q2 to restrict authd.exe to unsigned copies.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The initiating-process name carries no path, so the unsigned test lives on the Q2 card.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName in~ ("authd.exe", "vmtoolsd32.exe", "rpctool32.exe")
| extend Weekday = toint(dayofweek(Timestamp) / 1d), HourUtc = hourofday(Timestamp)
| project Timestamp, Weekday, HourUtc, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: The earliest 2024 traces were antivirus records of cmd.exe redirecting output to \\127.0.0.1\ADMIN$\__<unix timestamp>.<microseconds>. Solar ties that file name pattern to Impacket wmiexec.py: the command runs through WMI and the output is read back over SMB. This is lateral movement tradecraft that is not specific to this actor, so a hit means remote execution, not necessarily this campaign.
Known limitations and deployment notes
- PowerQuery: A command line that reaches the share through a different spelling of the loopback address is not matched.
- PowerQuery assumes: The share path is matched with literal backslashes, as the sensor reports the command line.
- PowerQuery assumes: Matching is case-insensitive, which reproduces the CQL /i intent.
- KQL – Defender XDR: A command line that reaches the share through a different spelling of the loopback address is not matched.
- KQL – Defender XDR assumes: The share path is matched with literal backslashes, as the sensor reports the command line.
// HUNT: cmd.exe redirecting output to the loopback ADMIN$ share with an underscore-timestamp file name // MITRE: T1047, T1021.002 // CONF: high // FP: low // COST: low // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 with FileName and CommandLine // FALSE POSITIVES: none expected; some security assessment tools reproduce the same pattern, which is itself worth knowing // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^cmd\.exe$/i | CommandLine=/\\\\127\.0\.0\.1\\ADMIN\$\\__[0-9]+\.[0-9]+/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, CommandLine]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typetgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator process
Optional fields
src.process.user: Creator user
Readiness test
event.type = 'Process Creation' tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, tgt.process.name, tgt.process.cmdline
// HUNT: cmd.exe redirecting output to the loopback ADMIN$ share with an underscore-timestamp file name
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1047, T1021.002
// CONF: high | FP: low
// FALSE POSITIVES: none expected; some security assessment tools reproduce the same pattern, which is itself worth knowing
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: cmd.exe whose command line names the loopback ADMIN$ share and an underscore-prefixed numeric file name. The new process is tgt.process.*. The share path is matched with literal backslashes.
// REQUIRES: SentinelOne EDR process-creation telemetry with tgt.process.cmdline populated
// TUNING: None expected; some security assessment tools reproduce the same pattern, which is itself worth knowing.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A command line that reaches the share through a different spelling of the loopback address is not matched.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name in:anycase ('cmd.exe') tgt.process.cmdline matches '\\\\\\\\127\\.0\\.0\\.1\\\\ADMIN\\$\\\\__[0-9]+\\.[0-9]+'
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.cmdline
| sort -event.time
| limit 200Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Initiating process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine | take 5
// HUNT: cmd.exe redirecting output to the loopback ADMIN$ share with an underscore-timestamp file name // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1047, T1021.002 // CONF: high | FP: low // FALSE POSITIVES: none expected; some security assessment tools reproduce the same pattern, which is itself worth knowing // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: cmd.exe whose command line names the loopback ADMIN$ share and an underscore-prefixed numeric file name. The share path is matched with literal backslashes. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: None expected; some security assessment tools reproduce the same pattern, which is itself worth knowing. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A command line that reaches the share through a different spelling of the loopback address is not matched. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(7d) | where FileName =~ "cmd.exe" | where ProcessCommandLine matches regex @"(?i)\\\\127\.0\.0\.1\\ADMIN\$\\__[0-9]+\.[0-9]+" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, ProcessCommandLine | sort by Timestamp desc | take 200
Looks for: Solar found the registry key timestamps of the legitimate AppMgmt service out of order (the service key newer than its Parameters subkey), which suggests the actors overwrote the service parameters, ran a payload through the service and restored the original value. It names StealthyWMIExec and NimExec as public tools that start code this way. This query catches changes to the values that decide what the service runs. FP: Windows servicing and some management agents touch service keys; AppMgmt itself rarely changes outside updates.
Known limitations and deployment notes
- PowerQuery: A set-then-restore pair shows as two rows; pairing them by time is left to the analyst.
- PowerQuery assumes: registry.keyPath may or may not end in the value name on this tenant; the pattern accepts both.
- PowerQuery assumes: Key paths are matched with a literal backslash separator.
- PowerQuery assumes: Matching is case-insensitive, which reproduces the CQL /i intent.
- KQL – Defender XDR: A set-then-restore pair shows as two rows; pairing them by time is left to the analyst.
- KQL – Defender XDR assumes: RegistryKey holds the key path without the value name, as the table documents.
- KQL – Defender XDR assumes: Key paths are matched with a literal backslash separator.
// HUNT: Registry value changes on the AppMgmt service key (ServiceDll, ImagePath, ObjectName, Start) // MITRE: T1569.002, T1112, T1543.003 // CONF: medium // FP: medium // COST: low // REQUIRES: AsepValueUpdate or RegGenericValueUpdate with RegObjectName, RegValueName and RegStringValue; an immediate set-then-restore may produce two rows seconds apart, which is the signal // FALSE POSITIVES: Windows servicing, management agents // TUNING: allowlist the servicing parent processes you observe on real rows; escalate set-then-restore pairs under a minute apart and any ServiceDll or ImagePath value that is not the stock AppMgmt value // LOOKBACK: 7d (set with the console time picker) #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\Services\\AppMgmt(\\Parameters)?$/i | RegValueName=/^(ServiceDll|ImagePath|ObjectName|Start)$/i | table([@timestamp, aid, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue, ContextBaseFileName]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.type: Event typeregistry.keyPath: Registry key pathregistry.valueName: Registry value name
Recommended fields
src.process.name: Writer processregistry.value: Registry value data
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * registry.valueName = * | limit 5 | columns event.type, registry.keyPath, registry.valueName, registry.value
// HUNT: Registry value changes on the AppMgmt service key (ServiceDll, ImagePath, ObjectName, Start)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1569.002, T1112, T1543.003
// CONF: medium | FP: medium
// FALSE POSITIVES: Windows servicing, management agents
// EQUIVALENCE: equivalent-with-schema-assumptions - Same registry predicate: a change to ServiceDll, ImagePath, ObjectName or Start on the AppMgmt service key or its Parameters subkey. The writer is the acting process, src.process.*. The key pattern also accepts a path that ends in the value name.
// REQUIRES: SentinelOne EDR registry telemetry (event type Registry Value Modified) with registry.keyPath, registry.valueName and registry.value populated
// TUNING: Allowlist the servicing parent processes you observe on real rows; escalate set-then-restore pairs under a minute apart and any ServiceDll or ImagePath value that is not the stock AppMgmt value.
// LOOKBACK: 7d (set with the console time picker)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A set-then-restore pair shows as two rows; pairing them by time is left to the analyst.
// VALIDATION LEVEL: static-reviewed
event.type = 'Registry Value Modified' registry.keyPath matches '\\\\Services\\\\AppMgmt(\\\\Parameters)?(\\\\(ServiceDll|ImagePath|ObjectName|Start))?$' registry.valueName in:anycase ('ServiceDll', 'ImagePath', 'ObjectName', 'Start')
| columns event.time, endpoint.name, src.process.user, src.process.name, registry.keyPath, registry.valueName, registry.value
| sort -event.time
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: Event timeActionType: Registry actionRegistryKey: Registry keyRegistryValueName: Registry value name
Recommended fields
InitiatingProcessFileName: Writer processRegistryValueData: Registry value data
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | where ActionType == "RegistryValueSet" | project Timestamp, ActionType, RegistryKey, RegistryValueName | take 5
// HUNT: Registry value changes on the AppMgmt service key (ServiceDll, ImagePath, ObjectName, Start)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1569.002, T1112, T1543.003
// CONF: medium | FP: medium
// FALSE POSITIVES: Windows servicing, management agents
// EQUIVALENCE: equivalent-with-schema-assumptions - Same registry predicate: a RegistryValueSet of ServiceDll, ImagePath, ObjectName or Start on the AppMgmt service key or its Parameters subkey. The writer is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents)
// TUNING: Allowlist the servicing parent processes you observe on real rows; escalate set-then-restore pairs under a minute apart and any ServiceDll or ImagePath value that is not the stock AppMgmt value.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A set-then-restore pair shows as two rows; pairing them by time is left to the analyst.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceRegistryEvents
| where Timestamp >= ago(7d)
| where ActionType == "RegistryValueSet"
| where RegistryKey matches regex @"(?i)\\Services\\AppMgmt(\\Parameters)?$"
| where RegistryValueName in~ ("ServiceDll", "ImagePath", "ObjectName", "Start")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessAccountName, InitiatingProcessFileName, RegistryKey, RegistryValueName, RegistryValueData
| sort by Timestamp desc
| take 200Detection Rules by Platform
Three behaviors are specific enough to promote. Everything is action Detect: the file names involved are shared with genuine VMware software, Telegram and GOST are legitimate software, and the indicators have a single originating source.
CrowdStrike: Custom IOA
| IOA name | Promotes | Pattern | Exclusions | Deployment Path |
|---|---|---|---|---|
DETECT-VT-UnsignedMasqueradeExe | Promote Q2 | Process creation where the image is authd.exe, vmtoolsd32.exe or rpctool32.exe under a VMware Tools folder, or WsusService.exe under UpdateServicesPackages | Confirmed signed VMware binaries by hash; the IOA builder cannot test the signature, so pair it with the Q2 hunt and keep severity Medium until baselined | Custom IOA (process creation), Detect only |
DETECT-VT-LoaderChildLaunch | Promote Q8 | Process creation whose parent image is authd.exe, vmtoolsd32.exe or rpctool32.exe | Genuine signed authd.exe helpers if present in your estate | Custom IOA (process creation), severity High, Detect only |
DETECT-VT-AdminShareOutputRedirect | Promote Q9 | cmd.exe command line redirecting to loopback ADMIN$ with an underscore-timestamp file name | Authorized security assessment tools | Custom IOA (process creation), severity High, Detect only |
Do not promote Q1, Q3, Q5, Q6, Q7 or Q10 to IOAs yet. Q3 and Q10 fire on legitimate installers and servicing, Q6 on shared CDN addresses, and Q7 on any approved Telegram automation. Q1, Q4 and Q5 are indicator matches better served by IOC Management (Section 10). No IOA here uses a prevent action, and Telegram, GOST and genuine VMware binaries must never be blocked on name or path.
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| DETECT-VT-UnsignedMasqueradeExe | Q2, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| DETECT-VT-LoaderChildLaunch | Q8, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| DETECT-VT-AdminShareOutputRedirect | Q9, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Microsoft Defender: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| DETECT-VT-UnsignedMasqueradeExe | Q2, KQL – Defender XDR tab | Hunt only until the gap is closed | Q2 is only an approximation here. Same masquerade names and folders on process creation, but DeviceProcessEvents has no signature column for the created process, so the unsigned test becomes an empty company name in the version info. |
| DETECT-VT-LoaderChildLaunch | Q8, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| DETECT-VT-AdminShareOutputRedirect | Q9, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
Q1, Q3, Q4, Q5, Q6, Q7 and Q10 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.
Machine-Readable IOC Appendix
Grouped quick-copy blocks. Of the 43 importable atomic indicators (12 SHA256, 28 domains, 3 IPs), 41 are action=detect, 0 are prevent and 2 are no_action. Nothing is prevent or critical: the indicators come from one originating source (Solar 4RAYS; the other outlets reprint its appendix), the GOST and 3proxy samples are open-source tools, and the two Cloudflare addresses are shared CDN space. Name and path indicators are not importable and ship as hunt lists.
type,value,action,severity,expiration,description,tags sha256,cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13,detect,high,2027-04-25,PartisanDNS at msadcs32.dll (System32) (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1,detect,medium,2027-04-25,DNSCat2 packed with UPX at tpvmmon.dll and omega.dll (System32) (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7,detect,medium,2027-04-25,DNSCat2 packed with UPX at aweman32.dll (System32) (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3,detect,high,2027-04-25,PartisanDNS at msadcs32.dll and msadcs32.bak (System32) (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869,detect,medium,2027-04-25,DNSCat2 packed with UPX at uplay_r164.dll (System32) (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2,detect,high,2027-04-25,custom loader-scheduler (service vmauad) at VMware Tools\authd.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766,detect,medium,2027-04-25,3proxy at VMware Tools\rpctool32.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c,detect,high,2027-04-25,Vasilek backdoor at VMware Tools\rpctool32.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,d7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b,detect,medium,2027-04-25,GOST tunnel at VMware Tools\vmtoolsd32.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513,detect,high,2027-04-25,PartisanDNS at C:\Windows\fstab.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742,detect,medium,2027-04-25,GOST tunnel (deleted before analysis) at E:\WSUS\UpdateServicesPackages\WsusService.exe (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy sha256,125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc,detect,high,2027-04-25,substituted library that loads PartisanDNS per Solar appendix at VMware Tools\vmtools.dll (single source Solar 4RAYS),campaign:Vasilek-PartisanZmiy domain,c0ce.org,detect,high,2027-01-25,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,campaign:Vasilek-PartisanZmiy domain,p7cp.org,detect,high,2027-01-25,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,campaign:Vasilek-PartisanZmiy domain,f91j.org,detect,high,2027-01-25,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,campaign:Vasilek-PartisanZmiy domain,w3a01.net,detect,high,2027-01-25,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,campaign:Vasilek-PartisanZmiy domain,gov-by.com,detect,high,2027-01-25,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,campaign:Vasilek-PartisanZmiy domain,okkgb.com,detect,medium,2027-01-25,network indicator listed by Solar 4RAYS with no role stated,campaign:Vasilek-PartisanZmiy domain,c-oh.com,detect,medium,2027-01-25,network indicator listed by Solar 4RAYS with no role stated,campaign:Vasilek-PartisanZmiy domain,89e.org,detect,medium,2027-01-25,network indicator listed by Solar 4RAYS with no role stated,campaign:Vasilek-PartisanZmiy domain,parker-inc.com,detect,medium,2027-01-25,network indicator listed by Solar 4RAYS with no role stated,campaign:Vasilek-PartisanZmiy domain,vpnosljjk.pro,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.top,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.link,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.cyou,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.pro,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.me,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.my,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.buzz,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.info,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.space,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.in,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.sbs,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.work,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.casa,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.lol,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.lat,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.net,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.org,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy domain,vfvnfaq.com,detect,medium,2027-01-25,PartisanDNS generated domain published by Solar 4RAYS,campaign:Vasilek-PartisanZmiy ipv4,172.67.210.25,no_action,low,2026-11-25,Cloudflare-labelled address from Solar 4RAYS (shared CDN so track only),campaign:Vasilek-PartisanZmiy ipv4,104.21.34.242,no_action,low,2026-11-25,Cloudflare-labelled address from Solar 4RAYS (shared CDN so track only),campaign:Vasilek-PartisanZmiy ipv4,199.59.243.228,detect,low,2026-11-25,Amazon-labelled address from Solar 4RAYS with no role stated,campaign:Vasilek-PartisanZmiy sha256,REPLACE_WITH_SHA256_FOR_WSUSSCAN_EXE,no_action,low,2026-11-25,unknown file C:\Update\169\WSUSSCAN.exe only a SHA1 is published so no importable hash,campaign:Vasilek-PartisanZmiy
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert FileSha256,cc8c707bf49c0cdb79b806d41df6254efc0e9f566a02d223871550f414469d13,Audit,PartisanDNS at msadcs32.dll,PartisanDNS at msadcs32.dll (System32) (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,e5c6b6d37ff168def37dfd86c636e512be3ed7ead9a2dc93d5c741c42b47c1f1,Audit,DNSCat2 packed with UPX at tpvmmon.dll and omega.dll,DNSCat2 packed with UPX at tpvmmon.dll and omega.dll (System32) (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,07381d79670129277211a4373e5518799a54b427946602539463ec2dd9cdb5e7,Audit,DNSCat2 packed with UPX at aweman32.dll,DNSCat2 packed with UPX at aweman32.dll (System32) (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,4f0e23a83d83d901c76353d8b9b6ee2940eb63d531ad15f736193903b5c7c8c3,Audit,PartisanDNS at msadcs32.dll and msadcs32.bak,PartisanDNS at msadcs32.dll and msadcs32.bak (System32) (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,8c37c4b1f168219a1ce495c9822730981b20ff03d937ddcd8795fca14a9b7869,Audit,DNSCat2 packed with UPX at uplay_r164.dll,DNSCat2 packed with UPX at uplay_r164.dll (System32) (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,5bc4fa9916c0883d45cb85639e328ed484dc75f4dfda294eb52f4b8b612889f2,Audit,custom loader-scheduler,custom loader-scheduler (service vmauad) at VMware Tools\authd.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,c499fab59acbb1750e1e0e5a3c51d119ccd6374e5f0b45639f29598720222766,Audit,3proxy at VMware Tools\rpctool32.exe,3proxy at VMware Tools\rpctool32.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,87e713f9b6ae14d97d3fa4d1a882c029e7e963d844d9c93ea383cab3d46a949c,Audit,Vasilek backdoor at VMware Tools\rpctool32.exe,Vasilek backdoor at VMware Tools\rpctool32.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,d7aedc020ce832334abf0d03986da31f41cb2191355f25b17989dcfa8bb2775b,Audit,GOST tunnel at VMware Tools\vmtoolsd32.exe,GOST tunnel at VMware Tools\vmtoolsd32.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,e55431d6f15aa78ada3f60ed30a3f32b444b952bdc53a652546c1820f8bfa513,Audit,PartisanDNS at C:\Windows\fstab.exe,PartisanDNS at C:\Windows\fstab.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,5076286c26f2a5c7dd7f507365fe404db2b05d39b350c463faa053baa37b3742,Audit,GOST tunnel,GOST tunnel (deleted before analysis) at E:\WSUS\UpdateServicesPackages\WsusService.exe (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,125ead2c3b1d0f7aee03d13b927744ec8dc1d046912ce73efc9c5a10243b99dc,Audit,substituted library that loads PartisanDNS per Solar appendi,substituted library that loads PartisanDNS per Solar appendix at VMware Tools\vmtools.dll (single source Solar 4RAYS),2027-04-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,c0ce.org,Audit,C2 or reused infrastructure named by Solar 4RAYS for the inc,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,2027-01-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,p7cp.org,Audit,C2 or reused infrastructure named by Solar 4RAYS for the inc,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,2027-01-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,f91j.org,Audit,C2 or reused infrastructure named by Solar 4RAYS for the inc,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,2027-01-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,w3a01.net,Audit,C2 or reused infrastructure named by Solar 4RAYS for the inc,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,2027-01-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,gov-by.com,Audit,C2 or reused infrastructure named by Solar 4RAYS for the inc,C2 or reused infrastructure named by Solar 4RAYS for the incident DNSCat2 tunnels,2027-01-25T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,okkgb.com,Audit,network indicator listed by Solar 4RAYS with no role stated,network indicator listed by Solar 4RAYS with no role stated,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,c-oh.com,Audit,network indicator listed by Solar 4RAYS with no role stated,network indicator listed by Solar 4RAYS with no role stated,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,89e.org,Audit,network indicator listed by Solar 4RAYS with no role stated,network indicator listed by Solar 4RAYS with no role stated,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,parker-inc.com,Audit,network indicator listed by Solar 4RAYS with no role stated,network indicator listed by Solar 4RAYS with no role stated,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vpnosljjk.pro,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.top,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.link,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.cyou,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.pro,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.me,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.my,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.buzz,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.info,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.space,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.in,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.sbs,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.work,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.casa,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.lol,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.lat,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.net,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.org,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True DomainName,vfvnfaq.com,Audit,PartisanDNS generated domain published by Solar 4RAYS,PartisanDNS generated domain published by Solar 4RAYS,2027-01-25T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True IpAddress,199.59.243.228,Audit,Amazon-labelled address from Solar 4RAYS with no role stated,Amazon-labelled address from Solar 4RAYS with no role stated,2026-11-25T00:00:00.0Z,Low,Investigate the device and pivot into the pack's queries,,,,True
Column names and allowed values are from Microsoft's documented parameter table. Left out because they are context rows, not detections: no_action 3. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
services: vmauad | tpvmmon | aweman32 | msadcs32 | uplay_r164 display: VMware Auth Adapter | Windows Insiders Service | Windows Channels Service | Sybase Inc. Product File | Access FT Imager Service loader: C:\Program Files\VMware\VMware Tools\authd.exe (unsigned) modes: (none) | run <command> | test tools: VMware Tools\vmtoolsd32.exe (GOST) | VMware Tools\rpctool32.exe (Vasilek or 3proxy) | E:\WSUS\UpdateServicesPackages\WsusService.exe (GOST) dll swap: VMware Tools\vmtools.dll unsigned, original kept as vmtoolsd.dll schedule: Saturday 22:00-23:00 (GOST); service start +480 minutes once (Vasilek and GOST) selfupdate:new.bak | old-<timestamp>.bak ; selfdelete: cmd /c del "<path>" > nul wmiexec: cmd.exe ... \\127.0.0.1\ADMIN$\__<unixts>.<us> and C:\Windows\__<unixts>.<us> registry: HKLM\SYSTEM\CurrentControlSet\Services\AppMgmt (Parameters) set then restored c2: api.telegram.org bot API: getUpdates (60 s long poll) sendMessage sendDocument getFile getChat deleteMessage answerCallbackQuery vasilek: 59 commands incl. move_cursor (new vs 1.5.4); report template starts "Version: [" and "Hostname: ["
Vasilek 32-bit backdoor, internal version 1.5.8, Telegram Bot API C2, OLLVM obfuscated, host-name SHA-256 keyed (loader) authd.exe loader-scheduler, service vmauad, three-mode CLI, cron-style schedule, undescribed before this report PartisanDNS DNS tunnel tool with generated domains (msadcs32.dll, fstab.exe, swapped vmtools.dll per appendix) DNSCat2 open-source DNS tunnel, UPX packed (tpvmmon.dll, aweman32.dll, uplay_r164.dll) GOST open-source tunnel (vmtoolsd32.exe, WsusService.exe) config gost.yml 3proxy open-source proxy (rpctool32.exe, earlier sample) Impacket wmiexec.py output pattern (dual-use, not specific to this actor) Background only, NOT in this pack: other tools of the same group named in the sources (wiper, log clearer, VPN decoy installer)
# 1) Unsigned or non-VMware-signed files in the VMware Tools folder
Get-ChildItem 'C:\Program Files\VMware\VMware Tools' -Include *.exe,*.dll,*.bak -Recurse -ErrorAction SilentlyContinue |
ForEach-Object { $s = Get-AuthenticodeSignature $_.FullName; [pscustomobject]@{File=$_.FullName; Status=$s.Status; Signer=$s.SignerCertificate.Subject; Modified=$_.LastWriteTime} }
# 2) Services with the published names
Get-CimInstance Win32_Service | Where-Object { $_.Name -match '^(vmauad|tpvmmon|aweman32|msadcs32|uplay_r164)$' } | Select-Object Name, DisplayName, PathName, State
# 3) Is VMware Tools installed on a host that is not a VMware guest?
(Get-CimInstance Win32_ComputerSystem).Model; Get-Service vmtoolsd -ErrorAction SilentlyContinue
The WSUSSCAN.exe row is a labelled placeholder: Solar publishes only a SHA1 for the unknown WSUSSCAN.exe (c4e623ab0a15db0896bf8a68eb9b45ebe6ae2f28), and Falcon IOC Management takes MD5 and SHA256, so there is nothing honest to import. Search it by that SHA1 in a file inventory instead. The four earlier-known domains Solar lists for comparison are deliberately omitted.
Detection Validation Gates
| Gate | Q1 services | Q2 unsigned exe | Q3 file writes | Q4 hashes | Q5 DNS | Q6 IPs | Q7 Telegram | Q8 children | Q9 ADMIN$ | Q10 AppMgmt |
|---|---|---|---|---|---|---|---|---|---|---|
| Telemetry ready | Pending service created (CrowdStrike: CreateService. SentinelOne: confirm in tenant. Defender: confirm action) | Pending process creation with signature field; confirm authenticode is populated for signed VMware binaries | Pending file written with writer process (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Ready process creation and file written with hashes | Pending DNS lookup (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse) | Ready outbound connection (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Pending DNS lookup plus process join; use proxy logs if resolvers hide the host | Ready process creation with parent | Ready process creation with command line | Pending registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) |
| Benign baseline | List all service display names once; expect none of the five | Hash the genuine VMware Tools set per version and record signer | Capture one VMware Tools upgrade cycle and the deployment agent writer | Run 30 days; expect none | Run 30 days; expect none | Baseline Cloudflare-using updaters per host group | Inventory approved Telegram automation by hash | Check whether any signed authd.exe exists on your estate | Run 30 days; note security tooling | Capture one Windows servicing cycle |
| Positive-control test | Not yet run. In a lab, create a service named like a published one that points at a harmless executable, then delete it | Not yet run. Copy a harmless unsigned test binary as authd.exe into a lab VMware Tools folder and run it | Not yet run. Write a harmless PE named rpctool32.exe into a lab VMware Tools folder from a script | Not yet run. Substitute the hash of a harmless lab file for one value, test, then restore | Not yet run. Resolve one published domain from a lab host (a lookup only) | Not yet run. Connect to a listed address from a lab host with a non-browser tool | Not yet run. Resolve api.telegram.org from a lab test binary | Not yet run. Launch cmd.exe from a renamed lab binary called vmtoolsd32.exe | Not yet run. Run a lab cmd.exe line that redirects to the loopback admin share file pattern | Not yet run. Set and restore a harmless value on a lab copy of a service key |
| Promotion | IOC and hunt | IOA candidate (Section 9) | Hunt only | IOC detect (Section 10) | IOC detect (Section 10) | Hunt only | Hunt only | IOA candidate (Section 9) | IOA candidate (Section 9) | Hunt only |
Run every positive control in an isolated lab, never on production, with benign files only. Never run real malware or tunnel tools to test a query. For Q2, Q3 and Q8 the test must include a signed genuine file to prove the exclusion works.
Hardening: Tiered
The threat lands on Windows servers, workstations and domain controllers, on the VMware Tools install path, on DNS and web egress, and on inter-organization trusts. Each control cites a MITRE mitigation (the why) and a benchmark or vendor source (the what). Controls marked best-practice have no formal benchmark. Playbook numbers refer to Section 13.
1. Baseline signatures in trusted-software folders. M1047 Audit; Solar recommendation [1]; CIS Control 2.3 Address Unauthorized Software. Check every executable and DLL under the VMware Tools folder (and other vendor folders on servers) for a valid vendor signature. Playbook 1. Verify: the script returns no unsigned file on a clean host.
2. Remove unused virtualization software. M1042 Disable or Remove Feature or Program; CIS Control 2.3. Solar's actors chose VMware Tools because it was installed long ago and unused, a blind spot [1]. Remove it where the host is not a VMware guest. Playbook 2. Verify: no vmtoolsd service on physical hosts.
3. Capture service installs. M1047 Audit; Microsoft Windows security baseline, Advanced Audit Policy, Security System Extension. The System log 7045 records survived in this case [1]; forward them and 4697 centrally. Playbook 3. Verify: auditpol /get shows success logging.
4. Alert on Telegram Bot API from servers. M1037 Filter Network Traffic. best-practice, no formal benchmark Add a proxy or resolver alert, not a block, for api.telegram.org from domain controllers and servers; move to a block only for host groups with no business need after 14 days of alert data. This is a network control and does not change the IOC actions (Section 10). Verify: resolver or proxy test lookup from a lab server alerts.
5. Application control on the VMware Tools folder. M1038 Execution Prevention; Microsoft application control guidance (WDAC or AppLocker). Allow only VMware-signed publisher rules in that folder, in audit mode first. Playbook 4. Verify: audit events (AppLocker EXE and DLL log) show would-block for an unsigned test file.
6. Restrict remote-execution paths between workstations. M1030 Network Segmentation, M1035 Limit Access to Resource Over Network; CIS Windows Firewall benchmark settings. Block inbound SMB and RPC to workstations from other workstation ranges so wmiexec-style execution and ADMIN$ output retrieval need a jump host [1]. Playbook 5. Verify: Get-NetFirewallRule readback and a failed lab connection from a peer workstation.
7. Force DNS through internal resolvers. M1037 Filter Network Traffic. best-practice, no formal benchmark Block outbound 53 and 853 from endpoints to anything except your resolvers and log lookups, so DNSCat2 and PartisanDNS traffic is visible and a direct tunnel is refused [1]. Verify: lab host cannot resolve through an external server.
8. Tiered administration and domain-controller protection. M1026 Privileged Account Management, M1032 Multi-factor Authentication; Microsoft enterprise access model. Solar reports the actors reached domain controllers and central management systems [1][4]; keep tier-0 credentials off every other tier and require MFA for administrative access.
9. Harden inter-organization trusts. M1030 Network Segmentation, M1018 User Account Management; Microsoft guidance on selective authentication for AD trusts. The prize in this intrusion was two-way trust with subsidiary medical institutions [1]. Use selective authentication, scope the allowed servers, and agree a shared incident contact with each partner.
10. File integrity monitoring and fleet software inventory. M1047 Audit. Monitor the VMware Tools and WSUS package folders for new executables and keep an inventory that flags installed-but-unused software; Solar's closing advice is that detections must be triaged, not only deployed [1].
Deployable Playbooks
Playbook 1: Signature and service audit of VMware Tools (read-only)
Prerequisites: Windows PowerShell 5.1 or later, local administrator, run from your management host over remoting or locally; M1047, Solar recommendation
Reboot required: No
Rollback: none required, this playbook only reads state
# Step 1: signature status of every binary in the VMware Tools folder
$root = 'C:\Program Files\VMware\VMware Tools'
Get-ChildItem $root -Include *.exe,*.dll,*.bak -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
$s = Get-AuthenticodeSignature $_.FullName
[pscustomobject]@{ File=$_.FullName; Status=$s.Status; Signer=$s.SignerCertificate.Subject; Sha256=(Get-FileHash $_.FullName).Hash; Modified=$_.LastWriteTime }
} | Export-Csv "$env:TEMP\vmtools-audit.csv" -NoTypeInformation
# Step 2: services that point at the folder or at the published System32 DLL names
Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'VMware Tools\\authd|tpvmmon|aweman32|msadcs32|uplay_r164' } |
Select-Object Name, DisplayName, PathName, State
# Verify: expect no row with Status other than Valid and no service named in Step 2 on a clean host
Playbook 2: Find and remove unused VMware Tools on non-VMware hosts
Prerequisites: Playbook 1 clean; change ticket; the host is not a VMware guest (model check below); M1042, CIS Control 2.3
Reboot required: Possibly (installer may request one); schedule in a maintenance window
Rollback: reinstall the same VMware Tools package from your software repository; the uninstall command below is the only state change
# Step 1: identify non-VMware hosts that carry VMware Tools (read-only)
$model = (Get-CimInstance Win32_ComputerSystem).Model
$app = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*' -ErrorAction SilentlyContinue |
Where-Object { $_.DisplayName -like 'VMware Tools*' } | Select-Object DisplayName, DisplayVersion, PSChildName
"Model: $model"; $app
# Step 2: only if Model does not contain VMware and the install is unused, uninstall (PSChildName is the product code)
# Start-Process msiexec.exe -ArgumentList "/x $($app.PSChildName) /qn /norestart" -Wait
# Verify
Get-Service vmtoolsd -ErrorAction SilentlyContinue; Test-Path 'C:\Program Files\VMware\VMware Tools'
# Preserve any unexpected files for forensics BEFORE uninstalling; do not delete evidence on a suspected host
Playbook 3: Audit service installs (Security 4697) and confirm System 7045
Prerequisites: Local administrator or GPO; Windows 10, 11 or Server 2016 and later; M1047, Microsoft security baseline (Advanced Audit Policy)
Reboot required: No
Rollback: restore the saved audit policy with the command in the last block
# Step 1: back up the current audit policy
auditpol /backup /file:C:\Windows\Temp\auditpol-backup.csv
# Step 2: enable success logging for service installs (event 4697)
auditpol /set /subcategory:"Security System Extension" /success:enable
# Step 3: verify
auditpol /get /subcategory:"Security System Extension"
Get-WinEvent -FilterHashtable @{LogName='System'; Id=7045} -MaxEvents 5 | Select-Object TimeCreated, Message
# Rollback
# auditpol /restore /file:C:\Windows\Temp\auditpol-backup.csv
Playbook 4: AppLocker audit-only publisher rule for the VMware Tools folder
Prerequisites: Playbook 1 shows ONLY valid VMware-signed files on a reference host (a rule built from a compromised host would trust the loader); Application Identity service available; piloted on a ring; M1038
Reboot required: No
Rollback: re-apply the exported backup policy (last block); audit-only mode blocks nothing in the meantime
# Step 1: back up the effective local policy
Get-AppLockerPolicy -Local -Xml | Out-File C:\Windows\Temp\applocker-backup.xml -Encoding utf8
# Step 2: build a publisher rule from the verified reference folder
Get-AppLockerFileInformation -Directory 'C:\Program Files\VMware\VMware Tools' -Recurse -FileType Exe,Dll |
New-AppLockerPolicy -RuleType Publisher -User Everyone -Optimize -Xml | Out-File C:\Windows\Temp\vmtools-rule.xml -Encoding utf8
# Step 3: force AUDIT ONLY on the generated collections, then merge
[xml]$x = Get-Content C:\Windows\Temp\vmtools-rule.xml
$x.AppLockerPolicy.RuleCollection | ForEach-Object { $_.SetAttribute('EnforcementMode','AuditOnly') }
$x.Save('C:\Windows\Temp\vmtools-rule-audit.xml')
Set-AppLockerPolicy -XmlPolicy C:\Windows\Temp\vmtools-rule-audit.xml -Merge
Start-Service AppIDSvc
# Verify: unsigned test file in that folder logs would-block in Microsoft-Windows-AppLocker/EXE and DLL
# Rollback
# Set-AppLockerPolicy -XmlPolicy C:\Windows\Temp\applocker-backup.xml
Playbook 5: Block workstation-to-workstation SMB and RPC (apply through GPO to the workstation OU only)
Prerequisites: Inventory of legitimate SMB and RPC flows between workstations; jump hosts defined; pilot ring; M1030, M1035; the REPLACE_WITH_ placeholders must be filled with your workstation address ranges
Reboot required: No
Rollback: remove the two rules with the Remove-NetFirewallRule line at the end; export the existing firewall policy first
# Step 1: export the current firewall policy netsh advfirewall export "C:\Windows\Temp\firewall-backup.wfw" # Step 2: block inbound SMB and RPC endpoint mapper from peer workstation ranges $peers = 'REPLACE_WITH_WORKSTATION_SUBNET_1','REPLACE_WITH_WORKSTATION_SUBNET_2' New-NetFirewallRule -DisplayName 'HP-Block-Peer-SMB' -Direction Inbound -Protocol TCP -LocalPort 445 -RemoteAddress $peers -Action Block -Profile Domain New-NetFirewallRule -DisplayName 'HP-Block-Peer-RPC' -Direction Inbound -Protocol TCP -LocalPort 135 -RemoteAddress $peers -Action Block -Profile Domain # Verify Get-NetFirewallRule -DisplayName 'HP-Block-Peer-*' | Get-NetFirewallPortFilter # Rollback # Remove-NetFirewallRule -DisplayName 'HP-Block-Peer-SMB','HP-Block-Peer-RPC' # Do not apply to file servers, print servers or jump hosts: block rules override allow rules
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-isolate hosts with a hit on Q1, Q2, Q4 or Q8 using your EDR containment. Do NOT reboot before collecting memory: Solar recovered Vasilek exchanges from the memory of legitimate processes that code was injected into from vmtools.dll [1]. Preserve the VMware Tools folder, the System32 DLLs, the service keys and event logs first. Remember the schedule: tunnels start on Saturdays 22:00 to 23:00 and Vasilek starts 480 minutes after the service starts, so a quiet host is not clean. | IR | Memory image, folder copy, service export, System and Security logs |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation). Keep the host powered on for memory capture on all of them. | IR | Memory image, folder copy, service export, System and Security logs |
| Eradicate | After preservation: disable the vmauad service and any of the five named services, remove the unsigned files, and restore the genuine vmtools.dll only from the vendor package after verifying its signature (do not trust the retained vmtoolsd.dll without a signature check). Hunt for the other tools on the same host: GOST (gost.yml), 3proxy, DNSCat2 and PartisanDNS services in System32, and the AppMgmt service parameters. | IR | File hashes, signature output, service list before and after |
| Scope | Run Q1 to Q10 for the full retention window and Section 7 natively. Assume multi-tool intrusion: search DNS for tunnels and generated domains, search servers for api.telegram.org, and review every domain controller and management server. Check delayed or scheduled destructive payloads, since the group is known for wipers [1]. | IR and threat hunting | Per-host findings table, DNS and proxy extracts |
| Recover | Reset credentials broadly where domain controllers or management servers were touched (all privileged accounts, service accounts, and the directory service account that protects Kerberos tickets, twice, per your directory team's procedure). Rebuild affected servers from known-good images rather than cleaning in place where feasible. Notify subsidiary and partner organizations on both sides of each trust and review the trust relationships. | Identity and infrastructure | Reset log, rebuild tickets, partner notification record |
| Prevent recurrence | Hardening 1 to 10 in Section 12 and Playbooks 1 to 5; keep Q1, Q2 and Q8 scheduled, and review every antivirus verdict for Vasilek or GOST rather than closing it (Solar saw them flagged long before the investigation) [1]. | Security engineering | Control verification output |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | SentinelOne | Defender XDR |
|---|---|---|---|---|---|---|
| T1543.003 | Five masquerading services created | Q1, Q2 | n/a | Good (needs CreateService fields validated) | Partial: Q1 approximate | Partial: Q1 approximate, Q2 approximate |
| T1036.004, T1036.005 | VMware and WSUS lookalike names and display names | Q1, Q2, Q3 | Q2 | Partial (name-based; relies on unsigned test) | Partial: Q1 approximate, Q3 approximate | Partial: Q1 approximate, Q2 approximate, Q3 approximate |
| T1574.004 (Solar ID) | vmtools.dll swapped, original retained | Q3, Q4 | n/a | Partial (file write only; module load of the DLL is a gap) | Partial: Q3 approximate | Partial: Q3 approximate, Q4 telemetry gap |
| T1090 | GOST and 3proxy tunnels, weekly window | Q2, Q4, Q8 | Q8 | Partial (tunnel traffic itself is outside endpoint telemetry) | Partial: same limit as CrowdStrike | Partial: Q2 approximate, Q4 telemetry gap |
| T1059.003, T1070.004 | Vasilek shell commands and self-delete | Q8 | Q8 | Good for children of the masquerade parents | Good, with assumptions | Good, with assumptions |
| T1102.002, T1041 | Telegram Bot API C2 and exfiltration | Q7 | n/a | Partial (proxy-resolved DNS hides the host; legitimate Telegram use collides) | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1071.004, T1568.002 | DNSCat2 and PartisanDNS tunnels, generated domains | Q5 | n/a | Partial (published domains only; algorithm unknown; analytics are outside endpoint telemetry) | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1071.001 | Published IPs | Q6 | n/a | Partial (shared CDN addresses) | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1047, T1021.002 | wmiexec-style remote execution with ADMIN$ output | Q9 | Q9 | Good | Good, with assumptions | Good, with assumptions |
| T1569.002, T1112 | AppMgmt service parameter swap | Q10 | n/a | Partial (a fast set-and-restore may be missed) | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1021.001 | Legitimate RDP used for movement | none | n/a | GAP (unscoped, needs logon baselining; Section 7) | GAP | GAP |
| T1548.004 | runas elevation via cadmin and force_cadmin | Q8 (child lineage only) | n/a | GAP (the policy read and relaunch are not distinguishable) | GAP: same limit as CrowdStrike | GAP: same limit as CrowdStrike |
| T1480.001, T1497.001 | Host-name keyed payloads, sandbox checks | none | n/a | GAP (evasion by design; explains silent sandboxes) | GAP | GAP |
| T1070.006 | Timestomping to 2020 VMware dates | none | n/a | GAP (no timestamp telemetry; use the Section 7 timeline check) | GAP | GAP |
| T1113, T1056.001, T1010, T1082, T1016 | Screenshots, keylogging, window tracking, discovery inside Vasilek | none | n/a | GAP (no mappable endpoint events) | GAP | GAP |
| T1573.002 | Embedded TLS stack ClientHello | none | n/a | GAP (outside endpoint telemetry; JA3 or JA4 on network sensors) | GAP | GAP |
Honest gaps. No query sees the module load of the swapped vmtools.dll, Vasilek's own capabilities, the host-name keying or timestomping. A zero result from Q2, Q3 or Q8 is meaningful only if the authenticode field is populated and the sensor ran on that host during the window. The hash and domain queries (Q4, Q5) miss anything the actors rotated since Solar's snapshot. Validation gates are in Section 11; none has been run yet, and every positive control is marked Not yet run.
Hunt Summary Ticket
TITLE: Hunt for Vasilek backdoor and loader hidden in VMware Tools (Partisan Zmiy / Cyber Partisans)
SEVERITY: High (about two years of dwell, domain controller access reported; destructive payloads possible)
SCOPE: Windows servers, workstations and domain controllers, especially hosts with VMware Tools installed or unused
HYPOTHESIS: A service named vmauad (or four System32 DLL services) runs an unsigned authd.exe from the VMware Tools folder,
which schedules GOST (Saturday 22:00-23:00) and Vasilek (480 minutes after service start); Vasilek talks to a
Telegram group through the Bot API while DNS tunnels and proxy chains give fallback access.
QUERIES: Q1-Q10 (Section 8); native log, signature and timeline hunts (Section 7)
DO FIRST: 1) Run Q1, Q2 and Q8 across all Windows hosts and domain controllers.
2) Run the Playbook 1 signature sweep on hosts with VMware Tools.
3) Import the Section 10 CSV (detect only) and run Q4, Q5.
FINDINGS: [fill in after execution]
GAPS: Module load of the swapped DLL, screenshots and keylogging, host-name keying and timestomping have no endpoint
telemetry mapping; DNS tunnel analytics and TLS fingerprints are outside endpoint telemetry.
ACTIONS: Promote Q2, Q8, Q9 to Custom IOA (detect only) after the Section 11 gates pass. Deploy Playbooks 1-5 on a pilot ring.
No prevent actions: single-source indicators and legitimate-software collisions.
OWNER: HuntPack
VERSION: v0.1 -- 2026-10-25
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | Solar 4RAYS: Partisan Zmiy: снова на радаре | Intrusion facts, loader behavior and schedule, Vasilek commands, MITRE matrix, all indicators | 2026-10-25 |
| 2 | The Hacker News: Hackers Hid Vasilek Backdoor in VMware Tools During 2-Year Russian Healthcare Intrusion | Corroboration, move_cursor, background on other tools | 2026-10-25 |
| 2 | Cyber Security News: Hackers Hide Vasilek Backdoor Inside VMware Tools to Target Medical Organizations | Appendix reprint, vmtools.dll discrepancy, unknown entry vector | 2026-10-25 |
| 2 | Cyberpress: Partisan Zmiy Hackers Use Telegram-Controlled Vasilek Backdoor to Spy on Healthcare Networks | Corroboration of incident background | 2026-10-25 |
| 1 | Kaspersky ICS CERT: TTPs of Cyber Partisans activity aimed at espionage and disruption | Background on Vasilek first description (no indicators used) | 2026-10-25 |
| 3 | MITRE ATT&CK mitigations M1026, M1030, M1032, M1035, M1037, M1038, M1042, M1047, M1018 | Hardening citations (mitigation IDs from the threat-hardening reference, not fetched in this run) | not fetched |
The first five sources are saved verbatim to Vasilek-PartisanZmiy-VMwareTools-Hunt-sources/ as 01 to 05 for provenance re-verification. The Solar page is in Russian; the English quotations and summaries in this pack are the analyst's translation. A sixth outlet (SC Media) could not be retrieved and is not cited. Indicators are perishable: re-verify against the Solar report before acting.