UAC-0145 ClickFix Campaign — Sandworm / APT44 Sub-Cluster
Executive Summary
CERT-UA published a consolidated advisory on the initial-access vectors used by UAC-0145, a sub-cluster of UAC-0002 (Sandworm / APT44 / Seashell Blizzard), the GRU-linked destructive-operations actor. The attacker objective is durable footholds on Ukrainian government, defence and military-adjacent endpoints, with at least one historical case where a consumer-grade compromise was pivoted into lateral movement and a destructive attack against a central executive authority's infrastructure.
The newly-detailed vector is ClickFix: during spring and summer 2026, victims visiting legitimate but compromised websites were shown a fake CAPTCHA that instructed them to copy a PowerShell command and run it in the Windows Run dialog or Windows Terminal. CERT-UA analysed the ClickFix implementation on more than ten compromised web resources during June–July 2026. Two cloaking mechanisms are in play: the commodity Cloaking.House traffic-filtering service, and a bespoke script named SMARTAXE which resolves its remote domain by calling an Ethereum smart contract (an eth_call against a hardcoded contract address and function selector) — an EtherHiding pattern that makes takedown of the resolver effectively impossible.
Post-execution the chain is deliberately low-tech and high-yield: the pasted command downloads a VBS file into the user's Startup autorun directory (GHETTOVIBE), which pulls down SCOUTCURL, a PowerShell recon script that inventories hardware, installed software, files and browser data to triage the victim's value. Loaders FLUIDLEECH (masquerading as an antivirus-removal utility) and LOADLOOP follow, and responded-to incidents also yielded FREAKYPOLL, a Python backdoor shipped as compiled .pyc bytecode. A parallel Android track distributes COWARDDUCK as an APK disguised as security software over messengers, exfiltrating contacts, files and live geolocation via the Dropbox API while retrieving commands from images hosted on legitimate services (including steamcommunity.com) proxied through proxy.duckduckgo.com.
Highest-value defensive angle: every Windows variant of this chain crosses two behavioural chokepoints that are cheap to monitor and rare in benign use — explorer.exe spawning a shell interpreter (the Run-dialog paste), and a script file landing in the per-user Startup autorun directory. Neither depends on an atomic indicator, so both survive infrastructure rotation. Atomic IOCs in this pack come directly from the CERT-UA advisory and are worth deploying, but the behavioural hunts are the durable coverage.
Defender priority: Hunt explorer.exe → powershell.exe and writes to …\Start Menu\Programs\Startup\ across the last 90 days before importing indicators. The lure is user-consented execution — EDR prevention policy will not stop a user who was told to paste the command, so detection and Run-dialog hardening (GPO NoRun / ASR script rules) carry the load.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry fwd |
|---|---|---|---|
| T1 | CERT-UA advisory 6318437 (2026-07-19) | Primary. Full narrative of the ClickFix vector, all seven malware codenames, the SMARTAXE eth_call resolver mechanism, Cloaking.House usage, and the complete file / network / host indicator list. | yes |
| T2 | The Hacker News (2026-07-19) | Corroborates actor attribution (Sandworm sub-cluster, GRU), the ten-plus compromised sites figure, and the role of each named implant. | yes |
| T2 | SOC Prime (2026-07-16) | Corroborates the wider initial-access set: torrented trojanised Windows/Office installers and Signal-delivered "antivirus" lures alongside ClickFix. | partial |
| T3 | The Cyber Express | General-audience corroboration of the ClickFix flow and victimology. No unique technical detail. | partial |
Research decisions
- Indicator source of truth is CERT-UA only. Every hash and domain in this pack is transcribed from the advisory's indicator block; no indicator was carried from a secondary outlet.
- Correction applied: the C2 domain is
offlce366[.]com— an L-for-i typosquat of "office366" — notoffice366[.]com. Several early write-ups render it as the latter. Blocking the wrong string yields zero coverage; the advisory's literal spelling is used throughout this pack. - Not carried forward as atomic IOCs: Cloaking.House (a third-party service, not attacker-owned infrastructure), the SMARTAXE Ethereum contract address and function selector (not published), and any Dropbox API endpoint (the advisory names the service, not a host). These appear as behavioural signals instead.
proxy[.]duckduckgo[.]com,images[.]stockmemory[.]site,images[.]stockmemory[.]spaceandsteamcommunity.comare flagged by CERT-UA as legitimate resources abused for C2/dead-drop. They are shipped as hunt/enrich only — blocking them will generate business impact and will not stop the actor.- Perishability: hashes are durable; the ten-plus compromised sites and the SMARTAXE-resolved domains rotate on the order of days-to-weeks. Re-pull the advisory before relying on network indicators past ~30 days.
Provenance: every atomic indicator in this pack traces back to the CERT-UA primary advisory; the corroborating sources supply narrative and attribution only.
Hunt Brief & Attack Chain
Attack chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | User visits a compromised legitimate website; Cloaking.House and/or SMARTAXE decide whether to serve the lure. SMARTAXE resolves its remote domain via an Ethereum eth_call. | Proxy / DNS logs, browser history | Web-tier only. No endpoint telemetry — this is a declared coverage gap (see §15). |
| 2 | Fake CAPTCHA instructs the victim to copy a PowerShell command and run it via Win+R or Windows Terminal. | RegGenericValueUpdate (RunMRU), ProcessRollup2 | Q1, Q2 — explorer.exe parenting a shell; RunMRU values containing interpreter strings. |
| 3 | The pasted command downloads a VBS file into the user's Startup autorun directory. One variant is codenamed GHETTOVIBE (Copilot Agent.vbs; a related sample is Work Copilot.vbs). | ProcessRollup2, FileCreateInfo, NewScriptWritten | Q3, Q5 — download cradle referencing Startup; script file created in the autorun path. |
| 4 | GHETTOVIBE executes at next logon via wscript.exe and beacons to its staging hosts. | ProcessRollup2, DnsRequest | Q4, Q8 — wscript/cscript with a Startup path in the command line; DNS for the GHETTOVIBE staging domains. |
| 5 | SCOUTCURL (reshV1_2.ps1) is staged for triage recon: hardware, installed software, files, browser data — then exfiltrated. | ProcessRollup2 | Q11 — PowerShell combining system inventory with browser-credential-store paths. |
| 6 | Loaders deploy: FLUIDLEECH (ESET AV Remover.exe → updatus.exe, posing as virus-removal software) and LOADLOOP (sl3.exe). | ProcessRollup2, PeFileWritten | Q6, Q10 — named-artifact and hash sweeps; unsigned "AV remover" spawning a child. |
| 7 | FREAKYPOLL Python backdoor establishes persistent remote access, deployed as .pyc bytecode with a private interpreter under %LOCALAPPDATA%\SystemHelper\python\. | ProcessRollup2, FileCreateInfo | Q7 — python interpreter executing from a non-standard user-writable directory. |
| 8 | Android track: COWARDDUCK APK (ESET.apk) delivered over messengers; exfiltrates contacts, documents and live geolocation via the Dropbox API, retrieving tasking from images on legitimate hosts. | MDM / mobile telemetry | Out of Falcon Windows scope. Native mobile hunts in §7; declared gap in §15. |
| 9 | Dead-drop C2 and exfil over legitimate services (Dropbox API, steamcommunity.com, DuckDuckGo proxy). | DnsRequest, NetworkConnectIP4 | Q9 — these destinations reached by a process that is not a browser or the vendor's own client. |
Hunt hypotheses (fidelity-ordered)
| # | Hypothesis | MITRE | Events | Expected FP | Conf |
|---|---|---|---|---|---|
| H1 | A user was socially engineered into pasting an interpreter command into the Run dialog, so explorer.exe directly parents powershell.exe/cmd.exe with download or encoding flags. | T1204.004, T1059.001 | ProcessRollup2 | Admins and helpdesk scripts launched from Run | HIGH |
| H2 | The Run-dialog paste is recorded in the user's RunMRU registry key, leaving forensic evidence even if the process rolled off retention. | T1204.004 | RegGenericValueUpdate | Legitimate admin use of Run | HIGH |
| H3 | A script file (.vbs/.js/.ps1/.hta/.lnk) was written into a per-user Startup autorun directory by a non-installer process. | T1547.001 | FileCreateInfo, NewScriptWritten | Legacy LOB installers, IT logon-script deployment | HIGH |
| H4 | wscript.exe/cscript.exe is executing a script located in a Startup autorun directory. | T1059.005, T1547.001 | ProcessRollup2 | Legacy enterprise VBS logon scripts | HIGH |
| H5 | A PowerShell download cradle writes its output into the Startup directory in a single command line. | T1105, T1547.001 | ProcessRollup2 | Very rare benign; software-deployment tooling | HIGH |
| H6 | A binary named as security/AV-removal software (FLUIDLEECH, LOADLOOP) executes from a user-writable path and spawns a child. | T1036.005, T1204.002 | ProcessRollup2 | Genuine ESET AV Remover runs during migrations | MED |
| H7 | A Python interpreter runs from a non-standard user-writable directory executing compiled bytecode (FREAKYPOLL). | T1059.006, T1027.011 | ProcessRollup2 | Embedded Python in dev tooling and vendor apps | MED |
| H8 | An endpoint resolved one of the CERT-UA-published campaign domains. | T1071.001 | DnsRequest | Near-zero; sinkhole and researcher traffic | HIGH |
| H9 | A non-browser, non-vendor process is reaching Dropbox API, steamcommunity.com or the DuckDuckGo proxy — dead-drop C2 or exfil. | T1102.002, T1567.002 | DnsRequest | Backup agents, game launchers, sync clients | MED |
| H10 | A file matching a published campaign hash exists or executed in the estate. | T1204.002 | ProcessRollup2, PeFileWritten | None | HIGH |
| H11 | PowerShell is performing system inventory and touching browser credential stores in one session (SCOUTCURL). | T1082, T1217, T1539 | ProcessRollup2 | Asset-inventory and browser-migration tooling | MED |
| H12 | A campaign-named artifact appears in any command line (GHETTOVIBE / SCOUTCURL / LOADLOOP / SMARTAXE filenames). | T1204.002 | ProcessRollup2 | None | HIGH |
Consolidated IOC Table
All indicators transcribed verbatim from CERT-UA advisory 6318437. Domains are shown defanged.
Files
| Filename | Family | SHA256 | MD5 | Conf | Action |
|---|---|---|---|---|---|
| Copilot Agent.vbs | GHETTOVIBE | 78e31b518516fd5b11f63dbe91f96aece7d95f027a612b9a8baf9989a0598693 | df586c8f8bb6f3fda68d0f60345613f3 | high | detect |
| Work Copilot.vbs | VBS dropper (related) | 0abaae3054d6dc5bee1f17684df98bf427e5c73eb3a0febb123f9ce670dbde78 | a7ee9222e0e1856f8c1fe341c669ed9b | high | detect |
| reshV1_2.ps1 | SCOUTCURL | 157aca11cdd3482728e1f687cb643f6c063025aebaf488159b4d3bf6aa9aa46d | a35fc74528f0a03692288ba86dc92960 | high | detect |
| ESET AV Remover.exe | FLUIDLEECH carrier (contains updatus.exe) | 45ec265667be203aa552744cbb1c3d10f04f91d8de513eaf8f0ff99817e2b660 | 20ee4a5c6422fef7f22b26bac3c1b7f2 | high | detect |
| updatus.exe | FLUIDLEECH carrier | 8bd8ab9eef9ebfa683a37c0bcd8a1e29ec032861e01f15bc3488586b400b0982 | ee85ed7f5d366d84001db0be6c340984 | high | detect |
| updatus.truncated.exe | FLUIDLEECH | 6065f5541d4c5e70d7ae821e275856755c900df2971e20d51314d738933bc81e | 65eb40ec0156e2ef0e9732e6fa6fe002 | high | detect |
| sl3.exe | LOADLOOP | a000fd4ab4c951d246f9db7e9d77dd3f3e91bbafbb93499cadf4ac5e31b77ed6 | c1e7c4304ba17f77856e8cc809cd69a8 | high | detect |
| update.cpython-314.pyc | FREAKYPOLL | 488b2b1b5434db7a47471220c0bac940bc5900c258ed076589d45468c4f838c6 | 2b21e2c6ccb1645f45890baf07590600 | high | detect |
| ESET.apk | COWARDDUCK (Android) | 0c6095acf2e075db839872a0a74000cfb8a3984fff719ac7e5cc11115eefedad | b674f1c1b941b6fa1373207a1d1431de | high | detect |
| wp-header.js | SMARTAXE (server-side) | 25606f1239350b2c93d72bfbd63aa165b922326a50a1c79fc9556e74731b673a | 5d176e6eb88ccfe7d48945fec4262817 | high | hunt |
Network
| Domain | Attribution | Conf | Action | Expiry |
|---|---|---|---|---|
| update-requirements[.]com | FREAKYPOLL | high | detect | 2027-01-20 |
| entouchnetworks[.]com | SMARTAXE | high | detect | 2027-01-20 |
| static[.]diagnostics-monitoring[.]com | GHETTOVIBE | high | detect | 2027-01-20 |
| static[.]opennetworkconnect[.]com | GHETTOVIBE | high | detect | 2027-01-20 |
| softupdater[.]org | FLUIDLEECH | high | detect | 2027-01-20 |
| soft[.]softchecker[.]org | FLUIDLEECH | high | detect | 2027-01-20 |
| pack[.]softpacker[.]org | FLUIDLEECH | high | detect | 2027-01-20 |
| smartlinkupload[.]com | Campaign infrastructure | high | detect | 2027-01-20 |
| delta[.]smartlinkupload[.]com | Campaign infrastructure | high | detect | 2027-01-20 |
| offlce366[.]com | Campaign infrastructure (typosquat — note the letter L) | high | detect | 2027-01-20 |
| 365softupdate[.]com | Campaign infrastructure | high | detect | 2027-01-20 |
| images[.]stockmemory[.]site | Legitimate service abused as COWARDDUCK C2 dead-drop | medium | hunt | 2026-10-20 |
| images[.]stockmemory[.]space | Legitimate service abused as COWARDDUCK C2 dead-drop | medium | hunt | 2026-10-20 |
| proxy[.]duckduckgo[.]com | Legitimate service used by COWARDDUCK for relay | low | enrich | 2026-08-20 |
Host
| Artifact | Meaning | Action |
|---|---|---|
%LOCALAPPDATA%\SystemHelper\python\ | Private Python interpreter directory staged for FREAKYPOLL | detect |
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\Copilot Agent.vbs | GHETTOVIBE autorun persistence | detect |
Not published, do not invent: the SMARTAXE Ethereum contract address and function selector, the Dropbox API tokens/endpoints, and the identities of the ten-plus compromised websites. Those slots ship as REPLACE_WITH_ placeholders in §10, not as guesses.
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows workstations (all users with browser + Run dialog) | Falcon ProcessRollup2 / SyntheticProcessRollup2 | CRITICAL | Low — default sensor coverage |
| Per-user Startup autorun directories | FileCreateInfo, NewScriptWritten, NewExecutableWritten | CRITICAL | Low |
| Run-dialog / RunMRU registry | RegGenericValueUpdate, AsepValueUpdate | HIGH | Medium — registry-value telemetry is sometimes trimmed by policy |
| Endpoint DNS resolution | DnsRequest | HIGH | Medium — encrypted DNS (DoH) in the browser bypasses sensor DNS visibility |
| Egress to Dropbox / Steam / DuckDuckGo | DnsRequest, NetworkConnectIP4, proxy logs | MEDIUM | Medium — TLS-inspection-dependent for full fidelity |
| Android devices (BYOD and corporate) | MDM / mobile threat defence; Falcon for Mobile if licensed | HIGH | HIGH — usually no telemetry at all on BYOD |
| Externally-hosted web properties you own | Web-server file-integrity monitoring, CMS audit logs | HIGH | HIGH — SMARTAXE lives server-side; EDR on the client never sees it |
| Web proxy / secure web gateway | Full URL + referrer logging | MEDIUM | Medium — needed to identify which compromised site served the lure |
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query / control |
|---|---|---|---|
| Resource Development | T1584.004 — Compromise Infrastructure: Server | Ten-plus legitimate websites compromised to host the lure | Hardening §12 (web tier) |
| Initial Access | T1189 — Drive-by Compromise | Fake CAPTCHA served conditionally by Cloaking.House / SMARTAXE | Proxy hunts §7 |
| Execution | T1204.004 — User Execution: Malicious Copy and Paste | Victim pastes the supplied command into Run / Terminal | Q1, Q2 |
| Execution | T1059.001 — PowerShell | Download cradle stages the VBS payload | Q1, Q5, Q11 |
| Execution | T1059.005 — Visual Basic | GHETTOVIBE VBS executed by wscript | Q4, Q12 |
| Execution | T1059.006 — Python | FREAKYPOLL runs as compiled bytecode | Q7 |
| Persistence | T1547.001 — Registry Run Keys / Startup Folder | VBS dropped into the per-user Startup directory | Q3, Q4, Q5 |
| Defense Evasion | T1036.005 — Masquerading: Match Legitimate Name or Location | FLUIDLEECH poses as ESET AV Remover; COWARDDUCK APK poses as security software | Q6, Q10 |
| Defense Evasion | T1027.011 — Fileless / compiled bytecode payload | FREAKYPOLL shipped as .pyc | Q7 |
| Defense Evasion | T1568.003 — Dynamic Resolution: DNS Calculation | SMARTAXE resolves its C2 domain from an Ethereum smart contract (EtherHiding) | §7 web-tier hunt; declared gap §15 |
| Discovery | T1082 — System Information Discovery | SCOUTCURL inventories hardware and installed software | Q11 |
| Credential Access | T1539 / T1555.003 — Browser cookies and credentials | SCOUTCURL collects browser data | Q11 |
| Command and Control | T1071.001 — Application Layer Protocol: Web | Beaconing to campaign domains over HTTP/S | Q8 |
| Command and Control | T1102.002 — Web Service: Bidirectional Communication | Tasking retrieved from images on legitimate hosts incl. steamcommunity.com | Q9 |
| Command and Control | T1090.002 — External Proxy | COWARDDUCK relays via proxy.duckduckgo.com | Q9 |
| Exfiltration | T1567.002 — Exfiltration to Cloud Storage | File upload via the Dropbox API | Q9 |
| Collection | T1430 / T1636 — Mobile location and protected data | COWARDDUCK collects contacts, documents, live geolocation | §7 mobile hunts |
Native Audit-Log Hunts (non-CQL)
Windows event log / Sysmon
- Sysmon Event ID 1 — process create where
ParentImageends inexplorer.exeandImageispowershell.exe,pwsh.exe,cmd.exe,wt.exeormshta.exe. This is the ClickFix signature in a Sysmon-only estate. - Sysmon Event ID 11 — file create where
TargetFilenamecontains\Start Menu\Programs\Startup\. Baseline this for a week; in most estates the benign set is a handful of vendor shortcuts. - PowerShell Operational 4104 (script-block logging) — script blocks containing both a download cradle and a Startup path, or containing
Get-ComputerInfoalongside browser profile paths (SCOUTCURL shape). - Security 4688 with command-line auditing enabled — same parent/child pattern as Sysmon ID 1 if Sysmon is not deployed.
Offline / forensic triage
- Dump
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRUon any suspect host — this key retains what the user typed or pasted into the Run dialog, and survives long after process telemetry has aged out. It is the single highest-value artifact for confirming or ruling out ClickFix on a specific machine. - List the contents of
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\and the machine-wide equivalent under%ProgramData%. - Check for the existence of
%LOCALAPPDATA%\SystemHelper\python\— this directory has no legitimate reason to exist and its presence alone warrants escalation.
Web proxy / SWG
- Pull full-URL logs for the 90 days preceding any confirmed endpoint hit and identify the referring site — that site is compromised and its owner should be notified.
- Hunt for requests to Ethereum JSON-RPC endpoints (
eth_callpayloads to public RPC providers) originating from user browsers; this is the SMARTAXE resolver step and is unusual outside of Web3 development work.
Web properties you own (SMARTAXE server-side)
- File-integrity check on CMS theme and plugin JavaScript. CERT-UA names
wp-header.jsas a SMARTAXE artifact — a WordPress-shaped filename that blends into a theme directory. Compare all deployed JS against version control or a clean vendor archive. - Review CMS user accounts, installed plugins and any webshells; CERT-UA notes explicitly that use of a site in this campaign is itself proof the site is compromised.
Mobile (COWARDDUCK)
- MDM inventory query for any installed package whose display name impersonates a security vendor but was sideloaded (installer package not the managed store).
- Alert on newly-granted
ACCESS_FINE_LOCATION,READ_CONTACTSand storage permissions on sideloaded apps. - Advise users that legitimate antivirus vendors never distribute APKs over Signal, WhatsApp or Telegram.
CrowdStrike LogScale CQL Hunt Queries
Looks for: the defining ClickFix artifact — the Windows Run dialog and Windows Terminal are children of explorer.exe, so a user pasting an attacker-supplied command produces explorer.exe → powershell.exe carrying download or encoding flags. FP: administrators and helpdesk staff legitimately launch scripts from Run; exclude your known admin accounts and any deployment tooling before promoting.
// HUNT: ClickFix Run-dialog paste — explorer.exe parenting an interpreter // MITRE: T1204.004, T1059.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: admin/helpdesk use of Win+R; software deployment agents // TUNING: exclude UserName in your admin group and known deployment service accounts #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^explorer\.exe$/i | FileName=/^(powershell|pwsh|cmd|wt|mshta)\.exe$/i | CommandLine=/(-enc|-EncodedCommand|-w hidden|-windowstyle hidden|iex|Invoke-Expression|DownloadString|DownloadFile|Invoke-WebRequest|Start-BitsTransfer|FromBase64String|curl |certutil)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
Looks for: the forensic residue of the paste. Windows records every Run-dialog entry in RunMRU, so this fires even when the process itself has aged out of retention — and it recovers the full original string the user was told to type. FP: genuine admin use of the Run dialog; scope to non-admin users first.
// HUNT: RunMRU value containing an interpreter or download cradle // MITRE: T1204.004 // CONF: high FP: low COST: low | REQUIRES: RegGenericValueUpdate // FALSE POSITIVES: admins typing powershell/cmd into Run // TUNING: filter to standard-user accounts; a paste is typically long, so triage by string length first #event_simpleName=/^(RegGenericValueUpdate|AsepValueUpdate)$/ | RegObjectName=/RunMRU/i | RegStringValue=/(powershell|pwsh|mshta|curl|certutil|iex|Invoke-Expression|Invoke-WebRequest|DownloadString|FromBase64String|conhost)/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue], limit=200)
Looks for: GHETTOVIBE's persistence step — a VBS (or any script/executable) landing in …\Start Menu\Programs\Startup\. In most estates the benign population of this directory is a handful of vendor shortcuts, which makes it one of the cleanest autorun hunts available. FP: legacy line-of-business installers and IT logon-script deployment; baseline for one week and allowlist by writing process.
// HUNT: GHETTOVIBE — script/PE written to the Startup autorun directory // MITRE: T1547.001 // CONF: high FP: low COST: low | REQUIRES: FileCreateInfo / NewScriptWritten // FALSE POSITIVES: LOB installers, IT logon-script deployment // TUNING: allowlist by ContextBaseFileName once your benign writers are baselined #event_simpleName=/^(FileCreateInfo|NewScriptWritten|NewExecutableWritten|PeFileWritten)$/ | TargetFileName=/Start Menu\\Programs\\Startup/i | TargetFileName=/\.(vbs|vbe|js|jse|wsf|wsh|hta|ps1|psm1|lnk|bat|cmd|scr|exe|dll|pyc)$/i | table([@timestamp, ComputerName, UserName, TargetFileName, ContextBaseFileName, SHA256HashData], limit=200)
Looks for: GHETTOVIBE actually firing at logon. Catches the persistence even if the original drop predates your retention window. FP: some enterprises still run legacy VBS logon scripts from Startup; those are a small, stable, easily-allowlisted set.
// HUNT: Script host executing a payload located in a Startup autorun directory // MITRE: T1059.005, T1547.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legacy enterprise VBS logon scripts // TUNING: allowlist the specific script names your IT team deploys #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(wscript|cscript|mshta|powershell|pwsh)\.exe$/i | CommandLine=/Start Menu\\Programs\\Startup/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
Looks for: the exact command CERT-UA describes — one PowerShell invocation that both retrieves a remote file and saves it into the autorun directory. Download-plus-autorun in a single command line is essentially never benign.
// HUNT: Single-command download-to-Startup (the ClickFix payload stage) // MITRE: T1105, T1547.001, T1059.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: rare; some software-deployment scripting // TUNING: allowlist your deployment tool's service account if it stages shortcuts this way #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh|cmd)\.exe$/i | CommandLine=/Startup/i | CommandLine=/(DownloadFile|DownloadString|Invoke-WebRequest|Start-BitsTransfer|WebClient|OutFile|curl |certutil|bitsadmin)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: the loader stage by artifact name — CERT-UA names ESET AV Remover.exe (carrier), updatus.exe (FLUIDLEECH) and sl3.exe (LOADLOOP). FP: the genuine ESET AV Remover utility is a real tool used during AV migrations — always confirm against the published SHA256 in §4 and check the signing status before escalating. Any unsigned copy running from a user-writable path is malicious until proven otherwise.
// HUNT: FLUIDLEECH / LOADLOOP named artifacts // MITRE: T1036.005, T1204.002 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: the genuine ESET AV Remover during a real AV migration // TUNING: cross-check SHA256HashData against the campaign hashes in section 4; treat // TUNING: any copy executing from Downloads/Temp/AppData as malicious until cleared #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(ESET AV Remover|updatus|updatus\.truncated|sl3)\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData], limit=200)
Looks for: the FREAKYPOLL backdoor's execution shape — a private Python interpreter staged under %LOCALAPPDATA%\SystemHelper\python\ running compiled .pyc bytecode. The SystemHelper path is a CERT-UA-published host indicator and has no legitimate use. FP: vendor applications and developer tooling do embed private Python interpreters under AppData — allowlist those by their parent application directory, but never allowlist SystemHelper itself.
// HUNT: FREAKYPOLL — Python backdoor executing from a staged AppData interpreter // MITRE: T1059.006, T1027.011 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: embedded Python in dev tooling and vendor apps under AppData // TUNING: allowlist known vendor app directories; never allowlist SystemHelper #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(python|pythonw)[0-9.]*\.exe$/i | ImageFileName=/AppData\\Local\\(SystemHelper|Temp)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData], limit=200)
Looks for: resolution of any CERT-UA-published campaign domain. Note offlce366.com is spelled with a lowercase L, not an i — copying it wrong yields silent zero coverage. Run this across the maximum retention you hold.
// HUNT: UAC-0145 published C2 / staging domain resolution // MITRE: T1071.001 // CONF: high FP: low COST: low | REQUIRES: DnsRequest // FALSE POSITIVES: sinkholed infrastructure; internal researcher lookups // NOTE: offlce366 uses a lowercase L — verify the literal before deploying #event_simpleName=DnsRequest | DomainName=/^(update-requirements\.com|entouchnetworks\.com|smartlinkupload\.com|delta\.smartlinkupload\.com|static\.diagnostics-monitoring\.com|static\.opennetworkconnect\.com|softupdater\.org|soft\.softchecker\.org|pack\.softpacker\.org|offlce366\.com|365softupdate\.com|images\.stockmemory\.site|images\.stockmemory\.space)$/i | table([@timestamp, ComputerName, UserName, DomainName, ContextBaseFileName], limit=200)
Looks for: the living-off-trusted-services pattern — Dropbox API for exfil and steamcommunity.com / DuckDuckGo proxy for tasking retrieval, reached by a process that is neither a browser nor the vendor's own client. FP: backup agents, sync clients and game launchers legitimately reach these hosts; the exclusion list below covers the common ones and must be extended with whatever is normal in your estate before this is promoted past investigate-only.
// HUNT: Trusted-service dead-drop C2 / exfil from an unexpected process // MITRE: T1102.002, T1567.002, T1090.002 // CONF: medium FP: medium COST: medium | REQUIRES: DnsRequest // FALSE POSITIVES: backup/sync agents, game launchers, security tooling // TUNING: extend the ContextBaseFileName exclusion with your approved sync clients #event_simpleName=DnsRequest | DomainName=/(dropboxapi\.com|content\.dropboxapi\.com|steamcommunity\.com|proxy\.duckduckgo\.com)$/i | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|iexplore|safari|Dropbox|steam|steamwebhelper|duckduckgo)\.exe$/i | table([@timestamp, ComputerName, UserName, DomainName, ContextBaseFileName], limit=200)
Looks for: any execution or write of a file matching a CERT-UA-published SHA256. Zero false positives by construction — any hit is a confirmed incident, not a hunt lead.
// HUNT: UAC-0145 published SHA256 sweep (execution or file write) // MITRE: T1204.002 // CONF: high FP: low COST: medium | REQUIRES: ProcessRollup2, PeFileWritten // FALSE POSITIVES: none — treat any hit as a confirmed incident #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten|NewScriptWritten)$/ | in(SHA256HashData, values=[ "78e31b518516fd5b11f63dbe91f96aece7d95f027a612b9a8baf9989a0598693", "0abaae3054d6dc5bee1f17684df98bf427e5c73eb3a0febb123f9ce670dbde78", "157aca11cdd3482728e1f687cb643f6c063025aebaf488159b4d3bf6aa9aa46d", "45ec265667be203aa552744cbb1c3d10f04f91d8de513eaf8f0ff99817e2b660", "8bd8ab9eef9ebfa683a37c0bcd8a1e29ec032861e01f15bc3488586b400b0982", "6065f5541d4c5e70d7ae821e275856755c900df2971e20d51314d738933bc81e", "a000fd4ab4c951d246f9db7e9d77dd3f3e91bbafbb93499cadf4ac5e31b77ed6", "488b2b1b5434db7a47471220c0bac940bc5900c258ed076589d45468c4f838c6", "25606f1239350b2c93d72bfbd63aa165b922326a50a1c79fc9556e74731b673a"]) | table([@timestamp, ComputerName, UserName, FileName, TargetFileName, ImageFileName, SHA256HashData], limit=max)
Looks for: the SCOUTCURL behaviour profile — a PowerShell session doing system/software inventory and touching browser profile stores in the same command line. Either alone is common; the combination is the triage-and-steal pattern. FP: asset-inventory agents and browser-migration tooling; exclude your inventory platform's service account and any profile-migration utility.
// HUNT: SCOUTCURL-shaped recon — inventory plus browser credential stores // MITRE: T1082, T1217, T1539, T1555.003 // CONF: medium FP: medium COST: medium | REQUIRES: ProcessRollup2 // FALSE POSITIVES: asset-inventory agents, browser profile migration tools // TUNING: exclude the service account used by your inventory platform #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)\.exe$/i | CommandLine=/(Get-ComputerInfo|Get-WmiObject|Get-CimInstance|systeminfo|Win32_ComputerSystem|Get-ItemProperty.*Uninstall)/i | CommandLine=/(Login Data|Web Data|Local State|Cookies|AppData\\Local\\Google\\Chrome|AppData\\Roaming\\Mozilla|AppData\\Local\\Microsoft\\Edge)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: the campaign's distinctive filenames anywhere in process command lines. Cheap, name-based backstop that catches renamed-hash variants still invoked by their original filename.
// HUNT: UAC-0145 named artifacts referenced in a command line // MITRE: T1204.002 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: negligible — these are campaign-specific filenames #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(Copilot Agent\.vbs|Work Copilot\.vbs|reshV1_2\.ps1|update\.cpython-314\.pyc|updatus\.exe|sl3\.exe|wp-header\.js|SystemHelper)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
CrowdStrike Custom IOA Recommendations
Three queries are strong enough to promote to Custom IOAs. The rest stay investigate-only until baselined.
| IOA name | From | Pattern | Exclusions | Action |
|---|---|---|---|---|
| UAC-0145 · ClickFix Run-Dialog Interpreter | Q1 | Process Creation — parent explorer.exe, image powershell.exe/pwsh.exe/cmd.exe, command line matching the download-or-encode set | Admin and helpdesk accounts; deployment agent service accounts | Detect (High) — move to Prevent only after a clean two-week baseline |
| UAC-0145 · Startup Autorun Script Drop | Q3 | File Creation — target path contains \Start Menu\Programs\Startup\ and extension in the script/PE set | Your software-deployment writer processes | Detect (High) |
| UAC-0145 · Download-to-Startup Cradle | Q5 | Process Creation — image powershell.exe, command line contains both a download primitive and Startup | None known | Prevent (Critical) — this combination has no benign use we could identify |
Investigate-only (do not promote yet)
- Q6, Q7, Q9, Q11 — each has a real benign population (AV migrations, embedded Python, sync clients, inventory agents). Baseline for 14 days and convert exclusions into the IOA before promotion.
- Q8, Q10, Q12 — better served by Falcon IOC Management (see §10) than by an IOA, since they are pure atomic matching.
Deployment path
- Endpoint security → Custom IOA rule groups → create a Windows rule group named
UAC-0145-ClickFix. - Add each rule in Monitor action first; assign the group to a pilot prevention policy covering ~5% of workstations.
- Review hits daily for 14 days, folding every benign hit into the rule's exclusion regex.
- Promote to Detect (all three) and Prevent (the Q5 rule) estate-wide.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,78e31b518516fd5b11f63dbe91f96aece7d95f027a612b9a8baf9989a0598693,prevent,critical,2027-01-20,GHETTOVIBE VBS dropper (Copilot Agent.vbs),campaign:UAC-0145 sha256,0abaae3054d6dc5bee1f17684df98bf427e5c73eb3a0febb123f9ce670dbde78,prevent,critical,2027-01-20,VBS dropper (Work Copilot.vbs),campaign:UAC-0145 sha256,157aca11cdd3482728e1f687cb643f6c063025aebaf488159b4d3bf6aa9aa46d,prevent,critical,2027-01-20,SCOUTCURL recon script (reshV1_2.ps1),campaign:UAC-0145 sha256,45ec265667be203aa552744cbb1c3d10f04f91d8de513eaf8f0ff99817e2b660,prevent,critical,2027-01-20,FLUIDLEECH carrier (ESET AV Remover.exe),campaign:UAC-0145 sha256,8bd8ab9eef9ebfa683a37c0bcd8a1e29ec032861e01f15bc3488586b400b0982,prevent,critical,2027-01-20,FLUIDLEECH carrier (updatus.exe),campaign:UAC-0145 sha256,6065f5541d4c5e70d7ae821e275856755c900df2971e20d51314d738933bc81e,prevent,critical,2027-01-20,FLUIDLEECH loader,campaign:UAC-0145 sha256,a000fd4ab4c951d246f9db7e9d77dd3f3e91bbafbb93499cadf4ac5e31b77ed6,prevent,critical,2027-01-20,LOADLOOP loader (sl3.exe),campaign:UAC-0145 sha256,488b2b1b5434db7a47471220c0bac940bc5900c258ed076589d45468c4f838c6,prevent,critical,2027-01-20,FREAKYPOLL python backdoor bytecode,campaign:UAC-0145 sha256,25606f1239350b2c93d72bfbd63aa165b922326a50a1c79fc9556e74731b673a,detect,high,2027-01-20,SMARTAXE server-side cloaking script (wp-header.js),campaign:UAC-0145 sha256,0c6095acf2e075db839872a0a74000cfb8a3984fff719ac7e5cc11115eefedad,detect,high,2027-01-20,COWARDDUCK Android backdoor (ESET.apk) - mobile MDM import,campaign:UAC-0145 md5,df586c8f8bb6f3fda68d0f60345613f3,detect,high,2027-01-20,GHETTOVIBE VBS dropper,campaign:UAC-0145 md5,a7ee9222e0e1856f8c1fe341c669ed9b,detect,high,2027-01-20,VBS dropper (Work Copilot.vbs),campaign:UAC-0145 md5,a35fc74528f0a03692288ba86dc92960,detect,high,2027-01-20,SCOUTCURL recon script,campaign:UAC-0145 md5,20ee4a5c6422fef7f22b26bac3c1b7f2,detect,high,2027-01-20,FLUIDLEECH carrier,campaign:UAC-0145 md5,ee85ed7f5d366d84001db0be6c340984,detect,high,2027-01-20,FLUIDLEECH carrier (updatus.exe),campaign:UAC-0145 md5,65eb40ec0156e2ef0e9732e6fa6fe002,detect,high,2027-01-20,FLUIDLEECH loader,campaign:UAC-0145 md5,c1e7c4304ba17f77856e8cc809cd69a8,detect,high,2027-01-20,LOADLOOP loader,campaign:UAC-0145 md5,2b21e2c6ccb1645f45890baf07590600,detect,high,2027-01-20,FREAKYPOLL bytecode,campaign:UAC-0145 md5,b674f1c1b941b6fa1373207a1d1431de,detect,high,2027-01-20,COWARDDUCK APK,campaign:UAC-0145 md5,5d176e6eb88ccfe7d48945fec4262817,detect,high,2027-01-20,SMARTAXE cloaking script,campaign:UAC-0145 domain,update-requirements.com,detect,high,2027-01-20,FREAKYPOLL C2,campaign:UAC-0145 domain,entouchnetworks.com,detect,high,2027-01-20,SMARTAXE infrastructure,campaign:UAC-0145 domain,static.diagnostics-monitoring.com,detect,high,2027-01-20,GHETTOVIBE staging,campaign:UAC-0145 domain,static.opennetworkconnect.com,detect,high,2027-01-20,GHETTOVIBE staging,campaign:UAC-0145 domain,softupdater.org,detect,high,2027-01-20,FLUIDLEECH distribution,campaign:UAC-0145 domain,soft.softchecker.org,detect,high,2027-01-20,FLUIDLEECH distribution,campaign:UAC-0145 domain,pack.softpacker.org,detect,high,2027-01-20,FLUIDLEECH distribution,campaign:UAC-0145 domain,smartlinkupload.com,detect,high,2027-01-20,campaign infrastructure,campaign:UAC-0145 domain,delta.smartlinkupload.com,detect,high,2027-01-20,campaign infrastructure,campaign:UAC-0145 domain,offlce366.com,detect,high,2027-01-20,campaign infrastructure - typosquat spelled with lowercase L,campaign:UAC-0145 domain,365softupdate.com,detect,high,2027-01-20,campaign infrastructure,campaign:UAC-0145 domain,images.stockmemory.site,detect,medium,2026-10-20,COWARDDUCK dead-drop on a legitimate host - HUNT not block,campaign:UAC-0145 domain,images.stockmemory.space,detect,medium,2026-10-20,COWARDDUCK dead-drop on a legitimate host - HUNT not block,campaign:UAC-0145 domain,REPLACE_WITH_SMARTAXE_RESOLVED_DOMAIN,detect,high,2026-10-20,resolved at runtime from an Ethereum contract - not published,campaign:UAC-0145 domain,REPLACE_WITH_COMPROMISED_LURE_SITE,detect,medium,2026-10-20,one of 10+ compromised sites - identities not published,campaign:UAC-0145 # proxy.duckduckgo.com is abused by COWARDDUCK but is a legitimate service - enrich only, never block
BEHAVIOURAL SIGNALS - UAC-0145 ClickFix (no atomic indicator required)
B1 explorer.exe directly parents powershell.exe / pwsh.exe / cmd.exe / wt.exe
carrying a download primitive or -EncodedCommand. [Run-dialog paste]
B2 HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU gains a value
containing an interpreter name or download cradle.
B3 Any .vbs / .js / .ps1 / .hta / .lnk / .exe created in
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\
B4 wscript.exe or cscript.exe with a Startup-directory path in its command line.
B5 One PowerShell command line containing BOTH a download primitive AND the
string "Startup". No benign equivalent identified.
B6 Directory %LOCALAPPDATA%\SystemHelper\python\ exists on any endpoint.
B7 python.exe / pythonw.exe executing .pyc bytecode from a user-writable path.
B8 Non-browser process resolving Dropbox API, steamcommunity.com or
proxy.duckduckgo.com. [dead-drop C2 / cloud exfil]
B9 Browser process issuing an Ethereum JSON-RPC eth_call to a public RPC
provider. [SMARTAXE / EtherHiding resolver step]
B10 Sideloaded Android package impersonating a security vendor, requesting
contacts + fine location + storage. [COWARDDUCK]
B11 A binary named as AV-removal tooling executing from Downloads, Temp or
AppData, unsigned or signature-mismatched. [FLUIDLEECH]
UAC-0145 TOOLING (CERT-UA codenames, advisory 6318437)
GHETTOVIBE VBS dropper; persists via the Startup autorun directory
SCOUTCURL PowerShell recon; hardware, software, files, browser data
FLUIDLEECH Loader masquerading as antivirus-removal software
LOADLOOP Loader
FREAKYPOLL Python backdoor, shipped as compiled .pyc bytecode
SMARTAXE Server-side page-content alteration; resolves its C2 domain via an
Ethereum smart-contract eth_call (EtherHiding)
COWARDDUCK Android backdoor; contacts, files, real-time geolocation
HISTORICAL UAC-0145 TOOLING (same cluster, other access vectors)
KALAMBUR / SUMBUR / TAMBUR - implants from the torrent and Signal vectors
OPENSSH + TOR - port forwarding of 445 / 3389 / 22 to actor infra
RSYNC - exfiltration of Signal / WhatsApp key material
THIRD-PARTY SERVICES ABUSED
Cloaking.House traffic filtering / conditional lure delivery
Dropbox API file exfiltration (COWARDDUCK)
steamcommunity.com, images.stockmemory.site/.space tasking dead-drops
proxy.duckduckgo.com relay
POWERSHELL AUDIT - run per host, compare against the intended baseline # 1. Is the Run dialog disabled for standard users? Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name NoRun -EA SilentlyContinue # 2. What is sitting in the per-user Startup autorun directory right now? Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" -Force # 3. What has the user typed or pasted into the Run dialog? Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU" # 4. Does the FREAKYPOLL staging directory exist? Test-Path "$env:LOCALAPPDATA\SystemHelper\python" # 5. Are the relevant ASR rules enforced (not audit, not off)? # d3e037e1-3eb8-44c8-a917-57927947596d JS/VBS launching downloaded content # 3b576869-a4ec-4529-8536-b80a7769e899 Office creating executable content # 5beb7efe-fd9a-4556-801d-275e5ffc04cc Obfuscated script execution Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Actions # 6. Is PowerShell script-block logging on? Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -EA SilentlyContinue # 7. Constrained Language Mode active for standard users? $ExecutionContext.SessionState.LanguageMode
Detection Validation Gates
| Gate | Test | Pass criterion |
|---|---|---|
| G1 · Telemetry ready | Confirm ProcessRollup2, FileCreateInfo, RegGenericValueUpdate and DnsRequest are all present for a representative workstation over the last 24h | All four event types return rows. If RegGenericValueUpdate is empty, Q2 is blind — record it as a gap. |
| G2 · Benign baseline | Run Q1, Q3, Q4, Q6, Q7, Q9, Q11 across 30 days with no exclusions | Each query's benign population is enumerated and written into its TUNING line before promotion |
| G3 · Positive control — Run dialog | From a test workstation, open Win+R and run powershell.exe -Command "Invoke-WebRequest -Uri https://example.com -OutFile $env:TEMP\gate.txt" | Q1 returns the event within the expected ingest delay. Q2 returns the matching RunMRU value. |
| G4 · Positive control — Startup drop | On the same test host, copy a benign, clearly-named text-based .vbs stub into the user Startup directory | Q3 returns the file-create event; delete the stub immediately after. |
| G5 · Positive control — download-to-Startup | Combine G3 and G4 into a single PowerShell command line whose -OutFile targets the Startup directory | Q5 returns the event. This is the gate for the Prevent-tier IOA. |
| G6 · Negative control | Confirm Q5 and Q3 produce zero hits on a 7-day window of a known-clean OU | Zero hits, or every hit explained and excluded |
| G7 · IOC ingest | Import the §10 CSV into Falcon IOC Management | All rows accepted; the two REPLACE_WITH_ rows are rejected or removed as intended |
| G8 · Promotion | 14 days of clean pilot running for the three §9 IOAs | Fewer than one unexplained detection per 1,000 endpoints per week |
Use only benign, clearly-labelled test artifacts for the positive controls and remove them immediately afterwards. Never stage real campaign samples to validate a detection.
Hardening — Tiered
ClickFix defeats payload-blocking because the user supplies the execution. The controls below attack the technique at its three chokepoints: the paste surface, the interpreter, and the autorun directory.
- Enable the ASR rule "Block JavaScript or VBScript from launching downloaded executable content" (
d3e037e1-3eb8-44c8-a917-57927947596d) in Block mode. Directly breaks the GHETTOVIBE VBS stage. MITRE M1038 · Microsoft Security Baseline for Windows. - Enable ASR "Block execution of potentially obfuscated scripts" (
5beb7efe-fd9a-4556-801d-275e5ffc04cc) in Block mode. Targets the encoded PowerShell cradle. MITRE M1038. - Turn on PowerShell script-block logging and module logging estate-wide. Without 4104 you cannot reconstruct what the pasted command actually did. MITRE M1047 · CIS Microsoft Windows Benchmark (Administrative Templates → Windows PowerShell).
- Import the §10 IOC CSV into Falcon IOC Management at Prevent for the nine Windows SHA256 values, Detect for the domains. MITRE M1031.
- Brief users on the ClickFix pattern specifically. The single sentence that inoculates: "No legitimate website, CAPTCHA or IT team will ever ask you to paste a command into the Run box or a terminal." Pair it with a one-click reporting path. MITRE M1017.
- Disable the Run dialog for standard users via GPO: User Configuration → Administrative Templates → Start Menu and Taskbar → Remove Run menu from Start Menu (sets
NoRun). This removes the primary paste surface outright. Pilot on a non-technical OU; expect pushback from developers and IT, who should sit in an exempted group. MITRE M1042 · CIS Windows Benchmark. - Deploy AppLocker or WDAC script rules blocking
.vbs,.js,.wsfand.htaexecution from user-writable paths (Startup, AppData, Temp, Downloads). Audit mode for two weeks, then enforce. MITRE M1038 · Microsoft WDAC guidance. - Change the default handler for
.vbs,.vbe,.js,.jse,.wsfand.htato Notepad so a double-click or autorun opens the file instead of executing it. Low-friction and highly effective against script droppers. MITRE M1042. - Enforce PowerShell Constrained Language Mode for standard users (via WDAC or AppLocker in Allow mode). Neutralises most download cradles without removing PowerShell. MITRE M1038.
- Block newly-registered and uncategorised domains at the secure web gateway. UAC-0145's staging domains are short-lived, so category-based blocking outperforms indicator-based blocking here. MITRE M1021 · NIST SP 800-41.
- Prohibit sideloading on managed Android devices (MDM: disallow install from unknown sources; enforce Play Protect). This is the whole COWARDDUCK vector. MITRE M1012 · CIS Google Android Benchmark. BYOD gap — for unmanaged devices this reduces to user guidance only.
- Full WDAC application-control policy in enforced mode on high-value workstations, so unsigned loaders like FLUIDLEECH and LOADLOOP cannot execute regardless of how they arrive. MITRE M1038 · Microsoft WDAC design guide.
- Remove local administrator rights from standard users and adopt a just-in-time elevation workflow. Limits the blast radius of a user-consented execution. MITRE M1026 · CIS Controls v8 §5, §6.
- File-integrity monitoring and a signed-artifact deployment pipeline for all internet-facing web properties you own. SMARTAXE lives in the CMS theme layer (
wp-header.js); only server-side FIM catches it, and CERT-UA is explicit that participation in this campaign proves the site is compromised. MITRE M1051 · CIS Controls v8 §7 · OWASP CMS hardening guidance. ⚠ best-practice, no single formal benchmark - Mandate a managed-device posture for access to sensitive data via Conditional Access, closing the BYOD-Android telemetry gap that COWARDDUCK exploits. MITRE M1013 · Microsoft Zero Trust deployment guidance.
- Egress control for cloud-storage and gaming-platform APIs — allow Dropbox and Steam only for the processes that legitimately need them, so trusted-service dead-drops lose their cover. MITRE M1037 · NIST SP 800-41.
Deployable Playbooks
Playbook 1 — Disable the Run dialog and harden script handlers (GPO / registry)
Apply to a pilot OU first. Step 1 removes the paste surface; step 2 makes script files inert on double-click.
REM 1. Remove the Run menu for standard users (User Configuration policy)
REM GPO path: User Configuration -> Administrative Templates ->
REM Start Menu and Taskbar -> Remove Run menu from Start Menu
REM Registry equivalent (per-user hive):
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
NoRun REG_DWORD 1
REM 2. Point script extensions at Notepad instead of the script hosts.
REM Deploy as a per-user GPO preference or a logon script.
HKCU\Software\Classes\VBSFile\Shell\Open\Command
(Default) REG_SZ notepad.exe "%1"
HKCU\Software\Classes\JSFile\Shell\Open\Command
(Default) REG_SZ notepad.exe "%1"
HKCU\Software\Classes\WSFFile\Shell\Open\Command
(Default) REG_SZ notepad.exe "%1"
HKCU\Software\Classes\JSEFile\Shell\Open\Command
(Default) REG_SZ notepad.exe "%1"
REM 3. Verify after the policy has applied:
REM gpresult /h report.html then confirm NoRun = 1 in the user scope
Playbook 2 — Enforce the relevant ASR rules (PowerShell)
# Run elevated on each endpoint, or deploy via Intune / GPO / your RMM.
# Action value 1 = Block, 2 = Audit, 6 = Warn. Start at 2, move to 1 after a clean week.
$rules = @{
# Block JavaScript or VBScript from launching downloaded executable content
'd3e037e1-3eb8-44c8-a917-57927947596d' = 1
# Block execution of potentially obfuscated scripts
'5beb7efe-fd9a-4556-801d-275e5ffc04cc' = 1
# Block Office applications from creating executable content
'3b576869-a4ec-4529-8536-b80a7769e899' = 1
# Block process creations originating from PSExec and WMI commands
'd1e49aac-8f56-4280-b9ba-993a6d77406c' = 1
}
foreach ($id in $rules.Keys) {
Add-MpPreference -AttackSurfaceReductionRules_Ids $id `
-AttackSurfaceReductionRules_Actions $rules[$id]
}
# Verify
$p = Get-MpPreference
for ($i = 0; $i -lt $p.AttackSurfaceReductionRules_Ids.Count; $i++) {
'{0} = {1}' -f $p.AttackSurfaceReductionRules_Ids[$i],
$p.AttackSurfaceReductionRules_Actions[$i]
}
Playbook 3 — Enable PowerShell script-block and module logging (GPO / registry)
REM Machine-wide. Required to reconstruct what a pasted command actually executed.
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
EnableScriptBlockLogging REG_DWORD 1
EnableScriptBlockInvocationLogging REG_DWORD 1
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging
EnableModuleLogging REG_DWORD 1
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames
* REG_SZ *
HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription
EnableTranscripting REG_DWORD 1
EnableInvocationHeader REG_DWORD 1
OutputDirectory REG_SZ \\FILESERVER-01\pstranscripts$
REM Ensure the transcript share is append-only for endpoints and readable only by IR.
Playbook 4 — Estate-wide triage sweep (PowerShell, read-only)
# Read-only collection. Run via your RMM or Falcon RTR against the estate and
# review centrally. Collects the four artifacts that confirm or rule out ClickFix.
$out = [ordered]@{ Host = $env:COMPUTERNAME; User = $env:USERNAME }
# 1. Run-dialog history - the paste itself
$mru = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU"
$out.RunMRU = if (Test-Path $mru) {
(Get-ItemProperty $mru).PSObject.Properties |
Where-Object { $_.Name -match '^[a-z]$' } |
ForEach-Object { $_.Value }
} else { 'none' }
# 2. Contents of the per-user Startup autorun directory
$startup = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup"
$out.Startup = Get-ChildItem $startup -Force -EA SilentlyContinue |
Select-Object Name, Length, CreationTimeUtc
# 3. FREAKYPOLL staging directory - existence alone is an escalation
$out.SystemHelper = Test-Path "$env:LOCALAPPDATA\SystemHelper\python"
# 4. Hashes of anything script-like sitting in Startup
$out.StartupHashes = Get-ChildItem $startup -Force -EA SilentlyContinue |
Where-Object { $_.Extension -match '\.(vbs|vbe|js|jse|wsf|hta|ps1|exe|lnk)$' } |
ForEach-Object { '{0} {1}' -f (Get-FileHash $_.FullName -Algorithm SHA256).Hash, $_.Name }
[pscustomobject]$out | ConvertTo-Json -Depth 4
Playbook 5 — Web-property integrity check for SMARTAXE (shell)
# Run on any web server you own that could have been used to serve the lure.
# SMARTAXE was observed as wp-header.js - a CMS-theme-shaped filename.
# 1. Any JavaScript modified in the last 90 days under the web root
find /var/www -type f -name '*.js' -mtime -90 -printf '%TY-%Tm-%Td %p\n' | sort
# 2. Hash every deployed JS file and diff against a clean vendor archive
find /var/www -type f -name '*.js' -exec sha256sum {} \; | sort -k2 > deployed.sha256
# then: diff <(sort -k2 known-good.sha256) deployed.sha256
# 3. Look for the smart-contract resolver pattern SMARTAXE uses
grep -rIl -e 'eth_call' -e 'eth_chainId' -e 'window.ethereum' /var/www 2>/dev/null
# 4. Look for injected loaders in theme headers and footers
grep -rIn -e 'document.write' -e 'atob(' -e 'fromCharCode' /var/www --include='*.js' \
--include='*.php' 2>/dev/null | head -50
# 5. Review CMS accounts and plugins for unexpected additions, then rotate all
# admin credentials and any API keys the host held.
Containment Runbook
| Phase | Actions | Owner | Evidence to capture |
|---|---|---|---|
| P0 · Triage 0–30 min | Confirm the hit is genuine: pull the full command line, the RunMRU value and the Startup directory listing. Determine whether the user actually executed the command or only visited the site. | SOC L1 | Process tree, RunMRU dump, Startup listing, browser history for the referring site |
| P1 · Isolate within 1 h | Network-contain the host in Falcon. Do not reimage yet. Treat the user's credentials as compromised and suspend active sessions. | SOC L2 | Containment timestamp; Falcon host ID |
| P2 · Scope 1–4 h | Run Q1–Q12 estate-wide over maximum retention. Identify every host that resolved a campaign domain or wrote to Startup. Ask the proxy team which internal users visited the referring site and treat all of them as candidates. | Threat hunting | Query result exports; affected-host list; identified compromised third-party site |
| P3 · Eradicate 4–24 h | Remove the Startup artifact and the %LOCALAPPDATA%\SystemHelper tree. Force a password reset and revoke refresh tokens for the affected user. Given Sandworm's destructive track record and the loader-into-backdoor chain, reimage rather than clean any host with a confirmed FREAKYPOLL, FLUIDLEECH or LOADLOOP hit. | IR + endpoint ops | Sample hashes, memory image if FREAKYPOLL is present, reimage records |
| P4 · Block same day | Import the §10 IOC set. Push the §12 Immediate ASR rules. Add the campaign domains to the SWG denylist and enable newly-registered-domain blocking. | Endpoint ops + network | IOC import receipt; ASR policy version |
| P5 · Notify 24–48 h | Notify the owner of the compromised site that served the lure — they are unaware and are still infecting visitors. If operating in or supporting Ukraine, report to CERT-UA; otherwise report to your national CERT. | IR lead | Notification record; CERT case reference |
| P6 · Recover 2–7 d | Return hosts to production only after a clean sweep. Re-run Q1–Q12 at 7 and 30 days to catch dormant re-persistence. Check the affected user's Android device for a sideloaded "security" APK. | IR + service desk | Clean-sweep evidence; mobile inventory result |
| P7 · Learn within 2 w | Fold every benign hit into the query TUNING lines. Promote the three §9 IOAs. Run a targeted ClickFix awareness push using the real lure as the example. | Detection engineering | Updated pack (bump to v0.2); IOA rule group export |
Escalation trigger: a confirmed FREAKYPOLL, FLUIDLEECH or LOADLOOP hit means the actor moved past triage recon and considered the host worth a backdoor. Escalate to full incident response immediately — this cluster's historical pattern is foothold, lateral movement, then destructive action.
Detection Coverage Map
| Technique | Behaviour | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1584.004 | Compromise of third-party websites to host the lure | — | — | GAP — no endpoint telemetry; web-tier FIM only (§7, §13 PB5) |
| T1189 | Conditional lure delivery via Cloaking.House | — | — | GAP — proxy-log dependent; the lure is served only to selected visitors |
| T1568.003 | SMARTAXE resolving C2 from an Ethereum contract | — | — | GAP — contract address and selector unpublished; only the generic eth_call proxy hunt (§7) applies |
| T1204.004 | Run-dialog paste of an attacker command | Q1, Q2 | Yes | GOOD |
| T1059.001 | PowerShell download cradle | Q1, Q5, Q11 | Yes | GOOD |
| T1547.001 | Startup-directory persistence | Q3, Q4, Q5 | Yes | GOOD |
| T1059.005 | GHETTOVIBE VBS execution | Q4, Q12 | Partial | GOOD |
| T1082 / T1539 | SCOUTCURL recon and browser-data collection | Q11 | No | PARTIAL — behaviour-only; a rewritten recon script with different cmdlets would evade |
| T1036.005 | FLUIDLEECH / LOADLOOP masquerading as AV tooling | Q6, Q10, Q12 | No | PARTIAL — filename and hash based; a rename defeats Q6 and Q12, leaving only Q10 |
| T1059.006 / T1027.011 | FREAKYPOLL Python backdoor | Q7, Q10, Q12 | No | PARTIAL — anchored on the SystemHelper path; a different staging directory reduces this to Q10 |
| T1071.001 | C2 beaconing to campaign domains | Q8 | No | PARTIAL — atomic and perishable; browser-level DoH bypasses sensor DNS entirely |
| T1102.002 / T1567.002 | Dead-drop C2 and Dropbox exfil | Q9 | No | PARTIAL — high benign volume; investigate-only until baselined |
| T1636 / T1430 | COWARDDUCK Android collection | — | — | GAP — no Falcon Windows telemetry; MDM hunts in §7, hardening in §12 |
Known gaps and what to do about them
- Web tier (3 gaps). Everything before the paste happens on infrastructure you do not control. Closing this requires proxy full-URL logging plus FIM on your own web properties — Playbook 5 covers the latter.
- Android (1 gap). Without MDM or Falcon for Mobile there is no COWARDDUCK telemetry at all. On BYOD this is a policy problem, not a detection problem.
- Encrypted DNS. Browser-level DoH removes
DnsRequestvisibility and silently blinds Q8 and Q9. Disable browser DoH by policy or force resolution through an inspected resolver. - Registry telemetry. If
RegGenericValueUpdateis trimmed in your sensor policy, Q2 returns nothing and looks clean rather than blind — validate with gate G1 before trusting it.
Validation summary: gates G1–G8 in §11 govern promotion. G1 (telemetry present) and G3–G5 (positive controls) must pass before any query is treated as coverage; G2 and G6 (baseline and negative control) must pass before any IOA moves past Monitor; G8 governs the move to Prevent. A query that has not passed its gate is a hypothesis, not a detection.
Hunt Summary Ticket
TITLE: UAC-0145 (Sandworm sub-cluster) ClickFix campaign - hunt and harden
SEVERITY: High - nation-state, active, user-consented execution bypasses payload blocking
SCOPE: All Windows workstations with browser access; managed and BYOD Android;
all internet-facing web properties owned by the organisation
HYPOTHESIS: A user was shown a fake CAPTCHA on a compromised legitimate website and
pasted an attacker-supplied PowerShell command into the Run dialog or
Windows Terminal, dropping a VBS file (GHETTOVIBE) into the Startup
autorun directory and leading to SCOUTCURL recon, FLUIDLEECH/LOADLOOP
loaders and a FREAKYPOLL Python backdoor.
QUERIES: Q1 explorer.exe parenting an interpreter CONF high FP low
Q2 RunMRU value containing a cradle CONF high FP low
Q3 script or PE written to Startup CONF high FP low
Q4 wscript/cscript executing from Startup CONF high FP low
Q5 download-to-Startup in one command line CONF high FP low
Q6 FLUIDLEECH / LOADLOOP named artifacts CONF high FP med
Q7 Python from AppData SystemHelper CONF high FP med
Q8 campaign C2 domain resolution CONF high FP low
Q9 Dropbox / steamcommunity from non-browser CONF med FP med
Q10 published SHA256 sweep CONF high FP low
Q11 SCOUTCURL inventory plus browser data CONF med FP med
Q12 campaign-named artifact in a command line CONF high FP low
DO FIRST: 1. Run Q10 and Q8 across maximum retention - any hit is a confirmed incident.
2. Run Q1, Q3 and Q5 across 90 days; these are the durable behavioural hunts.
3. Dump RunMRU on any host returned by step 2.
4. Enable ASR d3e037e1-3eb8-44c8-a917-57927947596d in Block mode.
5. Import the section 10 IOC CSV at Prevent for the nine Windows SHA256s.
FINDINGS: [pending - record hit counts per query and the referring compromised site]
GAPS: Web-tier delivery (Cloaking.House, SMARTAXE eth_call resolver) - no endpoint
telemetry. COWARDDUCK Android - no Falcon Windows visibility. Browser DoH
blinds Q8 and Q9. RegGenericValueUpdate may be trimmed by sensor policy (Q2).
ACTIONS: Immediate - ASR script rules, script-block logging, IOC import, user briefing
Near term - disable Run dialog for standard users, AppLocker/WDAC script rules,
.vbs/.js handler remap, Constrained Language Mode, block NRDs,
prohibit Android sideloading
Strategic - full WDAC enforcement, remove local admin, web-property FIM,
managed-device Conditional Access, cloud-API egress control
OWNER: HuntPack
VERSION: v0.2 - 2026-07-20
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.offlce366[.]com (lowercase L typosquat), which several secondary write-ups render incorrectly as office366[.]com.References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| T1 | CERT-UA — Initial compromise vectors of UAC-0145 as of July 2026 (article 6318437) | Primary. Campaign narrative, all seven malware codenames, SMARTAXE resolver mechanism, and every atomic indicator in this pack. | 2026-07-20 |
| T2 | The Hacker News — UAC-0145 Uses ClickFix CAPTCHAs to Infect Ukrainian Devices with Malware | Actor attribution, scale of the compromised-site set, implant role summaries. | 2026-07-20 |
| T2 | SOC Prime — UAC-0145 Uses Torrents, Signal, and ClickFix for Access | Wider initial-access context (torrented installers, Signal-delivered lures). | 2026-07-20 |
| T3 | The Cyber Express — ClickFix Attacks Fuel UAC-0145 Cyber Campaigns In Ukraine | General corroboration of the ClickFix flow and victimology. | 2026-07-20 |
| Ref | MITRE ATT&CK T1204.004 — User Execution: Malicious Copy and Paste | Technique mapping for the ClickFix paste step. | 2026-07-20 |
| Ref | MITRE ATT&CK T1547.001 — Registry Run Keys / Startup Folder | Technique mapping for GHETTOVIBE persistence. | 2026-07-20 |
| Ref | Microsoft — Attack Surface Reduction rules reference | ASR rule GUIDs and deployment guidance used in §12 and §13. | 2026-07-20 |
| Ref | CIS Benchmarks (Microsoft Windows, Google Android) | Baseline citations for the tiered hardening controls. | 2026-07-20 |