MythicRatatoskr: Yggdrasil-Hidden Backdoor and the Sandworm SDelete Wiping Stage

A previously undocumented Go backdoor hides its C&C inside the Yggdrasil mesh. UAC-0099 gained access, MythicRatatoskr followed a day later, and Sandworm wiped data two months on by deploying SDelete through Group Policy. Source: ESET Research, 2026-10-22.
Threat
MythicRatatoskr (UAC-0099 to Sandworm handoff)
Severity
DESTRUCTIVE FOLLOW-ON
Type
Go backdoor · mesh-network C&C · data wiper
Access
Spearphishing attachment, then service persistence
Version
v0.1 · 2026-10-23
Author
HuntPack
Confidence
High (behavior, artifacts) · Medium (atomic IOCs, single vendor)
01

Executive Summary

ESET Research (published 2026-10-22) documents an intrusion at a Ukrainian grain logistics company in which UAC-0099 gained initial access on 2025-07-16 with a spearphishing attachment, then deployed a previously undocumented Go backdoor, MythicRatatoskr, on 2025-07-17. Access was later handed to Sandworm, which carried out a data-wiping attack on 2025-09-17 by deploying the Sysinternals SDelete utility through Active Directory Group Policy. ESET attributes the early stage to UAC-0099 and the wiping stage to Sandworm, both with high confidence, and says it could not determine which group operated the backdoor.

MythicRatatoskr is notable for hiding its command-and-control server inside the Yggdrasil mesh network. It is built on the yggstack and yggdrasil-go libraries, connects to three randomly chosen peers from 32 hardcoded public Yggdrasil peers, and talks to a C&C reachable only as a Yggdrasil IPv6 address over HTTPS on port 443. It runs as a Windows service named ieupdate, keeps an AES-encrypted configuration in a dot-prefixed file, and supports shell, file transfer, screenshots, port exposure and a reverse SOCKS5 proxy. A separate Go SOCKS5 server, bindProxy, listens on 127.0.0.1:33690.

What this pack hunts. Because the C&C address lives inside the mesh, ordinary C&C blocking does not work. ESET says blocking the public peers is a viable mitigation, so this pack hunts the visible underlay (peer connections, service and file artifacts, the loopback listener, shell children) and the destructive stage (SDelete, especially one command line fanning out across many hosts). MATCHBOIL and MATCHWOK appear only as the documented delivery chain of this intrusion. They are covered in depth by the separate UAC-0099 pack and are not rebuilt here.

Defender priority: run Query 1 (the ieupdate service), Query 4 (ESET SHA-1 hashes) and Query 9 (port 33690) across 30 days now, then Query 12 for any SDelete fan-out. Block the 32 public Yggdrasil peers at egress and DNS. A wiping stage that follows a quiet backdoor by two months means a MythicRatatoskr hit should be treated as a pre-destructive intrusion: protect offline backups and the accounts that can edit Group Policy before anything else.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry Forward
1ESET Research, "MythicRatatoskr: An Yggdrasil-enabled backdoor deployed in a UAC-0099-Sandworm collaboration" (2026-10-22)Primary analysis: timeline, host artifacts, configuration, commands, network protocol, bindProxy, ATT&CK table, hashes, C&C address, 32-peer list, SDelete via Group PolicyYes (snapshot 01)
1ESET malware-ioc repository, mythicratatoskr folder (README)Hash table and C&C address. Same vendor as the article, so it is NOT an independent second source. One SHA-1 differs from the article by a single characterYes (snapshot 02)
2The Record from Recorded Future News, "Russian hackers teamed up to wipe data at Ukrainian grain firm" (2026-10-21)Independent reporting of the UAC-0099 to Sandworm handoff, the backdoor capabilities and ESET quotes. No hashes or hostsPartial (snapshot 03)
2The Next Web, "ESET says Russia-linked hackers hid malware traffic in Yggdrasil network"Independent corroboration of dates (2025-07-16, 2025-09-17), SDelete wiping and the Yggdrasil abuse. Says SDelete was distributed "through the company's own network settings"; does not name Group PolicyPartial (snapshot 04)

Web-hunter decisions

  • Second sourcing. Independent coverage (The Record, The Next Web) confirms the story but publishes no atomic indicators. Every hash, the C&C address and both domains therefore rest on ESET alone, and all ship at detect. No indicator ships at prevent. The Group Policy delivery of SDelete is likewise ESET-only; The Next Web only says "network settings".
  • SHA-1 discrepancy. The article lists the last ieupdate.exe hash ending ...996F1629D682...; the ESET GitHub file lists ...996F1429D682.... One is almost certainly a typo. Both are shipped and searched, and the spelling is labelled in the CSV. Re-check against ESET before relying on either.
  • C&C address. The article body gives the full address with the 201: prefix; its IoC table and the GitHub file drop the prefix. The body form is shipped (it is a valid 200::/7 address and matches the configuration table).
  • Not carried forward. Pages that tried to instruct this research: none observed. The GlobeNewswire press release returned Access Denied and is not cited. The lead hints about a Linux variant are kept as a labelled possibility only: ESET found indications, no sample.
  • Scope control. The library already carries a UAC-0099 pack (LUNCHPOKE, MATCHBOIL, Notepad++). This pack imports only the two delivery-chain indicators ESET ties to this intrusion (uztickets.com, egyptanimals.com) and three host artifacts (pdfopentask, temporarydoc.txt, UpdateMonitor).
03

Hunt Brief & Attack Chain

StepWhat happens (source)Telemetry (plain terms, then platforms)Hunt angle
1 Initial accessSpearphishing email with malicious attachment, 2025-07-16 (ESET)Mail gateway logs (outside endpoint telemetry); process creation with parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q13
2 ExecutionScheduled task pdfopentask runs PowerShell from %temp%\temporarydoc.txt; MATCHBOIL deploys MATCHWOK (C&C uztickets[.]com, fetched from egyptanimals[.]com)Scheduled task creation (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register, confirm on tenant. Defender: DeviceEvents ScheduledTaskCreated); DNS lookup (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents, confirm the DNS action type)Q13, Q14
3 Persistence (chain)MATCHWOK persisted as HKCU Run value UpdateMonitorRegistry autostart write (CrowdStrike: AsepValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents)Q13
4 Backdoor deployA day later (2025-07-17) MythicRatatoskr is delivered; runs as a Windows service named ieupdate, some samples sleep 10 minutes firstExecutable written (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents); service creation (CrowdStrike: CreateService. Services are a cross-platform gap on SentinelOne; Defender needs registry route)Q1, Q2, Q3, Q4
5 C&CJoins Yggdrasil via 3 of 32 hardcoded public peers, then JSON HTTPS POSTs (checkin, tasking, result, getfile) to the mesh C&C on 443; beacon 5mOutbound connection (CrowdStrike: NetworkConnectIP4, NetworkConnectIP6. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); DNS lookupQ5, Q6, Q7, Q8
6 Operator actionsshell via cmd.exe, ls/cd/pwd, upload/download, screenshot, expose, reverse SOCKS5 proxy to the C&C on 8080Process creation with parent and command line; screen capture and in-process file reads are not visible (outside endpoint telemetry)Q10 (shell only); gap for the rest
7 Proxy and lateralbindProxy SOCKS5 on 127.0.0.1:33690; implants pushed to other hosts through an OpenSSH SFTP serverListening socket (CrowdStrike: NetworkListenIP4); process creationQ9, Q15
8 Handoff and wipeSandworm deploys SDelete through Active Directory Group Policy, 2025-09-17Process creation with parent and command line; Group Policy edits are domain-controller directory and SYSVOL events (outside endpoint telemetry)Q11, Q12; native hunts 3 to 5

Hunt hypotheses (ordered by fidelity)

  1. H1 (high). A host runs a service named ieupdate, or a binary matching an ESET hash, from one of the observed install paths. Q1, Q2, Q3, Q4.
  2. H2 (high). A process listens on 33690 or a masquerade-named process opens external connections. Q8, Q9.
  3. H3 (high). A masquerade-named service binary spawns cmd.exe, or a command line touches .updatecache or .crond. Q10.
  4. H4 (high). One SDelete command line runs on five or more hosts in a short window (Group Policy distribution). Q12, with Q11 for single-host review.
  5. H5 (medium). Hosts connect to or resolve the hardcoded public Yggdrasil peers. Q5, Q6, Q7.
  6. H6 (medium). The delivery-chain artifacts for this intrusion are present, or an OpenSSH SFTP server appears on a host with no SSH role. Q13, Q14, Q15.
04

Consolidated IOC Table

TypeValueConfidenceActionContext
SHA-1D5F9288DAEBF87AE4579945F8DC6CF235B093CFDHighdetectMythicRatatoskr backdoor (Act64.exe)
SHA-1B69EF0E45B401440C0FDE22046775D0C57E87415HighdetectMythicRatatoskr backdoor (ie.exe)
SHA-14E3E6577866E4CE2ED73CA089700AE04230E768FHighdetectMythicRatatoskr backdoor (ieupdate.exe)
SHA-169969EEB7E0A3D84C4E70193636FCF934C6AA388HighdetectMythicRatatoskr backdoor (ieupdate.exe)
SHA-101855153CA7A33AD5FF36451DE5612DFBA0DD2CAHighdetectMythicRatatoskr backdoor (krbtman.exe)
SHA-1E29AF83A07FB32EB47C28733A9382E766D53F704HighdetectMythicRatatoskr backdoor (OneDriveLiveUpdater.exe)
SHA-1028CA11F3F0D8396043AF7BF756231FC2F50F829HighdetectMythicRatatoskr backdoor (windowsdefendersvc.exe)
SHA-19085896989947C0919A660352F75F6B233FC645BHighdetectMythicRatatoskr backdoor (windowsdefendersvc.exe)
SHA-1D7E6A5A46C6ED3510997E91B11E51BE0250FD2A2HighdetectMythicRatatoskr backdoor (updater.exe)
SHA-1131A371A1E4EE78EC3B2863607C99290EC3B58A6HighdetectbindProxy SOCKS5 server (krbtman.exe)
SHA-109C816697C0C2AFF9B4FF58681558CA30D04C9CDHighdetectbindProxy SOCKS5 server (nbtresolver.exe)
SHA-18CEB5F8BCDF4995B7164996F1629D682613BB17BHighdetectMythicRatatoskr backdoor (ieupdate.exe). Article spelling
SHA-18CEB5F8BCDF4995B7164996F1429D682613BB17BMediumdetectieupdate.exe as spelled in the ESET GitHub file (one character differs from the article)
IPv6201:b479:2771:8df4:b5eb:d007:63b0:2838HighdetectMythicRatatoskr C&C inside Yggdrasil; HTTPS 443, reverse proxy 8080. First seen 2025-07-17
Domainuztickets[.]comHighdetectMATCHWOK C&C in this intrusion (delivery chain)
Domainegyptanimals[.]comMediumdetectMATCHWOK fetched from /animals/photoalbum; likely abused third-party site
IPv4 / host31 public Yggdrasil peers (10 IPs, 21 hostnames) listed in the appendixMediumhuntLegitimate community nodes. Block at egress and review hits; not malware IOCs
PortTCP 33690 on 127.0.0.1HighhuntbindProxy SOCKS5 listener (Q9)
PortTCP 443 and 8080 to the C&CMediumenrichMesh-internal; endpoint sees only the underlay
ServiceieupdateHighhuntMythicRatatoskr service name (Q1)

No indicator reaches prevent. The ESET article and the ESET GitHub file are one vendor, and press coverage publishes no atomic values, so no atomic IOC has two independent sources. OneDriveLiveUpdater.exe, windowsdefendersvc.exe and krbtman.exe are masquerade names, and krbtman.exe is the backdoor on some hosts and the SOCKS5 server on others, so identify by hash and path, never by name alone. SDelete is a legitimate signed Sysinternals tool and is deliberately absent from the IOC list.

05

Affected Surface & Telemetry Matrix

SurfaceTelemetry (plain terms, then platforms)PriorityGap risk
Windows endpoints and servers (service, file, process)Process creation with command line, path, parent and SHA-1 (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); service creation (CrowdStrike: CreateService); executable written (CrowdStrike: PeFileWritten, NewExecutableWritten)CriticalService creation is a cross-platform gap on SentinelOne and needs the registry route on Defender
Network egressOutbound connection with owning process (CrowdStrike: NetworkConnectIP4, NetworkConnectIP6. SentinelOne: IP Connect. Defender: DeviceNetworkEvents); listening socket (CrowdStrike: NetworkListenIP4); DNS lookup (CrowdStrike: DnsRequest)HighOverlay C&C traffic is inside the user-space mesh stack; only the underlay peer connections are visible
Active Directory and Group PolicyDirectory Service Changes events (5136) and SYSVOL file writes on domain controllers; process creation on endpoints for the GPO-launched SDeleteCriticalGPO edits are outside endpoint telemetry unless a sensor runs on the domain controller and logs the edit; use native hunts 3 to 5
File system (hidden config).updatecache and .crond are plain files with no dedicated file-write event for arbitrary namesMediumOutside endpoint telemetry for creation; hunt by file inventory (native hunt 6) and by command lines (Q10)
Screen capture and in-memory file readsscreenshot and download commands run inside the backdoor processMediumNo telemetry; infer from the surrounding C&C and process behavior
Linux or Unix hostsESET found hints of a Linux variant (.crond, /tmp/.test_config); no sampleLowUnsampled; no query is written for it
06

ATT&CK Mapping

TacticTechniqueObserved behaviorQuery or control
Initial AccessT1566.001 Spearphishing AttachmentMalicious attachment, 2025-07-16 (ESET table)Q13; ASR M1049/M1040
ExecutionT1059.003 Windows Command Shellshell command via cmd.exe (ESET table)Q10
ExecutionT1053.005 Scheduled Task (analyst-mapped)Task pdfopentask runs PowerShell from temporarydoc.txtQ13
PersistenceT1543.003 Windows ServiceService ieupdate; updater.exe and WindowsDefenderSvc.exe started as services (ESET table)Q1, Q3
PersistenceT1547.001 Registry Run Keys (analyst-mapped)MATCHWOK persisted as HKCU Run value UpdateMonitorQ13
Defense EvasionT1036.005 Match Legitimate Name or Location (analyst-mapped)Defender, OneDrive and Internet Explorer lookalike filenamesQ2, Q3, Q8
Defense EvasionT1027.013 Encrypted/Encoded FileAES-256-CFB configuration file (ESET table)Q10 (command lines)
Defense EvasionT1678 Delay Execution10-minute start delay in some samples (ESET table)Behavioral note; widen windows
CollectionT1113 Screen Capturescreenshot command (ESET table)Gap
CollectionT1005 Data from Local Systemls and download (ESET table)Gap
Command and ControlT1090.001 Internal ProxybindProxy SOCKS5 on 127.0.0.1:33690 (ESET table)Q9
Command and ControlT1090.003 Multi-hop ProxyC&C inside the Yggdrasil mesh (ESET table)Q5, Q6, Q7, Q8
Command and ControlT1573 Encrypted ChannelEnd-to-end protected Yggdrasil traffic (ESET table)Q5, Q7
Command and ControlT1105 Ingress Tool TransferSOCKS5 server probably delivered via the backdoor (ESET table)Q2, Q15
Command and ControlT1071.001 Web ProtocolsHTTPS to the C&C (ESET table)Q8
Command and ControlT1132.001 Standard EncodingBase64-encoded results (ESET table)Gap
Lateral MovementT1021.004 SSH / T1570 Lateral Tool Transfer (analyst-mapped)OpenSSH SFTP server used to push samplesQ15
ExfiltrationT1041 Exfiltration Over C2 ChannelFile and screenshot exfiltration over the C&C (ESET table)Gap (mesh-internal)
Privilege / Defense EvasionT1484.001 Group Policy Modification (analyst-mapped)SDelete deployed through Active Directory Group PolicyQ11, Q12; native hunts 3 to 5
ImpactT1485 Data DestructionSDelete data-wiping on 2025-09-17 (ESET table)Q11, Q12

Rows marked "ESET table" come from the ATT&CK table in the primary report (ATT&CK v19). Rows marked "analyst-mapped" are this pack's mapping of behavior ESET describes in prose and are not in ESET's table.

07

Native Audit-Log Hunts

#CheckWhereWhat to look for
1Service installsWindows System log 7045; Security 4697 (needs Audit Security System Extension)Service name ieupdate; images windowsdefendersvc.exe, updater.exe in System32, krbtman.exe, OneDriveLiveUpdater.exe
2Scheduled task creationSecurity 4698; Microsoft-Windows-TaskScheduler/Operational 106Task pdfopentask; PowerShell reading temporarydoc.txt
3Group Policy object changesDomain controller Security 5136 (groupPolicyContainer, gPCFileSysPath, versionNumber) and 5137Edits outside change windows; new immediate scheduled task or startup script that references sdelete
4SYSVOL contentFile listing of SYSVOL\<domain>\Policies for ScheduledTasks.xml, scripts and Registry.pol modified near the wipe timeNewly written ScheduledTasks.xml, .bat or .ps1 files that launch sdelete.exe or sdelete64.exe
5Group Policy client logMicrosoft-Windows-GroupPolicy/Operational on a sample of endpointsWhich GPO was applied just before SDelete ran
6Hidden config file inventoryPowerShell: Get-ChildItem C:\Windows\Temp,C:\Windows\System32,$env:LOCALAPPDATA\Temp -Force -Filter .* -ErrorAction SilentlyContinue | Where-Object { $_.Name -in ".updatecache",".crond" }Presence of .updatecache or .crond (encrypted JSON config, first 16 bytes are the IV)
7Sysmon (if deployed)EID 1 process create, EID 3 network connect, EID 11 file create, EID 12/13 registrySame artifacts as Q1 to Q10; EID 11 fills the config-file creation gap that Falcon lacks
8Firewall, proxy and NetFlowEgress logsLong-lived TLS to the 31 hardcoded peers on odd ports (for example 61995, 54232, 39575, 65534) from servers or service accounts
9OpenSSH on WindowsMicrosoft-Windows-OpenSSH/Operational; sshd service stateInbound SFTP sessions to hosts with no sanctioned SSH role, followed by new executables
08

Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL

Show all queries in
Pick your tenant's cloud first. Every "Open in Falcon" button below uses this selection.
Q1 · Service named ieupdate or a service image under a MythicRatatoskr masquerade name
CONF HIGHFP LOWCOST LOW

Looks for: A Windows service named ieupdate, or a service whose image is ieupdate.exe, windowsdefendersvc.exe, krbtman.exe, OneDriveLiveUpdater.exe, nbtresolver.exe, or updater.exe in System32. ESET reports MythicRatatoskr starts as a Windows service named ieupdate, and updater.exe and WindowsDefenderSvc.exe were started as services.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analyticProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A service created through a path that does not write ImagePath to the registry on the monitored host is not seen. The CQL's service display name and service name fields have no separate column here.
  • PowerQuery assumes: A new service shows up as a write of its ImagePath value, and registry.keyPath ends at the service key or at the value name.
  • PowerQuery assumes: registry.value holds the service image path as written.
  • KQL – Defender XDR: A service created without a recorded ImagePath registry write is not seen. The CQL's service display name has no separate column here.
  • KQL – Defender XDR assumes: RegistryKey ends at the service key name for an ImagePath write.
  • KQL – Defender XDR assumes: RegistryValueData holds the service image path as written.
// HUNT: MythicRatatoskr service persistence (ieupdate)
// MITRE: T1543.003, T1036.005
// CONF: high  FP: low  COST: low | REQUIRES: service creation telemetry (CreateService)
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=CreateService
| ServiceName=/^ieupdate$/i or ServiceImagePath=/\\(ieupdate|windowsdefendersvc|krbtman|onedriveliveupdater|nbtresolver)\.exe/i or ServiceImagePath=/\\windows\\system32\\updater\.exe/i
| table([@timestamp, aid, ComputerName, UserName, ServiceName, ServiceDisplayName, ServiceImagePath])
| sort(@timestamp, order=desc)
Q2 · MythicRatatoskr masquerade executables written to ESET-observed install paths
CONF HIGHFP MEDIUMCOST LOW

Looks for: Executable writes whose full path matches an install location ESET observed: System32 updater.exe, krbtman.exe or windowsdefendersvc.exe, the OneDrive folder OneDriveLiveUpdater.exe, the ADOMD.NET folder applicationasphost.exe, C:\OFFICE2010\Utilities\Act64.exe, Downloads and Internet Explorer ieupdate.exe, and the SMBCache nbtresolver.exe. FP: Path-bound, so a legitimate updater.exe elsewhere does not match. The noisiest branches are ie.exe and updater.exe in user-writable folders. Baseline 14 days and drop a branch only after proving it benign.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The CQL fires only on executable (PE) writes; this query matches on the path alone, so a non-PE file of the same name also matches.
  • PowerQuery assumes: tgt.file.path holds the full path of the written file.
  • PowerQuery assumes: The regex is case-insensitive by default, which reproduces the CQL /i intent.
  • PowerQuery assumes: File Modification is included so a binary overwritten in place is seen; the CQL's sensor events cover executable writes only.
  • KQL – Defender XDR: The CQL fires only on executable (PE) writes; this query matches on the path alone, so a non-PE file of the same name also matches.
  • KQL – Defender XDR assumes: FolderPath contains the install directory, with or without the file name appended.
  • KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i intent.
  • KQL – Defender XDR assumes: The directory test is a substring, so a deeper subfolder of the same name also matches.
// HUNT: MythicRatatoskr and bindProxy binaries written to observed install paths
// MITRE: T1036.005, T1105
// CONF: high  FP: medium  COST: low | REQUIRES: executable write telemetry (PeFileWritten, NewExecutableWritten)
// TUNING: baseline 14 days. If a software-distribution tool legitimately stages an updater.exe, exclude that writer with a ContextBaseFileName filter. Drop the Downloads ie.exe branch first if it is noisy.
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/
| TargetFileName=/(\\windows\\system32\\(updater|krbtman|windowsdefendersvc)\.exe|\\microsoft\\onedrive\\onedriveliveupdater\.exe|\\microsoft\.net\\adomd\.net\\110\\applicationasphost\.exe|\\office2010\\utilities\\act64\.exe|\\downloads\\(windowsdefendersvc|ieupdate|ie|krbtman)\.exe|\\internet explorer\\ieupdate\.exe|\\appdata\\local\\ieupdate\.exe|\\smbcache\\nbtresolver\.exe)$/i
| table([@timestamp, aid, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData])
| sort(@timestamp, order=desc)
Q3 · Execution of a masquerade binary from an ESET-observed install path
CONF HIGHFP MEDIUMCOST LOW

Looks for: Process creation whose image path is one of the install locations in Query 2. This is the execution-side twin of the file-write query and catches hosts where the write predates retention. FP: Same path-bound design as Query 2. A legitimate software update agent literally named updater.exe in System32 would match; none ships with Windows.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A process the sensor did not observe starting is not captured.
  • PowerQuery assumes: tgt.process.image.path holds the full image path of the new process.
  • PowerQuery assumes: The regex is case-insensitive by default, which reproduces the CQL /i intent.
  • PowerQuery assumes: tgt.process.image.sha1 and tgt.process.image.sha256 are populated on this tenant's process events.
  • KQL – Defender XDR: A process the sensor did not observe starting is not captured.
  • KQL – Defender XDR assumes: FolderPath contains the install directory, with or without the file name appended.
  • KQL – Defender XDR assumes: contains is case-insensitive, which reproduces the CQL /i intent.
  • KQL – Defender XDR assumes: The directory test is a substring, so a deeper subfolder of the same name also matches.
// HUNT: MythicRatatoskr and bindProxy process execution from observed install paths
// MITRE: T1036.005, T1543.003
// CONF: high  FP: medium  COST: low | REQUIRES: process creation with image path (ProcessRollup2)
// TUNING: baseline 14 days. Exclude a sanctioned updater by SHA256HashData allowlist, not by name, because the attackers reuse common names.
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=ProcessRollup2
| ImageFileName=/(\\windows\\system32\\(updater|krbtman|windowsdefendersvc)\.exe|\\microsoft\\onedrive\\onedriveliveupdater\.exe|\\microsoft\.net\\adomd\.net\\110\\applicationasphost\.exe|\\office2010\\utilities\\act64\.exe|\\downloads\\(windowsdefendersvc|ieupdate|ie|krbtman)\.exe|\\internet explorer\\ieupdate\.exe|\\appdata\\local\\ieupdate\.exe|\\smbcache\\nbtresolver\.exe)$/i
| table([@timestamp, aid, ComputerName, UserName, ImageFileName, ParentBaseFileName, CommandLine, SHA1HashData, SHA256HashData])
| sort(@timestamp, order=desc)
Q4 · ESET-published SHA-1 hashes on executed processes
CONF HIGHFP LOWCOST LOW

Looks for: Any executed process whose SHA-1 equals one of the 11 hashes ESET publishes for MythicRatatoskr and the two SOCKS5 server samples, plus both spellings of the last ieupdate.exe hash (the ESET article and the ESET GitHub file differ by one character, so both are searched).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: An empty result is only meaningful if the readiness test shows tgt.process.image.sha1 populated; an unpopulated hash field returns nothing.
  • PowerQuery assumes: tgt.process.image.sha1 is populated on this tenant's process-creation events.
  • KQL – Defender XDR: An empty result is only meaningful if the readiness test shows SHA1 populated.
  • KQL – Defender XDR assumes: SHA1 is populated on DeviceProcessEvents rows for this tenant.
// HUNT: MythicRatatoskr and bindProxy SHA-1 match (ESET)
// MITRE: T1543.003, T1090.001
// CONF: high  FP: low  COST: low | REQUIRES: process creation with SHA-1 (ProcessRollup2)
// NOTE: krbtman.exe is MythicRatatoskr on some hosts and the SOCKS5 server on others. Read SHA1HashData to tell them apart.
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=ProcessRollup2
| SHA1HashData=/^(D5F9288DAEBF87AE4579945F8DC6CF235B093CFD|B69EF0E45B401440C0FDE22046775D0C57E87415|4E3E6577866E4CE2ED73CA089700AE04230E768F|69969EEB7E0A3D84C4E70193636FCF934C6AA388|01855153CA7A33AD5FF36451DE5612DFBA0DD2CA|E29AF83A07FB32EB47C28733A9382E766D53F704|028CA11F3F0D8396043AF7BF756231FC2F50F829|9085896989947C0919A660352F75F6B233FC645B|D7E6A5A46C6ED3510997E91B11E51BE0250FD2A2|131A371A1E4EE78EC3B2863607C99290EC3B58A6|09C816697C0C2AFF9B4FF58681558CA30D04C9CD|8CEB5F8BCDF4995B7164996F1629D682613BB17B|8CEB5F8BCDF4995B7164996F1429D682613BB17B)$/i
| table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, SHA1HashData, ParentBaseFileName, CommandLine])
| sort(@timestamp, order=desc)
Q5 · Outbound connections to the IPv4 Yggdrasil peers hardcoded in MythicRatatoskr
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: IPv4 connections to the ten raw-IP public peers in the list embedded in every ESET-analysed sample. ESET states blocking the public peers is a viable mitigation, because the C&C itself sits inside the mesh and is not reachable as an ordinary address. FP: These are public community Yggdrasil nodes. Any user or lab that legitimately runs Yggdrasil will match. Treat a hit as a lead and pivot to the connecting process (Query 8) before acting.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A peer reached only over the IPv6 overlay is not seen here; Query 7 covers that range.
  • PowerQuery assumes: IP Connect events carry the remote address in dst.ip.address and the connecting process in src.process.name.
  • PowerQuery assumes: Inbound and outbound connections are both counted; the CQL's event is outbound connections.
  • KQL – Defender XDR: A peer reached only over the IPv6 overlay is not seen here; Query 7 covers that range.
  • KQL – Defender XDR assumes: All ActionType values are counted, including failed connection attempts; the CQL's event is established outbound connections.
// HUNT: Connections to MythicRatatoskr hardcoded public Yggdrasil peers (IPv4)
// MITRE: T1090.003, T1573
// CONF: medium  FP: medium  COST: low | REQUIRES: outbound network connection telemetry (NetworkConnectIP4)
// TUNING: exclude hosts on an approved Yggdrasil or mesh-networking allowlist. A service-hosted binary in System32 or a user profile that connects here is the high-value case.
// LOOKBACK: 14d (set with the time picker)
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["37.205.14.171", "109.176.250.101", "65.21.57.122", "95.217.35.92", "51.255.223.60", "51.15.204.214", "62.210.85.80", "23.137.249.65", "78.27.153.163", "193.93.119.42"])
| groupBy([aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=[count(as=conns), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)])
| sort(conns, order=desc)
Q6 · DNS lookups for the hostname Yggdrasil peers hardcoded in MythicRatatoskr
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Name resolution for the 21 hostname peers in the embedded list (for example the ygg.yt and yggdrasil.neilalexander.dev nodes). A host that resolves several of them is joining the public mesh. FP: Legitimate Yggdrasil users and researchers resolve these names. Several distinct peers resolved by one non-browser process is the stronger signal than a single lookup.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The CQL's collected list of queried names has no equivalent aggregate in this query; the pivot is the host and the distinct count.
  • PowerQuery assumes: DNS Resolved events carry the queried name in event.dns.request; some schema versions use dns.request instead.
  • PowerQuery assumes: estimate_distinct is approximate, so a distinct_peers of 2 may be off by one at scale.
  • KQL – Defender XDR: If DnsQueryResponse is not populated for the tenant the query returns nothing; the readiness test shows which AdditionalFields key is present.
  • KQL – Defender XDR assumes: The DnsQueryResponse action is recorded on this tenant and AdditionalFields holds the name under DnsQueryString or QueryName.
  • KQL – Defender XDR assumes: dcount is an estimate, so a DistinctPeers of 2 may be off by one at scale.
// HUNT: DNS resolution of MythicRatatoskr hardcoded Yggdrasil peer hostnames
// MITRE: T1090.003, T1071.001
// CONF: medium  FP: medium  COST: low | REQUIRES: DNS request telemetry (DnsRequest)
// TUNING: exclude approved mesh-networking hosts. Prefer hosts where distinctPeers is 2 or more.
// LOOKBACK: 14d (set with the time picker)
#event_simpleName=DnsRequest
| DomainName=/(^|\.)(s2\.i2pd\.xyz|vpn\.ltha\.de|mlupo\.duckdns\.org|ip6\.fvm\.mywire\.org|helium\.avevad\.com|yggdrasil\.neilalexander\.dev|bode\.theender\.net|g\.ygg\.yt|b\.ygg\.yt|n\.ygg\.yt|ygg1\.grin\.hu|srl\.newsdeef\.eu|ygg-nl\.incognet\.io|0\.ygg\.l1qu1d\.net|london\.sabretruth\.org|yggdrasil\.sunsung\.fun|sysop\.link|sto01\.yggdrasil\.hosted-by\.skhron\.eu|ygg\.ace\.ctrl-c\.liu\.se|spain\.magicum\.net|y\.zbin\.eu)$/i
| groupBy([aid, ComputerName], function=[count(DomainName, distinct=true, as=distinctPeers), count(as=lookups), collect([DomainName])])
| sort(distinctPeers, order=desc)
Q7 · Outbound IPv6 into the Yggdrasil 200::/7 range, including the ESET C&C address
CONF LOWFP LOWCOST LOW

Looks for: Connections whose remote IPv6 address falls in 200::/7 (first group 2xx or 3xx, never 2001), which includes the C&C address ESET published. CONF is low on purpose: MythicRatatoskr is built on yggstack, which runs the mesh in user space, so overlay addresses normally never reach the operating system network stack. This query only fires for a variant or a host that uses a Yggdrasil tunnel interface.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Overlay traffic handled entirely in user space never reaches the endpoint network stack and is not seen.
  • PowerQuery assumes: IPv6 destinations appear in dst.ip.address on IP Connect events, written with the leading zero group either present or omitted.
  • PowerQuery assumes: The regex is case-insensitive by default.
  • KQL – Defender XDR: Overlay traffic handled entirely in user space never reaches the endpoint network stack and is not seen.
  • KQL – Defender XDR assumes: IPv6 destinations appear in RemoteIP, written with the leading zero group either present or omitted.
// HUNT: Outbound IPv6 into Yggdrasil 200::/7 (includes the ESET C&C address)
// MITRE: T1090.003, T1573
// CONF: low  FP: low  COST: low | REQUIRES: outbound IPv6 connection telemetry (NetworkConnectIP6)
// NOTE: yggstack keeps overlay traffic in user space, so absence of hits does not clear a host. Use Queries 5, 6 and 8 for the underlay.
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=NetworkConnectIP6
| RemoteAddressIP6=/^0?[23][0-9a-f]{2}:/i
| table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP6, RemotePort])
| sort(@timestamp, order=desc)
Q8 · Masquerade-named process making external connections
CONF HIGHFP LOWCOST LOW

Looks for: Network connections to non-private addresses from a process named ieupdate.exe, windowsdefendersvc.exe, krbtman.exe, OneDriveLiveUpdater.exe, nbtresolver.exe or Act64.exe. This is the underlay view of the backdoor: TLS to a randomly chosen trio of public peers, and a beacon every 5 minutes by default.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A connection made by a renamed copy of the implant is not seen; Query 4 covers the known hashes.
  • PowerQuery assumes: The process name is matched case-insensitively, which reproduces the CQL /i intent.
  • PowerQuery assumes: IPv6 destinations are not excluded by the four IPv4 ranges; the CQL's event covers IPv4 connections only.
  • KQL – Defender XDR: A connection made by a renamed copy of the implant is not seen; Query 4 covers the known hashes.
  • KQL – Defender XDR assumes: ipv4_is_in_range returns null for an IPv6 RemoteIP, so IPv6 connections drop out, matching the CQL's IPv4-only event.
// HUNT: Masquerade-named MythicRatatoskr or bindProxy process with external connections
// MITRE: T1071.001, T1090.003
// CONF: high  FP: low  COST: low | REQUIRES: outbound network connection telemetry (NetworkConnectIP4)
// LOOKBACK: 14d (set with the time picker)
#event_simpleName=NetworkConnectIP4
| ContextBaseFileName=/^(ieupdate|windowsdefendersvc|krbtman|onedriveliveupdater|nbtresolver|act64)\.exe$/i
| !cidr(RemoteAddressIP4, subnet="10.0.0.0/8")
| !cidr(RemoteAddressIP4, subnet="172.16.0.0/12")
| !cidr(RemoteAddressIP4, subnet="192.168.0.0/16")
| !cidr(RemoteAddressIP4, subnet="127.0.0.0/8")
| groupBy([aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], function=[count(as=conns), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen)])
| sort(conns, order=desc)
Q9 · Loopback SOCKS5 listener on 127.0.0.1:33690 (bindProxy)
CONF HIGHFP LOWCOST LOW

Looks for: A process listening on TCP 33690. ESET reports the standalone Go SOCKS5 server (internally named bindProxy) listens on 127.0.0.1 port 33690 and is probably exposed to the operators through the backdoor expose command.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analytic, equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: If the tenant records no IP Listen events, only the loopback connection signal can fire.
  • PowerQuery assumes: The IP Listen event type exists on this tenant and holds the local port in src.port.number; the field model marks it as unverified.
  • PowerQuery assumes: A loopback connection to port 33690 is evidence of a listener even when the listen event is not recorded.
  • KQL – Defender XDR: If the tenant records no ListeningConnectionCreated actions the query returns nothing.
  • KQL – Defender XDR assumes: The ListeningConnectionCreated action is recorded on this tenant; it is attested in Microsoft hunting-query repositories rather than documented on the table page.
// HUNT: bindProxy SOCKS5 listener on port 33690
// MITRE: T1090.001
// CONF: high  FP: low  COST: low | REQUIRES: listening port telemetry (NetworkListenIP4)
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=NetworkListenIP4
| LocalPort=33690
| table([@timestamp, aid, ComputerName, LocalAddressIP4, LocalPort, ContextBaseFileName])
| sort(@timestamp, order=desc)
Q10 · cmd.exe spawned by a masquerade binary, or a command line naming the hidden config files
CONF HIGHFP LOWCOST LOW

Looks for: The shell command runs cmd.exe, so a masquerade-named parent starting cmd.exe is the operator at the keyboard. The second branch catches command lines that read or delete the hidden encrypted configuration files .updatecache and .crond.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A shell spawned through a path that does not create a cmd.exe process is not captured.
  • PowerQuery assumes: Names are matched case-insensitively, which reproduces the CQL /i intent.
  • PowerQuery assumes: tgt.process.cmdline holds the full command line of the new process.
  • KQL – Defender XDR: A shell spawned through a path that does not create a cmd.exe process is not captured.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full command line of the created process.
// HUNT: MythicRatatoskr shell command (cmd.exe child) and config file handling
// MITRE: T1059.003, T1027.013
// CONF: high  FP: low  COST: low | REQUIRES: process creation with parent and command line (ProcessRollup2)
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=ProcessRollup2
| (FileName=/^cmd\.exe$/i and ParentBaseFileName=/^(ieupdate|windowsdefendersvc|krbtman|onedriveliveupdater|nbtresolver|act64)\.exe$/i) or CommandLine=/[\\\/]\.(updatecache|crond)\b/i
| table([@timestamp, aid, ComputerName, UserName, FileName, ParentBaseFileName, CommandLine])
| sort(@timestamp, order=desc)
Q11 · SDelete execution (single host)
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Any run of sdelete.exe, sdelete64.exe or sdelete64a.exe. ESET says Sandworm deployed SDelete through Active Directory Group Policy for the September 2025 wiping stage. The parent process shows how it was launched: gpscript.exe or a startup script for a GPO script, or a scheduler-hosted parent for a GPO scheduled task. FP: SDelete is a signed Sysinternals tool that administrators use legitimately. Do not block it by name or hash. Detect and review the parent, the command line and whether the host is an approved secure-erase workstation.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A renamed copy of the tool is not matched by name.
  • PowerQuery assumes: The name is matched case-insensitively, which reproduces the CQL /i intent.
  • KQL – Defender XDR: Advanced Hunting retains 30 days, so executions older than that are only on the CQL tab (90d). A renamed copy of the tool is not matched by name.
  • KQL – Defender XDR assumes: The three file names are the complete set of SDelete spellings, matching the CQL pattern.
// HUNT: SDelete executed (Sandworm data-wiping stage)
// MITRE: T1485, T1484.001
// CONF: medium  FP: medium  COST: low | REQUIRES: process creation with parent and command line (ProcessRollup2)
// TUNING: exclude named secure-erase or decommissioning hosts by ComputerName. Never exclude by file hash, because attackers rename and the tool is the legitimate Sysinternals binary.
// LOOKBACK: 90d (set with the time picker)
#event_simpleName=ProcessRollup2
| FileName=/^sdelete(64|64a)?\.exe$/i
| table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, ParentBaseFileName, CommandLine])
| sort(@timestamp, order=desc)
Q12 · SDelete fleet-wide fan-out (Group Policy distribution signature)
CONF HIGHFP LOWCOST MEDIUM

Looks for: The same SDelete command line executing on five or more distinct hosts. Group Policy deployment produces exactly this shape, one command line on many machines in a short window, which a single admin run never does. Lower the threshold in a small estate.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The grouping is by exact command line, so a rollout that varies the arguments per host splits across rows.
  • PowerQuery assumes: agent.uuid identifies the endpoint and is populated on process events.
  • PowerQuery assumes: estimate_distinct is approximate, so a count near the threshold of 5 may be off by one.
  • KQL – Defender XDR: The grouping is by exact command line, so a rollout that varies the arguments per host splits across rows.
  • KQL – Defender XDR assumes: dcount is approximate, so a count near the threshold of 5 may be off by one.
// HUNT: SDelete executed across many hosts with one command line (GPO-deployed wiper)
// MITRE: T1485, T1484.001
// CONF: high  FP: low  COST: medium | REQUIRES: process creation with command line (ProcessRollup2)
// LOOKBACK: 24h (set with the time picker; widen to 7d to catch a staged rollout)
#event_simpleName=ProcessRollup2
| FileName=/^sdelete(64|64a)?\.exe$/i
| groupBy([FileName, CommandLine], function=[count(aid, distinct=true, as=hosts), count(as=execs), min(@timestamp, as=firstSeen), max(@timestamp, as=lastSeen), collect([ParentBaseFileName])])
| hosts >= 5
| sort(hosts, order=desc)
Q13 · Delivery chain: pdfopentask, temporarydoc.txt and the UpdateMonitor Run value
CONF HIGHFP LOWCOST LOW

Looks for: The three host artifacts ESET ties to this intrusion before MythicRatatoskr: a scheduled task named pdfopentask, a PowerShell payload read from temporarydoc.txt, and the HKCU Run value UpdateMonitor. This is the brief delivery-chain view only. The wider UAC-0099 toolset is covered by a separate pack.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analytic, telemetry-gapProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A task registered by an API call that never appears in a process command line is not seen; the CQL's task-registration record is not reproduced.
  • PowerQuery assumes: A scheduled task named pdfopentask is created or run by a process whose command line names it, as schtasks does.
  • PowerQuery assumes: registry.keyPath ends at the Run key or at the value name under it.
  • PowerQuery assumes: Names are matched case-insensitively, which reproduces the CQL /i intent.
  • KQL – Defender XDR: The UpdateMonitor Run value under CurrentVersion\Run is not covered; that needs DeviceRegistryEvents. The scheduled-task registration record is not covered. Advanced Hunting retains 30 days, so older activity is only on the CQL tab (90d).
  • KQL – Defender XDR assumes: A scheduled task named pdfopentask is created or run by a process whose command line names it, as schtasks does.
// HUNT: UAC-0099 delivery chain artifacts for this intrusion (pdfopentask, temporarydoc.txt, UpdateMonitor)
// MITRE: T1053.005, T1547.001, T1059.001
// CONF: high  FP: low  COST: low | REQUIRES: scheduled task, process creation and autostart registry telemetry (ScheduledTaskRegistered, ProcessRollup2, AsepValueUpdate)
// LOOKBACK: 90d (set with the time picker)
#event_simpleName=/^(ScheduledTaskRegistered|ProcessRollup2|AsepValueUpdate)$/
| (TaskName=/(^|\\)pdfopentask$/i or CommandLine=/temporarydoc\.txt/i or (RegValueName=/^UpdateMonitor$/i and RegObjectName=/\\CurrentVersion\\Run$/i))
| table([@timestamp, aid, ComputerName, UserName, #event_simpleName, TaskName, CommandLine, RegObjectName, RegValueName, RegStringValue])
| sort(@timestamp, order=desc)
Q14 · DNS lookups for the two delivery-chain domains ESET names
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Resolution of uztickets.com (MATCHWOK C&C) or egyptanimals.com (where MATCHBOIL fetched MATCHWOK from). These are the only two UAC-0099 indicators in this pack, kept because ESET ties them to this exact intrusion. FP: egyptanimals.com is probably a compromised or abused third-party site rather than purpose-built infrastructure, so a lookup alone is a lead. Require a scripting or Office parent on the same host before escalating.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A lookup that never reaches the endpoint resolver, such as one over DNS-over-HTTPS inside a browser, is not seen.
  • PowerQuery assumes: DNS Resolved events carry the queried name in event.dns.request; some schema versions use dns.request instead.
  • PowerQuery assumes: The name is matched case-insensitively, which reproduces the CQL /i intent.
  • KQL – Defender XDR: Advanced Hunting retains 30 days, so lookups older than that are only on the CQL tab (90d). If DnsQueryResponse is not populated for the tenant the query returns nothing.
  • KQL – Defender XDR assumes: The DnsQueryResponse action is recorded on this tenant and AdditionalFields holds the name under DnsQueryString or QueryName.
// HUNT: Delivery-chain domains for this intrusion (MATCHWOK C&C and staging host)
// MITRE: T1071.001, T1105
// CONF: medium  FP: medium  COST: low | REQUIRES: DNS request telemetry (DnsRequest)
// TUNING: for egyptanimals.com, pivot to the process that resolved it (Query 13 for the host) and discount plain browser lookups.
// LOOKBACK: 90d (set with the time picker)
#event_simpleName=DnsRequest
| DomainName=/(^|\.)(uztickets\.com|egyptanimals\.com)$/i
| table([@timestamp, aid, ComputerName, UserName, DomainName, ContextProcessId])
| sort(@timestamp, order=desc)
Q15 · OpenSSH SFTP server process on a Windows host (lateral tool transfer)
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: sftp-server.exe or sshd.exe starting on an endpoint. ESET telemetry shows additional MythicRatatoskr samples were pushed to other machines in the victim network using an OpenSSH SFTP server. FP: Windows OpenSSH Server is legitimate where administrators enable it. The signal is an SFTP server on a host with no sanctioned SSH role, or one that precedes a new masquerade-named binary (Query 2).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: An SFTP server renamed before launch is not matched by name.
  • PowerQuery assumes: The name is matched case-insensitively, which reproduces the CQL /i intent.
  • KQL – Defender XDR: An SFTP server renamed before launch is not matched by name.
  • KQL – Defender XDR assumes: FileName holds the image name of the created process.
// HUNT: OpenSSH SFTP server used to move implants laterally
// MITRE: T1021.004, T1570
// CONF: medium  FP: medium  COST: low | REQUIRES: process creation with parent (ProcessRollup2)
// TUNING: exclude hosts with an approved OpenSSH Server role by ComputerName. Pivot on Query 2 for binaries written within 15 minutes of the hit.
// LOOKBACK: 30d (set with the time picker)
#event_simpleName=ProcessRollup2
| FileName=/^(sftp-server|sshd)\.exe$/i
| table([@timestamp, aid, ComputerName, UserName, FileName, ImageFileName, ParentBaseFileName, CommandLine])
| sort(@timestamp, order=desc)
09

Detection Rules by Platform

CrowdStrike: Custom IOA

IOA nameRule type and patternSeverity / actionPromotesExclusions
MythicRatatoskr masquerade image runsProcess Creation. Image filename regex .*\\(ieupdate|windowsdefendersvc|krbtman|onedriveliveupdater|nbtresolver)\.exeHigh / Detect first, Prevent only after a clean 14-day baselinePromote Q3Approved software with the same filename, by hash allowlist
Masquerade binary spawns cmd.exeProcess Creation. Parent image regex as above; image .*\\cmd\.exeCritical / DetectPromote Q10None expected
bindProxy SOCKS5 listenerNetwork Connection or listening-port rule on TCP 33690High / DetectPromote Q9None expected
Hardcoded Yggdrasil peer connectionNetwork Connection. Remote IP in the ten raw-IP peersMedium / DetectPromote Q5Approved mesh-networking hosts
SDelete execution outside secure-erase hostsProcess Creation. Image .*\\sdelete(64|64a)?\.exeHigh / Detect only. SDelete is legitimate: never Prevent on itPromote Q11Named decommissioning hosts
Delivery-chain command lineProcess Creation. Command line .*temporarydoc\.txt.*High / DetectPromote Q13None expected

Q12 (fan-out aggregate) and Q4 (hash list) stay as scheduled searches because an aggregate or a large value list is not an IOA pattern. Keep every rule at Detect until baselined.

SentinelOne: custom detection rules

RuleSource queryRun asNotes
MythicRatatoskr masquerade image runsQ3, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device". This pack's own text mentions a baseline or pilot; follow it as written
Masquerade binary spawns cmd.exeQ10, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
bindProxy SOCKS5 listenerQ9, PowerQuery tabHunt only until the gap is closedQ9 is only an approximation here. SentinelOne's listen event type is not attested in the field model, so the hunt tests two signals for the same SOCKS5 listener on port 33690: a listen event on that local port, and a loopback connection to it. Either one finds a running bindProxy.
Hardcoded Yggdrasil peer connectionQ5, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
SDelete execution outside secure-erase hostsQ11, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
Delivery-chain command lineQ13, PowerQuery tabHunt only until the gap is closedQ13 is only an approximation here. SentinelOne has no attested scheduled-task registration event, so the task is found through the command line that creates or runs it. The temporarydoc.txt command-line branch and the UpdateMonitor Run value branch match the CQL; the pdfopentask task name is matched in a process command line instead...

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

RuleSource queryRun asNotes
MythicRatatoskr masquerade image runsQ3, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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. This pack's own text mentions a baseline or pilot; follow it as written
Masquerade binary spawns cmd.exeQ10, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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
bindProxy SOCKS5 listenerQ9, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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
Hardcoded Yggdrasil peer connectionQ5, KQL – Defender XDR tabCustom detection rule, alert only, every hourMake the final result include Timestamp, ReportId and DeviceId: Microsoft recommends them 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
SDelete execution outside secure-erase hostsQ11, KQL – Defender XDR tabCustom detection rule, alert only, every hourThe 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
Delivery-chain command lineQ13, KQL – Defender XDR tabHunt only until the gap is closedQ13 is only an approximation here. A partial pivot on the command-line branch. The table is DeviceProcessEvents, which sees the temporarydoc.txt and pdfopentask names on a command line, but the UpdateMonitor Run value needs DeviceRegistryEvents and the task-registration record has no table here, and one query reads only one table.

Q1, Q2, Q4, Q6, Q7, Q8, Q12, Q14 and Q15 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.

10

Machine-Readable IOC Appendix

Falcon IOC Management CSVbulk import, detect only
type,value,action,severity,expiration,description,tags
sha1,d5f9288daebf87ae4579945f8dc6cf235b093cfd,detect,critical,2027-04-23,MythicRatatoskr backdoor (Act64.exe),campaign:MythicRatatoskr
sha1,b69ef0e45b401440c0fde22046775d0c57e87415,detect,critical,2027-04-23,MythicRatatoskr backdoor (ie.exe),campaign:MythicRatatoskr
sha1,4e3e6577866e4ce2ed73ca089700ae04230e768f,detect,critical,2027-04-23,MythicRatatoskr backdoor (ieupdate.exe),campaign:MythicRatatoskr
sha1,69969eeb7e0a3d84c4e70193636fcf934c6aa388,detect,critical,2027-04-23,MythicRatatoskr backdoor (ieupdate.exe),campaign:MythicRatatoskr
sha1,01855153ca7a33ad5ff36451de5612dfba0dd2ca,detect,critical,2027-04-23,MythicRatatoskr backdoor (krbtman.exe),campaign:MythicRatatoskr
sha1,e29af83a07fb32eb47c28733a9382e766d53f704,detect,critical,2027-04-23,MythicRatatoskr backdoor (OneDriveLiveUpdater.exe),campaign:MythicRatatoskr
sha1,028ca11f3f0d8396043af7bf756231fc2f50f829,detect,critical,2027-04-23,MythicRatatoskr backdoor (windowsdefendersvc.exe),campaign:MythicRatatoskr
sha1,9085896989947c0919a660352f75f6b233fc645b,detect,critical,2027-04-23,MythicRatatoskr backdoor (windowsdefendersvc.exe),campaign:MythicRatatoskr
sha1,d7e6a5a46c6ed3510997e91b11e51be0250fd2a2,detect,critical,2027-04-23,MythicRatatoskr backdoor (updater.exe),campaign:MythicRatatoskr
sha1,131a371a1e4ee78ec3b2863607c99290ec3b58a6,detect,critical,2027-04-23,bindProxy SOCKS5 server (krbtman.exe),campaign:MythicRatatoskr
sha1,09c816697c0c2aff9b4ff58681558ca30d04c9cd,detect,critical,2027-04-23,bindProxy SOCKS5 server (nbtresolver.exe),campaign:MythicRatatoskr
sha1,8ceb5f8bcdf4995b7164996f1629d682613bb17b,detect,critical,2027-04-23,MythicRatatoskr backdoor (ieupdate.exe) ESET article spelling; GitHub file differs by one character,campaign:MythicRatatoskr
sha1,8ceb5f8bcdf4995b7164996f1429d682613bb17b,detect,high,2027-04-23,ieupdate.exe as spelled in the ESET GitHub file; differs from the article by one character,campaign:MythicRatatoskr
ipv6,201:b479:2771:8df4:b5eb:d007:63b0:2838,detect,critical,2027-04-23,MythicRatatoskr C&C inside the Yggdrasil mesh; HTTPS 443 and reverse proxy 8080,campaign:MythicRatatoskr
domain,uztickets.com,detect,high,2027-04-23,MATCHWOK C&C in this intrusion (delivery chain only),campaign:MythicRatatoskr
domain,egyptanimals.com,detect,medium,2027-04-23,MATCHWOK fetched from here in this intrusion; likely abused third-party site,campaign:MythicRatatoskr
# NOTE: every row is DETECT. No indicator has two independent sources (the ESET article and the ESET GitHub file are one vendor; press coverage carries no atomic values).
# NOTE: Falcon IOC Management ingests sha256, md5, domain and IP types. The sha1 rows are for TIP, EDR search and Query 4; they are not importable as-is.
# NOTE: Yggdrasil public peers are legitimate community nodes. They are in Queries 5 and 6 and the Behavioral block, not in this import.
# NOTE: SDelete, OneDrive and Defender are not listed. Block only the attacker hashes above, never the stock tool or a masquerade name alone.
Microsoft Defender indicators CSVSettings, Endpoints, Indicators, Import: audit only
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert
FileSha1,d5f9288daebf87ae4579945f8dc6cf235b093cfd,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (Act64.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,b69ef0e45b401440c0fde22046775d0c57e87415,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (ie.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,4e3e6577866e4ce2ed73ca089700ae04230e768f,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (ieupdate.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,69969eeb7e0a3d84c4e70193636fcf934c6aa388,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (ieupdate.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,01855153ca7a33ad5ff36451de5612dfba0dd2ca,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (krbtman.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,e29af83a07fb32eb47c28733a9382e766d53f704,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (OneDriveLiveUpdater.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,028ca11f3f0d8396043af7bf756231fc2f50f829,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (windowsdefendersvc.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,9085896989947c0919a660352f75f6b233fc645b,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (windowsdefendersvc.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,d7e6a5a46c6ed3510997e91b11e51be0250fd2a2,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (updater.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,131a371a1e4ee78ec3b2863607c99290ec3b58a6,Audit,bindProxy SOCKS5 server,bindProxy SOCKS5 server (krbtman.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,09c816697c0c2aff9b4ff58681558ca30d04c9cd,Audit,bindProxy SOCKS5 server,bindProxy SOCKS5 server (nbtresolver.exe),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,8ceb5f8bcdf4995b7164996f1629d682613bb17b,Audit,MythicRatatoskr backdoor,MythicRatatoskr backdoor (ieupdate.exe) ESET article spelling; GitHub file differs by one character,2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha1,8ceb5f8bcdf4995b7164996f1429d682613bb17b,Audit,ieupdate.exe as spelled in the ESET GitHub file; differs fro,ieupdate.exe as spelled in the ESET GitHub file; differs from the article by one character,2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,uztickets.com,Audit,MATCHWOK C&C in this intrusion,MATCHWOK C&C in this intrusion (delivery chain only),2027-04-23T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,egyptanimals.com,Audit,MATCHWOK fetched from here in this intrusion; likely abused ,MATCHWOK fetched from here in this intrusion; likely abused third-party site,2027-04-23T00:00:00.0Z,Medium,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 this block maps only SHA-1, SHA-256, IPv4, domain and URL indicators: ipv6 1. 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).

SentinelOne IOC importnot included

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.

Behavioral Signaturespaths, config, protocol constants
# Service and files (names are masquerades; judge by path + hash, not name)
Service name:            ieupdate
Install paths (ESET Table 1):
  C:\windows\system32\updater.exe
  C:\Windows\system32\krbtman.exe
  C:\windows\system32\windowsdefendersvc.exe
  %localappdata%\Microsoft\OneDrive\OneDriveLiveUpdater.exe
  c:\program files (x86)\microsoft.net\adomd.net\110\applicationasphost.exe
  C:\OFFICE2010\Utilities\Act64.exe
  %userprofile%\Downloads\WindowsDefenderSvc.exe
  %userprofile%\Downloads\ieupdate.exe
  %userprofile%\Downloads\ie.exe
  %userprofile%\AppData\Local\Internet Explorer\ieupdate.exe
  %userprofile%\AppData\Local\ieupdate.exe
Hidden encrypted config (dot-prefixed):
  C:\Windows\Temp\.updatecache
  C:\Windows\system32\.updatecache
  %LocalAppData%/Temp/.crond        (forward slashes are the attackers' typo)
  /tmp/.test_config                 (unused string; hints at a Unix variant)
bindProxy SOCKS5 server paths:
  C:\Windows\system32\krbtman.exe
  %userprofile%\Downloads\krbtman.exe
  %localappdata%\SMBCache\nbtresolver.exe
  listens 127.0.0.1:33690
# Delivery chain (this intrusion only)
Scheduled task:          pdfopentask  ->  PowerShell payload %temp%\temporarydoc.txt
HKCU Run value:          UpdateMonitor  (HKCU\Software\Microsoft\Windows\CurrentVersion\Run)
# Protocol and config constants (memory, YARA and PCAP work; not endpoint-telemetry fields)
Config crypto:           AES-256-CFB, first 16 bytes = IV, key (base64) US3pM9KFxrZBSgc1pGl2wO4Kir1XjZP5Z9kBXBMYd2s=
Config defaults:         sleep 5m, skew 10 (unused), uuid 123 (placeholder), count 5
Check-in UUID:           d71f1722-cf0b-4e27-9f8e-c95ec9b24a23
HTTPS POST JSON types:   checkin, tasking, result, getfile
Commands:                chtime, expose, upload, download, nodeinfo, screenshot, cd, ls, pwd, churl, proxy (start|stop), shell (cmd.exe)
Proxy target (hardcoded): 201:b479:2771:8df4:b5eb:d007:63b0:2838:8080 ; sends the string "test" on connect
Startup delay:           10 minutes in some samples
Go build base:           yggdrasil-go, yggstack, revsocks, go-socks5 ; debug strings "Accepting stream", "Passing off to socks5"
Yggdrasil addressing:    200::/7 ; C&C TLS certificates rotate regularly (revsocks trait)
Named Malware and Toolingnames the sources use
MythicRatatoskr   Go backdoor, Windows service "ieupdate"; ESET detection WinGo/Agent.ZO
bindProxy         Go SOCKS5 server (go-socks5), 127.0.0.1:33690; ESET WinGo/Agent.AOK (krbtman.exe) and WinGo/TrojanProxy.Agent.I (nbtresolver.exe)
yggstack / yggdrasil-go   open-source code the backdoor is built on (legitimate projects; hunt the behavior, not the library)
revsocks          open-source reverse SOCKS code the proxy command is derived from
MATCHBOIL         UAC-0099 downloader, deployed MATCHWOK in this intrusion (documented elsewhere; delivery chain only here)
MATCHWOK          UAC-0099 backdoor, C&C uztickets.com, persisted as HKCU Run value UpdateMonitor
SDelete           Sysinternals secure-delete utility, signed and LEGITIMATE; deployed through Group Policy for the wiping stage (September 2025)
OpenSSH SFTP server   used to push additional samples to other machines
Yggdrasil Public Peer Listegress block / review, not IOCs
# 32 public Yggdrasil peers hardcoded in every ESET-analysed sample (three are chosen at random).
# Legitimate community infrastructure: use for egress BLOCK/alert review, never as malware IOCs.
tls://37.205.14.171:993
tls://109.176.250.101:65534
tls://65.21.57.122:61995
tls://95.217.35.92:1337
tls://51.255.223.60:54232
tls://51.15.204.214:54321
tls://s2.i2pd.xyz:39575
tls://62.210.85.80:39575
tls://vpn.ltha.de:443?key=0000006149970f245e6cec43664bce203f2514b60a153e194f31e2b229a1339d
tls://mlupo.duckdns.org:9001
quic://ip6.fvm.mywire.org:443?key=000000000143db657d1d6f80b5066dd109a4cb31f7dc6cb5d56050fffb014217
tls://helium.avevad.com:1337
tls://yggdrasil.neilalexander.dev:64648?key=ecbbcb3298e7d3b4196103333c3e839cfe47a6ca47602b94a6d596683f6bb358
tls://bode.theender.net:42169?key=f91b909f43829f8b20732b3bcf80cbc4bb078dd47b41638379a078e35984c9a4
tls://g.ygg.yt:443
tls://b.ygg.yt:443
tls://n.ygg.yt:443
tls://ygg1.grin.hu:42444
tls://[2a03:90c0:85::28a]:443
tls://srl.newsdeef.eu:59999
tls://23.137.249.65:444
tls://ygg-nl.incognet.io:8884
quic://0.ygg.l1qu1d.net:11102?key=0000000998b5ff8c0f1115ce9212f772d0427151f50fe858e6de1d22600f1680
tls://london.sabretruth.org:18472
tls://yggdrasil.sunsung.fun:4443
tls://78.27.153.163:33166
tls://193.93.119.42:443
tcp://sysop.link:555
tls://sto01.yggdrasil.hosted-by.skhron.eu:8884
tls://ygg.ace.ctrl-c.liu.se:9999?key=5636b3af4738c3998284c4805d91209cab38921159c66a6f359f3f692af1c908
quic://spain.magicum.net:36900
tcp://y.zbin.eu:7743
Hardening Audit Checklistread-only checks
# Hardening audit checklist (read-only checks)
[ ] Outbound policy: do servers and workstations have default-deny egress? Are the 32 peers above blocked?
[ ] auditpol /get /subcategory:"Directory Service Changes"        (DCs: Success enabled)
[ ] auditpol /get /subcategory:"Security System Extension"        (all: Success enabled, event 4697)
[ ] Get-Service sshd -ErrorAction SilentlyContinue                 (OpenSSH Server present where not sanctioned?)
[ ] Get-GPPermission over GPOs: who can edit/link GPOs beyond Domain Admins?
[ ] Get-MpPreference | select -Expand AttackSurfaceReductionRules_Ids   (ASR rules present; Defender AV in active mode?)
[ ] Offline, immutable backup restore test completed in the last 90 days?
11

Detection Validation Gates

GateRequirementStatus in this pack
Telemetry readyEndpoint sensor on servers, workstations and, ideally, domain controllers. Process creation with SHA-1, service creation, executable-written, outbound connection, listening-socket and DNS telemetry confirmed per tenant (CrowdStrike: ProcessRollup2, CreateService, PeFileWritten, NetworkConnectIP4, NetworkListenIP4, DnsRequest. SentinelOne and Defender equivalents per the platform map). Domain-controller Directory Service Changes auditing enabled for native hunt 3Verify per-tenant
Benign baselineRun Q2, Q3, Q5, Q6, Q11, Q14 and Q15 in investigate mode for 14 days. Record approved Yggdrasil users, secure-erase hosts, OpenSSH Server hosts and any software that legitimately drops an updater.exeRequired before go-live
Positive testsLab only. Q1: create a service named ieupdate pointing at a benign executable (sc.exe create ieupdate binPath= "C:\Windows\System32\notepad.exe" then delete it). Q9: bind any test listener to 127.0.0.1:33690. Q11 and Q12: run SDelete against a scratch file on three lab hosts with one identical command line. Never run real malware or touch the live peers from productionPending
Promotion criteriaZero unexplained hits over the baseline before any IOA leaves Detect. Q1, Q4, Q9, Q10 and Q12 have a small false-positive surface and can alert on day one; Q5, Q6 and Q11 stay at review severityPending
12

Hardening: Tiered

Immediate (this week, low compatibility risk)
  1. Block the 32 public Yggdrasil peers at egress and DNS. ESET calls this a viable mitigation, and it is the only control that denies the backdoor its way into the mesh. MITRE M1037 Filter Network Traffic and M1031 Network Intrusion Prevention; CIS Controls v8 Control 13 (Network Monitoring and Defense). Verify: a test connection to a listed peer fails and Q5 and Q6 show only blocked attempts.
  2. Turn on the audit trail that the wiping stage depends on. Enable Audit Directory Service Changes on domain controllers (event 5136) and Audit Security System Extension everywhere (event 4697). MITRE M1047 Audit; Microsoft advanced security audit policy guidance and the CIS Microsoft Windows Server Benchmarks audit-policy section. Verify with auditpol /get.
  3. Shrink who can create, edit and link Group Policy. Remove GPO edit and link rights from everyone except named Tier 0 administrators. MITRE M1026 Privileged Account Management and M1018 User Account Management; Microsoft enterprise access model (tiering). Verify with Get-GPPermission.
  4. Protect backups from the wiper. Keep an offline or immutable copy that Group Policy cannot reach and test a restore. MITRE M1053 Data Backup (T1485); CIS Controls v8 Control 11 (Data Recovery).
Near term (1 to 4 weeks, pilot first)
  1. Application control for user-writable and System32 paths. Deny execution of unsigned binaries from Downloads, %LocalAppData% and user profile folders, and flag unsigned new files in System32. MITRE M1038 Execution Prevention; Microsoft WDAC / AppLocker documentation; CIS Controls v8 safeguards on authorized software allowlisting. Verify with Q2 and Q3 going quiet.
  2. Disable OpenSSH Server where it has no role. The intrusion moved implants through an OpenSSH SFTP server. MITRE M1042 Disable or Remove Feature and M1035 Limit Access to Resource over Network. Best-practice: no formal CIS item covers an unused optional Windows feature, flagged ⚠ best-practice, no formal benchmark. Verify with Get-Service sshd.
  3. Attack surface reduction for the email entry point. Audit then enforce the rules that block executable content from email clients and Office child processes. MITRE M1040 Behavior Prevention on Endpoint and M1049 Antivirus/Antimalware; Microsoft ASR rules reference. Requires Defender Antivirus in active mode.
  4. Default-deny egress for servers. Servers rarely need arbitrary outbound TLS on odd ports; allow named destinations only. MITRE M1037; CIS Controls v8 Control 13.
Strategic (1 to 3 months, architecture or budget)
  1. Privileged access workstations and a GPO change workflow. Only a hardened admin tier edits Group Policy, with change approval and an alert on any GPO change near a business off-hours window. MITRE M1026, M1032 Multi-factor Authentication; Microsoft enterprise access model.
  2. Inspect or proxy all outbound TLS from server tiers so mesh and tunnel traffic is visible even when addresses are not on a list. MITRE M1031.
  3. Treat an ieupdate hit as a Tier 0 compromise. Pre-plan the credential reset, SYSVOL review and rebuild procedure so containment starts hours, not days, after detection (Section 14).
13

Deployable Playbooks

Playbook 1: egress block of the hardcoded Yggdrasil peers (Windows Firewall)

Step 1. Block the ten raw-IP peers outbound on managed Windows hosts.
Prerequisites: local administrator or a GPO with firewall write rights; confirm no sanctioned Yggdrasil use (Q5 baseline).
Reboot required: No
$peers = @('37.205.14.171', '109.176.250.101', '65.21.57.122', '95.217.35.92', '51.255.223.60', '51.15.204.214', '62.210.85.80', '23.137.249.65', '78.27.153.163', '193.93.119.42')
New-NetFirewallRule -DisplayName 'HuntPack-Block-Yggdrasil-Peers' -Direction Outbound -Action Block -RemoteAddress $peers -Profile Any
Verify: Get-NetFirewallRule -DisplayName 'HuntPack-Block-Yggdrasil-Peers' | Get-NetFirewallAddressFilter
Rollback: Remove-NetFirewallRule -DisplayName 'HuntPack-Block-Yggdrasil-Peers'

Step 2. Sinkhole the hostname peers on the internal DNS server (Windows DNS policy shown; use your resolver's RPZ equivalent otherwise).
Prerequisites: Windows Server 2016 or later DNS role; DnsServer module; run on each DNS server.
Reboot required: No
Add-DnsServerQueryResolutionPolicy -Name 'HuntPack-Block-Ygg-yt' -Action DENY -Fqdn 'EQ,*.ygg.yt'
Add-DnsServerQueryResolutionPolicy -Name 'HuntPack-Block-Ygg-neilalexander' -Action DENY -Fqdn 'EQ,yggdrasil.neilalexander.dev'
# repeat for the remaining hostnames in the Yggdrasil Public Peer List block
Verify: Resolve-DnsName g.ygg.yt -Server <dns-server>   (expect a refusal)
Rollback: Remove-DnsServerQueryResolutionPolicy -Name 'HuntPack-Block-Ygg-yt' -Force   (and each additional policy name)

Playbook 2: audit policy for Group Policy changes and service installs

Step 1. Record the current audit policy, then enable the two subcategories.
Prerequisites: domain admin for the DC step; run the first command on every host you change.
Reboot required: No
auditpol /backup /file:C:\Windows\Temp\audit-before.csv
auditpol /set /subcategory:"Directory Service Changes" /success:enable      (domain controllers)
auditpol /set /subcategory:"Security System Extension" /success:enable      (all hosts)
Verify: auditpol /get /subcategory:"Directory Service Changes","Security System Extension"
Rollback: auditpol /restore /file:C:\Windows\Temp\audit-before.csv
Note: size the Security log first; Directory Service Changes is moderately chatty on busy DCs.

Playbook 3: disable OpenSSH Server where unused

Step 1. Stop and disable the sshd service on hosts with no sanctioned SSH role.
Prerequisites: inventory of administrators who rely on SSH; confirm with Q15 baseline.
Reboot required: No
if (Get-Service sshd -ErrorAction SilentlyContinue) { Stop-Service sshd -Force; Set-Service sshd -StartupType Disabled }
New-NetFirewallRule -DisplayName 'HuntPack-Block-Inbound-22' -Direction Inbound -Protocol TCP -LocalPort 22 -Action Block
Verify: Get-Service sshd | Select Status,StartType
Rollback: Set-Service sshd -StartupType Automatic; Start-Service sshd; Remove-NetFirewallRule -DisplayName 'HuntPack-Block-Inbound-22' 

Playbook 4: attack surface reduction rules in audit mode

Step 1. Audit the email-executable and Office child-process rules for 30 days before enforcing.
Prerequisites: Microsoft Defender Antivirus in active mode (ASR is not applied in passive mode, so skip this on hosts where another AV is primary).
Reboot required: No
Add-MpPreference -AttackSurfaceReductionRules_Ids be9ba2d9-53ea-4cdc-84e5-9b1eeee46550,d4f940ab-401b-4efc-aadc-ad5f3c50688a -AttackSurfaceReductionRules_Actions AuditMode,AuditMode
Verify: Get-MpPreference | Select AttackSurfaceReductionRules_Ids,AttackSurfaceReductionRules_Actions
Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids be9ba2d9-53ea-4cdc-84e5-9b1eeee46550,d4f940ab-401b-4efc-aadc-ad5f3c50688a

Playbook 5: Group Policy edit-rights review (read-only, no change)

Step 1. List who can edit or link each GPO, then review for non-Tier-0 principals.
Prerequisites: GroupPolicy module (RSAT); domain read access.
Reboot required: No
Get-GPO -All | ForEach-Object { $g=$_; Get-GPPermission -Guid $g.Id -All | Where-Object { $_.Permission -match 'GpoEdit|GpoEditDeleteModifySecurity' } | Select @{n='GPO';e={$g.DisplayName}},Trustee,Permission }
Rollback: none required, this step only reads permissions. Any later permission removal is reverted with Set-GPPermission using the saved output.
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-isolate any host with the ieupdate service, an ESET hash, a masquerade binary or a 33690 listener. Do not wait for a C&C block: the C&C is mesh-internal. Block the 32 public peers at egress and DNS. If SDelete is already fanning out, disable the offending GPO link and stop the Group Policy refresh path firstIR lead, network teamQ1, Q4, Q9, Q12 results; host isolation log
Isolate: by platformCrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation).IR lead, network teamQ1, Q4, Q9, Q12 results; host isolation log
ScopeRun Q1 to Q15 over 90 days. Pivot on each hit host for binaries written in the prior 15 minutes (Q2), SFTP server activity (Q15) and the pdfopentask / UpdateMonitor chain (Q13). Treat 2025-07-17-style timing, backdoor first and wiper weeks later, as the expected patternThreat hunterQuery exports; host timeline
EradicateStop and delete the ieupdate service (sc.exe stop ieupdate, sc.exe delete ieupdate) after imaging; remove the binaries and the hidden .updatecache and .crond files; remove pdfopentask and the UpdateMonitor Run value; reset credentials for any account that edited Group Policy. If a domain admin credential could have been exposed, follow the full AD recovery procedure including resetting the krbtgt account twiceIR lead, AD teamForensic images; before and after service lists; GPO change log
RecoverRestore wiped hosts from offline backups, rebuild before re-joining the domain, review SYSVOL and every GPO for unexpected scheduled tasks and scripts, then re-enable the removed GPO links in a staged wayInfrastructure teamRestore test log; SYSVOL diff
HardenApply Section 12 immediate controls first (peer block, audit policy, GPO rights, offline backups), then the near-term listSecurity engineeringVerification commands from Section 13
15

Detection Coverage Map

TechniqueBehaviorCQLIOACrowdStrike coverageSentinelOneDefender XDR
T1543.003Service ieupdate and masquerade service imagesQ1, Q3, Q4Q3Good name, path and hash. A renamed service with a new binary is missed except by Q10, Q8 and Q9Partial: Q1 approximatePartial: Q1 approximate
T1036.005Masquerade names written or run from observed pathsQ2, Q3, Q4Q3Partial path-bound to ESET-observed locations; new paths are missedPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1090.003 / T1573Mesh C&C and public-peer joinsQ5, Q6, Q7, Q8Q5Partial underlay only; overlay traffic is user-space and invisible. Peer list is static (32 entries)Partial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1090.001bindProxy SOCKS5 on 33690Q9, Q4Q9Good if the sensor reports loopback listeners; confirm on a tenantPartial: Q9 approximateGood, with assumptions
T1059.003shell command through cmd.exeQ10Q10Good for the masquerade-parent case; a renamed parent is missedGood, with assumptionsGood, with assumptions
T1027.013Hidden encrypted config filesQ10-GAP file creation of .updatecache and .crond is outside endpoint telemetry; native hunt 6 and Sysmon EID 11GAP: same limit as CrowdStrikeGAP: same limit as CrowdStrike
T1113 / T1005 / T1041screenshot, ls, download, exfiltration--GAP in-process and mesh-internal; no telemetryGAPGAP
T167810-minute start delay--Partial behavioral only; use 30-day windowsNo queryNo query
T1021.004 / T1570OpenSSH SFTP lateral transferQ15, Q2-Partial depends on the host baselinePartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1053.005 / T1547.001pdfopentask, temporarydoc.txt, UpdateMonitorQ13Q13Good for this intrusion's names only; the wider UAC-0099 chain is a separate packPartial: Q13 approximatePartial: Q13 telemetry gap
T1071.001MATCHWOK domainsQ14-Partial two domains; ESET-onlyPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
T1484.001Group Policy modification--GAP domain-controller audit events, not endpoint telemetry; native hunts 3 to 5GAPGAP
T1485SDelete data wipingQ11, Q12Q11Partial execution is seen, the overwrite itself is not; Q12 is strongest at fleet scalePartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Linux variantHints of a Unix build (.crond, /tmp/.test_config)--GAP no sample or ESET indicators; unhuntedGAPGAP

Validation gates (Section 11) apply: no IOA leaves Detect before a 14-day baseline. Largest gaps: config-file creation, Group Policy edits on the domain controller, and anything that happens inside the mesh.

16

Hunt Summary Ticket

TITLE: MythicRatatoskr Yggdrasil-enabled backdoor and Sandworm SDelete wiping stage (UAC-0099 to Sandworm handoff)
SEVERITY: Critical (destructive follow-on, state-aligned actor; ESET report 2026-10-22)
SCOPE: Windows endpoints and servers, domain controllers and Group Policy; egress to public Yggdrasil peers
HYPOTHESIS: A masquerade-named Go service (ieupdate) is beaconing through public Yggdrasil peers, and a later Group Policy-delivered SDelete run wipes the estate
QUERIES: Q1 to Q15 (Section 8); IOA candidates Q3, Q5, Q9, Q10, Q11, Q13 (Section 9); native hunts (Section 7)
DO FIRST:
  1. Run Q1, Q4 and Q9 over 30 days; run Q12 for any SDelete fan-out
  2. Block the 32 public Yggdrasil peers at egress and DNS (Section 13, Playbook 1)
  3. Verify offline backups and review who can edit Group Policy (Playbook 5)
FINDINGS: [populate per engagement]
GAPS: config-file creation, screenshot and file reads, Group Policy edits and all mesh-internal traffic are outside endpoint telemetry; Linux variant unhunted (Section 15)
ACTIONS: block peers; isolate hits; audit GPO changes; protect backups; reset GPO-admin credentials on any hit
OWNER: [assign per engagement]
VERSION: v0.1, 2026-10-23
17

Changelog

v0.12026-10-23Initial release. Built from the ESET Research report of 2026-10-22 and ESET's malware-ioc file, with The Record and The Next Web as independent corroboration of the narrative. 15 CQL queries, 16 atomic indicators, all at detect. SHA-1 spelling discrepancy between ESET article and GitHub file noted. SentinelOne PowerQuery and Microsoft Defender KQL tabs added to Q1-Q15: SIEM Query Rosetta release 0.1.0 (public-beta; static-reviewed translations).
18

References

TierSourceUsed ForAccess Date
1ESET Research, MythicRatatoskr report (2026-10-22)All technical detail, hashes, C&C, peers, ATT&CK table2026-10-23
1ESET malware-ioc, mythicratatoskr folderHash table cross-check; SHA-1 discrepancy2026-10-23
2The Record, "Russian hackers teamed up to wipe data at Ukrainian grain firm"Independent narrative corroboration2026-10-23
2The Next Web, ESET Yggdrasil report coverageIndependent narrative corroboration; SDelete and dates2026-10-23
1MITRE ATT&CK T1485 Data DestructionMapping and mitigation M10532026-10-23
1MITRE ATT&CK T1484.001 Group Policy ModificationMapping and auditing guidance2026-10-23
1MITRE ATT&CK T1090.003 Multi-hop ProxyMapping2026-10-23
1Microsoft, Attack surface reduction rules referenceASR rule GUIDs and requirements2026-10-23