Ransomware Recovery Inhibition and Encryption
An adversary is inhibiting system recovery by deleting volume shadow copies using standard tools or scripts before performing mass file encryption with rare extensions.
Based on research by Huntress 2026-10-15 10 steps · 4 queries T1486 T1490
Brief
Recovery Inhibition Correlation
In the recent article Microsoft VSS: Still Essential, But Not the Whole Story (https://www.huntress.com/blog/microsoft-vss-limits-and-best-practices), the team explores the limits of volume shadow copies. Building on those insights, we developed a hunt that focuses on the moment an adversary turns a system's recovery tools against it. An adversary inhibits system recovery by deleting volume shadow copies using standard tools or scripts before performing mass file encryption with rare extensions. This strategy ensures that even if the encryption is detected, the victim cannot simply roll back to a previous state. While VSS is a standard feature of Windows, its fragility makes it a primary target during the impact phase of an intrusion. Detecting the deletion of a shadow copy in isolation often yields too much noise, as backup agents and administrators perform these actions regularly. This hunt solves that by looking for the sequence of inhibition followed by impact.
How the Hunt Flows
The hunt starts by scoping the environment for process activity. The initial query identifies hosts where the adversary is actively dismantling recovery options by looking for specific command-line arguments in vssadmin.exe, wmic.exe, and PowerShell that indicate a delete shadow operation. Once the hunt identifies a potential lead, it fans out to gather corroborating evidence. The second phase monitors for script-based deletions using WMI calls like Win32_ShadowCopy. This catches attackers who avoid the command line by calling the WMI methods directly through script blocks. Simultaneously, the hunt checks for the creation of common ransom notes such as readme.txt or decrypt.txt and calculates a baseline of file rename activity. The final phase of the hunt uses an agent to evaluate the combined evidence. It specifically looks for a high volume of file renames to extensions that are rare across the rest of the fleet. The agent evaluates if the deletion and encryption processes share the same parent or user context, which is a high-confidence indicator of a compromise. It also checks for the prevalence of these actions across the fleet to ensure that a site-wide backup job isn't misidentified as an attack. By matching the process responsible for VSS deletion with the process performing the renames, the hunt distinguishes a live ransomware event from scheduled maintenance. An analyst reviews the cited evidence to confirm the final verdict before initiating isolation.
Blind Spots
This hunt has two primary blind spots. If an adversary uses a custom binary to call VSS APIs directly without using the CLI or script engines, the initial scoping query will not see the activity. Additionally, some endpoint sensors truncate event logs when they detect high-volume file activity. This can mask the full scale of the encryption, though the presence of rare extensions usually remains visible.
Running the Playbook
You can run this hunt as a hunt.md playbook. It imports directly into Huntbase or any other runtime that supports the hunt.md standard. This allows you to parameterize the lookback period and the list of known ransom notes to fit your environment. Because this is a hunt.md playbook, it remains portable. You can run it manually against a single host if you suspect an ongoing incident, or schedule it as a periodic check across your entire estate. The parameters allow you to add custom ransomware extensions or exclude specific administrative accounts that perform legitimate shadow copy deletions.
Steps
-
Lead: VSS Snapshot Deletion Command
Query · scopingIdentify execution of tools known to delete shadow copies by matching binary names and looking for deletion keywords in the command line.
reads hb_process_activitysqlSELECT device_hostname, process_name, process_cmd_line, user_name, time FROM hb_process_activity WHERE (instr(',' || '{{vss_tools}}' || ',', ',' || LOWER(process_original_file_name) || ',') > 0 OR instr(',' || '{{vss_tools}}' || ',', ',' || LOWER(process_name) || ',') > 0) AND (instr(LOWER(process_cmd_line), 'delete') > 0 AND instr(LOWER(process_cmd_line), 'shadow') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Rows showing specific hosts and processes attempting shadow copy deletion. Silence suggests no obvious recovery inhibition via command line tools.
-
Scripted WMI Shadow Copy Deletion
Query · enrichmentFind programmatic shadow copy deletion in script blocks that might bypass process monitoring.
reads hb_script_activitysqlSELECT device_hostname, script_name, script_content, actor_user_name, time FROM hb_script_activity WHERE (instr(LOWER(script_content), 'win32_shadowcopy') > 0 AND instr(LOWER(script_content), '.delete()') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Script blocks calling the WMI Delete method on shadow objects. Silence proof of absence depends on script block logging coverage.
-
Ransom Note Creation
Query · enrichmentFind creation of files matching a known list of ransom-note names.
reads hb_file_activitysqlSELECT device_hostname, file_name, file_path, process_name, time FROM hb_file_activity WHERE instr(',' || '{{ransom_notes}}' || ',', ',' || LOWER(file_name) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')What a hit looks like. Creation of files like readme.txt or decrypt.txt in multiple directories.
-
Mass Renames to Rare Extensions
Query · baselineStack-count file renames to identify anomalous volume of extensions that are rare across the fleet.
reads hb_file_activitysqlSELECT device_hostname, process_name, actor_user_name AS user_name, LOWER(SUBSTR(file_name, INSTR(file_name, '.') + 1)) AS extension, COUNT(*) AS event_count, MIN(time) AS first_seen FROM hb_file_activity WHERE activity_id = 5 AND file_name LIKE '%.%' AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY device_hostname, process_name, user_name, extension HAVING event_count > 500What a hit looks like. A high volume of renames to a single extension that is not common across the fleet.
-
Evaluate Evidence Triage
Agent triageDetermine if recovery inhibition and file activity patterns indicate a ransomware event on a per-host basis.
-
Route on Verdict
DecisionRoute the workflow based on the agent's finding of malicious encryption activity.
-
Isolate Host
Response actionIsolate the host to stop the encryption process and prevent lateral movement.
-
Analyst Review
Analyst taskProvide manual oversight for suspicious or indeterminate cases.
-
Close Out
Analyst taskFinalize the hunt when no malicious activity is found.
Coverage
Scenario coverage
| Stage | Covered | How, or why not |
|---|---|---|
| VSS Snapshot Deletion T1490 |
Yes | vss-deletion-lead, scripted-shadow-deletion |
| Data Encryption for Impact T1486 |
Yes | ransom-note-creation, mass-encryption-baseline |
Blind spots
- Needs Direct VSS API monitoring via EDR. Adversaries using custom binaries to call VSS APIs directly will not be caught by command-line based queries. It would answer Was the shadow copy deletion performed using direct API calls rather than command-line tools?.
- Needs High-fidelity file modification logging. Mass encryption generates thousands of events; sensor-level truncation can mask the scale of the impact. It would answer Did the endpoint sensor truncate high-volume rename events during the encryption phase?.
Parameters & data
Parameters
| Parameter | Type | Default | What it is |
|---|---|---|---|
lookback_days | number | 14 | Days of history to examine. |
ransom_notes | list[string] | readme.txt, decrypt.txt, restore_files.txt, how_to_decrypt.html | Common filenames for ransom notes. |
scope_hosts | list[host] | — | Optional list of hosts to narrow the investigation. |
vss_tools | list[string] | vssadmin.exe, wmic.exe, powershell.exe, pwsh.exe | Binary names of tools used to delete shadow copies. |
Telemetry
| Source | Category | Telemetry |
|---|---|---|
| Endpoint telemetry (hb_ surfaces) | endpoint | endpoint |
Source
---
analysis: This hunt correlates recovery inhibition across process and script surfaces
with fleet-wide file activity baselining, providing the context needed to distinguish
a live intrusion from administrative backup maintenance.
blind_spots:
- id: no-vss-api-telemetry
question: Was the shadow copy deletion performed using direct API calls rather than
command-line tools?
requires: Direct VSS API monitoring via EDR
risk: Adversaries using custom binaries to call VSS APIs directly will not be caught
by command-line based queries.
stage: inhibit-recovery-vss-deletion
- id: event-truncation
question: Did the endpoint sensor truncate high-volume rename events during the
encryption phase?
requires: High-fidelity file modification logging
risk: Mass encryption generates thousands of events; sensor-level truncation can
mask the scale of the impact.
stage: impact-data-encryption
coverage:
- stage: inhibit-recovery-vss-deletion
status: covered
steps:
- vss-deletion-lead
- scripted-shadow-deletion
- stage: impact-data-encryption
status: covered
steps:
- ransom-note-creation
- mass-encryption-baseline
guardrails:
claims: no_unsupported
evidence: citation_required
missing_data: not_benign
telemetry: untrusted
hunt:
applicability: campaign-specific
handoff: keep-as-periodic-hunt
justification: Ransomware recovery depends on VSS integrity; identifying its disruption
confirms a critical disruption of disaster recovery processes.
methodology: model-assisted
trigger: intel-report
hypothesis: An adversary is inhibiting system recovery by deleting volume shadow copies
using standard tools or scripts before performing mass file encryption with rare
extensions.
labels:
- hunt
- attack.t1486
- attack.t1490
- impact
name: Ransomware Recovery Inhibition and Encryption
parameters:
lookback_days:
default: '14'
description: Days of history to examine.
type: number
ransom_notes:
default:
- readme.txt
- decrypt.txt
- restore_files.txt
- how_to_decrypt.html
description: Common filenames for ransom notes.
from:
kind: manual
observed: '2026-10-14'
ref: common-ransom-notes
type: list[string]
scope_hosts:
default: []
description: Optional list of hosts to narrow the investigation.
type: list[host]
vss_tools:
default:
- vssadmin.exe
- wmic.exe
- powershell.exe
- pwsh.exe
description: Binary names of tools used to delete shadow copies.
from:
kind: article
observed: '2026-10-14'
ref: huntress-vss
type: list[string]
provenance:
authors:
- name: Huntbase hunt generation
org: huntbase.io
generated:
by: huntbase-hunt-generation
from: https://www.huntress.com/blog/microsoft-vss-limits-and-best-practices
gates:
- dry-run
- lint
model: hb_google/gemini-3-flash-preview
rationale: Focus on file servers and database servers where VSS snapshots are critical
for recovery. Start with any host showing vssadmin or wmic deletion activity.
references:
- name: 'Microsoft VSS: Still Essential, But Not the Whole Story'
url: https://www.huntress.com/blog/microsoft-vss-limits-and-best-practices
related:
- hunt: ransomware-exfiltration-detection
reason: Data exfiltration typically precedes encryption and requires network/cloud
telemetry analysis.
relation: out-of-scope-alternative
scenario:
stages:
- name: VSS Snapshot Deletion
observables:
- vssadmin.exe delete shadows /all /quiet
- wmic.exe shadowcopy delete
- powershell.exe -Command Get-WmiObject Win32_Shadowcopy | ForEach-Object { $_.Delete()
}
- Execution of vssadmin.exe with administrative privileges
slug: inhibit-recovery-vss-deletion
tactic: impact
techniques:
- T1490
- name: Data Encryption for Impact
observables:
- High volume of file modification events
- Creation of ransom notes (e.g., .txt, .html files in multiple directories)
- Renaming of files to include ransomware-specific extensions
- Modification of files on SQL Server or Active Directory database volumes
slug: impact-data-encryption
tactic: impact
techniques:
- T1486
summary: Ransomware operators frequently target the Windows Volume Shadow Copy Service
(VSS) to delete local snapshots before or during the encryption process. By inhibiting
system recovery, adversaries ensure that victims cannot use 'Previous Versions'
or other local restore points to recover data, thereby increasing the likelihood
of ransom payment.
severity: medium
targets:
analyst:
name: Tier-2 analyst
role: analyst
endpoint:
category: endpoint
name: Endpoint telemetry (hb_ surfaces)
telemetry:
- endpoint
hunter:
agent: true
name: Hunt agent
tlp: clear
type: investigation
---
# Ransomware Recovery Inhibition and Encryption
This hunt identifies the destructive impact phase of a ransomware intrusion by looking for recovery inhibition and data encryption. It lead-scopes the estate for the use of VSS-manipulation tools, then fans out to corroborate this with scripted shadow copy deletion, the creation of known ransom-note filenames, and fleet-wide anomalous file rename activity. An agent evaluates the combined evidence to distinguish between legitimate administrative maintenance and a live ransomware event.
## vss-deletion-lead
<!-- Lead: VSS Snapshot Deletion Command -->
Identify execution of tools known to delete shadow copies by matching binary names and looking for deletion keywords in the command line.
```sqlite target=endpoint role=scoping params=(lookback_days=lookback_days, vss_tools=vss_tools, scope_hosts=scope_hosts)
~~~yaml
expected: Rows showing specific hosts and processes attempting shadow copy deletion.
Silence suggests no obvious recovery inhibition via command line tools.
reads:
- device_hostname
- process_name
- process_cmd_line
- process_original_file_name
- user_name
- time
silence: not_evidence_of_absence
source: hb_process_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, process_name, process_cmd_line, user_name, time FROM hb_process_activity WHERE (instr(',' || '{{vss_tools}}' || ',', ',' || LOWER(process_original_file_name) || ',') > 0 OR instr(',' || '{{vss_tools}}' || ',', ',' || LOWER(process_name) || ',') > 0) AND (instr(LOWER(process_cmd_line), 'delete') > 0 AND instr(LOWER(process_cmd_line), 'shadow') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## corroborate-evidence
<!-- Corroborate Recovery Inhibition and Impact -->
parallel:
- → scripted-shadow-deletion
- → ransom-note-creation
- → mass-encryption-baseline
join: → agent-triage
## scripted-shadow-deletion
<!-- Scripted WMI Shadow Copy Deletion -->
Find programmatic shadow copy deletion in script blocks that might bypass process monitoring.
```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: Script blocks calling the WMI Delete method on shadow objects. Silence proof
of absence depends on script block logging coverage.
reads:
- device_hostname
- script_name
- script_content
- actor_user_name
- time
silence: not_evidence_of_absence
source: hb_script_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, script_name, script_content, actor_user_name, time FROM hb_script_activity WHERE (instr(LOWER(script_content), 'win32_shadowcopy') > 0 AND instr(LOWER(script_content), '.delete()') > 0) AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## ransom-note-creation
<!-- Ransom Note Creation -->
Find creation of files matching a known list of ransom-note names.
```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts, ransom_notes=ransom_notes)
~~~yaml
expected: Creation of files like readme.txt or decrypt.txt in multiple directories.
reads:
- device_hostname
- file_name
- file_path
- process_name
- time
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, file_name, file_path, process_name, time FROM hb_file_activity WHERE instr(',' || '{{ransom_notes}}' || ',', ',' || LOWER(file_name) || ',') > 0 AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```
## mass-encryption-baseline
<!-- Mass Renames to Rare Extensions -->
Stack-count file renames to identify anomalous volume of extensions that are rare across the fleet.
```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
baseline:
compare: new_this_window
window: '{{lookback_days}}d'
expected: A high volume of renames to a single extension that is not common across
the fleet.
prevalence:
by: device_hostname
key:
- extension
rare_below: 3
reads:
- device_hostname
- file_name
- activity_id
- time
- process_name
- actor_user_name
silence: not_evidence_of_absence
source: hb_file_activity
verified: dry-run
verified_at: '2026-10-15'
~~~
SELECT device_hostname, process_name, actor_user_name AS user_name, LOWER(SUBSTR(file_name, INSTR(file_name, '.') + 1)) AS extension, COUNT(*) AS event_count, MIN(time) AS first_seen FROM hb_file_activity WHERE activity_id = 5 AND file_name LIKE '%.%' AND time >= datetime('now', '-{{lookback_days}} days') AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) GROUP BY device_hostname, process_name, user_name, extension HAVING event_count > 500
```
## agent-triage
<!-- Evaluate Evidence Triage -->
```agent target=hunter
cite: required
context:
- vss-deletion-lead
- scripted-shadow-deletion
- ransom-note-creation
- mass-encryption-baseline
max_iterations: 6
objective: Identify hosts where shadow deletion was followed by ransom note creation
or mass file renames with rare extensions, specifically examining if the same process
is responsible for both deletion and encryption.
success_criteria: A verdict per host citing specific rows and indicators.
tools:
- endpoint
```
## route-on-verdict
<!-- Route on Verdict -->
if~: "the agent-triage verdict is malicious for at least one host showing both recovery inhibition and impact indicators" (confidence: high, judge=hunter)
then: → isolate-host
indeterminate: → analyst-review
unavailable: → analyst-review (blind_spot: no-vss-api-telemetry)
else: → close-out
## isolate-host
<!-- Isolate Host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host from the network immediately and initiate incident response protocols for confirmed ransomware.
```
→ analyst-review
## analyst-review
<!-- Analyst Review -->
```manual target=analyst
Review the cited evidence. Confirm if the 'rare extensions' are known encryption markers and if the process performing them is unauthorized. Check if deletion was part of scheduled backup maintenance.
```
→ end
## close-out
<!-- Close Out -->
```manual target=analyst
Document absence of malicious recovery inhibition. Record benign administrative VSS manipulation for tuning.
```
→ end
Run it
Take this hunt into your environment.
Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.
Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.