AOMEI Backupper Supply-Chain Tampering (UNC7017): CROSSROAD and SHINYROAD

Ephemeral supply-chain tampering of AOMEI Backupper and AnyViewer update infrastructure, April to July 2026. Source: Google Threat Intelligence Group and Mandiant, with ManageEngine Threat Analysis Lab.
Threat
UNC7017: AOMEI update-channel tampering
Malware
CROSSROAD, SHINYROAD, ADAPTAGENT
Severity
HIGH
Type
Software supply chain
Access
Unauthenticated remote config (no CVE)
Version
v0.1 (Draft) · 2026-10-18
Author
HuntPack
Confidence
High (two sources)
01

Executive Summary

Between April and July 2026 an actor tracked by Google Threat Intelligence Group and Mandiant as UNC7017 tampered with the update and notification configuration files that AOMEI Backupper and AnyViewer fetch from AOMEI infrastructure. Each tampering window lasted about 5 to 10 minutes and then reverted to authentic content, so a later check of the vendor URL shows only clean files. Any machine whose AOMEI background services polled during a window was handed a CROSSROAD downloader, which stages the SHINYROAD backdoor (a signed Radmin launcher sideloading a malicious DLL that registers a COM server hosting an embedded PocketPy interpreter). In mid-July the actor also pushed ADAPTAGENT, an Adaptix C2 agent disguised as Nitro PDF software, and added a 1x1 invisible popup that coerces WebDAV/NTLM authentication to an actor server.

No software vulnerability was exploited: the client followed its own update logic against unauthenticated remote configuration. The highest-value defensive angle is therefore endpoint lineage, not the vendor URL: an AOMEI updater process starting an executable from its own html or tmphtml directory (Q1), the two scheduled task names (Q3), the Radmin launcher with --runtimechk (Q4), and user-profile sideload drops (Q5).

Defender priority: vendor-side remediation does not clean endpoints that already ran the payload. Hunt the whole April to July 2026 period on every host that ever ran AOMEI Backupper or AnyViewer, treat WebDAV/NTLM exposure as a credential event even where no binary ran, and do not dismiss an updater-child alert because the vendor URL looks clean now.
02

Source Review & Web Hunter Notes

TierSourceKey findingCarry forwardSnapshot
1Google Threat Intelligence Group / Mandiant: Investigating Ephemeral Supply Chain Tampering (2026-10-15)Authoritative campaign report: tampering windows, config diffs, CROSSROAD and SHINYROAD internals, ADAPTAGENT, IOCs, YARA, ATT&CKYes01-mandiant-gtig.txt
1ManageEngine Threat Analysis Lab: AOMEI Backupper supply-chain compromise (2026-10-16)Discovery telemetry from 28 May and 16 July, process lineage, payload analysis, Sigma rules, its own hash tableYes (partial overlap with source 1)02-manageengine.txt

Decisions and discrepancies

  • Independence. The Mandiant report credits ManageEngine with the initial discovery and the two vendors coordinated, so their prose overlaps. ManageEngine does carry its own endpoint telemetry and its own hash table. Only indicators that appear in both snapshots (the BlkScrDl.dll hash, the component.zip hash, and 8.218.65.184) were allowed to ship as prevent or critical; everything else is detect.
  • Domain spelling. One ManageEngine table writes the package host without the hyphen (storagedata). The Mandiant report and ManageEngine's own body text use storage-data.com. The hyphenated form is shipped; the unhyphenated variant is not.
  • Radmin location. Mandiant places the components in %LOCALAPPDATA%\Radmin\; ManageEngine records the genuine Radmin Server installer writing to a Program Files (x86) rserver30 folder. Queries match the \Radmin\ folder name and the user-profile path separately rather than assuming one.
  • Guardrails. Mandiant states CROSSROAD aborts when the country code is CN. ManageEngine adds that it also terminates when geolocation cannot be resolved and when specific endpoint security agents are present (agents not named). Only the CN rule is in the Mandiant text.
  • Technique ID. Mandiant maps DLL hijacking to T1574.001; ManageEngine uses T1574.002. This pack follows the Mandiant IDs.
  • Not shipped as indicators: the three legitimate file hashes (WinLpcDl.dll, WinLpcDl2.dll, Nitro_Scan2PDFApp.exe) are listed as context only; the benign decoy file hash is omitted; 96.126.191.98 is the IP found in the actor's allowlist file (a target filter, not shown to be actor infrastructure) and is a hunt pivot, not a block; the two declared MD5 values for the malicious archives are shipped as detect.
  • Radmin never armed. ManageEngine found Radmin Server installed without a configured address or credential and no active listener; remote access in its sample came from the implant's outbound connection. Treat Radmin presence as staging, not proof of an active Radmin session.
  • Attribution confidence. UNC7017 is an uncategorized cluster. Neither source names a nation or sponsor and this pack does not.
03

Hunt Brief & Attack Chain

Hunt hypotheses (highest fidelity first)

#HypothesisMITRETelemetryConfidenceQuery
H1An AOMEI updater child process runs from html or tmphtml.T1195.002, T1036.005Process creationHighQ1
H2CROSSROAD deletes itself via a --nitrod child and the :wtfbbq stream rename.T1070.004, T1564.004Process creation; file stream telemetry (native)High (flag); gap (stream)Q2
H3The loader registers RadminComponentRuntime or NitroRuntime.T1053.005Scheduled task registrationHighQ3
H4A signed Radmin launcher runs with --runtimechk from a user profile and sideloads BlkScrDl.dll.T1574.001Process creation; executable writesHighQ4, Q5
H5SHINYROAD registers a COM server and spawns a shell from the launcher or dllhost.T1559.001, T1059.006Registry writes; process creationMediumQ6, Q7
H6Campaign binaries look up their external IP, then reach campaign infrastructure.T1016, T1614, T1571DNS lookup; outbound connectionHighQ8, Q9, Q10, Q14
H7ADAPTAGENT is staged under a Nitro PDF masquerade with hidden PowerShell.T1059.001, T1036.005Process creationHighQ11
H8A hijacked popup coerces outbound SMB or WebDAV authentication.T1187Outbound connection; native logsMediumQ12

Attack chain

StepBehaviorTelemetry (plain terms, then platforms)Hunt angle
1Actor edits down_html.ini (version, MD5, URL) and Notifycfg.ini for 5 to 10 minutesServer side; at the endpoint only a cached config copy and proxy logs (outside endpoint telemetry)Native hunt N1, N2: cached ini in Tmphtml, proxy record at alert second
2Backupper.exe downloads upgrade-now.zip and stages it to tmphtml, then htmlExecutable or file written with path (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents)Executable written under AOMEI tmphtml (Q1 covers the launch)
3ABNotify.exe executes upgrade-now.exe; 35,000-line Notifycfg.ini forces the update pathProcess creation with command line, path, parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)Q1; native N2 for the dummy-section bloat
4CROSSROAD guardrails: AOMEI path check, external IP lookup, abort on CN, named mutexDNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents, confirm on tenant)Q8; mutex has no endpoint telemetry (gap)
5Config reversion: thrid reset to 5 and URL pointed back to AOMEIFile modification of the cached ini (outside default endpoint telemetry)Native N1
6Download component.zip or en.zip to %TEMP%\svc*.tmp, unpack to local app dataExecutable or file written; outbound connection (CrowdStrike: NetworkConnectIP4, DnsRequest)Q5, Q9, Q10
7Task RadminComponentRuntime runs FamItrfc.exe --runtimechk every 3 hoursScheduled task or service created (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register. Defender: DeviceEvents ScheduledTaskCreated)Q3, Q4
8Self-deletion: copy to temp, --nitrod, rename :$DATA to :wtfbbq, delete on closeProcess creation; NTFS stream telemetry (not in default endpoint telemetry)Q2; native N3 (Sysmon stream hash event)
9FamItrfc.exe sideloads BlkScrDl.dll; COM server registered; shared memory section mappedExecutable written; registry value set (CrowdStrike: RegGenericValueUpdate, AsepValueUpdate)Q5, Q7; shared memory has no telemetry (gap)
10RuntimeComponent.dll decrypts metadata.dat (ChaCha20) and runs PocketPy bytecode in memory; C2 on 8.218.65.184Outbound connection with processQ9, Q14; in-memory stage is a gap
11Interactive shell, chaffed C2 traffic, runtime extensionProcess creation with parent; network (chaffing is a network-layer signal)Q6; chaffing not detectable at the endpoint
12Mid-July: ADAPTAGENT via NitroPromotion.exe, task NitroRuntime, Eztwain4.dll sideload, 2-minute beacons to 8.210.84.56:6800Process creation; scheduled task; outbound connectionQ3, Q5, Q11, Q14
1320 July: 1x1 popup to a file:// UNC path forces WebDAV/NTLM to 8.210.84.56Outbound connection (SMB 445, WebDAV over HTTP); NTLM audit log (native)Q12, N4, N5

Campaign timeline from the Mandiant report: tampering windows on 28 May 2026 (05:40 to 05:50 UTC), 16 July 2026 (08:33 to 08:39 UTC) and 20 July 2026 (10:35 to 10:40 UTC), plus related samples from late April. The vendor was notified on 17 July and responded on 29 July. Additional windows outside the vendors' visibility are probable.

04

Consolidated IOC Table

TypeValueConfidenceActionContextSnapshot
sha2566670ab3f0434a42f33416f8354150b1701e7615f3cfa2f1635e54f8df0f6eec7mediumdetectupgrade-now.zip (May 20 CROSSROAD archive). CROSSROAD archive01
sha25611e576df44e9c9eef72b9f5b699291bcdb200a19130778ec231e5b0987b913admediumdetectupgrade-now.exe (May 20 CROSSROAD loader). CROSSROAD loader01
sha256130c3970f1c900191615b99d8be522d6a488a3d3b73938896ed937092007d96amediumdetectupgrade-now.exe (28 May endpoint sample). CROSSROAD loader seen on endpoint02
sha2569a58e8f49edf5644e5728f74cf36f560d3d486fa51db4db69d927963c7aca450mediumdetectupgrade-now.exe (July 16 CROSSROAD loader). CROSSROAD loader01
sha256b360b6db0c2b668317edc1504a7c39ef047f0d925c8f113b521f6724c157ae21mediumdetectupgrade-now.exe (July 20 CROSSROAD loader). CROSSROAD loader01
sha2569ed503c6a9a3a493fb859401e9ed469eed77ab9927341964d6dbfbfa6255aebamediumdetectupgrade-now.zip (July 20 CROSSROAD archive). CROSSROAD archive01
sha256d167bc898e856da8a4003cb4dfc7de55fea109eee3cd64fc8999710314109464highpreventcomponent.zip / en.zip (SHINYROAD package). SHINYROAD package; two sources01 + 02
sha2565837bc26a73cfb46ffd466cf889f03ce2f6a48f1f3fd42ec8be22189d51cab1ehighpreventBlkScrDl.dll (malicious sideloaded DLL). SHINYROAD loader DLL; two sources01 + 02
sha2568fbaa74b27dc1e89abfc694e834378746f0ad37a688098c5f8f511410157c8b8mediumdetectRuntimeComponent.dll (PocketPy engine). SHINYROAD implant DLL01
sha2564c0a75e0f62ddc0bb350c224fe996f3b2ab08dcb0d288231c61ffe9406c7045bmediumdetectconfig.zip (Python bytecode archive). SHINYROAD payload archive01
sha2564b4d25b3501519476f9a62a88a781e4f446f669280eb5e98c6b96eb6d3743431mediumdetectmetadata.dat (ChaCha20 payload). SHINYROAD encrypted payload01
sha256100657d3e205bfd0e96f1c088ae1739b50657592a696201467b4c65b7d36289amediumdetectWNTestdll.dll. Related DLL named in ManageEngine hash table02
sha25653b7d01163ccb679001f20e4a8a5e1f33d5d2837c375315f6514cc820f81bd12mediumdetectSample listed as hunted VirusTotal sample. ManageEngine hunted sample; function not stated02
sha25614b31918075e6130b9123158743db0a81e2d7bfcf6d39731ee7d9200a98cd591mediumdetectNitroPromotion.exe (ADAPTAGENT launcher). ADAPTAGENT launcher01
sha2568c8090aca8ddb1cf968d2b810457e0cfce97c03cd721f70d2eca7f37f2681fc4mediumdetectEztwain4.dll (ADAPTAGENT helper DLL). ADAPTAGENT sideloaded DLL01
sha2567b252be444dee2fb2a57043a823dc5b5e1fae970aea91ee2c8339aa70329969dmediumdetectabe.exe (secondary payload). Secondary payload; role not described01
sha256924ad92d89dde577d5858b2ebc5703a485467842d78e98b75019b2e2e0ac3fe6mediumdetectdown_html.ini (tampered July 16). Tampered AOMEI update config01
sha256f2a7d0a4c8613a9cdd31ede6131b27040c0571ca97970b245a710191806d7ac4mediumdetectdown_html.ini (tampered July 20). Tampered AOMEI update config01
sha256a984fdb0830760446d2b599b263506e01fcf1e560a31a057c3bbe7b3f8ac155dmediumdetectdown_html.ini (ManageEngine volatile hash). Tampered AOMEI update config02
sha256d2f9ef2429312667f0512504b6a19ba4a9cc5514f1b2933923dd42f75a1c5934mediumdetectNotifycfg.ini (tampered July 16). Tampered notification config with dummy sections01
sha256286e0d8c7bdfaa7c251a3e8f0f2fefbe25c67586c0149d39b1095c89dc6023c8mediumdetectNotifycfg.ini (tampered July 20 WebDAV). Tampered notification config with WebDAV popup01
sha2562e3b4bfb86224f079b8762ce78bb7ff10afdbf8421b08b23e96429f2e1ee7b50mediumdetectNotifycfg.ini (ManageEngine volatile hash). Tampered notification config02
md531323e7e738230fa6a8deef2b7894666mediumdetectJuly 16 declared MD5 for the malicious upgrade-now.zip01
md5bf73c4391b58ca95220ce3ae03f66dcfmediumdetectJuly 20 declared MD5 for the malicious upgrade-now.zip01
ipv48.210.84.56mediumdetectWebDAV NTLM target and Adaptix C201
ipv48.218.65.184highdetectSHINYROAD C2, ports 41397 and 44301 + 02
ipv447.239.60.117mediumdetectSecondary infrastructure01
domainstorage-data.commediumdetectThreat actor domain01
domainpromotion.storage-data.commediumdetectStage-2 dropper and component staging01
domainaomei.storage-data.commediumdetectStage-3 payload staging01
domainserv.oss-cn-hongkong.aliyuncs.commediumdetectAlibaba Cloud OSS bucket used for April and May staging01
urlhttps://promotion.storage-data.com/download/abpopup/upgrade-now.zipmediumdetectStaging or delivery URL01
urlhttps://promotion.storage-data.com/config/component.zipmediumdetectStaging or delivery URL01
urlhttps://promotion.storage-data.com/config/en.zipmediumdetectStaging or delivery URL01
urlhttps://promotion.storage-data.com/config/whitelist.inimediumdetectStaging or delivery URL01
urlhttps://storage.googleapis.com/aomeiupdate/upgrade-now.zipmediumdetectStaging or delivery URL01
urlhttps://storage.googleapis.com/aomeiupdate/component.zipmediumdetectStaging or delivery URL01
unc\\8.210.84.56\DavWWWRoot\campaign\24hour-flash-sale.htmlmediumdetectWebDAV NTLM coercion resource01
ipv496.126.191.98lowhuntIP in the actor's whitelist.ini allowlist (observed June 22). A target filter, not shown to be actor infrastructure. Pivot only.01
sha2562d99e9d732ff9304d97c7856b052ca520ae689fec1ce86df724de741913afa4bhighenrichWinLpcDl.dll (legitimate Radmin component). Legitimate. Do not block; listed so analysts do not alert on it alone.01
sha256dad559ae9bc977783c7251591eeb7aa432b860ce821ccf10b1260fd0e650c951highenrichWinLpcDl2.dll (legitimate Radmin component). Legitimate. Do not block; listed so analysts do not alert on it alone.01
sha256d71a119b4950ee88dd36205176d989a64df5248ac268591d4bbb78621a73acbdhighenrichNitro_Scan2PDFApp.exe (legitimate signed binary abused for sideloading). Legitimate. Do not block; listed so analysts do not alert on it alone.01

Prevent is set only for the two hashes that appear in both snapshots (the BlkScrDl.dll loader and the component.zip package). The signed Famatech binaries FamItrfc.exe and FamItrf2.exe, the Radmin support DLLs and the Nitro Pro file names are legitimate product artifacts and ship detect-or-enrich only. Hashes are perishable for this campaign: the dropper is rebuilt per window and self-deletes.

05

Affected Surface & Telemetry Matrix

SurfaceTelemetry (plain terms, then platforms)PriorityGap
Endpoints running AOMEI Backupper or AnyViewer (Windows)Process creation with parent and command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)CriticalNone for lineage; hosts without the sensor during April to July are unobservable
User-profile Radmin and Nitro Pro foldersExecutable or file written with path (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents)HighNon-PE files (config.zip, metadata.dat, ini) are outside endpoint telemetry
Scheduled tasksScheduled task or service created (CrowdStrike: ScheduledTaskRegistered. SentinelOne: Task Register. Defender: DeviceEvents ScheduledTaskCreated)HighConfirm field names for the task action on your tenant
COM registrationRegistry value set (CrowdStrike: RegGenericValueUpdate, AsepValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents)MediumPer-user COM keys may not be collected; silence is not proof
Egress to actor infrastructureOutbound connection and DNS lookup with process (CrowdStrike: NetworkConnectIP4, DnsRequest. SentinelOne: IP Connect, DNS Resolved)HighProxy and firewall logs outside endpoint telemetry carry the User-Agent strings
Vendor distribution serversOrigin web server and storage bucket integrity logsVendor onlyOutside endpoint telemetry; the cached ini on the host is the only local evidence
NTLM credential exposureNTLM operational audit log, domain controller logonsHighOutside endpoint telemetry
06

ATT&CK Mapping

TacticTechniqueNameObserved behaviorQuery or control
Resource DevelopmentT1583.001Acquire Infrastructure: Domainsstorage-data.com and promotion. and aomei. subdomainsQ10
Resource DevelopmentT1583.006Acquire Infrastructure: Web ServicesAlibaba Cloud OSS bucket and a public Google Cloud Storage bucket as stagingQ10, native N1
Resource DevelopmentT1608.001Stage Capabilities: Upload Malwareupgrade-now.zip, component.zip, en.zip staged before each windowIOC blocklist
Initial AccessT1195.002Compromise Software Supply ChainEphemeral edits to AOMEI .ini filesQ1, N1
ExecutionT1059.001PowerShellHidden Start-Process of NitroPromotion.exeQ11
ExecutionT1059.006PythonPocketPy bytecode run in memory from RuntimeComponent.dllGap (in memory); Q6
ExecutionT1559.001Component Object ModelBlkScrDl.dll registers an in-process COM serverQ7
PersistenceT1053.005Scheduled TaskRadminComponentRuntime every 3 hours; NitroRuntimeQ3, Q4
Defense EvasionT1574.001Hijack Execution Flow: DLLFamItrfc.exe loads BlkScrDl.dll; Eztwain4.dll sideloadQ4, Q5
Defense EvasionT1480Execution GuardrailsAOMEI path check, external IP lookup, CN abort, mutexQ8
Defense EvasionT1036.005MasqueradingAOMEI metadata on the dropper; Nitro PDF names; Radmin DLL namesQ1, Q5, Q11
Defense EvasionT1027.013, T1140Encrypted file; Deobfuscate/Decodemetadata.dat ChaCha20 decrypted in memoryGap (in memory)
Defense EvasionT1070.004File DeletionSelf-deletion via --nitrodQ2
Defense EvasionT1564.004NTFS File Attributes:wtfbbq alternate data stream renameGap; native N3
Credential AccessT1187Forced Authentication1x1 popup to a file:// UNC WebDAV pathQ12, N4, N5
DiscoveryT1016, T1614Network Configuration; System Location DiscoveryExternal IP reflection lookups, abort on CNQ8
DiscoveryT1082, T1033System Information; Owner/User DiscoveryHostname and username fingerprint for the agent IDGap (in memory)
Command and ControlT1105Ingress Tool Transfercomponent.zip and en.zip download to %TEMP%Q5, Q9, Q10
Command and ControlT1571, T1573.001Non-Standard Port; Symmetric CryptographyTCP 41397 and 6800; handshake key then per-host keyQ9, Q14
Command and ControlT1001.001Junk DataTraffic chaffingGap (network layer)
Command and ControlT1219.002Remote Desktop SoftwareGenuine Radmin 3.x bundleQ4, Q15
07

Native Audit-Log Hunts

#Check
N1Cached AOMEI configuration. Preserve and hash down_html.ini and Notifycfg.ini under %PROGRAMFILES(X86)%\AOMEI\*\Tmphtml\ before anything is cleaned. Look for a non-default URL host, a thrid above the installed build and the shipped hashes. Do not re-fetch the vendor URL as evidence: it reverted within minutes.
N2Config bloat. A Notifycfg.ini with more than 35,000 lines or many [dummy_ sections, or a [PopWindow1] section with a file:// address and Width and Height of 1.
N3NTFS stream telemetry. Sysmon stream-hash events (Event ID 15) or equivalent for a stream named :wtfbbq on upgrade-now.exe.
N4NTLM audit. Enable outgoing NTLM auditing and review the NTLM Operational log for authentication to external addresses from user workstations, especially 8.210.84.56.
N5WebClient service. Check for the WebClient (WebDAV) service starting on workstations and for outbound DAV traffic to public addresses in firewall or proxy logs.
N6Proxy and gateway. Search for User-Agent Anyviewer-loader/1.0 and Anyviewer-ipcheck/1.0, requests to serv.oss-cn-hongkong.aliyuncs.com, and to the Google Cloud Storage path storage.googleapis.com/aomeiupdate/. Correlate with the second an updater-child alert fired.
N7Windows Security and Task Scheduler logs. Event 4698 or Task Scheduler Operational 106 for tasks RadminComponentRuntime and NitroRuntime.
N8Registry. COM keys under Software\Classes\CLSID\ and AppID for the identifiers in section 10, and unusual binary values under HKLM\SYSTEM\Software\Microsoft\TIP\AggregateResults\data as the report advises.
N9Named objects. Handle or object-manager review for the mutex and shared-memory section names in section 10 on suspect hosts (live response only).
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.

All queries are Falcon CQL. Set the time picker to the longest retention you have: the campaign ran April to July 2026 and the payload persists after the vendor reverts its files.

Q1 · Updater process launching an executable from its own staging or rendering directory
CONF HIGHFP LOWCOST LOW

Looks for: ABNotify.exe or Backupper.exe as parent of any .exe whose image path sits under an html or tmphtml directory. This is the CROSSROAD execution step (upgrade-now.exe launched from the html directory by the notification agent).

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: An executable the sensor did not see being created is not captured.
  • PowerQuery assumes: src.process.name holds the creating updater's file name on Process Creation events.
  • PowerQuery assumes: tgt.process.image.path holds the full path of the created image.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A process the sensor did not observe starting is not captured.
  • KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
  • KQL – Defender XDR assumes: The updater's file name is reported without a path in InitiatingProcessFileName.
// HUNT: Updater process launching an executable from its own staging or rendering directory
// MITRE: T1195.002, T1036.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: Process creation with parent and image path
// FALSE POSITIVES: none expected; legitimate AOMEI bundles contain no executables in these directories (ManageEngine)
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| ParentBaseFileName=/^(ABNotify|Backupper)(\.exe)?$/i
| ImageFileName=/\\(html|tmphtml)\\.*\.exe$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Q2 · CROSSROAD self-deletion child (--nitrod)
CONF HIGHFP LOWCOST LOW

Looks for: Any process started with the --nitrod argument. CROSSROAD copies itself to the temp directory and relaunches with --nitrod, passing the parent PID and original path through environment values rather than the command line.

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 started by a sensor-invisible parent is not captured.
  • PowerQuery assumes: tgt.process.cmdline holds the full command line of the created process.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A process the sensor did not observe starting is not captured.
  • KQL – Defender XDR assumes: ProcessCommandLine holds the full command line of the created process.
// HUNT: CROSSROAD self-deletion child (--nitrod)
// MITRE: T1070.004, T1564.004
// CONF: high
// FP: low
// COST: low
// REQUIRES: Process creation with command line
// FALSE POSITIVES: none expected; the flag is specific to this dropper
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| CommandLine=/(^|\s)--nitrod(\s|$)/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Q3 · Persistence tasks RadminComponentRuntime and NitroRuntime
CONF HIGHFP LOWCOST LOW

Looks for: Scheduled task registration with either campaign task name. The task action (FamItrfc.exe --runtimechk) is caught when it runs by Q4.

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: A task registered through the Task Scheduler API with no such command line is not captured; the CQL tab sees the registration event itself.
  • PowerQuery: The CQL anchors the match at the end of the task name; this pane matches the name anywhere in the command line.
  • PowerQuery assumes: The task name appears in the command line of the process that registers the task.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A task registered without a ScheduledTaskCreated event is not captured.
  • KQL – Defender XDR assumes: AdditionalFields is a string in Defender XDR and carries a TaskName key for ScheduledTaskCreated events.
  • KQL – Defender XDR assumes: ScheduledTaskCreated is attested in Microsoft-owned hunting repositories rather than documented on a Learn table page.
// HUNT: Persistence tasks RadminComponentRuntime and NitroRuntime
// MITRE: T1053.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: Scheduled task registration
// FALSE POSITIVES: none expected; neither task name is a stock Radmin or Nitro artifact
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=ScheduledTaskRegistered
| TaskName=/(RadminComponentRuntime|NitroRuntime)$/i
| table([@timestamp, ComputerName, UserName, TaskName, TaskAuthor])
Q4 · Signed Radmin launcher run with --runtimechk or from a user profile
CONF HIGHFP LOWCOST LOW

Looks for: FamItrfc.exe or FamItrf2.exe is authentic Famatech software abused for DLL search-order hijacking. The signal is the argument and the user-profile location, never the binary itself. Do not block the hash.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A launcher renamed to another file name is not captured.
  • PowerQuery assumes: tgt.process.name holds the created file name with its extension.
  • PowerQuery assumes: tgt.process.image.path holds the full path of the created image.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A launcher renamed to another file name is not captured.
  • KQL – Defender XDR assumes: FolderPath holds the full image path of the created process.
// HUNT: Signed Radmin launcher run with --runtimechk or from a user profile
// MITRE: T1574.001, T1053.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: Process creation with command line and image path
// FALSE POSITIVES: Sanctioned Radmin deployments should not use --runtimechk or run from AppData; confirm with the Radmin owner
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| FileName=/^FamItrf[c2]\.exe$/i
| CommandLine=/--runtimechk/i or ImageFileName=/\\AppData\\Local\\Radmin\\.*\.exe$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Q5 · Sideload DLL and launcher drops in user-profile Radmin and Nitro Pro folders
CONF HIGHFP LOWCOST LOW

Looks for: PE files written to AppData\Local\Radmin (BlkScrDl.dll, csvc\RuntimeComponent.dll) or AppData\Local\Nitro Pro (Eztwain4.dll, NitroPromotion.exe). The legitimate Nitro Pro product installs under Program Files, not the user profile.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: approximate-analyticProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Whether the written file is a PE image is not tested; the exact paths carry that meaning.
  • PowerQuery: The match is a substring match, not anchored at the end of the path.
  • PowerQuery assumes: tgt.file.path holds the full path of the written file.
  • PowerQuery assumes: File Modification events are included so a drop that lands as a modification is not missed.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: Whether the written file is a PE image is not tested; the exact paths carry that meaning.
  • KQL – Defender XDR assumes: FolderPath holds the full path including the file name on DeviceFileEvents.
// HUNT: Sideload DLL and launcher drops in user-profile Radmin and Nitro Pro folders
// MITRE: T1574.001, T1036.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: Executable or file written with path
// FALSE POSITIVES: BlkScrDl.dll is described as masquerading as a Radmin component name; if a genuine file of that name exists in your Radmin build, confirm with the hash from section 4
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/
| TargetFileName=/\\AppData\\Local\\(Radmin\\(BlkScrDl\.dll|csvc\\RuntimeComponent\.dll)|Nitro Pro\\(Eztwain4\.dll|NitroPromotion\.exe))$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData])
Q6 · Radmin launcher or dllhost spawning a command shell
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: SHINYROAD exposes an interactive remote shell (os.system) from inside the Radmin launcher process or a dllhost COM surrogate. A command interpreter whose parent is one of those is worth triage. FP: dllhost.exe legitimately spawns children for some COM servers. Exclude known admin tooling and the Windows components you baseline in your estate.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Shells launched through an intermediate process are not captured.
  • PowerQuery assumes: src.process.name holds the creator's file name on Process Creation events.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: Shells launched through an intermediate process are not captured.
  • KQL – Defender XDR assumes: InitiatingProcessFileName carries the creator's file name without a path.
// HUNT: Radmin launcher or dllhost spawning a command shell
// MITRE: T1059.006, T1559.001
// CONF: medium
// FP: medium
// COST: low
// REQUIRES: Process creation with parent
// FALSE POSITIVES: COM surrogate children from legitimate software
// TUNING: exclude dllhost parents whose command line carries a known-good /Processid and that match your baselined software; review FamItrf parents without exclusion
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| ParentBaseFileName=/^(FamItrf[c2]|dllhost)(\.exe)?$/i
| FileName=/^(cmd|powershell|pwsh)\.exe$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Q7 · COM server registration for the SHINYROAD CLSID and AppID
CONF MEDIUMFP LOWCOST LOW

Looks for: Registry writes that carry the CLSID or AppID BlkScrDl.dll registers, or a value pointing to csvc\RuntimeComponent.dll. Sensor registry coverage of per-user COM keys varies, so a silent query is not proof of absence.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Registry activity on keys the sensor does not monitor is not captured.
  • PowerQuery assumes: registry.keyPath holds the full key path including the CLSID or AppID segment.
  • PowerQuery assumes: registry.value holds the data written to the value.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: Registry activity on keys the sensor does not monitor is not captured.
  • KQL – Defender XDR assumes: RegistryKey holds the full key path including the CLSID or AppID segment.
// HUNT: COM server registration for the SHINYROAD CLSID and AppID
// MITRE: T1559.001
// CONF: medium
// FP: low
// COST: low
// REQUIRES: Registry value set (CrowdStrike registry events)
// FALSE POSITIVES: none expected; the identifiers are specific to this campaign
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(RegGenericValueUpdate|AsepValueUpdate)$/
| RegObjectName=/21191641-0D7F-4CD9-9572-01AAE6E7851B|9AD3E98A-4C7E-4F37-982D-D73D41E4F91B/i or RegStringValue=/\\Radmin\\csvc\\RuntimeComponent\.dll/i
| table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue])
Q8 · External IP lookup by campaign binaries (CROSSROAD geolocation guardrail)
CONF MEDIUMFP LOWCOST LOW

Looks for: DNS lookups for the IP-reflection services CROSSROAD queries before deciding whether to continue (it aborts on country code CN), made by upgrade-now.exe or NitroPromotion.exe.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Tenants that populate dns.request instead of event.dns.request return nothing until the field is swapped; run the field check in the readiness test.
  • PowerQuery assumes: event.dns.request is the populated DNS name field; some tenants populate dns.request instead.
  • PowerQuery assumes: src.process.name holds the requesting process on DNS events.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A tenant whose DnsQueryResponse rows carry the name under another key returns nothing; check the readiness test output.
  • KQL – Defender XDR assumes: AdditionalFields is a string in Defender XDR and carries the queried name under DnsQueryString or QueryName.
  • KQL – Defender XDR assumes: DnsQueryResponse is attested in Microsoft-owned hunting repositories rather than documented on a Learn table page.
// HUNT: External IP lookup by campaign binaries (CROSSROAD geolocation guardrail)
// MITRE: T1016, T1614, T1480
// CONF: medium
// FP: low
// COST: low
// REQUIRES: DNS lookup with requesting process
// FALSE POSITIVES: none expected for these two process names
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=DnsRequest
| DomainName=/^(myip\.opendns\.com|o-o\.myaddr\.l\.google\.com|checkip\.amazonaws\.com|api\.ipify\.org|ifconfig\.me|icanhazip\.com)$/i
| ContextBaseFileName=/^(upgrade-now|NitroPromotion)(\.exe)?$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName])
Q9 · Outbound connections to campaign IP addresses
CONF HIGHFP LOWCOST LOW

Looks for: Any IPv4 connection to the three campaign IP addresses (WebDAV and Adaptix target, SHINYROAD C2, secondary infrastructure). Hosting IPs are perishable, so absence now does not clear a host that connected in the April to July window; run over the longest retention you have.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Connections through a proxy show the proxy address, not the campaign address.
  • PowerQuery assumes: dst.ip.address holds the remote IPv4 address on IP Connect events.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: Connections through a proxy show the proxy address, not the campaign address.
  • KQL – Defender XDR assumes: RemoteIP holds the remote IPv4 address as a string.
// HUNT: Outbound connections to campaign IP addresses
// MITRE: T1571, T1573.001, T1187
// CONF: high
// FP: low
// COST: low
// REQUIRES: Outbound network connection with process
// FALSE POSITIVES: none expected
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["8.210.84.56","8.218.65.184","47.239.60.117"])
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort])
Q10 · DNS lookups for campaign domains and the Alibaba OSS staging bucket
CONF HIGHFP LOWCOST LOW

Looks for: Resolution of storage-data.com and its subdomains, or the specific Alibaba Cloud OSS bucket host used for April and May staging.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Tenants that populate dns.request instead of event.dns.request return nothing until the field is swapped; run the field check in the readiness test.
  • PowerQuery assumes: event.dns.request is the populated DNS name field; some tenants populate dns.request instead.
  • PowerQuery assumes: src.process.name holds the requesting process on DNS events.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A tenant whose DnsQueryResponse rows carry the name under another key returns nothing; check the readiness test output.
  • KQL – Defender XDR assumes: AdditionalFields is a string in Defender XDR and carries the queried name under DnsQueryString or QueryName.
  • KQL – Defender XDR assumes: DnsQueryResponse is attested in Microsoft-owned hunting repositories rather than documented on a Learn table page.
// HUNT: DNS lookups for campaign domains and the Alibaba OSS staging bucket
// MITRE: T1583.001, T1583.006, T1105
// CONF: high
// FP: low
// COST: low
// REQUIRES: DNS lookup with requesting process
// FALSE POSITIVES: none expected; the OSS match is on the single bucket host, not on aliyuncs.com as a whole
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=DnsRequest
| DomainName=/(^|\.)storage-data\.com$/i or DomainName=/^serv\.oss-cn-hongkong\.aliyuncs\.com$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName])
Q11 · Hidden PowerShell launching NitroPromotion.exe (ADAPTAGENT staging)
CONF HIGHFP LOWCOST LOW

Looks for: NitroPromotion.exe execution, or a Start-Process command line naming it. The report documents a hidden PowerShell Start-Process against NitroPromotion.exe in the user temp directory.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The hidden-window flag in the card title is not tested by the CQL or by this pane.
  • PowerQuery assumes: tgt.process.name holds the created file name with its extension.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: The hidden-window flag in the card title is not tested by the CQL or by this pane.
  • KQL – Defender XDR assumes: FileName holds the created file name with its extension.
// HUNT: Hidden PowerShell launching NitroPromotion.exe (ADAPTAGENT staging)
// MITRE: T1059.001, T1036.005
// CONF: high
// FP: low
// COST: low
// REQUIRES: Process creation with command line
// FALSE POSITIVES: none expected; confirm with the Nitro Software owner that no sanctioned tool uses this name
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| FileName=/^NitroPromotion\.exe$/i or CommandLine=/Start-Process.*NitroPromotion\.exe/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Q12 · Outbound SMB to non-private addresses (WebDAV and NTLM coercion fallout)
CONF MEDIUMFP MEDIUMCOST MEDIUM

Looks for: TCP 445 connections to public addresses, grouped by host and process. The 1x1 popup coerces an outbound SMB or WebDAV session that leaks NetNTLMv2 material. WebDAV normally rides HTTP, so pair this with the native hunts for the WebClient service. FP: Cloud file shares and some VPN-less remote file access use 445 to public addresses. Exclude your documented storage endpoints.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: IPv6 destinations are not covered, as in the CQL.
  • PowerQuery assumes: dst.port.number is numeric on IP Connect events.
  • PowerQuery assumes: src.process.name holds the connecting process.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: IPv6 destinations are not covered, as in the CQL.
  • KQL – Defender XDR assumes: RemoteIP holds an IPv4 address string for the rows of interest; ipv4_is_private returns null for IPv6, which drops those rows.
// HUNT: Outbound SMB to non-private addresses (WebDAV and NTLM coercion fallout)
// MITRE: T1187
// CONF: medium
// FP: medium
// COST: medium
// REQUIRES: Outbound network connection with process
// FALSE POSITIVES: legitimate SMB to cloud or partner storage
// TUNING: exclude sanctioned remote storage IP ranges with !cidr() and known backup appliance hosts; the hosts left are the review set
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=NetworkConnectIP4
| RemotePort=445
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16","100.64.0.0/10"])
| groupBy([ComputerName, ContextBaseFileName, RemoteAddressIP4], function=count(as=conns))
| sort(conns, order=desc)
Q13 · Known campaign file hashes executed or written
CONF HIGHFP LOWCOST MEDIUM

Looks for: SHA-256 match against the executable and DLL hashes in section 10. Config files, archives and metadata.dat are left out because the sensor hashes PE and process images. Hash coverage is the weakest signal in this campaign: the dropper self-deletes and is rebuilt per window.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptions, telemetry-gapProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: A file whose hash the sensor did not compute is not matched.
  • PowerQuery assumes: tgt.process.image.sha256 and tgt.file.sha256 are populated on the tenant; an unpopulated hash field returns nothing.
  • PowerQuery assumes: File Modification events are included so a drop that lands as a modification is not missed.
  • KQL – Defender XDR: Process executions of these hashes are not covered; the CQL tab covers them.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A file whose hash the sensor did not compute is not matched.
  • KQL – Defender XDR assumes: SHA256 is populated on DeviceFileEvents rows for the tenant.
// HUNT: Known campaign file hashes executed or written
// MITRE: T1195.002, T1574.001
// CONF: high
// FP: low
// COST: medium
// REQUIRES: Process creation and executable written with file hash
// FALSE POSITIVES: none expected
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/
| in(SHA256HashData, values=[
    "11e576df44e9c9eef72b9f5b699291bcdb200a19130778ec231e5b0987b913ad",
    "130c3970f1c900191615b99d8be522d6a488a3d3b73938896ed937092007d96a",
    "9a58e8f49edf5644e5728f74cf36f560d3d486fa51db4db69d927963c7aca450",
    "b360b6db0c2b668317edc1504a7c39ef047f0d925c8f113b521f6724c157ae21",
    "5837bc26a73cfb46ffd466cf889f03ce2f6a48f1f3fd42ec8be22189d51cab1e",
    "8fbaa74b27dc1e89abfc694e834378746f0ad37a688098c5f8f511410157c8b8",
    "100657d3e205bfd0e96f1c088ae1739b50657592a696201467b4c65b7d36289a",
    "53b7d01163ccb679001f20e4a8a5e1f33d5d2837c375315f6514cc820f81bd12",
    "14b31918075e6130b9123158743db0a81e2d7bfcf6d39731ee7d9200a98cd591",
    "8c8090aca8ddb1cf968d2b810457e0cfce97c03cd721f70d2eca7f37f2681fc4",
    "7b252be444dee2fb2a57043a823dc5b5e1fae970aea91ee2c8339aa70329969d"
  ])
| table([@timestamp, ComputerName, UserName, FileName, ImageFileName, TargetFileName, SHA256HashData])
Q14 · SHINYROAD and ADAPTAGENT C2 ports from sideload hosts
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: Connections to TCP 41397 (SHINYROAD raw TCP C2) or 6800 (Adaptix beacon) from the Radmin launcher, dllhost, the Nitro masquerade binaries or rundll32. FP: Port 6800 is used by unrelated software, hence the process restriction. A hit from dllhost needs the destination reviewed, not auto-escalation.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: Other software using port 6800 can match when it runs under one of the listed process names.
  • PowerQuery assumes: dst.port.number is numeric on IP Connect events.
  • PowerQuery assumes: src.process.name holds the connecting process on IP Connect events.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: Other software using port 6800 can match when it runs under one of the listed process names.
  • KQL – Defender XDR assumes: InitiatingProcessFileName carries the connecting process name without a path.
// HUNT: SHINYROAD and ADAPTAGENT C2 ports from sideload hosts
// MITRE: T1571, T1219.002
// CONF: medium
// FP: medium
// COST: low
// REQUIRES: Outbound network connection with process
// FALSE POSITIVES: other software using port 6800
// TUNING: restrict to non-RFC1918 destinations with !cidr() if internal services use 6800, and exclude baselined dllhost destinations
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=NetworkConnectIP4
| in(RemotePort, values=[41397, 6800])
| ContextBaseFileName=/^(FamItrf[c2]|dllhost|NitroPromotion|Nitro_Scan2PDFApp|rundll32)(\.exe)?$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort])
Q15 · Silent Radmin Server install (rsetup64.exe /intsetup)
CONF MEDIUMFP MEDIUMCOST LOW

Looks for: rsetup64.exe run with the intsetup argument. CROSSROAD invokes the genuine Radmin Server installer this way; ManageEngine found it staged but never armed. Triage on the parent: an unsigned or AOMEI-path parent is the campaign. FP: Sanctioned Radmin rollouts use the same installer. Exclude your deployment tool as parent.

Validation: schema-aligned, static-reviewedAutomated: static-passedEquivalence: equivalent-with-schema-assumptionsProfiles: microsoft-defender-xdr, sentinelone-endpoint-ocsf
Known limitations and deployment notes
  • PowerQuery: The creator image path is not projected; pivot on src.process.name and the host to find it.
  • PowerQuery assumes: tgt.process.name holds the created file name with its extension; src.process.name holds the creator and is shown for triage.
  • KQL – Defender XDR: Advanced Hunting keeps 30 days, so the 120-day campaign window is covered only on the CQL tab.
  • KQL – Defender XDR: A process the sensor did not observe starting is not captured.
  • KQL – Defender XDR assumes: FileName holds the created file name; InitiatingProcessFolderPath is projected so the AOMEI-directory check in the tuning note can be made.
// HUNT: Silent Radmin Server install (rsetup64.exe /intsetup)
// MITRE: T1219.002
// CONF: medium
// FP: medium
// COST: low
// REQUIRES: Process creation with command line and parent
// FALSE POSITIVES: IT-managed Radmin deployments
// TUNING: exclude ParentBaseFileName values for your software deployment agent; keep any hit whose parent image path sits under an AOMEI directory
// LOOKBACK: 120d (covers the April to July 2026 campaign window; set with the console time picker)
#event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/
| FileName=/^rsetup64(\.exe)?$/i
| CommandLine=/intsetup/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine])
09

Detection Rules by Platform

CrowdStrike: Custom IOA

IOA namePatternExclusionsPath
Updater launches executable from html or tmphtmlParent ABNotify.exe or Backupper.exe, child image under an html or tmphtml directory (Promote Q1)None expectedDetect; Prevent candidate after 14 clean days
CROSSROAD self-delete flagCommandLine contains --nitrod (Promote Q2)None expectedDetect
Campaign scheduled tasksTask name RadminComponentRuntime or NitroRuntime, or arguments with --runtimechk (Promote Q3)None expectedDetect
Radmin launcher run for the sideloadFamItrfc.exe or FamItrf2.exe with --runtimechk or from AppData\Local\Radmin (Promote Q4)Sanctioned Radmin deploymentsDetect only (signed legitimate binary, never Prevent)
Sideload DLL drop in user profilePE write of BlkScrDl.dll, csvc\RuntimeComponent.dll, Eztwain4.dll, NitroPromotion.exe under AppData\Local (Promote Q5)None expectedDetect
Hidden PowerShell launch of NitroPromotion.exeNitroPromotion.exe, or Start-Process naming it (Promote Q11)None expectedDetect
Falcon IOC Management: only the two hashes corroborated by both sources carry prevent. Every other indicator is detect. Nothing that is a legitimate Famatech or Nitro product binary is imported.

SentinelOne: custom detection rules

RuleSource queryRun asNotes
Updater launches executable from html or tmphtmlQ1, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
CROSSROAD self-delete flagQ2, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
Campaign scheduled tasksQ3, PowerQuery tabHunt only until the gap is closedQ3 is only an approximation here. SentinelOne telemetry in this field model has no scheduled-task registration event, so the hunt pivots on the command line of any created process that names RadminComponentRuntime or NitroRuntime. That catches schtasks.exe and PowerShell task registration by command line, but not a task registered...
Radmin launcher run for the sideloadQ4, PowerQuery tabScheduled custom detection ruleBind entities so the alert names the host instead of "Unknown Device"
Sideload DLL drop in user profileQ5, PowerQuery tabHunt only until the gap is closedQ5 is only an approximation here. The CQL matches PE-file-written events at four exact paths. SentinelOne has no PE-specific write event here, so this pane matches File Creation and File Modification at the same paths. The paths are matched as substrings rather than anchored at the end, so a longer name that merely starts with a...
Hidden PowerShell launch of NitroPromotion.exeQ11, PowerQuery tabScheduled custom detection ruleBind 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

RuleSource queryRun asNotes
Updater launches executable from html or tmphtmlQ1, 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
CROSSROAD self-delete flagQ2, 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
Campaign scheduled tasksQ3, 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
Radmin launcher run for the sideloadQ4, 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
Sideload DLL drop in user profileQ5, KQL – Defender XDR tabHunt only until the gap is closedQ5 is only an approximation here. The CQL matches PE-file-written events at four exact paths. DeviceFileEvents has no PE-specific write action, so this pane matches FileCreated and FileModified at the same paths. The paths are matched as substrings rather than anchored at the end.
Hidden PowerShell launch of NitroPromotion.exeQ11, 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

Q6, Q7, Q8, Q9, Q10, Q12, Q13, 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
type,value,action,severity,expiration,description,tags
sha256,6670ab3f0434a42f33416f8354150b1701e7615f3cfa2f1635e54f8df0f6eec7,detect,high,2027-04-18,upgrade-now.zip (May 20 CROSSROAD archive) CROSSROAD archive,campaign:UNC7017
sha256,11e576df44e9c9eef72b9f5b699291bcdb200a19130778ec231e5b0987b913ad,detect,high,2027-04-18,upgrade-now.exe (May 20 CROSSROAD loader) CROSSROAD loader,campaign:UNC7017
sha256,130c3970f1c900191615b99d8be522d6a488a3d3b73938896ed937092007d96a,detect,high,2027-04-18,upgrade-now.exe (28 May endpoint sample) CROSSROAD loader seen on endpoint,campaign:UNC7017
sha256,9a58e8f49edf5644e5728f74cf36f560d3d486fa51db4db69d927963c7aca450,detect,high,2027-04-18,upgrade-now.exe (July 16 CROSSROAD loader) CROSSROAD loader,campaign:UNC7017
sha256,b360b6db0c2b668317edc1504a7c39ef047f0d925c8f113b521f6724c157ae21,detect,high,2027-04-18,upgrade-now.exe (July 20 CROSSROAD loader) CROSSROAD loader,campaign:UNC7017
sha256,9ed503c6a9a3a493fb859401e9ed469eed77ab9927341964d6dbfbfa6255aeba,detect,high,2027-04-18,upgrade-now.zip (July 20 CROSSROAD archive) CROSSROAD archive,campaign:UNC7017
sha256,d167bc898e856da8a4003cb4dfc7de55fea109eee3cd64fc8999710314109464,prevent,critical,2027-04-18,component.zip / en.zip (SHINYROAD package) SHINYROAD package; two sources,campaign:UNC7017
sha256,5837bc26a73cfb46ffd466cf889f03ce2f6a48f1f3fd42ec8be22189d51cab1e,prevent,critical,2027-04-18,BlkScrDl.dll (malicious sideloaded DLL) SHINYROAD loader DLL; two sources,campaign:UNC7017
sha256,8fbaa74b27dc1e89abfc694e834378746f0ad37a688098c5f8f511410157c8b8,detect,high,2027-04-18,RuntimeComponent.dll (PocketPy engine) SHINYROAD implant DLL,campaign:UNC7017
sha256,4c0a75e0f62ddc0bb350c224fe996f3b2ab08dcb0d288231c61ffe9406c7045b,detect,high,2027-04-18,config.zip (Python bytecode archive) SHINYROAD payload archive,campaign:UNC7017
sha256,4b4d25b3501519476f9a62a88a781e4f446f669280eb5e98c6b96eb6d3743431,detect,high,2027-04-18,metadata.dat (ChaCha20 payload) SHINYROAD encrypted payload,campaign:UNC7017
sha256,100657d3e205bfd0e96f1c088ae1739b50657592a696201467b4c65b7d36289a,detect,high,2027-04-18,WNTestdll.dll Related DLL named in ManageEngine hash table,campaign:UNC7017
sha256,53b7d01163ccb679001f20e4a8a5e1f33d5d2837c375315f6514cc820f81bd12,detect,high,2027-04-18,Sample listed as hunted VirusTotal sample ManageEngine hunted sample; function not stated,campaign:UNC7017
sha256,14b31918075e6130b9123158743db0a81e2d7bfcf6d39731ee7d9200a98cd591,detect,high,2027-04-18,NitroPromotion.exe (ADAPTAGENT launcher) ADAPTAGENT launcher,campaign:UNC7017
sha256,8c8090aca8ddb1cf968d2b810457e0cfce97c03cd721f70d2eca7f37f2681fc4,detect,high,2027-04-18,Eztwain4.dll (ADAPTAGENT helper DLL) ADAPTAGENT sideloaded DLL,campaign:UNC7017
sha256,7b252be444dee2fb2a57043a823dc5b5e1fae970aea91ee2c8339aa70329969d,detect,high,2027-04-18,abe.exe (secondary payload) Secondary payload; role not described,campaign:UNC7017
sha256,924ad92d89dde577d5858b2ebc5703a485467842d78e98b75019b2e2e0ac3fe6,detect,medium,2027-04-18,down_html.ini (tampered July 16) Tampered AOMEI update config,campaign:UNC7017
sha256,f2a7d0a4c8613a9cdd31ede6131b27040c0571ca97970b245a710191806d7ac4,detect,medium,2027-04-18,down_html.ini (tampered July 20) Tampered AOMEI update config,campaign:UNC7017
sha256,a984fdb0830760446d2b599b263506e01fcf1e560a31a057c3bbe7b3f8ac155d,detect,medium,2027-04-18,down_html.ini (ManageEngine volatile hash) Tampered AOMEI update config,campaign:UNC7017
sha256,d2f9ef2429312667f0512504b6a19ba4a9cc5514f1b2933923dd42f75a1c5934,detect,medium,2027-04-18,Notifycfg.ini (tampered July 16) Tampered notification config with dummy sections,campaign:UNC7017
sha256,286e0d8c7bdfaa7c251a3e8f0f2fefbe25c67586c0149d39b1095c89dc6023c8,detect,medium,2027-04-18,Notifycfg.ini (tampered July 20 WebDAV) Tampered notification config with WebDAV popup,campaign:UNC7017
sha256,2e3b4bfb86224f079b8762ce78bb7ff10afdbf8421b08b23e96429f2e1ee7b50,detect,medium,2027-04-18,Notifycfg.ini (ManageEngine volatile hash) Tampered notification config,campaign:UNC7017
md5,31323e7e738230fa6a8deef2b7894666,detect,medium,2027-04-18,July 16 declared MD5 for the malicious upgrade-now.zip,campaign:UNC7017
md5,bf73c4391b58ca95220ce3ae03f66dcf,detect,medium,2027-04-18,July 20 declared MD5 for the malicious upgrade-now.zip,campaign:UNC7017
ipv4,8.210.84.56,detect,high,2027-04-18,WebDAV NTLM target and Adaptix C2,campaign:UNC7017
ipv4,8.218.65.184,detect,critical,2027-04-18,SHINYROAD C2  ports 41397 and 443,campaign:UNC7017
ipv4,47.239.60.117,detect,high,2027-04-18,Secondary infrastructure,campaign:UNC7017
domain,storage-data.com,detect,high,2027-04-18,Threat actor domain,campaign:UNC7017
domain,promotion.storage-data.com,detect,high,2027-04-18,Stage-2 dropper and component staging,campaign:UNC7017
domain,aomei.storage-data.com,detect,high,2027-04-18,Stage-3 payload staging,campaign:UNC7017
domain,serv.oss-cn-hongkong.aliyuncs.com,detect,high,2027-04-18,Alibaba Cloud OSS bucket used for April and May staging,campaign:UNC7017
Microsoft Defender indicators CSVSettings, Endpoints, Indicators, Import: audit and block
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert
FileSha256,6670ab3f0434a42f33416f8354150b1701e7615f3cfa2f1635e54f8df0f6eec7,Audit,upgrade-now.zip,upgrade-now.zip (May 20 CROSSROAD archive) CROSSROAD archive,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,11e576df44e9c9eef72b9f5b699291bcdb200a19130778ec231e5b0987b913ad,Audit,upgrade-now.exe,upgrade-now.exe (May 20 CROSSROAD loader) CROSSROAD loader,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,130c3970f1c900191615b99d8be522d6a488a3d3b73938896ed937092007d96a,Audit,upgrade-now.exe,upgrade-now.exe (28 May endpoint sample) CROSSROAD loader seen on endpoint,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,9a58e8f49edf5644e5728f74cf36f560d3d486fa51db4db69d927963c7aca450,Audit,upgrade-now.exe,upgrade-now.exe (July 16 CROSSROAD loader) CROSSROAD loader,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,b360b6db0c2b668317edc1504a7c39ef047f0d925c8f113b521f6724c157ae21,Audit,upgrade-now.exe,upgrade-now.exe (July 20 CROSSROAD loader) CROSSROAD loader,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,9ed503c6a9a3a493fb859401e9ed469eed77ab9927341964d6dbfbfa6255aeba,Audit,upgrade-now.zip,upgrade-now.zip (July 20 CROSSROAD archive) CROSSROAD archive,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,d167bc898e856da8a4003cb4dfc7de55fea109eee3cd64fc8999710314109464,Block,component.zip / en.zip,component.zip / en.zip (SHINYROAD package) SHINYROAD package; two sources,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,5837bc26a73cfb46ffd466cf889f03ce2f6a48f1f3fd42ec8be22189d51cab1e,Block,BlkScrDl.dll,BlkScrDl.dll (malicious sideloaded DLL) SHINYROAD loader DLL; two sources,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,8fbaa74b27dc1e89abfc694e834378746f0ad37a688098c5f8f511410157c8b8,Audit,RuntimeComponent.dll,RuntimeComponent.dll (PocketPy engine) SHINYROAD implant DLL,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,4c0a75e0f62ddc0bb350c224fe996f3b2ab08dcb0d288231c61ffe9406c7045b,Audit,config.zip,config.zip (Python bytecode archive) SHINYROAD payload archive,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,4b4d25b3501519476f9a62a88a781e4f446f669280eb5e98c6b96eb6d3743431,Audit,metadata.dat,metadata.dat (ChaCha20 payload) SHINYROAD encrypted payload,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,100657d3e205bfd0e96f1c088ae1739b50657592a696201467b4c65b7d36289a,Audit,WNTestdll.dll Related DLL named in ManageEngine hash table,WNTestdll.dll Related DLL named in ManageEngine hash table,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,53b7d01163ccb679001f20e4a8a5e1f33d5d2837c375315f6514cc820f81bd12,Audit,Sample listed as hunted VirusTotal sample ManageEngine hunte,Sample listed as hunted VirusTotal sample ManageEngine hunted sample; function not stated,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,14b31918075e6130b9123158743db0a81e2d7bfcf6d39731ee7d9200a98cd591,Audit,NitroPromotion.exe,NitroPromotion.exe (ADAPTAGENT launcher) ADAPTAGENT launcher,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,8c8090aca8ddb1cf968d2b810457e0cfce97c03cd721f70d2eca7f37f2681fc4,Audit,Eztwain4.dll,Eztwain4.dll (ADAPTAGENT helper DLL) ADAPTAGENT sideloaded DLL,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,7b252be444dee2fb2a57043a823dc5b5e1fae970aea91ee2c8339aa70329969d,Audit,abe.exe,abe.exe (secondary payload) Secondary payload; role not described,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,924ad92d89dde577d5858b2ebc5703a485467842d78e98b75019b2e2e0ac3fe6,Audit,down_html.ini,down_html.ini (tampered July 16) Tampered AOMEI update config,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,f2a7d0a4c8613a9cdd31ede6131b27040c0571ca97970b245a710191806d7ac4,Audit,down_html.ini,down_html.ini (tampered July 20) Tampered AOMEI update config,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,a984fdb0830760446d2b599b263506e01fcf1e560a31a057c3bbe7b3f8ac155d,Audit,down_html.ini,down_html.ini (ManageEngine volatile hash) Tampered AOMEI update config,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,d2f9ef2429312667f0512504b6a19ba4a9cc5514f1b2933923dd42f75a1c5934,Audit,Notifycfg.ini,Notifycfg.ini (tampered July 16) Tampered notification config with dummy sections,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,286e0d8c7bdfaa7c251a3e8f0f2fefbe25c67586c0149d39b1095c89dc6023c8,Audit,Notifycfg.ini,Notifycfg.ini (tampered July 20 WebDAV) Tampered notification config with WebDAV popup,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
FileSha256,2e3b4bfb86224f079b8762ce78bb7ff10afdbf8421b08b23e96429f2e1ee7b50,Audit,Notifycfg.ini,Notifycfg.ini (ManageEngine volatile hash) Tampered notification config,2027-04-18T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,8.210.84.56,Audit,WebDAV NTLM target and Adaptix C2,WebDAV NTLM target and Adaptix C2,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,8.218.65.184,Audit,SHINYROAD C2  ports 41397 and 443,SHINYROAD C2  ports 41397 and 443,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
IpAddress,47.239.60.117,Audit,Secondary infrastructure,Secondary infrastructure,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,storage-data.com,Audit,Threat actor domain,Threat actor domain,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,promotion.storage-data.com,Audit,Stage-2 dropper and component staging,Stage-2 dropper and component staging,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,aomei.storage-data.com,Audit,Stage-3 payload staging,Stage-3 payload staging,2027-04-18T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
DomainName,serv.oss-cn-hongkong.aliyuncs.com,Audit,Alibaba Cloud OSS bucket used for April and May staging,Alibaba Cloud OSS bucket used for April and May staging,2027-04-18T00:00:00.0Z,High,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: md5 2. Prevent rows import as Block, without remediation; network indicators cannot use BlockAndRemediate. 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.

Proxy and URL blocklistgateway, not Falcon
# Proxy / DNS / web gateway blocklist (not importable to Falcon IOC Management)
https://promotion.storage-data.com/download/abpopup/upgrade-now.zip
https://promotion.storage-data.com/config/component.zip
https://promotion.storage-data.com/config/en.zip
https://promotion.storage-data.com/config/whitelist.ini
https://storage.googleapis.com/aomeiupdate/upgrade-now.zip
https://storage.googleapis.com/aomeiupdate/component.zip
# Block outbound SMB (TCP 445) and WebDAV to external addresses
\\8.210.84.56\DavWWWRoot\campaign\24hour-flash-sale.html
# User-Agent strings to search in proxy logs
Anyviewer-loader/1.0
Anyviewer-ipcheck/1.0
# Reflection services used by the geolocation guardrail (legitimate; hunt by process, do not block)
myip.opendns.com
o-o.myaddr.l.google.com
checkip.amazonaws.com
api.ipify.org
ifconfig.me
icanhazip.com
Behavioral Signatureshunt and IOA seeds
# Behavioral signatures (all from the Mandiant report unless marked)
Mutex:            Global\{F9E6E3C0-E11A-4F85-9944-AF4AD6E05883}
Shared memory:     Local\963d3c60-d406-4ad6-aa1e-dc8e45061ccf
COM CLSID:         {21191641-0D7F-4CD9-9572-01AAE6E7851B}
COM AppID:         {9AD3E98A-4C7E-4F37-982D-D73D41E4F91B}
Scheduled task:   \RadminComponentRuntime  (description: Radmin Component runtime checkable.)
Scheduled task:   \NitroRuntime
Task command:     %LOCALAPPDATA%\Radmin\FamItrfc.exe --runtimechk  (every 3 hours)
Self-delete flag:  --nitrod  (env NITRODP, NITRODT)
ADS name:         :wtfbbq
Product string:   AOMEI Update Compent  (typo; dropper version info)
Install helper:    rsetup64.exe /intsetup
Config bloat:     Notifycfg.ini with 35,000+ [dummy_XXXXXX] sections
Popup coercion:   [PopWindow1] Address="file://...DavWWWRoot..." Width=1 Height=1
Staging paths:    %LOCALAPPDATA%\Radmin\  |  %LOCALAPPDATA%\Radmin\csvc\  |  %LOCALAPPDATA%\Nitro Pro\  |  %TEMP%\svc*.tmp
AOMEI paths:      ...\AOMEI\*\Tmphtml\  |  ...\AOMEI\*\html\
Named Malware and Toolingnames and abused binaries
# Named malware and tooling
CROSSROAD      downloader (upgrade-now.exe)
SHINYROAD      backdoor (BlkScrDl.dll loader, RuntimeComponent.dll PocketPy engine, config.zip, metadata.dat)
ADAPTAGENT     Adaptix C2 agent (Eztwain4.dll, launched via NitroPromotion.exe)
Adaptix C2     post-exploitation framework
UNC7017        tracking name (Google Threat Intelligence Group / Mandiant)
# Abused LEGITIMATE binaries: hunt the behavior, never prevent on the file
FamItrfc.exe / FamItrf2.exe   Famatech Radmin launcher (signed)
WinLpcDl.dll / WinLpcDl2.dll  Radmin components
Nitro_Scan2PDFApp.exe  Nitro signed binary
mfc140u.dll    Microsoft MFC runtime
Configuration Auditread-only checks
# Read-only configuration audit (run per endpoint)
Get-Service WebClient | Select-Object Status, StartType
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name RestrictSendingNTLMTraffic -ErrorAction SilentlyContinue
Get-NetFirewallRule -DisplayName 'HuntPack Block*' -ErrorAction SilentlyContinue | Select-Object DisplayName, Enabled, Action
(Get-MpPreference).AttackSurfaceReductionRules_Ids
Get-ScheduledTask -TaskName RadminComponentRuntime,NitroRuntime -ErrorAction SilentlyContinue
Get-ChildItem "${env:ProgramFiles(x86)}\AOMEI" -Recurse -Include *.exe -ErrorAction SilentlyContinue | Where-Object { $_.FullName -match '\\(html|tmphtml)\\' }

Falcon IOC Management does not import URLs or UNC paths, which is why they sit in the gateway block. Expiration is set six months out because the infrastructure rotated across three windows.

11

Detection Validation Gates

GateRequirementEvidence
1 · Telemetry readyProcess creation with parent and command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents), scheduled task registration, executable writes, outbound connections and DNS flowing from AOMEI hosts; 120 days of retention or the longest availableEvent counts per source for AOMEI hosts
2 · Benign baselineRun Q1 to Q15 in hunt mode; catalogue sanctioned Radmin deployments, dllhost children and port 6800 usersPer-query exclusion list
3 · Positive testsIn a lab, copy a harmless executable named like the dropper into an html folder under a test AOMEI path and launch it from a renamed test parent; register a test task named RadminComponentRuntime; run a benign binary with --nitrodQ1, Q2, Q3 fire
4 · PromotionPromote IOA candidates after zero unexplained hits over the baseline window; keep every legitimate-binary IOA at DetectChange record
12

Hardening: Tiered

Immediate (this week)
  • Block outbound SMB (TCP 445) and WebDAV to external addresses, and block the campaign IPs and domains at the perimeter and in the host firewall. Authority: MITRE M1037 Filter Network Traffic; also the report's own network guidance. Verify: playbook PB1 audit commands, or a failed test connection.
  • Disable the WebClient (WebDAV redirector) service on endpoints that do not need WebDAV. Authority: MITRE M1042 Disable or Remove Feature or Program. best-practice, no formal benchmark cited here. Verify: Get-Service WebClient.
  • Audit, then restrict, outgoing NTLM (Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers). Authority: M1037 and Microsoft NTLM restriction guidance. Verify: the registry value and the NTLM Operational log (PB2).
  • Inventory AOMEI Backupper and AnyViewer and run the read-only triage in PB4 on every host that has them. Authority: M1047 Audit.
Near term (1 to 4 weeks, pilot first)
  • Application control that denies execution and DLL loads from user-profile Radmin and Nitro Pro folders and from AOMEI html and tmphtml folders (WDAC or AppLocker, audit first). Authority: M1038 Execution Prevention; Microsoft WDAC and AppLocker documentation. Verify: audit events for blocked paths, then a CQL spot-check that Q1 and Q5 return nothing.
  • Defender ASR rule: block executable files that do not meet a prevalence, age or trusted-list criterion, audit mode first (PB3). Authority: Microsoft attack surface reduction rules reference; M1038. Verify: Get-MpPreference.
  • Constrain the AOMEI notification agent's egress with a per-program firewall rule where the promotional channel is not business-critical (PB3). Authority: M1037, M1042. best-practice, no formal benchmark.
  • Promote Q1, Q2, Q3, Q5, Q11 to Custom IOA at Detect, Prevent only after baseline. Authority: M1049 Antivirus/Antimalware (behavioral).
Strategic (1 to 3 months)
  • Update-channel trust. Prefer software that signs its remote configuration and verifies Authenticode on downloads, pins update domains and refuses file:// and UNC handlers in embedded web views, as the report recommends to vendors. Weigh this in procurement and vendor risk reviews. Authority: ATT&CK T1195.002 mitigations (M1013, M1016, M1051) and the report's vendor guidance.
  • Proxy policy for update clients. Allowlist the vendor's official update hostnames for background updaters and deny arbitrary public cloud storage buckets and newly registered domains. The July 20 window used a public Google Cloud Storage bucket specifically to pass newly-registered-domain filters. Authority: M1037.
  • Credential hygiene. For users on hosts that ran AOMEI products during a window, assume NetNTLMv2 exposure: reset passwords, prefer Kerberos, enforce SMB signing and consider Protected Users membership for privileged accounts. Authority: M1027 Password Policies, M1026 Privileged Account Management.
  • Retrospective-hunt capability. Retain endpoint process, network and DNS telemetry long enough to hunt a four-month-old ephemeral window. Authority: M1047 Audit.
13

Deployable Playbooks

PB1 · Block egress to the campaign and external SMB (host firewall)

Prerequisites: local administrator; confirm no business file share is reached over a public address (the Internet keyword also covers VPN-assigned public ranges). Reboot required: no. Rollback: remove the two rules with the last command.

# Block outbound SMB to non-private addresses
New-NetFirewallRule -DisplayName "HuntPack Block SMB Egress" -Direction Outbound -Action Block -Protocol TCP -RemotePort 445 -RemoteAddress Internet -Profile Any
# Block the campaign IP addresses (WebDAV/Adaptix, SHINYROAD C2, secondary)
New-NetFirewallRule -DisplayName "HuntPack Block UNC7017 IPs" -Direction Outbound -Action Block -RemoteAddress 8.210.84.56,8.218.65.184,47.239.60.117 -Profile Any
# Verify
Get-NetFirewallRule -DisplayName "HuntPack Block*" | Format-Table DisplayName, Enabled, Direction, Action
# Rollback
# Remove-NetFirewallRule -DisplayName "HuntPack Block*" 

PB2 · Audit outgoing NTLM and disable the WebClient service

Prerequisites: local administrator; confirm no application depends on WebDAV or outbound NTLM (value 1 only audits, it does not block). Reboot required: no for the service; a policy refresh or restart may be needed for the NTLM value to take effect. Rollback: restore the service start type and delete the registry value.

# Audit all outgoing NTLM (1 = audit, 2 = deny all). Start with audit; review the NTLM Operational log first.
New-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name RestrictSendingNTLMTraffic -PropertyType DWord -Value 1 -Force
# Disable the WebDAV redirector service
Stop-Service WebClient -ErrorAction SilentlyContinue
Set-Service WebClient -StartupType Disabled
# Verify
Get-Service WebClient | Select-Object Status, StartType
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name RestrictSendingNTLMTraffic
# Rollback
# Set-Service WebClient -StartupType Manual
# Remove-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name RestrictSendingNTLMTraffic

PB3 · ASR prevalence rule (audit) and AOMEI notification agent egress

Prerequisites: Microsoft Defender Antivirus is the active engine and not already governed by Intune or GPO for ASR; local administrator; AOMEI installed under Program Files (x86). Reboot required: no. Rollback: remove the ASR rule and the firewall rule. Blocking ABNotify.exe disables promotional popups only; confirm the product still updates through your approved channel.

# ASR: executables that do not meet prevalence/age/trusted-list criteria. Audit first (2 = audit, 1 = block)
Add-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25 -AttackSurfaceReductionRules_Actions AuditMode
# Constrain the AOMEI notification agent
Get-ChildItem "${env:ProgramFiles(x86)}\AOMEI" -Recurse -Filter ABNotify.exe -ErrorAction SilentlyContinue | ForEach-Object {
  New-NetFirewallRule -DisplayName "HuntPack Block ABNotify Egress" -Direction Outbound -Action Block -Program $_.FullName -Profile Any
}
# Verify
(Get-MpPreference).AttackSurfaceReductionRules_Ids
Get-NetFirewallRule -DisplayName "HuntPack Block ABNotify*" | Format-Table DisplayName, Enabled, Action
# Rollback
# Remove-MpPreference -AttackSurfaceReductionRules_Ids 01443614-cd74-433a-b99e-2ecdc07bfc25
# Remove-NetFirewallRule -DisplayName "HuntPack Block ABNotify*" 

PB4 · Read-only endpoint triage for AOMEI hosts

Prerequisites: local administrator. Reboot required: no. Rollback: none required, the script only reads and hashes files, tasks and services; it changes nothing. Run it before any cleanup so the cached configuration is preserved.

$ErrorActionPreference = 'SilentlyContinue'
# 1. Campaign tasks
Get-ScheduledTask -TaskName RadminComponentRuntime,NitroRuntime | Select-Object TaskName, State, @{n='Action';e={$_.Actions.Execute + ' ' + $_.Actions.Arguments}}
# 2. Sideload artifacts in every user profile
Get-ChildItem 'C:\Users\*\AppData\Local\Radmin','C:\Users\*\AppData\Local\Nitro Pro' -Recurse -Include BlkScrDl.dll,RuntimeComponent.dll,config.zip,metadata.dat,Eztwain4.dll,NitroPromotion.exe |
  Get-FileHash -Algorithm SHA256 | Format-Table Hash, Path -AutoSize
# 3. Cached AOMEI configuration (preserve copies before cleanup) and bloat check
$aomei = "${env:ProgramFiles(x86)}\AOMEI"
Get-ChildItem $aomei -Recurse -Include down_html.ini,Notifycfg.ini | ForEach-Object {
  [pscustomobject]@{ Path = $_.FullName; Sha256 = (Get-FileHash $_.FullName -Algorithm SHA256).Hash; Lines = (Get-Content $_.FullName | Measure-Object -Line).Lines; DummySections = (Select-String -Path $_.FullName -Pattern '^\[dummy_').Count }
}
# 4. Executables inside the rendering or staging directories
Get-ChildItem $aomei -Recurse -Include *.exe | Where-Object { $_.FullName -match '\\(html|tmphtml)\\' } | Select-Object FullName, LastWriteTime
# 5. WebClient and NTLM posture
Get-Service WebClient | Select-Object Status, StartType
14

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain hosts with a Q1 to Q5 or Q9 hit while keeping them powered on; block the campaign IPs and domains at perimeter and proxy; block outbound SMB and WebDAV to external addressesSOC / IR leadContainment timestamps; block change records
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). Keep the host powered on for memory capture on all of them.SOC / IR leadContainment timestamps; block change records
Isolate: by platformPlatform-specific isolation actions are added where the SentinelOne and Defender tabs existSOCIsolation logs
PreserveBefore cleanup, copy and hash down_html.ini, Notifycfg.ini, the Tmphtml and html directories, the Radmin and Nitro Pro user-profile folders and the temp svc*.tmp files; capture proxy and firewall records for the second each alert fired. The live vendor URL is not evidenceDFIREvidence hash list
ScopeRun Q1 to Q15 across the whole retention window, April to July 2026 at minimum, on every host that has or had AOMEI Backupper or AnyViewer; check DNS and proxy for the campaign domainsThreat huntHost list with first and last seen
CredentialsTreat users on exposed hosts as NetNTLMv2-exposed: reset passwords, review sign-ins from 8.210.84.56 or other unfamiliar sources, rotate service credentials used on those hostsIdentity teamReset log; sign-in review
EradicateDelete tasks RadminComponentRuntime and NitroRuntime after exporting their XML; end the Radmin launcher and any dllhost surrogate tied to the CLSID; remove the COM registration and the Radmin and Nitro Pro user-profile folders; uninstall Radmin Server if it is not sanctioned; confirm AOMEI is on a build the vendor has remediatedIR / IT opsRemoval list; task XML export
RecoverRebuild hosts where the in-memory implant ran with elevated rights (the chain inherits the AOMEI process privileges and can fetch more code); restore from known-good imagesIT opsRebuild records
Post-incidentPromote validated IOAs; add the cached-config check to endpoint baselines; report the finding to the vendor; review procurement of auto-updating utilitiesDetection engLessons-learned record
15

Detection Coverage Map

Technique / behaviorCQLIOACrowdStrike coverageSentinelOneDefender XDR
Updater child from html or tmphtml (T1195.002, T1036.005)Q1YesGoodGood, with assumptionsGood, with assumptions
Self-deletion flag (T1070.004)Q2YesGoodGood, with assumptionsGood, with assumptions
NTFS stream rename (T1564.004)noneNoGAPGAPGAP
Scheduled task persistence (T1053.005)Q3, Q4YesGoodPartial: Q3 approximateGood, with assumptions
DLL sideload (T1574.001)Q4, Q5YesGoodPartial: Q5 approximatePartial: Q5 approximate
COM server registration (T1559.001)Q7NoPartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Shell from launcher or dllhost (T1059.006)Q6NoPartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Guardrail IP lookup (T1016, T1614, T1480)Q8NoPartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Named mutex and shared memory (T1480)noneNoGAPGAPGAP
In-memory PocketPy and ChaCha20 stage (T1027.013, T1140)noneNoGAPGAPGAP
C2 infrastructure (T1571, T1583.001)Q9, Q10, Q14IOC MgmtGood, perishableGood, with assumptionsGood, with assumptions
ADAPTAGENT staging (T1059.001)Q11YesGoodGood, with assumptionsGood, with assumptions
WebDAV/NTLM coercion (T1187)Q12NoPartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Known hashesQ13IOC MgmtPartialPartial: same limit as CrowdStrikePartial: Q13 telemetry gap
Radmin Server install (T1219.002)Q15NoPartialPartial: same limit as CrowdStrikePartial: same limit as CrowdStrike
Traffic chaffing (T1001.001)noneNoGAPGAPGAP
Server-side config tampering (T1195.002)noneNoGAPGAPGAP

Gaps are stated honestly: the vendor-side edits happen outside endpoint telemetry; the mutex, shared memory, in-memory decryption and traffic chaffing have no default endpoint event; the stream rename needs Sysmon or equivalent (native hunt N3). Validation gates are in section 11.

16

Hunt Summary Ticket

TITLE:        AOMEI Backupper Supply-Chain Tampering (UNC7017): CROSSROAD, SHINYROAD, ADAPTAGENT
SEVERITY:     HIGH (software supply chain, post-compromise persistence and credential exposure)
SCOPE:        Windows endpoints with AOMEI Backupper or AnyViewer, April to July 2026 and any persisting payload
HYPOTHESIS:   A host polled AOMEI update or notification infrastructure during a 5 to 10 minute tampering
              window, ran upgrade-now.exe from the AOMEI html directory, and now carries a Radmin
              launcher sideloading BlkScrDl.dll, a COM-hosted PocketPy implant, and possibly ADAPTAGENT.
QUERIES RUN:  Q1 updater child | Q2 --nitrod | Q3 tasks | Q4 Radmin launcher | Q5 sideload drops |
              Q6 shell child | Q7 COM keys | Q8 IP lookup | Q9 C2 IPs | Q10 C2 DNS | Q11 Nitro masquerade |
              Q12 SMB egress | Q13 hashes | Q14 C2 ports | Q15 rsetup64   (+9 native hunts)
DATA SOURCES: Process creation, executable writes, scheduled task registration, registry writes, outbound
              connections and DNS (CrowdStrike: ProcessRollup2, PeFileWritten, ScheduledTaskRegistered,
              NetworkConnectIP4, DnsRequest. SentinelOne and Defender equivalents in section 5)
DO FIRST:     Preserve cached down_html.ini and Notifycfg.ini; run Q1, Q3, Q5, Q9 over the longest retention.
FINDINGS:     <pending analyst execution>
GAPS:         Server-side tampering, named mutex, shared memory, in-memory decryption and traffic chaffing
              are outside endpoint telemetry; the :wtfbbq stream rename needs native stream telemetry.
ACTIONS:      Block egress to the campaign IPs and external SMB/WebDAV; disable WebClient; audit outgoing NTLM;
              reset credentials for exposed users; promote Q1, Q3, Q5 to Custom IOA (Detect); prevent only the
              two hashes seen in both sources.
OWNER:        HuntPack
VERSION:      v0.1 (Draft) - 2026-10-18
17

Changelog

v0.12026-10-18Initial HuntPack: 15 CQL queries, 9 native hunts, 6 IOA candidates, tiered hardening, 4 deployable playbooks, 2 source snapshots. 31 atomic indicators in the Falcon CSV, each traced to a snapshot. Two hashes corroborated by both sources set to prevent; all other indicators detect. 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 forAccessed
1Google Threat Intelligence Group / Mandiant: Investigating Ephemeral Supply Chain TamperingCampaign, mechanics, IOCs, YARA, ATT&CK, guidance2026-10-18
1ManageEngine Threat Analysis Lab: AOMEI Backupper supply-chain compromiseDiscovery telemetry, process lineage, hash corroboration, Sigma rules2026-10-18
2MITRE ATT&CK and mitigationsTechnique and mitigation mapping2026-10-18
2Microsoft: Attack surface reduction rules referenceASR rule used in PB32026-10-18