STAC4749 — Microsoft Teams Vishing to Chaos Ransomware
Executive Summary
The attacker objective is a fast, hands-on-keyboard ransomware payday that never touches your perimeter. STAC4749 is a financially motivated cluster tracked by Sophos X-Ops that compromised dozens of North American organisations between February and June 2026. Roughly 95 percent of victims were in Canada (about 50 percent) and the United States (about 44 to 45 percent), concentrated in professional services, manufacturing, energy, construction and engineering, and intellectual-property law firms.
The operators never exploit a vulnerability. They register IT-themed .top domains, stand up external Microsoft Teams tenants with fake helpdesk personas, and call employees directly. A two to two-and-a-half minute conversation is usually enough to talk the user into starting a Microsoft Quick Assist session, or installing the cloud RMM tool RemSupp when Quick Assist is blocked. From April onward RemSupp became the preferred tool, most likely because it is less commonly present on application blocklists.
Once inside the remote-support session the operator uses PowerShell to stage a loader into %AppData%, profiles the host and its security products, and installs persistence through HKCU Run keys and Startup-folder VBScript shortcuts disguised as Realtek and Windows audio components. A PyInstaller Python backdoor obfuscated with PyArmour hands off to Golang implants, a reverse SOCKS proxy (sc5.exe) provides tunnelled access, and DWAgent, AnyDesk and enabled RDP provide redundant footholds. In at least three intrusions this ended in Chaos ransomware, once in under 17 hours from first Teams contact to encryption, with data theft in at least one case.
The highest-value defensive angle is the join between the identity plane and the endpoint. Every one of these intrusions requires an external Teams tenant to reach an employee, and a remote-support binary to launch shortly afterwards. Neither half is malicious alone. Together, inside a short time window, the pair is close to unambiguous. That correlation is what this pack is built around, because the malware filenames, the hosting domains and the persistence value names all changed continuously between February and May while the shape of the intrusion did not.
Defender priority: restrict Microsoft Teams external access to an allowlist of federated domains today, and alert on any remote-support tool (Quick Assist, RemSupp, DWAgent, AnyDesk) launching on a host that has had an external federated Teams conversation in the preceding hour. Blocking the indicator list alone will not stop this actor. The infrastructure rotated roughly weekly across a 40-domain payload cluster while the social-engineering play stayed identical.
Source Review & Web Hunter Notes
Five sources were fetched and snapshotted verbatim into the pack's source directory. Every atomic indicator shipped in this pack traces mechanically back to one of those snapshots.
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| T1 | Sophos X-Ops, Chaos in Teams vishing | Primary incident-response research. Campaign attribution, full attack chain, persistence value names, loader naming patterns, certificate-pinning issuer names, persona list, the 16-domain .top vishing tenant cluster. | Yes |
| T1 | SophosLabs IoCs repository, STAC4749-Chaos_IOCs_July2026.csv | Authoritative atomic indicator release. 12 IPs, 21 payload/C2 domains, 15 hosting URLs, and hashes for the loaders, backdoors, Golang implants, the sideloaded DLL and the trojanised CopyQ archive. | Yes |
| T2 | BleepingComputer | Independent write-up. Corroborates the campaign timeline, victimology split, the Quick Assist to RemSupp shift, the Realtek and WinAudio persistence naming, the DWAgent/AnyDesk backup access, and the readme.chaos.txt ransom note. | Yes |
| T3 | CyberPress | Corroborates the .top tenant tradecraft, the msconfig RDP-enablement step, the gRPC loader C2 protocol, and the AppData\Roaming staging directory. | Partial |
| T3 | SOCFortress (Medium) | Corroborates the three hard-coded loader C2 IP:443 pairs, the PyInstaller/PyArmour packaging, the certificate-pinning CA names, and the sc5.exe reverse SOCKS proxy behaviour. | Partial |
Decisions taken during research
- No indicator ships at prevent/critical. The two-independent-source bar is not met by anything in this campaign. The Sophos blog and the SophosLabs CSV are the same organisation and count as one source. BleepingComputer, CyberPress and SOCFortress are all derivative reporting on that single vendor investigation, not independent telemetry. Everything therefore ships at
detector lower, and the pack says so rather than quietly inflating severity. - The vendor CSV contains one malformed hash. The SHA-256 row for
msupdate.exeis 63 hex characters, not 64. It was dropped rather than repaired by guesswork. The well-formed MD5 for the same sample ships in its place. - Cloudflare edge addresses were not shipped. The vendor CSV annotates most payload domains with the Cloudflare IPs they resolved to (
104.21.x,172.67.x,172.64.x). Those are shared CDN front-ends, not actor infrastructure. Blocking them would break a large fraction of the public internet. - Bare
workers.devwas not shipped. It is a shared Cloudflare Workers domain used by millions of legitimate deployments. The three specific attacker subdomains ship at medium severity instead, with the caveat that Workers subdomains are cheap and disposable. - Generic implant filenames were not shipped as indicators. The Golang implants use single-word English nouns (
graph.exe,confirm.exe,midnight.exe,shield.exe,tube.exe,dizzy.exe,agree.exe,autumn.exe). Alerting on those names would generate constant noise. Their hashes ship, and Q12 hunts the--token-rawcommand-line argument that the whole family shares, which is the durable signal. - Legitimate tooling is hunted contextually, never blocklisted. Quick Assist, RemSupp, DWAgent, AnyDesk, RDP, msconfig and CopyQ are all real software with real business use. Every query touching them is scoped by parent process, first-appearance rarity, execution path, or correlation with an external Teams conversation.
- No prompt-injection attempt was found in any fetched page. One fetch of the Sophos article returned a partial refusal from the retrieval tooling rather than the full technique narrative. That is a tool-side limitation, not adversarial page content, and the missing detail was recovered from the corroborating sources.
Hunt Brief & Attack Chain
Attack chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | External Teams tenant on an IT-themed .top domain opens a chat or voice call with a fake helpdesk persona. | Purview / Teams audit, Entra sign-in logs | External federated chat from a non-allowlisted domain. See section 7. |
| 2 | User is talked into starting Microsoft Quick Assist, or installing RemSupp when Quick Assist is blocked. | ProcessRollup2, InstalledApplication | Q1, Q2. Rarity plus correlation with step 1. |
| 3 | Operator runs PowerShell inside the remote-support session to download a first-stage loader into %AppData%. | ProcessRollup2 | Q3, Q4. Remote-support parent spawning a shell, download cradle writing an EXE. |
| 4 | Loader lands with a randomised name (sekv_, helper_, 74fs_ plus a 10-digit numeric string) and beacons over gRPC to a hard-coded C2 on 443. | ProcessRollup2, PeFileWritten, NetworkConnectIP4 | Q5, Q6, Q13. |
| 5 | Registry-based discovery of the host and its installed security products. | ProcessRollup2 | Q9. Registry reads are not directly emitted, so this is hunted through the discovery command lines. |
| 6 | Persistence via HKCU Run keys and Startup-folder .vbs shortcuts, named to imitate Realtek HD Audio, Realtek Audio UHD and WinAudio components. | AsepValueUpdate, RegGenericValueUpdate, ProcessRollup2 | Q7, Q8. The discriminator is the target path, not the value name. |
| 7 | PyInstaller/PyArmour Python backdoor (updater.exe, msupdate.exe) retrieves its AES key and IV from a public GitHub repository and hands off to Golang implants. | ProcessRollup2, NetworkConnectIP4, DnsRequest | Q12, Q13, Q14. |
| 8 | DLL sideloading through a trojanised CopyQ build (vcruntime140_1.dll) for stealthier execution. | ProcessRollup2, ZipFileWritten | Q10. |
| 9 | Lateral movement: RDP enabled through the Terminal Server registry key and msconfig, plus DWAgent and AnyDesk as redundant access. | RegSystemConfigValueUpdate, ProcessRollup2, UserLogon | Q2, Q11. |
| 10 | sc5.exe reverse SOCKS proxy tunnels operator traffic out to legio[.]name. | ProcessRollup2, NetworkConnectIP4, DnsRequest | Q13, Q14. |
| 11 | Data theft (observed in at least one intrusion), then Chaos ransomware deployed simultaneously across compromised hosts, dropping readme.chaos.txt. | ProcessRollup2, RansomwareOpenFile | Q15, Q16. |
Hunt hypotheses, ordered by fidelity
| # | Hypothesis | MITRE | Falcon events | Expected FP source | Conf |
|---|---|---|---|---|---|
| H1 | A process on an endpoint carries the --token-raw argument, the authentication flag shared by every Golang implant in this toolkit. | T1105, T1571 | ProcessRollup2 | Effectively none observed. | HIGH |
| H2 | An endpoint contacts one of the hard-coded loader, backdoor or implant C2 addresses. | T1071, T1090 | NetworkConnectIP4 | Address reuse after actor abandonment. | HIGH |
| H3 | A remote-support binary is the parent of a shell, script host or download utility. | T1219, T1059.001 | ProcessRollup2 | Genuine helpdesk remediation scripts. | HIGH |
| H4 | An executable matching the randomised <prefix>_<10 digits>.exe loader pattern executes from a user-writable directory. | T1036, T1204.004 | ProcessRollup2, PeFileWritten | Versioned installer stubs and update caches. | HIGH |
| H5 | A Run-key value named after a Realtek or Windows audio component points at a user-writable path instead of Program Files. | T1547.001, T1036.005 | AsepValueUpdate | Portable audio utilities installed per-user. | HIGH |
| H6 | Chaos pre-encryption behaviour: shadow copy deletion, backup catalogue deletion, recovery disablement. | T1490, T1489 | ProcessRollup2 | Backup and imaging software maintenance jobs. | HIGH |
| H7 | Microsoft Quick Assist launches on a host where it is not part of the normal support workflow. | T1219 | ProcessRollup2 | Legitimate helpdesk use of Quick Assist. | MEDIUM |
| H8 | An RMM or remote-support tool appears on a very small number of hosts for the first time. | T1219 | ProcessRollup2 | Pilot deployments, contractors, shadow IT. | MEDIUM |
| H9 | RDP is enabled through a direct write to the Terminal Server registry key. | T1021.001, T1112 | RegSystemConfigValueUpdate | IT enabling RDP for a genuine support case. | MEDIUM |
| H10 | A CopyQ binary runs from a user-writable directory, consistent with the trojanised archive used for DLL sideloading. | T1574.002 | ProcessRollup2 | Portable-app users running CopyQ legitimately. | MEDIUM |
| H11 | Endpoint DNS resolves one of the payload-hosting or C2 domains. | T1071.001, T1105 | DnsRequest | Security tooling detonating samples. | HIGH |
| H12 | A process performs registry-based security-product enumeration shortly after a remote-support session. | T1518.001, T1082 | ProcessRollup2 | Asset inventory and compliance agents. | LOW |
Consolidated IOC Table
70 atomic indicators ship in this pack: 12 IP addresses, 40 domains and 18 file hashes. The full importable list is in section 10. Representative entries and the reasoning behind each severity choice are below.
| Type | Value | Conf | Action | Context | Expiry |
|---|---|---|---|---|---|
| ipv4 | 94[.]140[.]114[.]192 94[.]140[.]115[.]18 94[.]140[.]115[.]129 | high | detect | Hard-coded gRPC C2 in the first-stage loader, observed on tcp/443. Named by both Sophos and SOCFortress. | 2027-02-04 |
| ipv4 | 208[.]91[.]112[.]55 193[.]29[.]57[.]37 | high | detect | Payload staging servers for additional tooling. | 2027-02-04 |
| ipv4 | 195[.]133[.]38[.]33 | high | detect | C2 for the PyInstaller Python backdoor. | 2027-02-04 |
| ipv4 | 95[.]81[.]118[.]189 130[.]49[.]214[.]20 2[.]58[.]15[.]231 | high | detect | Golang implant C2. Tied by the vendor to autumn.exe, shield.exe, dizzy.exe and the 7414fs loader. | 2027-02-04 |
| ipv4 | 93[.]88[.]205[.]136 5[.]8[.]18[.]80 2[.]58[.]14[.]254 | medium | enrich | Source addresses of the Teams vishing calls. These sit on the identity plane and will normally never appear in endpoint network telemetry, so they ship as monitor-only context rather than a detection. | 2026-09-04 |
| domain | legio[.]name | high | detect | C2 for the sc5.exe reverse SOCKS proxy. Corroborated by Sophos and SOCFortress. | 2027-02-04 |
| domain | fa5[.]flsdwnld[.]online fa2[.]filesdwnload[.]top fa103[.]aohoodie[.]com plus 15 more in the payload cluster | high | detect | Payload-hosting cluster across the filesdwnld / fldwnld / filldowl / dowlfles / downlf / dwlfils / aohoodie / artcnb families, all fronted by Cloudflare. Rotated continuously through the campaign. | 2027-02-04 |
| domain | imarketads[.]com jrown[.]fun | high | detect | C2 for the sideloaded vcruntime140_1.dll and for the backdoor respectively. | 2027-02-04 |
| domain | conf[.]grahql[.]workers[.]dev webconf[.]shop-api[.]workers[.]dev api[.]grahql[.]workers[.]dev | medium | detect | Cloudflare Workers subdomains used for backdoor C2. Shipped as specific subdomains only. The bare workers.dev apex is deliberately excluded, it is shared infrastructure used by millions of legitimate deployments. | 2026-11-04 |
| domain | sequrityupdate[.]top scan-security[.]top system-connect[.]top plus 13 more .top personas | medium | detect | Domains behind the fake IT-helpdesk Teams tenants. Their primary value is in the Teams and Entra federation allowlist, not on the endpoint. An endpoint resolving one of these is nonetheless worth investigating. | 2026-11-04 |
| sha256 | 1cf3131b6f487067b3746dd4743544fbbfa553fb2941176b8213996aac61425c plus 5 more loader hashes | high | detect | First-stage loaders shipped as sekv*.exe and helper*.exe. | 2027-02-04 |
| sha256 | bb96d21b7a61628724f13c6d4506b9d7bb56020d1c41fc79310f74666bb75904 35a75212862ce719ae6de1758949be33a3de787fab31e2d98436bacce8369d92 | high | detect | Python backdoor updater.exe and the sc5.exe reverse SOCKS proxy. | 2027-02-04 |
| md5 | 36e80c375861d3ff0a55d5e49c8fe12e | high | detect | Python backdoor msupdate.exe. The vendor SHA-256 for this sample is malformed (63 hex characters) and was dropped rather than reconstructed, so the MD5 carries this sample. | 2027-02-04 |
| sha256 | cd3163a308ba40c3a5e153c0326b7cf23a36debb6255624f9afb7e7ca5182391 d8fed5a9fa8baee68d241190f29a2e91f5c549a684cb66c92de3974fc9f3db22 | high | detect | Malicious vcruntime140_1.dll and the trojanised copyq-13.0.0.zip archive it ships inside. | 2027-02-04 |
| behavioural | --token-raw command-line argument | high | detect | Shared authentication flag across the entire Golang implant family. Outlives every filename and hash in this table. | n/a |
| behavioural | readme.chaos.txt ransom note | high | detect | Dropped at encryption time. A file-integrity or DLP rule on this name is a last-chance tripwire. | n/a |
Nothing in this pack ships at prevent or critical. All public reporting on STAC4749 traces back to a single vendor investigation, so the two-independent-source bar for a blocking indicator is not met. Promote to prevent once your own telemetry or a second vendor confirms a hit in your estate.
Affected Surface & Telemetry Matrix
This intrusion spans three planes. Endpoint telemetry alone will catch the malware but not the entry, and identity telemetry alone will catch the entry but not the ransomware. Both are required for the correlation that makes this campaign cheap to detect.
| Surface | Required telemetry | Priority | Gap risk if absent |
|---|---|---|---|
| Microsoft Teams / Entra ID federation | Purview unified audit log (Teams chat and call events), Entra sign-in logs, tenant federation configuration | CRITICAL | Total. Step 1 of the chain is invisible, and the correlation this pack is built on cannot be computed. |
| Windows endpoint, process execution | Falcon ProcessRollup2 / SyntheticProcessRollup2 | CRITICAL | Total. 11 of 16 queries depend on it. |
| Windows endpoint, registry | AsepValueUpdate, RegGenericValueUpdate, RegSystemConfigValueUpdate | HIGH | Persistence and RDP enablement go unseen. Attacker survives reboot and remediation. |
| Windows endpoint, file writes | PeFileWritten, NewExecutableWritten, ZipFileWritten | HIGH | Staging of loaders and the trojanised CopyQ archive is missed. Execution-time queries still fire. |
| Windows endpoint, network | NetworkConnectIP4, DnsRequest | HIGH | All atomic C2 detection is lost. Behavioural queries still fire. |
| Windows endpoint, ransomware behaviour | RansomwareOpenFile | MEDIUM | Last-chance mass-encryption tripwire is lost. This is a late-stage signal and should never be the primary control. |
| Egress proxy / DNS resolver | Proxy logs, DNS resolver logs, newly-registered-domain feed | MEDIUM | Loss of a second, sensor-independent view of the payload cluster and of .top resolution. |
| Backup infrastructure | Backup job logs, immutability / object-lock state | HIGH | Recovery becomes negotiation. Chaos deletes shadow copies and tampers with backup services before encrypting. |
| macOS / Linux | n/a | LOW | No reporting places STAC4749 on non-Windows endpoints. The Teams vishing entry is platform-agnostic, but the toolkit observed is Windows-only. |
ATT&CK Mapping
| Tactic | Technique | Observed behaviour | Query or control |
|---|---|---|---|
| Initial Access | T1566.004 · Phishing: Spearphishing Voice | Fake IT-helpdesk personas call employees over Microsoft Teams from external tenants on IT-themed .top domains. | Section 7 native hunts; Playbook P1 |
| Initial Access | T1199 · Trusted Relationship | Abuse of open Teams federation to reach employees as an apparently internal contact. | Playbook P1 |
| Execution | T1204.004 · User Execution: Malicious Copy and Paste | User is talked through launching the remote-support session and, in some cases, running the operator's commands. | Q1, Q2; user awareness control H9 |
| Execution | T1059.001 · PowerShell | PowerShell download cradle stages the loader into %AppData% and unblocks it before execution. | Q3, Q4; Playbook P5 |
| Persistence | T1547.001 · Registry Run Keys / Startup Folder | HKCU Run values and Startup-folder .vbs shortcuts. | Q7, Q8 |
| Privilege Escalation | T1078.003 · Valid Accounts: Local Accounts | Operator inherits the interactive user's session and privileges through the remote-support tool. | Control H11 (remove standing local admin) |
| Defense Evasion | T1036.005 · Masquerading: Match Legitimate Name or Location | Persistence values named Realtek HD Audio, Realtek Audio UHD, WinAudio life2. Implants named as single English nouns. | Q7, Q12 |
| Defense Evasion | T1574.002 · DLL Side-Loading | Trojanised CopyQ archive sideloads a malicious vcruntime140_1.dll. | Q10 |
| Defense Evasion | T1027.002 · Obfuscated Files: Software Packing | PyInstaller packaging with PyArmour obfuscation; AES key and IV pulled from a public GitHub repository at runtime. | Q6, Q13; control H4 |
| Discovery | T1518.001 · Security Software Discovery | Registry enumeration of installed security products before payload staging. | Q9 |
| Discovery | T1082 · System Information Discovery | Host profiling by the first-stage loader. | Q9 |
| Command and Control | T1219 · Remote Access Software | Quick Assist, RemSupp, DWAgent and AnyDesk used for interactive access and redundancy. | Q1, Q2; Playbook P2 |
| Command and Control | T1071.001 · Application Layer Protocol: Web Protocols | gRPC over tcp/443 to hard-coded C2, plus HTTPS payload retrieval from a rotating Cloudflare-fronted cluster. | Q13, Q14 |
| Command and Control | T1090 · Proxy | sc5.exe reverse SOCKS proxy to legio[.]name. | Q13, Q14 |
| Command and Control | T1105 · Ingress Tool Transfer | Golang implants and follow-on tooling pulled down over HTTPS and launched with --token-raw. | Q4, Q12 |
| Lateral Movement | T1021.001 · Remote Desktop Protocol | RDP enabled by direct registry modification and via msconfig. | Q11; Playbook P4 |
| Collection / Exfiltration | T1567 · Exfiltration Over Web Service | Data theft observed in at least one intrusion prior to encryption. | Q13, Q14; control H12 |
| Impact | T1490 · Inhibit System Recovery | Shadow copy and backup catalogue deletion before encryption. | Q15; control H8 |
| Impact | T1489 · Service Stop | Security and backup services tampered with prior to deployment. | Q15 |
| Impact | T1486 · Data Encrypted for Impact | Chaos ransomware encrypts simultaneously across hosts and drops readme.chaos.txt. | Q16 |
Native Audit-Log Hunts
Falcon cannot see step 1 of this chain. The queries below run outside the EDR and supply the identity half of the correlation that makes every endpoint query in section 8 dramatically more decisive.
Microsoft Purview / Teams unified audit log
- Search
MessageSent,MessagesListedandChatCreatedoperations where the initiating user's domain is external to your tenant. Rank external domains by how many distinct internal recipients they contacted in a day. A first-seen external domain fanning out to several employees within an hour is the signature of this campaign, regardless of what the domain is called. - Filter specifically for external participants whose domain ends in
.top, or whose display name contains helpdesk vocabulary such as IT, support, helpdesk, security, service or update. The observed personas used ordinary first-and-last-name pairs, so hunt the domain and the fan-out pattern rather than the name. - Pull Teams call detail records for external inbound calls of 60 seconds or longer. The observed calls ran from roughly 90 seconds to over 20 minutes, clustering around two to two and a half minutes.
- Cross-reference the timestamp of any such call with the endpoint's first Quick Assist or RemSupp execution. That pairing is the single highest-value alert in this pack.
Entra ID
- Review
Get-CsTenantFederationConfigurationforAllowFederatedUsersand the allowed and blocked domain lists. An empty allowlist with federation enabled means any tenant on the internet can chat your staff. - Review
Get-CsExternalAccessPolicyassignments. Look for a permissive global policy that was never overridden per-user. - Check cross-tenant access settings for inbound B2B collaboration and B2B direct connect defaults.
Windows event logs (where Falcon coverage is thin or the host is unmanaged)
- Security 4688 process creation with command line, filtered to parent
quickassist.exe,remsupp*.exe,dwagent*.exeoranydesk.exe. - Security 4624 with
LogonType10 (RemoteInteractive) on hosts that had no RDP history, following an RDP enablement in the registry. - Security 4657 registry value modification on the Run keys and on
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections. Requires SACL configuration to be useful. - Microsoft-Windows-PowerShell/Operational 4104 script block logging for download cradles and for
Unblock-Fileagainst a path in%AppData%. - Sysmon 11 and 13, if deployed, for the Startup-folder
.vbsdrop and the Run-key write.
Network and DNS
- Query proxy and resolver logs for the payload cluster families listed in section 10, and for any newly registered
.topdomain resolved by a workstation. - Alert on outbound tcp/443 to the C2 addresses in section 10 from any process that is not a browser or a known updater.
- Hunt for direct-to-IP HTTPS on 443 with no preceding DNS resolution, which is how the hard-coded gRPC loader C2 behaves.
File integrity and backup
- Alert on creation of any file named
readme.chaos.txton a file server or in a user share. This is a late signal but a cheap one. - Alert on backup job failures or on deletion of backup catalogues that were not initiated by the backup service account.
CrowdStrike LogScale CQL Hunt Queries
Time windows are set in the console, not in the query. None of these queries carry an in-query timeframe filter. Set the range in the Falcon search bar. Suggested starting windows are noted per card.
Looks for: every host that has launched Quick Assist, grouped so the rare ones float to the top. In most estates Quick Assist runs on a handful of known support machines, so a first-ever launch on a finance or legal workstation is the interesting row. Cross-reference each hit against the Teams external-chat hunt in section 7. FP: a genuine helpdesk that uses Quick Assist as its standard tool will light up broadly; suppress by the support OU or the operator account rather than by host. Suggested window: 30 days.
// HUNT: Microsoft Quick Assist execution, ranked by fleet rarity // MITRE: T1219 | CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: legitimate IT helpdesk sessions; Windows built-in support flows // TUNING: exclude your helpdesk operator accounts and the support OU, e.g. add // TUNING: | UserName!=/^(svc-helpdesk|it-support)/i -- and drop hosts in the IT asset group #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^quickassist(\.exe)?$/i | groupBy([ComputerName, UserName], function=[ count(as=Launches), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen), collect([ParentBaseFileName, CommandLine], limit=5) ], limit=20000) | sort(FirstSeen, order=desc, limit=500)
Looks for: remote-support and RMM binaries that are present on only a small number of hosts. STAC4749 shifted to RemSupp in April precisely because it is rarely on a blocklist, and installed DWAgent or AnyDesk as redundant access in the intrusions that reached ransomware. The signal is not the tool, it is the tool being new and rare. FP: pilot deployments, contractors and managed service providers legitimately introduce rare RMM tools. Suggested window: 30 days, so the rarity count means something.
// HUNT: rare / first-seen remote-support and RMM tooling across the fleet // MITRE: T1219 | CONF: medium FP: medium COST: medium // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: sanctioned RMM rollouts, MSP tooling, contractor laptops, IT pilots // TUNING: raise the DistinctHosts ceiling above your sanctioned RMM's install count, // TUNING: then drop your approved product from the FileName regex entirely so it // TUNING: never competes with the rare tools you actually want to see #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(remsupp|dwagent|dwagsvc|dwrcs|anydesk|quickassist|teamviewer|screenconnect|connectwisecontrol|atera|splashtop|gotoassist|logmein|ultraviewer|rustdesk)[a-z0-9_\-]{0,12}(\.exe)?$/i | groupBy([FileName], function=[ count(aid, distinct=true, as=DistinctHosts), count(as=Executions), collect([ComputerName, UserName], limit=25), min(@timestamp, as=FirstSeen) ], limit=20000) | DistinctHosts < 6 | sort(FirstSeen, order=desc, limit=200)
Looks for: the exact pivot point of this intrusion. A remote-support tool is the parent, and a shell, script host or download utility is the child. This is what the operator does within seconds of the user clicking Allow. It is the highest-fidelity endpoint-only query in this pack because the parent-child pair is rare even in estates that use Quick Assist daily. Suggested window: 7 days for alerting, 30 days for a retrospective sweep.
// HUNT: remote-support binary spawning a shell / script host / download utility // MITRE: T1219, T1059.001 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: helpdesk staff running genuine remediation scripts in-session // TUNING: if your helpdesk legitimately scripts in-session, keep the query and // TUNING: exclude only their signed script paths via CommandLine, never the parent #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(quickassist|remsupp|dwagent|dwagsvc|dwrcs|anydesk|msra|teamviewer|screenconnect)[a-z0-9_\-]{0,12}(\.exe)?$/i | FileName=/^(powershell|pwsh|cmd|mshta|wscript|cscript|curl|certutil|bitsadmin|rundll32|regsvr32|msiexec)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the first-stage delivery command. The observed cradle fetches an EXE over HTTPS, writes it under %APPDATA%, calls Unblock-File to strip the mark-of-the-web, then starts it with an argument. Requiring the download verb, the user-writable destination and the .exe extension together keeps this tight. FP: software deployment scripts and developer tooling do this legitimately; exclude by the signed script path or the deployment service account, not by removing the AppData condition. Suggested window: 7 days.
// HUNT: PowerShell download cradle writing an EXE into AppData / ProgramData / Temp // MITRE: T1059.001, T1105 | CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 with CommandLine // FALSE POSITIVES: software deployment scripts, dev tooling, package managers // TUNING: exclude your deployment service account and the signed script directory, // TUNING: e.g. | UserName!=/^svc-deploy$/i and | CommandLine!=/ProgramData\\PackageCache/i // TUNING: keep Unblock-File in the OR list -- it is the strongest single token here #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)(\.exe)?$/i | CommandLine=/(Invoke-WebRequest|iwr\s|Start-BitsTransfer|DownloadFile|DownloadString|WebClient|Unblock-File)/i | CommandLine=/(AppData|ProgramData|\\Temp\\|\$env:APPDATA|\$env:TEMP)/i | CommandLine=/\.exe/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the campaign's loader naming convention: a short alphabetic prefix, an underscore or nothing, then a randomised 10-digit numeric string, then .exe. Sophos observed sekv_, helper_, 74fs_ and 7414fs variants, plus ms_876234.exe. This query targets the named prefixes for precision. Q6 covers the generic shape for hosts where the prefix has rotated again. Suggested window: 30 days.
// HUNT: STAC4749 randomised loader filename pattern at execution time // MITRE: T1036, T1204.004 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: none observed for these specific prefixes // TUNING: the ms prefix is the loosest of the set; if it produces noise from a // TUNING: vendor updater, drop ms from the alternation and rely on Q6 for that shape #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(sekv|helper|74fs|7414fs|ms)[_\-]?[0-9]{6,12}[_\-]?(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, SHA256HashData, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the durable shape rather than the specific prefix. Sophos noted the attackers changed malware filenames continuously between February and May, so the prefix list in Q5 will decay. What did not change is the shape: a short word, a long random numeric run, and an EXE landing in AppData, ProgramData or Temp. FP: installers and update caches write versioned executables into ProgramData; exclude by the writing process rather than by loosening the numeric run. Suggested window: 14 days.
// HUNT: EXE with a randomised long numeric suffix written to a user-writable path // MITRE: T1036, T1105 | CONF: medium FP: medium COST: medium // REQUIRES: PeFileWritten / NewExecutableWritten // FALSE POSITIVES: installer and updater caches (package managers, browser updaters, // FALSE POSITIVES: EDR and RMM agents staging versioned payloads into ProgramData) // TUNING: exclude the writing process first, not the path, e.g. // TUNING: | ContextBaseFileName!=/^(msiexec|setup|teamsupdate|googleupdate|update)/i #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | TargetFileName=/\\(AppData|ProgramData)\\/i | TargetFileName=/[a-z]{2,10}[_\-]?[0-9]{8,12}[_\-]?\.exe$/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the campaign's signature persistence. Value names observed include Realtek HD Audio, Realtek HD Audio Universal Service, Realtek Audio, Realtek Audio UHD and WinAudio life2, plus SecurityHealth and OneDriveUpdate. The discriminator is not the name, it is the target: a genuine Realtek autostart points into Program Files or System32, never into AppData or ProgramData. That path condition is what turns a noisy name-match into a high-confidence hit. Suggested window: 30 days.
// HUNT: autostart value impersonating an audio driver but pointing at a user-writable path // MITRE: T1547.001, T1036.005 | CONF: high FP: low COST: low // REQUIRES: AsepValueUpdate / RegGenericValueUpdate // FALSE POSITIVES: per-user portable audio utilities that self-install into AppData // TUNING: keep the RegStringValue path condition -- it is the whole detection. If a // TUNING: legitimate per-user audio tool fires, exclude it by its exact SHA256 via a // TUNING: follow-up ProcessRollup2 pivot, never by widening the path filter #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate)$/ | RegObjectName=/\\CurrentVersion\\Run/i | RegValueName=/(Realtek|WinAudio|Audio\s?UHD|Universal\s?Service|SecurityHealth|OneDriveUpdate)/i | RegStringValue=/\\(AppData|ProgramData|Users\\Public|Temp)\\/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc, limit=500)
Looks for: the second persistence mechanism. Sophos observed mklink-%.vbs scripts creating hidden shortcuts in the Startup folder, which survives the removal of the Run key and is frequently missed during remediation. Hunt the script host executing from or writing into the Startup path. FP: legacy line-of-business logon scripts still use VBScript from the Startup folder in some estates; enumerate and allowlist those by path once. Suggested window: 30 days.
// HUNT: wscript / cscript touching the Startup folder or a mklink-style VBS dropper // MITRE: T1547.001, T1059.005 | CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 with CommandLine // FALSE POSITIVES: legacy VBScript logon scripts placed in the Startup folder by GPO // TUNING: enumerate your legitimate Startup .vbs set once, then exclude by exact path, // TUNING: e.g. | CommandLine!=/legacy-mapdrives\.vbs/i -- do not exclude the folder #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(wscript|cscript)(\.exe)?$/i | CommandLine=/(\\Start Menu\\Programs\\Startup\\|mklink|\\AppData\\Roaming\\.{0,60}\.vbs)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the loader's profiling step. Sophos describes registry-based enumeration of the host and its installed security products before payload staging. Falcon does not emit registry read events, so this hunts the command-line surface of the same behaviour instead. FP: genuinely high. Asset inventory agents, compliance scanners and support scripts all enumerate installed security products routinely. Treat this as a corroborating signal for a host already surfaced by Q1 through Q6, not as a standalone alert. Suggested window: 7 days, host-scoped.
// HUNT: security software and system discovery command lines // MITRE: T1518.001, T1082 | CONF: medium FP: high COST: medium // REQUIRES: ProcessRollup2 with CommandLine // FALSE POSITIVES: asset inventory agents, compliance scanners, vulnerability scanners, // FALSE POSITIVES: helpdesk triage scripts, Defender health checks run by IT // TUNING: run this host-scoped against a host already flagged by Q1-Q6 rather than // TUNING: fleet-wide. Fleet-wide, first exclude your inventory agent by parent, e.g. // TUNING: | ParentBaseFileName!=/^(ccmexec|amagent|nessusd|qualys-cloud-agent)/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(SecurityCenter2|AntiVirusProduct|AntiSpywareProduct|Get-MpComputerStatus|Get-MpPreference|wmic.{0,40}antivirus|reg\s+query.{0,60}CurrentVersion\\Uninstall)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the side-loading host. The actor distributed a trojanised copyq-13.0.0.zip whose legitimate CopyQ binary loads a malicious vcruntime140_1.dll from its own directory. CopyQ is a real clipboard manager, so the signal is the location: an install under AppData, Downloads, Temp or Users\Public rather than Program Files. Pair any hit with the CopyQ archive and DLL hashes in section 10. Suggested window: 30 days.
// HUNT: CopyQ executing from a user-writable path (trojanised archive / DLL side-load) // MITRE: T1574.002 | CONF: medium FP: low COST: low // REQUIRES: ProcessRollup2 / SyntheticProcessRollup2 // FALSE POSITIVES: users who legitimately run the portable CopyQ build from Downloads // TUNING: confirm any hit against the vcruntime140_1.dll and copyq-13.0.0.zip hashes // TUNING: in section 10 before escalating; a clean portable install is benign #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^copyq(\.exe)?$/i | ImageFileName=/\\(AppData|ProgramData|Temp|Downloads|Users\\Public)\\/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc, limit=500)
Looks for: the lateral-movement enabler. The operators turned on RDP on the initial host by modifying Windows service configuration, including through msconfig, to move onward. On a workstation that has never accepted RDP, a write to fDenyTSConnections is a strong signal. FP: IT legitimately enables RDP for support. Discriminate by whether the change came from a management platform (SCCM, Intune, GPO) or from an interactive user session inside a remote-support window. Suggested window: 30 days.
// HUNT: RDP enablement via the Terminal Server registry key // MITRE: T1021.001, T1112 | CONF: medium FP: medium COST: low // REQUIRES: RegSystemConfigValueUpdate / RegGenericValueUpdate // NOTE: RegStringValue is projected for context. On some sensor versions a DWORD // NOTE: lands in a numeric field instead and this column reads empty. // NOTE: field presence is tenant-specific -- validate in tenant before filtering on it. // FALSE POSITIVES: sanctioned RDP enablement by GPO, SCCM, Intune or a build task // TUNING: correlate each hit with a Q1/Q2/Q3 hit on the same ComputerName within the // TUNING: preceding 24h. Standalone, exclude your management platform's service account #event_simpleName=/^(RegSystemConfigValueUpdate|RegGenericValueUpdate|AsepValueUpdate)$/ | RegObjectName=/\\Terminal Server/i | RegValueName=/^(fDenyTSConnections|UserAuthentication|fSingleSessionPerUser)$/i | table([@timestamp, ComputerName, UserName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc, limit=500)
Looks for: the one string this entire toolkit could not change. Every Golang implant in the campaign is launched with a --token-raw argument carrying its authentication token, and the observed PowerShell cradle passes it at Start-Process time. The implant binaries are named as ordinary English nouns (graph, confirm, midnight, shield, tube, dizzy, agree, autumn), which is deliberately unhuntable by name. The argument is not. This is the single best behavioural detection in the pack and it should be promoted to a Custom IOA. Suggested window: 90 days for a retrospective sweep.
// HUNT: STAC4749 Golang implant launched with its --token-raw authentication flag // MITRE: T1105, T1036.005 | CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 with CommandLine // FALSE POSITIVES: none observed. The flag is not used by common legitimate tooling. // TUNING: if a bespoke internal tool uses this flag, exclude it by SHA256HashData, // TUNING: never by FileName -- the implant names rotate and are generic by design #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/--token-raw/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, SHA256HashData, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the nine endpoint-observable C2 addresses published by SophosLabs, covering the hard-coded loader C2 on tcp/443, the payload staging servers, the Python backdoor C2 and the Golang implant C2. The three Teams vishing call-source addresses are deliberately excluded here, they sit on the identity plane and will not appear in endpoint network telemetry. Projecting ContextBaseFileName tells you immediately which process is talking. Suggested window: 90 days, then keep running.
// HUNT: outbound connection to a published STAC4749 C2 address // MITRE: T1071.001, T1090 | CONF: high FP: low COST: low // REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: address reuse after the actor abandons the host; security tooling // FALSE POSITIVES: detonating samples from a sandbox VM inside your address space // TUNING: exclude your malware-analysis subnet by ComputerName before alerting #event_simpleName=/^NetworkConnectIP4$/ | in(RemoteAddressIP4, values=[ "94.140.114.192", "94.140.115.18", "94.140.115.129", "208.91.112.55", "193.29.57.37", "195.133.38.33", "95.81.118.189", "130.49.214.20", "2.58.15.231" ]) | table([@timestamp, ComputerName, aid, UserName, ContextBaseFileName, RemoteAddressIP4, RemotePort]) | sort(@timestamp, order=desc, limit=1000)
Looks for: resolution of the rotating download cluster. Rather than pinning the 18 exact subdomains, this matches the registrable-domain families the actor reused across the whole campaign (filesdwnld, filesdwnl, filesdwnload, filesdownld, filedwnld, fldwnld, flsdwnld, filldowl, dowlfles, downlf, downlfl, dwlfils, aohoodie, artcnb) plus the three named C2 domains. That survives the next subdomain rotation, which the exact list will not. Suggested window: 90 days.
// HUNT: DNS for the STAC4749 payload-hosting cluster and named C2 domains // MITRE: T1071.001, T1105 | CONF: high FP: low COST: medium // REQUIRES: DnsRequest // FALSE POSITIVES: threat-intel enrichment tooling and sandboxes resolving IOCs // TUNING: exclude your TI platform and sandbox hosts by ComputerName. The family // TUNING: fragments are typo-squats of "files download" and do not collide with // TUNING: legitimate domains, so widen rather than narrow if the cluster rotates #event_simpleName=/^DnsRequest$/ | DomainName=/(filesdwnld|filesdwnl|filesdwnload|filesdownld|filedwnld|fldwnld|flsdwnld|filldowl|dowlfles|downlfl|downlf|dwlfils|aohoodie|artcnb|legio\.name|jrown\.fun|imarketads)/i | table([@timestamp, ComputerName, aid, UserName, ContextProcessId, DomainName]) | sort(@timestamp, order=desc, limit=1000)
Looks for: the minutes before encryption. Chaos, like its BlackSuit and Royal lineage, deletes volume shadow copies, wipes the backup catalogue and disables Windows recovery before it starts encrypting. This is the last query in the chain that still gives you time to act, so it belongs on a real-time alert with a paging rule, not a weekly hunt. FP: backup and imaging products legitimately prune shadow copies; exclude by the parent process of your backup agent, not by removing individual verbs. Suggested window: real-time.
// HUNT: shadow copy / backup catalogue / recovery destruction (Chaos pre-encryption) // MITRE: T1490, T1489 | CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 with CommandLine // FALSE POSITIVES: backup and imaging software pruning shadow copies on schedule; // FALSE POSITIVES: SCCM / imaging task sequences calling bcdedit during a rebuild // TUNING: exclude your backup agent by parent, e.g. // TUNING: | ParentBaseFileName!=/^(veeam|beremote|backupexec|acronis|sqlservr)/i // TUNING: keep vssadmin delete shadows unexcluded on workstations regardless #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(vssadmin.{0,40}delete.{0,20}shadow|wmic.{0,30}shadowcopy.{0,20}delete|wbadmin.{0,30}delete.{0,20}catalog|bcdedit.{0,40}(recoveryenabled|bootstatuspolicy)|Disable-ComputerRestore|Win32_ShadowCopy.{0,40}Delete)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc, limit=500)
Looks for: the encryption itself. Sophos observed Chaos encrypting simultaneously across all compromised devices, so the fleet-wide shape is many hosts crossing the threshold within the same few minutes rather than one host doing so alone. This is a tripwire and a blast-radius measurement, not a prevention control. Pair it with a file-integrity alert on readme.chaos.txt from section 7. FP: backup agents, indexers, antivirus full scans and bulk migration tools all touch large file counts; exclude by process. Suggested window: real-time.
// HUNT: single process touching a large number of files (encryption burst) // MITRE: T1486 | CONF: medium FP: medium COST: medium // REQUIRES: RansomwareOpenFile // FALSE POSITIVES: backup agents, search indexers, AV full scans, bulk file migrations // TUNING: exclude the known bulk readers by process before alerting, e.g. // TUNING: | ContextBaseFileName!=/^(searchindexer|veeamagent|robocopy|mssense)/i // TUNING: then tune FilesTouched to just above your noisiest surviving process #event_simpleName=/^RansomwareOpenFile$/ | groupBy([ComputerName, ContextBaseFileName], function=[ count(as=FilesTouched), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen) ], limit=20000) | FilesTouched > 200 | sort(FilesTouched, order=desc, limit=200)
CrowdStrike Custom IOA Recommendations
Four of the sixteen queries are strong enough to promote from Investigate-only to a Custom IOA. The rest stay as scheduled hunts because their false-positive profile depends on how your helpdesk works.
| IOA name | From | Pattern | Action | Exclusions to configure first |
|---|---|---|---|---|
| STAC4749 — Implant Token Argument | Q12 | Process Creation. Command line contains --token-raw. | Detect / Critical | None expected. Verify no internal tool uses this flag by running Q12 across 90 days before enabling. |
| STAC4749 — Remote Support Spawning Shell | Q3 | Process Creation. Parent image name matches the remote-support set, child image name matches the shell / script-host / download-utility set. | Detect / High | Your helpdesk's signed remediation script paths, excluded by command line. |
| STAC4749 — Audio-Driver Autostart in User Path | Q7 | Registry Operation. Run-key value name matches the audio-component set, value data contains a user-writable path. | Detect / High | Any per-user portable audio utility in your estate, excluded by hash. |
| STAC4749 — Randomised Loader Name | Q5 | Process Creation. Image file name matches the prefix plus 6-to-12-digit numeric pattern. | Detect / High | Drop the ms prefix from the pattern if a vendor updater collides. |
Deployment path
- Falcon console, Endpoint security, Custom IOA rule groups. Create a Windows rule group named for this campaign.
- Build each rule in Monitor action first. Leave it there for a full business week including a patch cycle.
- Review every hit. Add exclusions in the rule, not in the prevention policy.
- Promote to Detect once the rule has produced zero unexplained hits for five consecutive business days. Q12 is the only rule that should reach Critical severity.
- Assign the rule group to a pilot host group before the full estate.
Do not promote Q9, Q15 or Q16 to a blocking IOA. Q9 is high-FP discovery telemetry. Q15 and Q16 fire on behaviour that legitimate backup and indexing software also performs, and a blocking rule there risks breaking your recovery path at exactly the moment you need it.
Machine-Readable IOC Appendix
70 atomic indicators, each traced back to a saved source snapshot. Nothing here is at prevent or critical severity, see section 2 for why. Copy each block straight into the tool it names.
type,value,action,severity,expiration,description,tags # STAC4749 / Chaos ransomware. Source: SophosLabs IoCs STAC4749-Chaos_IOCs_July2026.csv + Sophos X-Ops blog. # No row ships at prevent/critical: all public reporting traces to one vendor investigation. # --- C2 and payload staging addresses (endpoint-observable) --- ipv4,94.140.114.192,detect,high,2027-02-04,STAC4749 hard-coded loader gRPC C2 on tcp 443,campaign:STAC4749 ipv4,94.140.115.18,detect,high,2027-02-04,STAC4749 hard-coded loader gRPC C2 on tcp 443,campaign:STAC4749 ipv4,94.140.115.129,detect,high,2027-02-04,STAC4749 hard-coded loader gRPC C2 on tcp 443,campaign:STAC4749 ipv4,208.91.112.55,detect,high,2027-02-04,STAC4749 payload staging server,campaign:STAC4749 ipv4,193.29.57.37,detect,high,2027-02-04,STAC4749 payload staging server,campaign:STAC4749 ipv4,195.133.38.33,detect,high,2027-02-04,STAC4749 Python backdoor C2,campaign:STAC4749 ipv4,95.81.118.189,detect,high,2027-02-04,STAC4749 Golang implant C2,campaign:STAC4749 ipv4,130.49.214.20,detect,high,2027-02-04,STAC4749 Golang implant C2,campaign:STAC4749 ipv4,2.58.15.231,detect,high,2027-02-04,STAC4749 Golang implant C2,campaign:STAC4749 # --- Teams vishing call sources. Identity plane. Monitor only. --- ipv4,93.88.205.136,no_action,informational,2026-09-04,Source of STAC4749 Teams vishing calls,campaign:STAC4749 ipv4,5.8.18.80,no_action,informational,2026-09-04,Source of STAC4749 Teams vishing calls,campaign:STAC4749 ipv4,2.58.14.254,no_action,informational,2026-09-04,Source of STAC4749 Teams vishing calls,campaign:STAC4749 # --- Payload-hosting cluster (Cloudflare-fronted; rotates weekly) --- domain,stats09.filldowl.online,detect,high,2027-02-04,STAC4749 payload staging,campaign:STAC4749 domain,de3.filedwnld.top,detect,high,2027-02-04,STAC4749 payload staging (CopyQ archive),campaign:STAC4749 domain,dl2.filesdwnl.top,detect,high,2027-02-04,STAC4749 loader staging,campaign:STAC4749 domain,fa4.fldwnld.online,detect,high,2027-02-04,STAC4749 backdoor staging,campaign:STAC4749 domain,fa2.filesdwnload.top,detect,high,2027-02-04,STAC4749 backdoor and implant staging,campaign:STAC4749 domain,fa3.filesdownld.top,detect,high,2027-02-04,STAC4749 Golang implant staging,campaign:STAC4749 domain,fa5.flsdwnld.online,detect,high,2027-02-04,STAC4749 implant and proxy staging,campaign:STAC4749 domain,fa16.dwlfils.online,detect,high,2027-02-04,STAC4749 backdoor staging,campaign:STAC4749 domain,fa103.aohoodie.com,detect,high,2027-02-04,STAC4749 Golang implant staging,campaign:STAC4749 domain,re1.filesdwnld.top,detect,high,2027-02-04,STAC4749 payload staging,campaign:STAC4749 domain,re2.filesdwnload.top,detect,high,2027-02-04,STAC4749 loader staging,campaign:STAC4749 domain,re4.fldwnld.online,detect,high,2027-02-04,STAC4749 loader staging,campaign:STAC4749 domain,re5.flsdwnld.online,detect,high,2027-02-04,STAC4749 backdoor staging,campaign:STAC4749 domain,re8.dowlfles.online,detect,high,2027-02-04,STAC4749 payload staging,campaign:STAC4749 domain,re19.downlf.online,detect,high,2027-02-04,STAC4749 payload staging,campaign:STAC4749 domain,re20.downlfl.online,detect,high,2027-02-04,STAC4749 payload staging,campaign:STAC4749 domain,re103.aohoodie.com,detect,high,2027-02-04,STAC4749 C2,campaign:STAC4749 domain,re104.artcnb.com,detect,high,2027-02-04,STAC4749 C2,campaign:STAC4749 # --- Named C2 domains --- domain,legio.name,detect,high,2027-02-04,STAC4749 reverse SOCKS proxy C2 (sc5.exe),campaign:STAC4749 domain,jrown.fun,detect,high,2027-02-04,STAC4749 backdoor C2,campaign:STAC4749 domain,imarketads.com,detect,high,2027-02-04,STAC4749 sideloaded DLL C2,campaign:STAC4749 # --- Cloudflare Workers subdomains. Specific subdomains only. --- # The bare workers.dev apex is shared infrastructure and is deliberately NOT listed. domain,conf.grahql.workers.dev,detect,medium,2026-11-04,STAC4749 backdoor C2,campaign:STAC4749 domain,api.grahql.workers.dev,detect,medium,2026-11-04,STAC4749 backdoor C2,campaign:STAC4749 domain,webconf.shop-api.workers.dev,detect,medium,2026-11-04,STAC4749 backdoor C2,campaign:STAC4749 # --- Fake IT-helpdesk Teams tenant domains. Primary value is the Teams allowlist. --- domain,sequrityupdate.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,scan-security.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,system-online.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,system-connect.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,corp-connect.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,info-secure.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,supportsoft.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,update-syscontrol.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,sequpdate.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,service-clien.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,service-corporation.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,scansequrity.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,service-help.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,it-service.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,sequritycheck.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 domain,upsecscan.top,detect,medium,2026-11-04,STAC4749 Teams vishing tenant domain,campaign:STAC4749 # --- First-stage loaders --- sha256,1cf3131b6f487067b3746dd4743544fbbfa553fb2941176b8213996aac61425c,detect,high,2027-02-04,STAC4749 loader sekv,campaign:STAC4749 sha256,746a693e2ba1bb50b941a6ea30026cce02ab9b64ffb9fa6168a62f7aa9557f0a,detect,high,2027-02-04,STAC4749 loader sekv,campaign:STAC4749 sha256,23cb533bc3a5b535c06c8f0865e6cdebf442d56a7ac275baddcb9785279e4b88,detect,high,2027-02-04,STAC4749 loader helper,campaign:STAC4749 sha256,44f8bd68487d0c40227ed44321cf16fc4a34d645252e98d6ba3f81e9f05e7900,detect,high,2027-02-04,STAC4749 loader helper,campaign:STAC4749 sha256,d5572db12b800e87f986ef1138690ec5e17dfa5a0720dc75d453233ada88ee6d,detect,high,2027-02-04,STAC4749 loader helper,campaign:STAC4749 sha256,2d8ea8fb20f1311e04ea88baa7cff957f6cb73899a524dc2bd39523e14ab022f,detect,high,2027-02-04,STAC4749 loader helper,campaign:STAC4749 # --- Python backdoors and reverse proxy --- sha256,bb96d21b7a61628724f13c6d4506b9d7bb56020d1c41fc79310f74666bb75904,detect,high,2027-02-04,STAC4749 Python backdoor updater,campaign:STAC4749 md5,36e80c375861d3ff0a55d5e49c8fe12e,detect,high,2027-02-04,STAC4749 Python backdoor msupdate (vendor sha256 malformed),campaign:STAC4749 sha256,35a75212862ce719ae6de1758949be33a3de787fab31e2d98436bacce8369d92,detect,high,2027-02-04,STAC4749 reverse SOCKS proxy sc5,campaign:STAC4749 # --- Golang implants --- sha256,94b66ac8391ca543b0dffde6a2d475d29afce6fe32995eda76d379553da68407,detect,high,2027-02-04,STAC4749 Golang implant autumn,campaign:STAC4749 sha256,9faa993d608c09eed5dcc9c945b8dd07431fcc192f0232ef379293622a1f3586,detect,high,2027-02-04,STAC4749 Golang implant graph,campaign:STAC4749 sha256,c2fa32ac59f6424657a8513a7f158082877b97436b8502c3879f5736713e2132,detect,high,2027-02-04,STAC4749 Golang implant tube,campaign:STAC4749 sha256,3f0dbc159dcdfb884ebc577dfe873d468617bf5a483bf832469cd209efbe84d4,detect,high,2027-02-04,STAC4749 Golang implant midnight,campaign:STAC4749 sha256,95fcab7e8892cb87bcadb523a4491bf10ee0788b859647ca7cca1e1d92d7519a,detect,high,2027-02-04,STAC4749 Golang implant agree,campaign:STAC4749 sha256,219aa20e572dee9d1ef47ae1c33a851fc4fcecc5a45d15ce80c863da67cfeb10,detect,high,2027-02-04,STAC4749 Golang implant dizzy,campaign:STAC4749 sha256,65060c1d1c6020ac445ea7b394ef9b1bd9aa23f27d9a508470403c7296924ce8,detect,high,2027-02-04,STAC4749 Golang implant confirm,campaign:STAC4749 # --- DLL side-loading pair --- sha256,cd3163a308ba40c3a5e153c0326b7cf23a36debb6255624f9afb7e7ca5182391,detect,high,2027-02-04,STAC4749 malicious vcruntime140_1.dll,campaign:STAC4749 sha256,d8fed5a9fa8baee68d241190f29a2e91f5c549a684cb66c92de3974fc9f3db22,detect,high,2027-02-04,STAC4749 trojanised copyq archive,campaign:STAC4749
STAC4749 behavioural signatures. These survived every rotation between Feb and Jun 2026.
1. IDENTITY-TO-ENDPOINT PIVOT (highest value; requires both data sets)
External federated Teams chat or call from a non-allowlisted domain
THEN within 60 minutes on the same user's host:
quickassist.exe OR remsupp*.exe OR dwagent*.exe OR anydesk.exe starts.
2. REMOTE-SUPPORT PARENTAGE
Parent = quickassist.exe / remsupp* / dwagent* / dwrcs* / anydesk
Child = powershell / pwsh / cmd / mshta / wscript / cscript / curl /
certutil / bitsadmin / rundll32 / regsvr32 / msiexec
3. IMPLANT AUTHENTICATION FLAG
Any process command line containing: --token-raw
Single most durable string in the toolkit. Names rotate; this did not.
4. LOADER NAME SHAPE
Short alpha prefix + optional underscore + 6-12 random digits + .exe
in AppData\Roaming, AppData\Local\Temp or ProgramData.
Observed prefixes: sekv_ helper_ 74fs_ 7414fs ms_
5. AUDIO-DRIVER MASQUERADE
HKCU ...\CurrentVersion\Run value named:
Realtek HD Audio / Realtek HD Audio Universal Service /
Realtek Audio / Realtek Audio UHD / WinAudio life2 /
SecurityHealth / OneDriveUpdate
whose DATA points into AppData, ProgramData, Temp or Users\Public.
Genuine Realtek autostarts never point at a user-writable path.
6. STARTUP VBS SHORTCUT
mklink-style .vbs creating a hidden shortcut in
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
7. PYTHON BACKDOOR ARTEFACTS
PyInstaller unpack artefacts: AppData\Local\Temp\base_library.zip
PyArmour-obfuscated bytecode; AES key and IV fetched from a public
GitHub repository at runtime.
Log path artefact: C:\ProgramData\AppSreen\logs\appscreen.log
(note the misspelling of "AppScreen" -- it is the actor's, not a typo)
8. TLS CERTIFICATE PINNING ISSUERS
Custom CA issuer common names seen on the C2 certificates:
loop-CA connectify-CA james-bond-CA
Hunt these in TLS inspection / JA3 / certificate logs if available.
9. RANSOMWARE STAGE
vssadmin delete shadows / wmic shadowcopy delete /
wbadmin delete catalog / bcdedit recoveryenabled No
THEN simultaneous mass encryption across hosts,
THEN ransom note: readme.chaos.txt
10. OPERATOR ARTEFACT
Commands mistyped in a Cyrillic keyboard layout appearing in shell
history is a strong hands-on-keyboard indicator for this actor.
STAC4749 tooling. NONE of this belongs on a flat blocklist.
Every entry is either legitimate software or a name too generic to alert on.
LEGITIMATE TOOLS ABUSED -- hunt contextually, never block by name
quickassist.exe Microsoft Quick Assist, the preferred entry tool
RemSupp cloud RMM, preferred from April 2026 onward
DWAgent / dwagsvc redundant remote access in ransomware cases
AnyDesk redundant remote access in ransomware cases
msconfig.exe used to enable RDP service configuration
CopyQ clipboard manager used as a DLL side-loading host
Remote Desktop enabled via HKLM ...\Terminal Server\fDenyTSConnections
MALWARE FILENAMES -- too generic or too volatile to alert on by name.
Use the hashes in the CSV block and the behaviours above instead.
Loaders sekv_<10 digits>.exe helper_<10 digits>.exe
74fs_<10 digits>.exe 7414fs*.exe ms_876234.exe
45234ssdf403851640.exe
Backdoors updater.exe msupdate.exe path1.exe
Golang graph.exe confirm.exe midnight.exe shield.exe tube.exe
dizzy.exe agree.exe autumn.exe left.exe nation.exe
hire.exe WiSec.exe graph3.exe
^ single-word English nouns, chosen to defeat name-based rules
Proxy sc5.exe (reverse SOCKS, ~1000 concurrent connections)
Side-load vcruntime140_1.dll inside copyq-13.0.0.zip
PERSISTENCE VALUE NAMES -- alert only WITH a user-writable target path
Realtek HD Audio Realtek HD Audio Universal Service
Realtek Audio Realtek Audio UHD
WinAudio life2 SecurityHealth
OneDriveUpdate mklink-%.vbs
RANSOM NOTE
readme.chaos.txt
VISHING PERSONA DISPLAY NAMES -- context only, trivially changed
AnthonyBrooks DylanHarper EthanParker DylanHartman
JasonMitchell DylanFoster EllaBrooks RyanBennett
LoganCooper LoganMitchell NicholasGrant TimothyPorter
# STAC4749 exposure audit. Run before anything else.
# Requires the MicrosoftTeams PowerShell module and a Teams Administrator role.
Connect-MicrosoftTeams
# 1. Can any tenant on the internet chat your staff right now?
Get-CsTenantFederationConfiguration |
Select-Object AllowFederatedUsers, AllowPublicUsers,
AllowedDomains, BlockedDomains,
AllowTeamsConsumer, AllowTeamsConsumerInbound
# AllowFederatedUsers = True with an EMPTY AllowedDomains list means
# open federation. That is the precondition this campaign requires.
# 2. Which external-access policies are actually assigned?
Get-CsExternalAccessPolicy |
Select-Object Identity, EnableFederationAccess,
EnablePublicCloudAccess, EnableTeamsConsumerAccess
# 3. Block the known vishing tenant domains immediately.
# This is a stopgap. The domain-allowlist control in Playbook P1 is the fix.
$stac4749 = @(
"sequrityupdate.top","scan-security.top","system-online.top",
"system-connect.top","corp-connect.top","info-secure.top",
"supportsoft.top","update-syscontrol.top","sequpdate.top",
"service-clien.top","service-corporation.top","scansequrity.top",
"service-help.top","it-service.top","sequritycheck.top","upsecscan.top"
)
$blocked = (Get-CsTenantFederationConfiguration).BlockedDomains.Domain
$stac4749 | Where-Object { $_ -notin $blocked } |
ForEach-Object { "MISSING FROM BLOCKLIST: $_" }
# 4. Is Quick Assist reachable by standard users?
Get-AppxPackage -AllUsers -Name "MicrosoftCorporationII.QuickAssist" |
Select-Object Name, Version, InstallLocation
# 5. Which endpoints already have an unsanctioned remote-support tool?
# Cross-check against Falcon Q2 output before treating any as benign.
Get-CimInstance -ClassName Win32_Product |
Where-Object { $_.Name -match "AnyDesk|DWAgent|RemSupp|TeamViewer|ScreenConnect" } |
Select-Object Name, Version, InstallDate
Detection Validation Gates
Work these four gates in order. A query that has not cleared all four is not a detection, it is a hypothesis.
Gate 1 — Telemetry ready
- Confirm
ProcessRollup2events carry a populatedCommandLinein your tenant. Q4, Q8, Q9, Q12 and Q15 are worthless without it. - Confirm
AsepValueUpdateandRegGenericValueUpdateare flowing. Run a Run-key write on a test host and verify it lands. - Confirm
RegStringValueis populated for the registry events you receive. On some sensor versions a DWORD write lands in a numeric field and Q11's value column reads empty. This is the one field in the pack flagged⚠ validate in tenant. - Confirm the Purview unified audit log is enabled and that Teams chat and call events are being retained. Without this, the highest-value correlation in the pack cannot be built.
- Confirm
RansomwareOpenFileis present. It depends on your prevention policy configuration.
Gate 2 — Benign baseline
- Run Q1, Q2, Q9, Q15 and Q16 over 30 days with no exclusions. Record the hit count and the top ten contributing processes or accounts for each.
- Any query returning more than roughly 50 hits per day fleet-wide needs its exclusion list built before it is scheduled, not after.
- Q3, Q5, Q7, Q10, Q12, Q13 and Q14 should return zero or near-zero in a clean estate. A non-zero result on any of those is an investigation, not a tuning task.
Gate 3 — Positive test
- Q3: launch Quick Assist on a lab host and start PowerShell from inside the session. The query must return the pair.
- Q5 and Q6: write and execute a benign signed binary renamed to
helper_1234567890.exein%APPDATA%. - Q7: create an HKCU Run value named
Realtek Audio UHDpointing at a benign EXE in%APPDATA%, then delete it. - Q12: run any benign binary with
--token-raw=testappended. The query must return it. - Q13 and Q14: use your TI platform's detonation host, or add one indicator to a lab DNS sinkhole and resolve it.
- Q15: run
vssadmin list shadowsfirst to confirm the process is visible, then a scoped delete in a snapshot-protected lab VM only.
Gate 4 — Promotion criteria
- Five consecutive business days with zero unexplained hits before any query becomes a Custom IOA.
- Every IOA starts in Monitor. Nothing goes straight to Detect.
- Each promoted rule carries a documented rollback: the rule group name, the assigned host group, and the person who can disable it out of hours.
- Re-baseline after each of your own RMM or backup software upgrades. Those are the two products most likely to break these exclusion lists.
Hardening — Tiered
This campaign exploits no vulnerability, so there is nothing to patch. The controls below remove the preconditions instead: open Teams federation, unrestricted remote-support tooling, and a user account with enough privilege to persist. Each control cites a MITRE mitigation for the why and a platform authority for the what.
H1. Restrict Teams external access to an allowlist of federated domains. This single control removes step 1 of the chain outright. Move from open federation to an explicit allowlist of the partner domains you actually work with. MITRE M1030 (Network Segmentation), M1018 (User Account Management). Microsoft Teams security guidance; CIS Microsoft 365 Foundations Benchmark section 8 (Teams). See Playbook P1.
H2. Disable Teams consumer (personal account) interoperability unless a documented business case exists. It is a second unmonitored path to your staff. MITRE M1030. CIS Microsoft 365 Foundations Benchmark.
H3. Block Microsoft Quick Assist for standard users. Quick Assist was the actor's first-choice entry tool. If your helpdesk does not use it, remove it. If it does, restrict launching it to the support group. MITRE M1038 (Execution Prevention), M1042 (Disable or Remove Feature). Microsoft guidance on Quick Assist abuse. See Playbook P2.
H4. Enable the four relevant ASR rules in Block mode. Block executable content from email and webmail clients; block JavaScript or VBScript from launching downloaded executable content; block execution of potentially obfuscated scripts; block process creations originating from PSExec and WMI commands. The VBScript rule directly targets the Startup-folder persistence in this chain. MITRE M1038, M1050 (Exploit Protection). Microsoft Security Baseline for Windows. See Playbook P3.
H5. Import the section 10 IOC CSV into Falcon IOC Management and enable the four Custom IOAs from section 9 in Monitor mode. Vendor control, no benchmark citation applies.
H6. Brief staff on the specific play. Not generic phishing training. Tell them: IT will never contact you unsolicited via a Teams chat from outside the company, and will never ask you to start Quick Assist or install remote-support software on a call you did not initiate. Publish one verified callback number. MITRE M1017 (User Training).
H7. Application-control deny list for unsanctioned remote-support and RMM tooling. AppLocker or WDAC rules denying RemSupp, DWAgent, AnyDesk, ScreenConnect, TeamViewer, Atera, Splashtop, LogMeIn, RustDesk and UltraViewer except for the support group. This is the control that broke the actor's April pivot away from Quick Assist. MITRE M1038. CIS Microsoft Windows Benchmark, AppLocker section. See Playbook P2.
H8. Immutable and offline backups, with segregated credentials. Object-lock or WORM retention on at least one copy, and backup service credentials that are not reachable from a compromised workstation session. Chaos deletes shadow copies and tampers with backup services before encrypting, so an online-only backup is not a backup here. MITRE M1053 (Data Backup). NIST SP 800-209; CIS Control 11.
H9. PowerShell script block logging, module logging and transcription, forwarded off the host. Without this the download cradle in step 3 leaves almost no forensic trace. MITRE M1047 (Audit). CIS Microsoft Windows Benchmark, PowerShell section; Microsoft Security Baseline. See Playbook P5.
H10. Disable RDP on workstations by policy, and audit the Terminal Server key. Set fDenyTSConnections to 1 by GPO so a local registry write is reverted at the next policy refresh, and enable a SACL on the key so the attempt is logged. Require Network Level Authentication where RDP is genuinely needed. MITRE M1035 (Limit Access to Resource Over Network), M1042. CIS Microsoft Windows Benchmark; DISA Windows STIG. See Playbook P4.
H11. Remove standing local administrator rights from standard users, and deploy Windows LAPS for the local administrator account. The operator inherits whatever the interactive user has. MITRE M1026 (Privileged Account Management). CIS Microsoft Windows Benchmark; Microsoft Security Baseline.
H12. Block newly registered and low-reputation domains at the resolver or proxy, with .top and the other high-abuse TLDs treated as block-by-default with an exception process. The entire payload cluster and every vishing tenant domain in this campaign sat on such TLDs. MITRE M1037 (Filter Network Traffic). CIS Control 9; NIST SP 800-81 (DNS).
H13. Windows Defender Application Control in enforced mode with a managed installer. An allowlist model ends the whole class of attack: the randomised loader, the Golang implants and the sideloaded DLL all fail to execute regardless of naming. This is the highest-leverage control in the pack and also the most expensive. MITRE M1038. Microsoft WDAC design guidance; DISA Windows STIG.
H14. Phishing-resistant MFA and Conditional Access covering Teams, with legacy authentication blocked and device compliance required. Reduces the value of any credentials harvested during the session. MITRE M1032 (Multi-factor Authentication). CIS Microsoft 365 Foundations Benchmark; Microsoft Zero Trust guidance.
H15. Network segmentation with default-deny egress from workstation VLANs, forcing all outbound HTTPS through an inspecting proxy. Removes the direct-to-IP gRPC C2 path and the reverse SOCKS tunnel. MITRE M1030, M1037. CIS Control 12; NIST SP 800-207.
H16. Tiered administration model. Tier 0 credentials never authenticate to a workstation, so a compromised endpoint session cannot become a domain compromise. MITRE M1026. Microsoft Enterprise Access Model.
H17. A documented, rehearsed remote-support verification procedure. Every remote-support session initiated by IT is announced through a second channel the user already trusts, and users are trained to refuse any session that arrives without one. ⚠ best-practice, no formal benchmark. Included because it is the only control that addresses the social-engineering step directly rather than its consequences.
Deployable Playbooks
Five playbooks covering the highest-leverage controls. Every step carries prerequisites, reboot impact and a rollback. Test each in a pilot ring before estate-wide deployment.
P1 — Restrict Microsoft Teams external access to an allowlist (control H1, H2)
Prerequisites: MicrosoftTeams PowerShell module v5.0 or later; Teams Administrator or Global Administrator role; an agreed list of partner domains from the business. Reboot required: none. Changes propagate across the tenant in up to 24 hours. Rollback: capture the current configuration to JSON first (step 1), then re-apply it with Set-CsTenantFederationConfiguration. Reverting restores open federation, so treat the rollback as an incident in its own right and time-box it.
Connect-MicrosoftTeams
# STEP 1 -- CAPTURE ROLLBACK STATE BEFORE CHANGING ANYTHING
$backup = Get-CsTenantFederationConfiguration
$backup | ConvertTo-Json -Depth 6 |
Out-File "C:\Admin\rollback-teams-federation-2026-08-04.json"
# STEP 2 -- define the partner domains the business actually needs
$allow = @("partner-one.example.com","partner-two.example.com")
$allowList = $allow | ForEach-Object { New-CsEdgeDomainPattern -Domain $_ }
$allowObj = New-CsEdgeAllowList -AllowedDomain $allowList
# STEP 3 -- switch federation from open to allowlist-only
Set-CsTenantFederationConfiguration `
-AllowFederatedUsers $true `
-AllowedDomains $allowObj `
-AllowPublicUsers $false `
-AllowTeamsConsumer $false `
-AllowTeamsConsumerInbound $false
# STEP 4 -- verify
Get-CsTenantFederationConfiguration |
Select-Object AllowFederatedUsers, AllowPublicUsers,
AllowTeamsConsumer, AllowTeamsConsumerInbound,
@{n="Allowed";e={ $_.AllowedDomains.AllowedDomain.Domain }}
# ROLLBACK (only with documented approval)
# $r = Get-Content "C:\Admin\rollback-teams-federation-2026-08-04.json" | ConvertFrom-Json
# Set-CsTenantFederationConfiguration -AllowFederatedUsers $r.AllowFederatedUsers `
# -AllowPublicUsers $r.AllowPublicUsers -AllowTeamsConsumer $r.AllowTeamsConsumer
P2 — Block Quick Assist and unsanctioned RMM via AppLocker (control H3, H7)
Prerequisites: Application Identity service (AppIDSvc) set to Automatic; an existing AppLocker policy or a decision to create one; a security group containing your genuine support staff; a pilot host group. Reboot required: no reboot, but AppIDSvc must be started and a policy refresh applied. Sessions already running a blocked binary are not terminated, so schedule a logoff cycle. Rollback: export the effective policy before merging (step 1) and re-import it with Set-AppLockerPolicy -XmlPolicy, which replaces rather than merges. If AppLocker locks out a business-critical tool out of hours, setting AppIDSvc to Manual and stopping it disables enforcement immediately as a break-glass measure.
# STEP 1 -- CAPTURE ROLLBACK STATE
Get-AppLockerPolicy -Effective -Xml |
Out-File "C:\Admin\rollback-applocker-2026-08-04.xml" -Encoding utf8
# STEP 2 -- ensure the enforcement service is running
Set-Service -Name AppIDSvc -StartupType Automatic
Start-Service -Name AppIDSvc
# STEP 3 -- author the deny rules.
# Deploy as a GPO under:
# Computer Configuration > Windows Settings > Security Settings
# > Application Control Policies > AppLocker > Executable Rules
#
# Rule 1 DENY Publisher: MicrosoftCorporationII.QuickAssist (all versions)
# Except: security group CORP-IT-Support
# Rule 2 DENY Path: *\remsupp*.exe
# Rule 3 DENY Path: *\dwagent*.exe and *\dwagsvc*.exe and *\dwrcs*.exe
# Rule 4 DENY Path: *\anydesk*.exe
# Rule 5 DENY Path: *\screenconnect*.exe and *\connectwisecontrol*.exe
# Rule 6 DENY Path: *\rustdesk*.exe and *\ultraviewer*.exe
# Rule 7 DENY Path: *\atera*.exe and *\splashtop*.exe and *\logmein*.exe
# Rule 8 DENY Path: %OSDRIVE%\Users\*\AppData\Local\Temp\*.exe
# Except: your software-deployment service account
#
# Deny rules override allow rules in AppLocker, so these take precedence
# over any broad "allow Program Files" rule already in the policy.
# STEP 4 -- start in AUDIT ONLY on the pilot ring
Set-AppLockerPolicy -XmlPolicy "C:\Admin\rmm-deny.xml" -Merge
# STEP 5 -- review what WOULD have been blocked, for at least 5 business days
Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EXE and DLL" |
Where-Object { $_.Id -in 8003,8006 } |
Select-Object TimeCreated, Id, Message -First 200
# STEP 6 -- only after a clean audit week, switch the rule collection to Enforce.
# ROLLBACK
# Set-AppLockerPolicy -XmlPolicy "C:\Admin\rollback-applocker-2026-08-04.xml"
# BREAK-GLASS: Stop-Service AppIDSvc ; Set-Service AppIDSvc -StartupType Manual
P3 — Enable the four relevant ASR rules (control H4)
Prerequisites: Microsoft Defender Antivirus in active mode (not passive) with real-time protection on; Defender platform version 4.18.2201 or later; local administrator or Intune. Reboot required: none. Rules take effect immediately. Rollback: set the same GUIDs to Disabled, or to AuditMode to keep visibility without enforcement. The Remove-MpPreference form in the rollback block clears the rule entirely rather than leaving it disabled, which is the cleaner state to return to.
# Run elevated. Deploy via Intune Endpoint Security -> Attack Surface Reduction
# for the estate; this form is for the pilot ring and for verification.
# STEP 1 -- CAPTURE ROLLBACK STATE
Get-MpPreference |
Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids |
Out-File "C:\Admin\rollback-asr-ids-2026-08-04.txt"
Get-MpPreference |
Select-Object -ExpandProperty AttackSurfaceReductionRules_Actions |
Out-File "C:\Admin\rollback-asr-actions-2026-08-04.txt"
# STEP 2 -- start in AUDIT mode (value 2). Do not skip this.
$rules = @(
"BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550", # block exe content from email/webmail
"D3E037E1-3EB8-44C8-A917-57927947596D", # block JS/VBS launching downloaded exe
"5BEB7EFE-FD9A-4556-801D-275E5FFC04CC", # block obfuscated scripts
"D1E49AAC-8F56-4280-B9BA-993A6D77406C" # block process creation from PSExec/WMI
)
foreach ($id in $rules) {
Add-MpPreference -AttackSurfaceReductionRules_Ids $id `
-AttackSurfaceReductionRules_Actions AuditMode
}
# STEP 3 -- after 5 clean business days, switch to Enabled (block).
# foreach ($id in $rules) {
# Set-MpPreference -AttackSurfaceReductionRules_Ids $id `
# -AttackSurfaceReductionRules_Actions Enabled
# }
# STEP 4 -- verify
Get-MpPreference | Select-Object AttackSurfaceReductionRules_Ids,
AttackSurfaceReductionRules_Actions
# ROLLBACK
# foreach ($id in $rules) { Remove-MpPreference -AttackSurfaceReductionRules_Ids $id }
P4 — Enforce RDP-disabled on workstations and audit the key (control H10)
Prerequisites: a GPO scoped to the workstation OU only, never to servers or to jump hosts; confirmation from IT that no support workflow depends on workstation RDP. Reboot required: none for the policy value. A reboot or gpupdate /force applies it, and any existing RDP session survives until it is disconnected. Rollback: set the GPO value back to Disabled for the "Allow users to connect remotely" setting, or unlink the GPO. Because this is enforced by policy rather than a one-off registry write, an attacker's local change is reverted at the next refresh, which is the entire point of doing it this way.
# GPO PATH (preferred -- survives a local registry write by an attacker)
# Computer Configuration > Policies > Administrative Templates
# > Windows Components > Remote Desktop Services
# > Remote Desktop Session Host > Connections
# "Allow users to connect remotely by using Remote Desktop Services" = Disabled
#
# Where RDP IS required, in the same node set:
# "Require user authentication for remote connections by using
# Network Level Authentication" = Enabled
# VERIFY the effective state on a host (1 = RDP denied)
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
-Name fDenyTSConnections |
Select-Object fDenyTSConnections
# AUDIT the key so an attacker's attempt is logged even when policy reverts it.
# Enable: Computer Configuration > Policies > Windows Settings > Security
# Settings > Advanced Audit Policy > Object Access > Audit Registry
# Then set a SACL on the Terminal Server key for "Set Value" by Everyone.
# Resulting events: Security 4657. Feeds the section 7 native hunt.
# ROLLBACK
# Set the GPO setting to "Disabled" -> reverts to allowing RDP, or unlink the GPO.
# Emergency single-host restore (requires local admin, use sparingly):
# Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server" `
# -Name fDenyTSConnections -Value 0
P5 — PowerShell script block logging and transcription (control H9)
Prerequisites: a write-restricted network share or SIEM forwarder for transcripts; log volume budget (script block logging is verbose); PowerShell 5.1 or later. Reboot required: none. New PowerShell sessions pick the policy up immediately; existing sessions do not. Rollback: set both policy values to Disabled, or delete the registry keys created below. Rollback is safe and immediate, but understand that it removes the only forensic record of a download cradle, so prefer reducing retention over disabling collection.
# GPO PATH (preferred)
# Computer Configuration > Policies > Administrative Templates
# > Windows Components > Windows PowerShell
# "Turn on PowerShell Script Block Logging" = Enabled
# "Turn on Module Logging" = Enabled (module names: *)
# "Turn on PowerShell Transcription" = Enabled
# Transcript output directory: \\logsrv\pstranscripts$
# (share must be append-only to the workstation computer accounts)
# EQUIVALENT REGISTRY FORM, for a pilot host. Run elevated.
$sb = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"
$tr = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription"
New-Item -Path $sb -Force | Out-Null
New-Item -Path $tr -Force | Out-Null
Set-ItemProperty -Path $sb -Name EnableScriptBlockLogging -Value 1 -Type DWord
Set-ItemProperty -Path $tr -Name EnableTranscripting -Value 1 -Type DWord
Set-ItemProperty -Path $tr -Name EnableInvocationHeader -Value 1 -Type DWord
Set-ItemProperty -Path $tr -Name OutputDirectory `
-Value "\\logsrv\pstranscripts$" -Type String
# VERIFY -- run a harmless command, then confirm a 4104 event exists
Write-Output "asr-validation-probe"
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 20 |
Where-Object { $_.Id -eq 4104 } |
Select-Object TimeCreated, Id -First 5
# ROLLBACK
# Remove-Item -Path $sb -Recurse -Force
# Remove-Item -Path $tr -Recurse -Force
Containment Runbook
Assume a 17-hour clock. The fastest observed intrusion went from first Teams contact to encryption in under 17 hours. If Q3, Q5, Q7 or Q12 fires, treat it as an active hands-on-keyboard intrusion, not a malware alert, and start Phase 1 immediately rather than queueing it for triage.
| Phase | Actions | Owner | Evidence to capture first |
|---|---|---|---|
| 0 — Triage 0 to 15 min |
|
SOC L2 | Teams audit export, Falcon detection IDs, screenshot of the process tree. |
| 1 — Isolate 15 to 60 min |
|
SOC L3 + Identity | Memory image if your process requires it, taken before containment. Full ProcessRollup2 export for the host. Registry hive export. |
| 2 — Eradicate 1 to 8 hours |
|
SOC L3 + Endpoint Eng | Hash and preserve every removed artefact. Record the exact Run-key names and target paths for the pack changelog. |
| 3 — Recover 8 to 72 hours |
|
IT Ops + SOC | Restore validation log, backup integrity check output. |
| 4 — Learn 1 to 2 weeks |
|
SOC Lead | Timeline document, updated pack, IOA rule IDs. |
Detection Coverage Map
| Technique | Behaviour | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1566.004 | Teams vishing call from an external tenant | — | — | GAP No endpoint telemetry exists for this step. Covered only by the section 7 Purview and Entra hunts. This is the single most important gap in the pack. |
| T1199 | Abuse of open Teams federation | — | — | GAP Prevented by control H1, not detected. Detection requires the section 7 native hunts. |
| T1219 | Quick Assist / RemSupp / DWAgent / AnyDesk session | Q1, Q2 | — | Partial Rarity-based only. Becomes strong when joined to the section 7 Teams data; weak standalone in an estate that uses these tools daily. |
| T1204.004 | User talked into launching the session | Q1, Q2 | — | Partial The human step is not observable. Only the resulting process is. |
| T1059.001 | PowerShell download cradle inside the session | Q3, Q4 | Yes (Q3) | Good Q3 is the highest-fidelity endpoint-only detection in the pack. |
| T1105 | Loader and implant ingress | Q4, Q5, Q6, Q12 | Yes (Q5, Q12) | Good Covered at both file-write and execution time, and by the durable argument signature. |
| T1036 / T1036.005 | Randomised loader names; audio-driver masquerade | Q5, Q6, Q7 | Yes (Q5, Q7) | Good Q6 covers the shape after the prefixes rotate. |
| T1547.001 | Run-key and Startup-folder persistence | Q7, Q8 | Yes (Q7) | Good Both mechanisms covered. The path condition in Q7 is what keeps it precise. |
| T1518.001 / T1082 | Security product and system discovery | Q9 | — | Partial Falcon does not emit registry reads, so the registry-based discovery Sophos describes is only visible through its command-line surface. High FP by nature. |
| T1574.002 | CopyQ DLL side-loading | Q10 | — | Partial Path-based. A module-load event would be stronger but is not available in the validated event set, so confirm hits against the DLL and archive hashes. |
| T1027.002 | PyInstaller / PyArmour packing; AES key from GitHub | Q6 | — | GAP No dedicated detection. The GitHub key retrieval is indistinguishable from ordinary developer traffic. Hunt the artefacts in the behavioural block instead. |
| T1021.001 / T1112 | RDP enablement via registry and msconfig | Q11 | — | Partial Detected. Control H10 is the stronger answer because GPO reverts the change automatically. |
| T1071.001 / T1090 | gRPC C2, HTTPS staging, reverse SOCKS proxy | Q13, Q14 | — | Partial Atomic coverage only. The infrastructure rotated roughly weekly, so these decay. Q14's family-fragment matching extends the useful life. |
| T1567 | Data theft before encryption | — | — | GAP No volumetric exfiltration query ships in this pack. Sophos reports data theft in at least one intrusion but publishes no exfiltration destination. Add a high-volume-egress hunt scoped to your own crown-jewel shares. |
| T1490 / T1489 | Shadow copy and backup destruction | Q15 | — | Good Real-time alert candidate. The last point at which action still helps. |
| T1486 | Chaos encryption | Q16 | — | Partial Tripwire and blast-radius measurement only. By the time this fires the outcome is largely decided. |
Validation gates. Section 11 defines the four gates every query must clear before it is trusted: telemetry confirmed present in the tenant (including the one field flagged ⚠ validate in tenant, RegStringValue on registry events in Q11), a 30-day benign baseline with exclusions built before scheduling rather than after, a positive test that proves each query actually fires, and a promotion rule of five consecutive clean business days in Monitor before any Custom IOA reaches Detect. Sixteen queries ship. Seven rate CONF high, six medium and none low, with three carrying an FP risk of medium or higher and one (Q9) rated high FP and explicitly scoped to host-level corroboration rather than fleet-wide alerting.
The dominant gap is structural, not a missing query. Four of the sixteen mapped techniques have no endpoint detection because they do not happen on the endpoint. Until the Teams and Entra audit data in section 7 is joined to the Falcon data in section 8, this pack detects the intrusion from step 2 onward and never sees step 1. Closing that join is worth more than any additional CQL.
Hunt Summary Ticket
TITLE: STAC4749 -- Microsoft Teams vishing to Chaos ransomware
SEVERITY: Critical -- active RaaS, under 17h from initial access to encryption
SCOPE: All Windows endpoints with an interactive user.
All Microsoft 365 tenants with Teams external access enabled.
Highest risk: professional services, manufacturing, energy,
construction and engineering, IP law. Canada and US.
HYPOTHESIS: An external Microsoft Teams tenant on an IT-themed .top domain
has contacted an employee posing as internal IT helpdesk, talked
them into a Quick Assist or RemSupp remote-support session, and
used it to stage a loader into %AppData%, persist via a Run key
disguised as a Realtek audio component, and hand off to Golang
implants ahead of Chaos ransomware deployment.
QUERIES: Q1 Quick Assist execution ranked by rarity CONF med
Q2 RMM / remote-support first appearance CONF med
Q3 Remote-support parent spawning a shell CONF high *IOA
Q4 PowerShell cradle writing an EXE to AppData CONF high
Q5 Randomised loader filename pattern CONF high *IOA
Q6 Randomised-name EXE written to user-writable dir CONF med
Q7 Audio-driver autostart in a user-writable path CONF high *IOA
Q8 Startup-folder VBScript launcher CONF med
Q9 Security-product discovery CONF med FP HIGH
Q10 CopyQ from a user-writable directory CONF med
Q11 RDP enabled via Terminal Server registry key CONF med
Q12 Golang implant --token-raw argument CONF high *IOA
Q13 Egress to published C2 addresses CONF high
Q14 DNS for the payload-hosting cluster CONF high
Q15 Shadow copy / backup destruction CONF high
Q16 Mass-file ransomware activity burst CONF med
DO FIRST: 1. Run the section 10 Teams/Entra exposure audit. If federation
is open with an empty allowlist, you are exposed today.
2. Run Q12 across 90 days. It has no known false positives, so a
single hit is an incident.
3. Run Q13 and Q14 across 90 days for retrospective compromise.
4. Run Q3 and Q7 across 30 days.
5. Deploy Playbook P1 (Teams federation allowlist).
FINDINGS: [ ] Q12 hits: ______ [ ] Q13 hits: ______ [ ] Q14 hits: ______
[ ] Q3 hits: ______ [ ] Q7 hits: ______
[ ] Teams federation open with empty allowlist? Y / N
[ ] Quick Assist reachable by standard users? Y / N
[ ] Unsanctioned RMM found by Q2? Y / N
GAPS: - Teams vishing itself (T1566.004) has NO endpoint telemetry.
Requires Purview and Entra audit logs, section 7.
- No exfiltration detection ships. Sophos reports data theft but
publishes no destination. Add a volumetric egress hunt locally.
- PyArmour packing and the GitHub AES key fetch (T1027.002) are
not separately detectable and are covered only behaviourally.
- Registry-read-based discovery is not emitted by the sensor, so
Q9 hunts the command-line surface instead and is high FP.
ACTIONS: [ ] Import the section 10 IOC CSV into Falcon IOC Management
[ ] Create the 4 Custom IOAs in Monitor mode (section 9)
[ ] Playbook P1 -- Teams federation allowlist (Immediate)
[ ] Playbook P2 -- Block Quick Assist + unsanctioned RMM
[ ] Playbook P3 -- 4 ASR rules, Audit then Block
[ ] Playbook P4 -- RDP disabled by GPO on workstations
[ ] Playbook P5 -- PowerShell script block logging
[ ] Verify immutable / offline backup copy exists (H8)
[ ] Targeted user briefing on the specific pretext (H6)
OWNER: SOC Detection Engineering
VERSION: v0.1 -- 2026-08-04
Changelog
workers.dev, the Cloudflare edge addresses, and the generic single-noun implant filenames were deliberately excluded from the blocklist and converted to behavioural coverage.
Planned for v0.2: a joined Teams-to-endpoint correlation query once the Purview and Falcon data sets are in the same search head, and a volumetric egress hunt to close the exfiltration gap noted in section 15.
References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| T1 | Sophos X-Ops — Chaos in Teams vishing | Primary research. Campaign attribution, victimology, full attack chain, persistence value names, loader naming, certificate issuers, persona list, vishing tenant domains. | 2026-08-04 |
| T1 | SophosLabs IoCs — STAC4749-Chaos_IOCs_July2026.csv | Every atomic indicator in section 10: addresses, domains, staging URLs and file hashes. | 2026-08-04 |
| T2 | BleepingComputer — Microsoft Teams vishing attacks lead to Chaos ransomware attacks | Corroboration of the timeline, victimology, the Quick Assist to RemSupp shift, persistence naming, redundant remote access, and the ransom note name. | 2026-08-04 |
| T3 | CyberPress — Teams vishing campaign delivers Chaos ransomware | Corroboration of the tenant tradecraft, the msconfig RDP step, the gRPC loader protocol and the staging directory. | 2026-08-04 |
| T3 | SOCFortress — STAC4749: Teams vishing and the Chaos ransomware campaign | Corroboration of the loader C2 addresses and ports, PyInstaller and PyArmour packaging, certificate pinning issuers, and the reverse SOCKS proxy behaviour. | 2026-08-04 |
| Framework | MITRE ATT&CK T1566.004 — Spearphishing Voice | Technique mapping for the initial-access step and its associated mitigations. | 2026-08-04 |
| Framework | MITRE ATT&CK T1219 — Remote Access Software | Technique mapping and mitigation references for the remote-support abuse. | 2026-08-04 |
| Framework | MITRE ATT&CK M1038 — Execution Prevention | Authority behind controls H3, H4, H7 and H13. | 2026-08-04 |
| Vendor | Microsoft — Manage external access (federation) in Microsoft Teams | Configuration authority for control H1, H2 and Playbook P1. | 2026-08-04 |
| Vendor | Microsoft — Attack surface reduction rules reference | Rule GUIDs and behaviour for control H4 and Playbook P3. | 2026-08-04 |
| Vendor | Microsoft — AppLocker overview | Configuration authority for control H7 and Playbook P2. | 2026-08-04 |
| Benchmark | CIS Microsoft 365 Foundations Benchmark | Baseline authority for the Teams external-access and MFA controls (H1, H2, H14). | 2026-08-04 |
| Benchmark | CIS Microsoft Windows Desktop Benchmark | Baseline authority for the AppLocker, RDP, PowerShell logging and local-admin controls (H7, H9, H10, H11). | 2026-08-04 |
Source snapshots. The verbatim fetched text of all five threat-intelligence sources is stored alongside this pack in STAC4749-TeamsVishing-Chaos-Hunt-sources/. Every atomic indicator in section 10 was traced back to those files mechanically before publication.