Spirals Ransomware — Rapid Rust Encryptor via IIS Web Shell
Executive Summary
Spirals is a previously undocumented, Rust-based ransomware family that Symantec's Threat Hunter Team disclosed on 2026-07-17. In June 2026 the operator compromised an IT-services company in South Asia and moved from initial breach to network-wide encryption in under 24 hours. The intrusion began 2026-06-16 at 22:21 local time through an internet-facing IIS web server, where the attacker uploaded an ASP.NET web shell.
Within minutes the operator dropped three tunneling utilities for redundant, encrypted C2 over port 443: a reverse-SOCKS proxy (revsocks and a tool named tunn.exe), the Chisel tunneler renamed chrome.exe, and a Cloudflare Tunnel client (cloudflared). They escalated with a UAC bypass and token-impersonation tooling, dumped the SAM hive and LSASS (via rundll32.exe + comsvcs.dll), then used WMI to move laterally across more than a dozen hosts with a compromised domain-admin account. The next day the ransomware payload, masquerading as bitsadmin.exe, was pushed network-wide with PsExec running as SYSTEM; a base64 PowerShell stub disabled Microsoft Defender and stopped 23 backup/database/virtualization service categories first. Files are encrypted with a per-file AES-128 key wrapped under an attacker-controlled ECDH P-256 public key, with intermittent encryption on files over 5 MB. The ransom note lands system-wide as C:\RECOVERY_SECTION.log, threatening a public leak within six days via a Tor portal that names the family "Spirals".
Defender priority: The single highest-value catch is an IIS worker process (w3wp.exe) spawning a command interpreter — the web-shell foothold that precedes everything else. Pair it with detection of "living-off-trusted-names" masquerades (chrome.exe/bitsadmin.exe running from the wrong directory) and PsExec-as-SYSTEM lateral bursts. With a sub-24-hour clock, prevention and rapid isolation matter more than after-the-fact hunting.
Source Review & Web Hunter Notes
| # | Tier | Source | Key contribution | Carry |
|---|---|---|---|---|
| 1 | T1 | Symantec / Security.com Threat Hunter Team | Primary analysis: timeline, tool set, full SHA256 IOC list, staging IP + URLs, encryption scheme, ransom-note path | yes |
| 2 | T2 | Help Net Security | Corroborates chain: SAM/LSASS dump, Chisel-as-chrome.exe, cloudflared, bitsadmin.exe, 23 services, AES-128 + ECDH P-256 | yes |
| 3 | T2 | CyberSecurityNews | Staging IP 185.141.216.194, ransom-note path, timeline (22:21 / 23:33 / next-day PsExec), SYSVOL propagation | yes |
| 4 | T2 | BleepingComputer | Rust family, PsExec-as-SYSTEM, UAC bypass, RDP + local account, six-day leak deadline | yes |
| 5 | T3 | Mallory.ai (aggregator) | Cross-check of chain and encryption details; single-victim status | partial |
Verbatim snapshots of every cited source are saved in Spirals-Ransomware-Hunt-sources/ for IOC provenance. Gridinsoft's write-up returned HTTP 403 and was not used. All atomic IOCs in this pack trace to snapshot 01 (Symantec primary), with the staging IP and ransom-note path also present in snapshot 03.
Hunt Brief & Attack Chain
Hunt hypotheses (fidelity-ordered)
- H1 (high): An IIS worker (
w3wp.exe) spawned a command interpreter or recon binary, indicating an ASP.NET web shell. Falcon: ProcessRollup2. - H2 (high): A tunneling binary runs under a masqueraded name or from a public web/temp directory (
chrome.exe= Chisel,tunn.exe/revsocks,cloudflared). Falcon: ProcessRollup2 + NetworkConnectIP4. - H3 (high): LSASS or SAM credential material was dumped (
rundll32.exe+comsvcs.dllMiniDump). Falcon: ProcessRollup2. - H4 (high): Ransomware was deployed by PsExec running as SYSTEM. Falcon: ProcessRollup2.
- H5 (high): The payload masquerades as
bitsadmin.exefrom a non-system directory. Falcon: ProcessRollup2. - H6 (medium): A PowerShell stub disabled Defender and stopped backup/DB/virtualization services. Falcon: ProcessRollup2.
- H7 (high): The ransom note
C:\RECOVERY_SECTION.logwas written. Falcon: file-write telemetry. - H8 (high): A host connected to staging IP 185.141.216.194. Falcon: NetworkConnectIP4.
Attack chain
| # | Stage | Behavior | Telemetry | Hunt angle |
|---|---|---|---|---|
| 1 | Initial Access | ASP.NET web shell on internet-facing IIS | ProcessRollup2 (w3wp parent); IIS logs | Q1, native IIS hunt |
| 2 | C2 / redundancy | revsocks, Chisel-as-chrome.exe, cloudflared over 443 | ProcessRollup2; NetworkConnectIP4 | Q2, Q3, Q4, Q10 |
| 3 | Priv-esc | UAC bypass; token impersonation (tokens.exe) | ProcessRollup2 | Hash IOC; native 4688 |
| 4 | Cred Access | SAM hive dump; LSASS via comsvcs.dll | ProcessRollup2; ZipFileWritten | Q7 |
| 5 | Lateral Movement | WMI + compromised DA to 12+ hosts; SYSVOL staging | ProcessRollup2; native | Native hunts |
| 6 | Deployment | PsExec-as-SYSTEM pushes bitsadmin.exe | ProcessRollup2; 7045 | Q5, Q6 |
| 7 | Defense Evasion | Base64 PS disables Defender, stops 23 services | ProcessRollup2 | Q8 |
| 8 | Impact | AES-128/ECDH P-256 encryption; note dropped | File-write; RECOVERY_SECTION.log | Q9 |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| SHA256 | 0f9574dc38e5c34a31153f0bcc603c6ec29cb3bf65c3d25380dbe86d42573141 | high | detect | Spirals ransomware payload (bitsadmin.exe) |
| SHA256 | 7f0d49b11d0a3697685622ce510c570199bf2dc76515b3f9a6b6735de8c9134b | high | detect | Tunneling tool tunn.exe (public web dir) |
| SHA256 | 4cab935d0ec400059a3fcdc95b6623efdd51a61dff401fba8d5da244cc2de649 | high | detect | revsocks reverse-SOCKS proxy |
| SHA256 | 84b9a9a1668145df04faa3d0e118e2f0acbebd3d9d260baf3a355b44c815c22d | high | detect | Chisel disguised as chrome.exe |
| SHA256 | 862a3ca7e944ccf0ff3a6d556b34faade4b68343015c35a014a43725ac14a2a1 | high | detect | Token impersonation tool (tokens.exe) |
| SHA256 | b5d598b00cc3a28cabc5812d9f762819334614bae452db4e7f23eefe7b081556 | high | detect | Cloudflare Tunnel client (cloudflared) |
| IPv4 | 185.141.216.194 | high | detect | Payload staging / download host |
| URL | http://185.141.216.194/cd.jpg | med | hunt | Tool download disguised with .jpg extension |
| URL | http://185.141.216.194/cd.zip | med | hunt | Tool archive download |
| URL | https://computer.kplus.com/cd.zip | med | hunt | Secondary staging URL |
| URL | https://beta.padmin.com/mybenefits/Templates/cd.zip | med | hunt | Secondary staging URL |
| Filename | C:\RECOVERY_SECTION.log | high | detect | System-wide ransom note |
| Behavioral | chrome.exe / bitsadmin.exe / cloudflared / tunn.exe from non-standard path | high | hunt | Masquerade + tunneling behavior |
Hashes and the staging IP are single-campaign, single-victim indicators; treat masquerade + tunneling behavior as the durable signal. The staging hostnames appear in the Symantec IOC list but may be attacker-abused legitimate infrastructure, so they are set to hunt, not block.
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Internet-facing IIS / ASP.NET | ProcessRollup2 (w3wp children); IIS W3C logs | critical | IIS logs often not centralized |
| Windows endpoints / servers | ProcessRollup2, SyntheticProcessRollup2, file-write, NetworkConnectIP4 | critical | Servers sometimes under-sensored |
| Active Directory / domain admin | UserLogon, service install (7045), SYSVOL change audit | high | DA logon baseline needed |
| Perimeter / egress (443) | NetworkConnectIP4; proxy/firewall logs | high | TLS tunnels blend into normal 443 |
| Backup / virtualization infra | ServiceStarted/stop; ProcessRollup2 | high | Appliance telemetry may be thin |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1190 | Exploited public-facing IIS web server | Q1 / harden IIS |
| Persistence | T1505.003 | ASP.NET web shell | Q1 / IIS hunt |
| Persistence | T1136.001 / T1021.001 | Local account created; RDP enabled | Native / harden |
| Priv Esc / Def Evasion | T1548.002 | UAC bypass | Native 4688 |
| Priv Esc | T1134 | Token impersonation (tokens.exe) | Hash IOC |
| Credential Access | T1003.001 | LSASS dump via comsvcs.dll MiniDump | Q7 |
| Credential Access | T1003.002 | SAM hive dumped to archive | Native / ASR |
| Command & Control | T1572 | Chisel, revsocks, Cloudflare tunnels over 443 | Q2, Q3, Q4 |
| Command & Control | T1105 | Tools downloaded from staging host (.jpg lure) | Q10 |
| Defense Evasion | T1036.005 | chrome.exe / bitsadmin.exe masquerade | Q2, Q6 |
| Defense Evasion | T1562.001 | Disable Defender / tamper | Q8 / harden |
| Lateral Movement | T1021.002 / T1047 | PsExec + WMI to 12+ hosts | Q5 / native |
| Execution | T1569.002 | PsExec service execution as SYSTEM | Q5 |
| Impact | T1489 | Stopped 23 backup/DB/virtualization services | Q8 |
| Impact | T1486 | AES-128 + ECDH P-256 encryption; note dropped | Q9 |
Native Audit-Log Hunts (non-CQL)
- IIS W3C logs: hunt POST requests to recently-created or unusual
.aspx/.ashxfiles in web-production directories, especially from a single external IP with immediate follow-on GET activity. New handler files with no deployment ticket = web shell. - Windows Security 4688: process creation where parent is
w3wp.exeand child is a shell or recon tool. Also flagtokens.exe,tunn.exe,chrome.exe,cloudflared*.exefrom web/temp paths. - Service install (System 7045):
PSEXESVCservice registrations across many hosts in a short window signal mass PsExec push. - SYSVOL / netlogon change audit: unexpected writes to the SYSVOL domain scripts directory or the
\Windows\Tasksfolder (tool-staging locations reported by Symantec). - Defender operational log (5001/5010/5012): real-time protection disabled or tamper events cluster immediately before encryption.
- Security 1102: event-log clears during the intrusion window.
- DA logon baseline (4624/4672): domain-admin interactive/network logons to servers that never normally see them, in the hours before deployment.
CrowdStrike LogScale CQL Hunt Queries
Looks for: w3wp.exe launching a command interpreter or recon binary, the classic web-shell foothold.
// HUNT: IIS worker process spawning a command shell (ASP.NET web shell) // MITRE: T1505.003, T1190 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: rare legacy app-pool maintenance scripts, some monitoring agents #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^w3wp\.exe$/i | FileName=/^(cmd|powershell|pwsh|cscript|wscript|net1?|whoami|systeminfo|bitsadmin|certutil)\.exe$/i | table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid], limit=200)
Looks for: a process named chrome.exe executing from anywhere other than the genuine Google Chrome install tree. FP: portable/enterprise Chrome builds and dev sandboxes.
// HUNT: chrome.exe running from outside the real Chrome install path (Chisel masquerade) // MITRE: T1572, T1036.005 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: portable Chrome, non-standard enterprise installs, browser dev builds // TUNING: exclude ImageFileName paths under \Program Files\Google\Chrome and \Program Files (x86)\Google\Chrome; corroborate with SHA256 84b9a9a1668145df04faa3d0e118e2f0acbebd3d9d260baf3a355b44c815c22d #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^chrome\.exe$/i | ImageFileName!=/\\Google\\Chrome\\/i | table([ComputerName, UserName, ImageFileName, CommandLine, SHA256HashData, aid], limit=200)
Looks for: execution of cloudflared to expose internal RDP/services over an outbound tunnel.
// HUNT: Cloudflare Tunnel client (cloudflared) execution // MITRE: T1572, T1090 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: organizations that sanction Cloudflare Tunnel for remote access #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^cloudflared(-windows-amd64)?\.exe$/i | table([ComputerName, UserName, ImageFileName, CommandLine, SHA256HashData, aid], limit=200)
Looks for: the named reverse-SOCKS tools by filename or by the two published tunneler hashes.
// HUNT: reverse-SOCKS tunnelers (tunn.exe / revsocks) by name or hash // MITRE: T1572, T1090.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: unusual; legitimate SOCKS tooling is rare on servers #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(tunn|revsocks)\.exe$/i OR SHA256HashData=/^(7f0d49b11d0a3697685622ce510c570199bf2dc76515b3f9a6b6735de8c9134b|4cab935d0ec400059a3fcdc95b6623efdd51a61dff401fba8d5da244cc2de649)$/i | table([ComputerName, ImageFileName, FileName, CommandLine, SHA256HashData, aid], limit=200)
Looks for: the PSEXESVC service process or PsExec command lines invoking -s (SYSTEM). FP: sanctioned admin/software-deployment via PsExec.
// HUNT: PsExec service execution as SYSTEM (mass ransomware deployment) // MITRE: T1569.002, T1021.002 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate remote administration and software deployment using PsExec // TUNING: exclude known admin jump hosts and RMM service accounts; alert when the same source pushes PSEXESVC to many hosts in a short window #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^PSEXESVC\.exe$/i OR CommandLine=/psexec.{0,40}(\-s\b|accepteula)/i | table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, aid], limit=200)
Looks for: a bitsadmin.exe image running from anywhere other than System32/SysWOW64. FP: admin scripts that copy the real binary elsewhere.
// HUNT: bitsadmin.exe running from outside System32/SysWOW64 (Spirals payload masquerade) // MITRE: T1036.005, T1486 // CONF: high FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate bitsadmin from system directories (excluded), rare admin tooling copies // TUNING: keep the System32/SysWOW64 exclusion; corroborate with SHA256 0f9574dc38e5c34a31153f0bcc603c6ec29cb3bf65c3d25380dbe86d42573141 #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^bitsadmin\.exe$/i | ImageFileName!=/\\Windows\\(System32|SysWOW64)\\/i | table([ComputerName, UserName, ImageFileName, CommandLine, SHA256HashData, aid], limit=200)
Looks for: the well-known rundll32 comsvcs.dll, MiniDump LSASS-dumping pattern.
// HUNT: LSASS memory dump via rundll32 + comsvcs.dll MiniDump // MITRE: T1003.001 // CONF: high FP: low COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: extremely rare; some crash-dump diagnostics #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^rundll32\.exe$/i | CommandLine=/comsvcs\.dll.{0,40}MiniDump|MiniDump.{0,40}comsvcs/i | table([ComputerName, UserName, CommandLine, aid], limit=200)
Looks for: a PowerShell command line combining Defender-disable cmdlets with bulk service stops. FP: maintenance windows and backup admins.
// HUNT: PowerShell disabling Defender and stopping backup/DB/virtualization services // MITRE: T1562.001, T1489 // CONF: medium FP: medium COST: low | REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate patch/maintenance windows; backup admins stopping services // TUNING: prioritize command lines pairing Set-MpPreference/DisableRealtimeMonitoring with multiple Stop-Service; exclude approved maintenance service accounts #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(powershell|pwsh)\.exe$/i | CommandLine=/Set-MpPreference|DisableRealtimeMonitoring|Remove-MpPreference|Stop-Service|Uninstall-WindowsFeature/i | table([ComputerName, UserName, CommandLine, aid], limit=200)
Looks for: creation of the Spirals ransom note. A hit means encryption is already in progress. Validate file-write event coverage in your tenant.
// HUNT: creation of the Spirals ransom note RECOVERY_SECTION.log // MITRE: T1486 // CONF: high FP: low COST: low | REQUIRES: FileWritten telemetry // FALSE POSITIVES: none expected; the filename is campaign-specific #event_simpleName=/FileWritten/ | TargetFileName=/\\RECOVERY_SECTION\.log$/i | table([ComputerName, TargetFileName, ContextBaseFileName, aid], limit=200)
Looks for: any host reaching the reported payload-staging host.
// HUNT: outbound connection to Spirals staging IP 185.141.216.194 // MITRE: T1105 // CONF: high FP: low COST: low | REQUIRES: NetworkConnectIP4 // FALSE POSITIVES: none expected for this single-campaign address #event_simpleName=/NetworkConnectIP4/ | RemoteAddressIP4=/^185\.141\.216\.194$/ | table([ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, aid], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA name | Pattern | Exclusions | Action |
|---|---|---|---|
| WebShell — IIS worker spawns shell | Parent w3wp.exe → child cmd/powershell/cscript/wscript | Approved app-pool maintenance scripts | Block/Detect (server policy) |
| Masquerade — trusted name, wrong path | chrome.exe/bitsadmin.exe executing outside their legitimate directories | Real Chrome tree; System32/SysWOW64 | Detect, escalate |
| Tunneler execution | cloudflared*, tunn.exe, revsocks.exe process creation | Sanctioned Cloudflare Tunnel hosts | Block on servers |
| Credential dump — comsvcs MiniDump | rundll32.exe command line with comsvcs.dll + MiniDump | None | Block |
| PsExec-as-SYSTEM burst | PSEXESVC.exe created on many hosts from one source in a short window | Admin jump hosts, RMM accounts | Detect, high severity |
Promote Q7 (comsvcs MiniDump) and the tunneler patterns to prevention first: both are low-FP and sit early in the chain. Gate the web-shell IOA to your IIS/server policy to avoid workstation noise.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags sha256,0f9574dc38e5c34a31153f0bcc603c6ec29cb3bf65c3d25380dbe86d42573141,prevent,critical,2027-01-23,Spirals ransomware payload (bitsadmin.exe),campaign:Spirals sha256,7f0d49b11d0a3697685622ce510c570199bf2dc76515b3f9a6b6735de8c9134b,prevent,high,2027-01-23,Tunneling tool tunn.exe,campaign:Spirals sha256,4cab935d0ec400059a3fcdc95b6623efdd51a61dff401fba8d5da244cc2de649,prevent,high,2027-01-23,revsocks reverse-SOCKS proxy,campaign:Spirals sha256,84b9a9a1668145df04faa3d0e118e2f0acbebd3d9d260baf3a355b44c815c22d,prevent,high,2027-01-23,Chisel disguised as chrome.exe,campaign:Spirals sha256,862a3ca7e944ccf0ff3a6d556b34faade4b68343015c35a014a43725ac14a2a1,prevent,high,2027-01-23,Token impersonation tool tokens.exe,campaign:Spirals sha256,b5d598b00cc3a28cabc5812d9f762819334614bae452db4e7f23eefe7b081556,detect,high,2027-01-23,Cloudflare Tunnel client cloudflared,campaign:Spirals ipv4,185.141.216.194,detect,high,2026-10-23,Payload staging host,campaign:Spirals url,http://185.141.216.194/cd.jpg,detect,medium,2026-10-23,Tool download (.jpg lure),campaign:Spirals url,http://185.141.216.194/cd.zip,detect,medium,2026-10-23,Tool archive download,campaign:Spirals url,https://computer.kplus.com/cd.zip,detect,medium,2026-10-23,Secondary staging URL,campaign:Spirals url,https://beta.padmin.com/mybenefits/Templates/cd.zip,detect,medium,2026-10-23,Secondary staging URL,campaign:Spirals
# Durable behaviors (survive hash/infra rotation) w3wp.exe -> cmd/powershell/cscript/wscript child # ASP.NET web shell chrome.exe running outside \Program Files\Google\Chrome # Chisel masquerade bitsadmin.exe running outside \Windows\System32|SysWOW64 # payload masquerade cloudflared / tunn.exe / revsocks process creation # redundant 443 tunnels rundll32.exe + comsvcs.dll + MiniDump # LSASS dump PSEXESVC.exe created on many hosts from one source # mass deployment PowerShell: Set-MpPreference/DisableRealtimeMonitoring + bulk Stop-Service File write: C:\RECOVERY_SECTION.log # ransom note
# Tool -> disguise -> role tunn.exe reverse-SOCKS proxy (public web dir) revsocks.exe reverse-SOCKS proxy chrome.exe Chisel tunneler (masquerade) cloudflared*.exe Cloudflare Tunnel client (RDP exposure) tokens.exe token impersonation / priv-esc bitsadmin.exe Spirals Rust encryptor (masquerade) # Ransom note: C:\RECOVERY_SECTION.log # Crypto: per-file AES-128, keys wrapped with attacker ECDH P-256 pubkey
# Verify before / after deployment [ ] IIS patched; web-production dirs reviewed for rogue .aspx/.ashx [ ] LSASS RunAsPPL enabled (RunAsPPL=1); Credential Guard where possible [ ] Defender Tamper Protection ON; ASR: block credential steal from LSASS [ ] ASR: block process creation from PSExec/WMI commands [ ] Egress 443 to unsanctioned tunnels (cloudflared) blocked/monitored [ ] Offline/immutable backups verified restorable [ ] Block staging IP 185.141.216.194 at egress
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| Telemetry ready | ProcessRollup2, NetworkConnectIP4, and file-write events flow from IIS/servers | Recent events from web + server hosts in the last 24h |
| Benign baseline | Run Q2/Q5/Q6/Q8 over 7-30 days; catalog benign hits | Exclusions written for known Chrome paths, admin PsExec, maintenance windows |
| Positive test | In a lab, run bitsadmin.exe from a temp dir and rundll32 comsvcs MiniDump | Q6 and Q7 fire |
| Promotion | Q7 + tunneler + comsvcs patterns promoted to prevention | IOA live on server policy; FP rate acceptable |
Hardening — Tiered
- Enable Defender Tamper Protection and confirm it is enforced by policy, not locally toggleable (M1042). Blocks the base64 Set-MpPreference disable step.
- Enable LSASS protection:
RunAsPPL=1and, where supported, Credential Guard (M1043). Defeats the comsvcs MiniDump path. - ASR rules (Defender): block credential stealing from LSASS, block process creations originating from PsExec/WMI commands, block executable content unless it meets prevalence/trust (M1040).
- Block the staging IP 185.141.216.194 at egress and alert on any historical hits.
- Review internet-facing IIS web-production directories for unauthorized
.aspx/.ashxfiles; patch the server (M1051).
- Constrain the IIS app-pool identity to least privilege; deny it interactive-logon and outbound where feasible (CIS IIS Benchmark; M1026).
- Restrict PsExec/SMB admin: tiered administration, block SMB (445) between workstations, enforce SMB signing (M1026, M1037).
- Egress control for tunnels: allowlist outbound 443 destinations for servers; alert on
cloudflared/Chisel-style long-lived TLS tunnels (M1037). - Immutable/offline backups for backup, DB and virtualization infra; test restores (M1053).
- Segment internet-facing IIS into a DMZ with no direct path to domain admin scope; remove domain-joined web servers from Tier-0 reach (M1030).
- Deploy a WAF / RASP in front of public web apps to catch web-shell upload and interaction (M1050).
- Domain-admin hygiene: eliminate DA logons to member servers; adopt just-in-time/PAW access (M1026, M1015).
Deployable Playbooks
1. Enable LSASS protection (RunAsPPL)
# Requires reboot. Deploy via GPO/registry to servers + workstations. reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f # Verify: reg query "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL
2. Enforce Defender Tamper Protection + key ASR rules (PowerShell)
# Tamper Protection is managed via Intune/MDE policy; confirm state locally: Get-MpComputerStatus | Select-Object IsTamperProtected, RealTimeProtectionEnabled # ASR: block credential stealing from LSASS Add-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2 -AttackSurfaceReductionRules_Actions Enabled # ASR: block process creations from PsExec and WMI commands Add-MpPreference -AttackSurfaceReductionRules_Ids d1e49aac-8f56-4280-b9ba-993a6d77406c -AttackSurfaceReductionRules_Actions Enabled
3. Block the staging IP at the host firewall
New-NetFirewallRule -DisplayName "Block Spirals staging 185.141.216.194" ` -Direction Outbound -RemoteAddress 185.141.216.194 -Action Block -Profile Any
4. Hunt rogue web-shell files under IIS roots (PowerShell)
# Flag recently-written handler files in web roots (review each hit).
Get-ChildItem -Path C:\inetpub\wwwroot -Recurse -Include *.aspx,*.ashx,*.asmx -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-14) } |
Select-Object FullName, LastWriteTime, Length | Sort-Object LastWriteTime -Descending
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain any host with an encrypting process, a tunneler, or a note write. Contain the IIS web server first. Sever egress to 185.141.216.194 and to unsanctioned Cloudflare tunnels. | SOC / IR | Falcon host IDs, containment timestamps |
| Eradicate | Disable the compromised domain-admin account and reset it plus krbtgt (twice). Kill and remove tunn.exe/revsocks/chrome.exe(Chisel)/cloudflared, tokens.exe, bitsadmin.exe payload. Remove the ASP.NET web shell and any local accounts the actor created. | IR / AD team | Process trees, file hashes, SAM/local-account diff |
| Recover | Rebuild the IIS server from known-good. Restore encrypted systems from immutable/offline backups only after eradication is confirmed. Re-enable Defender + services from clean policy. | Infra / Backup | Restore logs, integrity checks |
| Post-incident | Rotate all credentials exposed to SAM/LSASS dumps. Review SYSVOL and \Windows\Tasks for residual staging. Hunt other IIS servers for the same web-shell pattern. | IR / IAM | Credential-rotation record, hunt results |
Assume every credential on any host where LSASS or SAM was dumped is compromised, including the domain-admin account used for lateral movement. Password rotation without krbtgt reset leaves Kerberos persistence intact.
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 / T1505.003 | IIS web shell | Q1 | Yes | Good |
| T1572 | Tunnelers (Chisel/revsocks/cloudflared) | Q2, Q3, Q4 | Yes | Good |
| T1105 | Staging download | Q10 | — | Good |
| T1003.001 | LSASS dump | Q7 | Yes | Good |
| T1003.002 | SAM hive dump | — | ASR | Partial |
| T1569.002 / T1021.002 | PsExec-as-SYSTEM | Q5 | Yes | Good |
| T1047 | WMI lateral movement | — | — | Gap |
| T1036.005 | Masquerade (chrome/bitsadmin) | Q2, Q6 | Yes | Good |
| T1562.001 / T1489 | Defender disable + service stop | Q8 | — | Partial |
| T1548.002 / T1134 | UAC bypass / token impersonation | — | Hash | Partial |
| T1486 | Encryption + ransom note | Q9 | — | Good |
Known gaps: WMI-based lateral movement (T1047) has no dedicated CQL here and should be covered by a broad WMI/wmic/WmiPrvSE.exe child-process hunt in your tenant. SAM-hive dump and UAC bypass are covered indirectly (ASR / hash) rather than by a purpose-built query. Validation gates in Section 11 must pass before promoting any FP-medium query to prevention.
Hunt Summary Ticket
TITLE: Spirals ransomware — IIS web shell to network encryption in <24h
SEVERITY: Critical (active ransomware, double extortion)
SCOPE: Internet-facing IIS, Windows servers/endpoints, AD, egress 443
HYPOTHESIS: A web-shell foothold on IIS leads to redundant tunneling, LSASS/SAM
theft, PsExec-as-SYSTEM deployment of a Rust encryptor (bitsadmin.exe)
and a system-wide C:\RECOVERY_SECTION.log note.
QUERIES: Q1 web shell · Q2-Q4,Q10 tunnels/staging · Q7 LSASS · Q5 PsExec ·
Q6 payload masquerade · Q8 Defender/service kill · Q9 ransom note
DO FIRST: Run Q1 and Q7 (highest fidelity, earliest in chain). Then Q4/Q3/Q2.
FINDINGS: [ fill in on execution ]
GAPS: WMI lateral movement (T1047); SAM-dump and UAC bypass query coverage
ACTIONS: Enable Tamper Protection + RunAsPPL + ASR; block 185.141.216.194;
review IIS web roots; verify immutable backups
OWNER: HuntPack
VERSION: v0.2 · 2026-07-23
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | Symantec / Security.com — Spirals | Primary: timeline, tools, hashes, IP/URLs, crypto, note path | 2026-07-23 |
| T2 | Help Net Security | Chain corroboration; credential access; encryption scheme | 2026-07-23 |
| T2 | CyberSecurityNews | Staging IP, note path, timeline, SYSVOL propagation | 2026-07-23 |
| T2 | BleepingComputer | Rust family, PsExec-as-SYSTEM, UAC/RDP, leak deadline | 2026-07-23 |
| T3 | Mallory.ai | Cross-check; single-victim status | 2026-07-23 |
Generated 2026-07-23 · HuntPack v0.1 · Defensive detection and hardening content only.