T1680

Local Storage Discovery

Discovery Last updated:

This detection identifies adversary attempts to enumerate local drives, disks, volumes, and storage attributes across Windows, Linux, macOS, and ESXi platforms. Attackers use tools such as wmic logicaldisk, Get-PSDrive, lsblk, fdisk, diskutil, esxcli, and cloud CLI commands to gather disk size, free space, volume serial numbers, and partition layouts. Storage discovery is a critical precursor to ransomware encryption (to identify all encryptable volumes), lateral movement targeting network shares, and direct volume access attacks. Groups like TeamTNT and malware families including Cuba ransomware and ZeroCleare have demonstrated this behavior in production incidents.

What is T1680 Local Storage Discovery?

Local Storage Discovery (T1680) maps to the Discovery tactic — the adversary is trying to figure out your environment in MITRE ATT&CK.

This page provides production-ready detection logic for Local Storage Discovery, covering the data sources and telemetry it touches: Microsoft Defender for Endpoint. The queries below are rated medium severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.

MITRE ATT&CK

Tactic
Discovery
Technique
T1680 Local Storage Discovery
Canonical reference
https://attack.mitre.org/techniques/T1680/
Microsoft Sentinel / Defender
kusto
let StorageDiscoveryPatterns = dynamic(["logicaldisk", "diskdrive", "win32_volume", "win32_logicaldisk"]);
let PSStorageCmdlets = dynamic(["Get-PSDrive", "Get-Disk", "Get-Volume", "Get-Partition", "Get-PhysicalDisk", "Get-StoragePool"]);
let LinuxStorageCmds = dynamic(["lsblk", "fdisk", "parted", "lshw", "blkid", "lvdisplay", "pvdisplay", "vgdisplay"]);
let CloudStorageCmds = dynamic(["describe-volumes", "describe-instances", "disks list", "disk list"]);
DeviceProcessEvents
| where TimeGenerated > ago(1h)
| where (
    (FileName =~ "wmic.exe" and ProcessCommandLine has_any (StorageDiscoveryPatterns))
    or (FileName =~ "wmic.exe" and ProcessCommandLine has "volume" and ProcessCommandLine has "get")
    or (FileName in~ ("powershell.exe", "pwsh.exe") and ProcessCommandLine has_any (PSStorageCmdlets))
    or (FileName =~ "diskpart.exe" and ProcessCommandLine has_any ("list disk", "list volume", "list partition"))
    or (FileName =~ "fsutil.exe" and ProcessCommandLine has "fsinfo")
    or (FileName =~ "mountvol.exe")
    or (FileName in~ ("lsblk", "fdisk", "parted", "lshw", "blkid", "df") and ProcessCommandLine has_any (LinuxStorageCmds))
    or (FileName =~ "diskutil" and (ProcessCommandLine has "list" or ProcessCommandLine has "info"))
    or (FileName =~ "system_profiler" and ProcessCommandLine has "SPStorageDataType")
    or (FileName =~ "esxcli" and ProcessCommandLine has "storage")
    or (FileName in~ ("aws", "gcloud", "az") and ProcessCommandLine has_any (CloudStorageCmds))
)
| where InitiatingProcessFileName !in~ ("msiexec.exe", "MsMpEng.exe", "svchost.exe", "services.exe")
| project TimeGenerated, DeviceName, AccountName, AccountDomain,
    FileName, ProcessCommandLine, FolderPath,
    InitiatingProcessFileName, InitiatingProcessCommandLine, InitiatingProcessAccountName,
    ProcessId, InitiatingProcessId
| extend RiskIndicator = case(
    ProcessCommandLine has "wmic" and ProcessCommandLine has "logicaldisk", "WMIC LogicalDisk Enumeration",
    ProcessCommandLine has_any (PSStorageCmdlets), "PowerShell Storage Cmdlet",
    ProcessCommandLine has "diskpart", "DiskPart Storage Enumeration",
    ProcessCommandLine has "esxcli" and ProcessCommandLine has "storage", "ESXi Storage Enumeration",
    ProcessCommandLine has_any (CloudStorageCmds), "Cloud Volume Enumeration",
    "Generic Storage Discovery"
)
| order by TimeGenerated desc

Detects process execution patterns consistent with local storage enumeration across Windows (wmic logicaldisk, PowerShell Get-PSDrive/Get-Disk, diskpart, fsutil), Linux (lsblk, fdisk, parted, lshw), macOS (diskutil, system_profiler SPStorageDataType), ESXi (esxcli storage), and cloud CLI (aws describe-volumes, gcloud compute disks list, az disk list). Filters common system processes that legitimately invoke these utilities to reduce noise.

medium severity medium confidence

Data Sources

Microsoft Defender for Endpoint

Required Tables

DeviceProcessEvents

False Positives

  • Backup agents (Veeam, Commvault, Veritas) routinely enumerate disk volumes before backup operations
  • System administration scripts and IT automation tools (Ansible, Chef, Puppet) checking disk capacity for health monitoring
  • Windows disk cleanup utilities and OS maintenance tasks invoking fsutil or wmic for storage information
  • Cloud management platforms and orchestration tools (Terraform, Packer) enumerating volumes during provisioning
  • Storage monitoring agents and SIEM forwarders checking disk free space for alerting thresholds

Sigma rule & cross-platform mapping

The detection logic for Local Storage Discovery (T1680) above is provided in a vendor-neutral form so you can deploy it on any SIEM. The same logic is shipped here as native KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the following logsource:

logsource:
  category: process_creation
  product: windows

Browse the community-maintained Sigma rules for this technique:


Testing Methodology

Validate this detection against 6 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.

  1. Test 1Windows WMIC LogicalDisk Enumeration

    Expected signal: DeviceProcessEvents: FileName=wmic.exe, ProcessCommandLine contains 'logicaldisk get'. Security Event 4688 if process creation auditing enabled. Sysmon EventCode=1 with full command line.

  2. Test 2PowerShell Storage Enumeration via Get-Disk and Get-Volume

    Expected signal: DeviceProcessEvents: FileName=powershell.exe, ProcessCommandLine contains 'Get-Disk' and 'Get-Volume'. PowerShell Script Block Logging (Event 4104) will record the script block if enabled. Sysmon EventCode=1.

  3. Test 3DiskPart Volume and Disk Listing

    Expected signal: DeviceProcessEvents: FileName=diskpart.exe with /s flag and temp file path. DeviceFileEvents: temp script file creation in %TEMP%. Security Event 4688 or Sysmon EventCode=1.

  4. Test 4Linux Block Device Enumeration

    Expected signal: Syslog or auditd EXECVE records for lsblk, fdisk, df, blkid. auditd: type=EXECVE msg containing lsblk and fdisk arguments. bash history update.

  5. Test 5ESXi Storage Enumeration via esxcli

    Expected signal: ESXi shell.log (/var/log/shell.log): command execution entries for esxcli storage filesystem list and vim-cmd. Syslog entries if syslog forwarding is configured to a SIEM.

  6. Test 6AWS Cloud Volume Discovery

    Expected signal: AWS CloudTrail: DescribeVolumes and DescribeInstances API calls with sourceIPAddress, userIdentity.arn, and eventTime. CloudTrail log should appear in S3 bucket within 15 minutes.


Response Playbook

Triage

  1. Step 1: Identify the process tree — check InitiatingProcessFileName and InitiatingProcessCommandLine to determine what spawned the storage discovery command. A browser, document viewer, or Office app as parent is highly suspicious; a backup agent or management tool is expected.
  2. Step 2: Correlate with user context — verify whether AccountName has a history of running storage commands on this device. First-time execution of wmic logicaldisk or Get-PSDrive by a standard user account warrants escalation.
  3. Step 3: Check temporal clustering — query DeviceProcessEvents ±5 minutes around the alert time for co-execution of other reconnaissance commands (net view, ipconfig, whoami, nltest). Storage discovery combined with network and user discovery is a strong ransomware pre-cursor signal.
  4. Step 4: Examine the full command line for output redirection (> C:\ProgramData\, > %TEMP%\) which suggests the adversary is saving drive inventory for exfiltration.
  5. Step 5: For cloud environments, check if the cloud CLI commands were run from an unexpected IP, region, or using newly created credentials by cross-referencing SigninLogs or CloudTrail.
  6. Step 6: Check if this device has had other recent alerts — search for T1046 (Network Scanning), T1057 (Process Discovery), T1083 (File and Directory Discovery) in the past 24 hours for the same host/user.

Containment

  1. If ransomware pre-cursor is suspected: immediately isolate the endpoint via Defender for Endpoint's device isolation feature (Actions > Isolate Device) before any encryption can begin.
  2. Suspend or disable the user account involved if credential compromise is suspected, particularly if the account is a service account or has domain admin privileges.
  3. For ESXi alerts: place the hypervisor into lockdown mode immediately and disable SSH access while investigation proceeds — ransomware groups targeting ESXi (e.g., Cheerscrypt) move quickly after storage enumeration.
  4. For cloud (IaaS) alerts: revoke the IAM credentials or service principal that ran describe-volumes / disk list, rotate the access key, and enable CloudTrail/Azure Monitor enhanced logging on the affected subscription.
  5. Preserve volatile state before isolation: capture running process list, network connections (netstat -anob), and memory if timeline allows using Defender for Endpoint Live Response.

Evidence Collection

  1. Export the full DeviceProcessEvents timeline for the affected host for the 2 hours preceding and following the alert for analyst review.
  2. Collect Windows prefetch files (C:\Windows\Prefetch\WMIC.EXE-*.pf, POWERSHELL.EXE-*.pf, DISKPART.EXE-*.pf) to establish first-execution timestamp for these utilities.
  3. Pull ShimCache / AppCompatCache registry entries (HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache) for evidence of first execution.
  4. Collect scheduled tasks (schtasks /query /fo LIST /v) and services (sc query) to check for persistence mechanisms installed alongside the discovery activity.
  5. On Linux systems: capture auditd logs (/var/log/audit/audit.log), bash history files (~/.bash_history, /root/.bash_history), and /proc/<pid>/cmdline snapshots for any lsblk/fdisk/parted invocations.
  6. For ESXi: capture /var/log/shell.log, /var/log/esxupdate.log, and esxcli command history from the /tmp directory.

Escalation Criteria

  • ! Escalate immediately to P1 if storage discovery is followed within 5 minutes by file write events to multiple directories, volume shadow copy deletion (vssadmin delete shadows), or stop-service commands — these are hallmarks of an active ransomware deployment.
  • ! Escalate to P1 if the activity originates from a service account, a domain controller, or a privileged workstation with broad network access.
  • ! Escalate to P1 if storage enumeration is detected across 3 or more hosts in the same subnet within a 30-minute window — this indicates active lateral spread.
  • ! Escalate to P2 if cloud storage enumeration (describe-volumes, az disk list) is performed from an IP address outside known corporate egress ranges or from a region where the organization has no presence.
  • ! Escalate to P2 if esxcli storage commands are detected from a VM guest process rather than the hypervisor management plane, suggesting a VM escape / breakout scenario.

Investigation Guide

Forensic Artifacts

  • > Windows Prefetch: C:\Windows\Prefetch\WMIC.EXE-*.pf, DISKPART.EXE-*.pf, POWERSHELL.EXE-*.pf — timestamps indicate first and last execution
  • > AmCache / ShimCache: Records application execution including wmic.exe, diskpart.exe, fsutil.exe with timestamps
  • > Windows Event Log: Security Event 4688 (process creation with command line auditing enabled) for wmic, diskpart, fsutil invocations
  • > PowerShell transcript logs: C:\Users\<user>\Documents\PowerShell\Transcripts\ if transcript logging is enabled — captures Get-PSDrive, Get-Disk output
  • > Sysmon Event ID 1: Process creation with full command line, parent process, and user context
  • > Linux auditd: /var/log/audit/audit.log with EXECVE records for lsblk, fdisk, parted, df — grep for 'comm=\"lsblk\"' or 'comm=\"fdisk\"'
  • > Linux bash history: ~/.bash_history, /root/.bash_history — may contain lsblk, fdisk -l, parted -l, lshw -class disk invocations
  • > ESXi: /var/log/shell.log — records all esxcli commands executed via SSH or local shell with timestamps
  • > Cloud provider audit logs: AWS CloudTrail DescribeVolumes API calls, Azure Activity Log for disk list operations, GCP Cloud Audit Logs for compute.disks.list

Tuning Guidance

Primary tuning levers: (1) Exclude known backup agent service accounts by adding 'where AccountName !in ("svc-veeam", "svc-backup", "svc-commvault")' — enumerate all backup service accounts in your environment and allowlist them. (2) Exclude management hosts by adding a DeviceName allowlist for backup servers, monitoring servers, and IT admin workstations that legitimately perform storage inventory. (3) For PowerShell storage cmdlets, consider requiring at least 2 different storage cmdlets within the same session before alerting, to reduce noise from single Get-PSDrive invocations in scripts. (4) For cloud queries, narrow scope to specific high-value subscriptions or AWS accounts rather than running org-wide to reduce volume. (5) Add an InitiatingProcessAccountType filter to focus on 'Standard' users rather than 'Administrator' for Windows hosts where admin use of wmic is expected. (6) Consider tuning severity to 'high' when the parent process is an Office application, browser, or document reader, as these are never expected parents for storage discovery commands.


Hunting Queries

Hunts for burst storage discovery activity — 3 or more storage enumeration commands executed within a 10-minute window by the same user/host, which is anomalous and indicative of automated ransomware reconnaissance.

Hunting — KQL
kql
// Hunt: Burst storage discovery — multiple storage commands in short time window
DeviceProcessEvents
| where TimeGenerated > ago(24h)
| where FileName in~ ("wmic.exe", "diskpart.exe", "fsutil.exe", "mountvol.exe") 
    or (FileName in~ ("powershell.exe", "pwsh.exe") and ProcessCommandLine has_any ("Get-PSDrive", "Get-Disk", "Get-Volume", "Get-Partition"))
| summarize CommandCount = count(), Commands = make_set(ProcessCommandLine), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated) 
    by DeviceName, AccountName, bin(TimeGenerated, 10m)
| where CommandCount >= 3
| extend TimeWindowMinutes = datetime_diff('minute', LastSeen, FirstSeen)
| project FirstSeen, DeviceName, AccountName, CommandCount, TimeWindowMinutes, Commands
| order by CommandCount desc
Hunting — SPL
spl
index=* sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
| eval lower_img=lower(Image)
| where match(lower_img, "wmic\.exe|diskpart\.exe|fsutil\.exe|mountvol\.exe") OR (match(lower_img, "powershell") AND match(lower(CommandLine), "get-psdrive|get-disk|get-volume|get-partition"))
| bucket _time span=10m
| stats count as cmd_count values(CommandLine) as commands by _time, host, User
| where cmd_count >= 3
| sort - cmd_count
| table _time, host, User, cmd_count, commands

Hunts for storage discovery invoked indirectly through scripting interpreters (WScript, CScript, MSHTA) or LOLBins (Regsvr32, Rundll32), which suggests malware using script-based loaders rather than direct command execution — a TTP used by Cuba ransomware and SLOTHFULMEDIA.

Hunting — KQL
kql
// Hunt: Storage discovery via scripting engines (VBScript, JScript, WMI subscription)
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName in~ ("wscript.exe", "cscript.exe", "mshta.exe", "regsvr32.exe", "rundll32.exe", "wmiprvse.exe")
    and FileName in~ ("wmic.exe", "diskpart.exe", "powershell.exe", "pwsh.exe")
    and ProcessCommandLine has_any ("logicaldisk", "diskdrive", "Get-PSDrive", "Get-Disk", "Get-Volume", "list disk", "list volume")
| project TimeGenerated, DeviceName, AccountName,
    FileName, ProcessCommandLine,
    InitiatingProcessFileName, InitiatingProcessCommandLine,
    InitiatingProcessParentFileName
| order by TimeGenerated desc
Hunting — SPL
spl
index=* sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1
| eval lower_parent=lower(ParentImage), lower_img=lower(Image), lower_cmd=lower(CommandLine)
| where match(lower_parent, "wscript\.exe|cscript\.exe|mshta\.exe|regsvr32\.exe|rundll32\.exe|wmiprvse\.exe")
| where match(lower_img, "wmic\.exe|diskpart\.exe|powershell\.exe")
| where match(lower_cmd, "logicaldisk|diskdrive|get-psdrive|get-disk|get-volume|list disk|list volume")
| table _time, host, User, ParentImage, Image, CommandLine
| sort - _time

Hunts for ESXi-specific storage enumeration via esxcli and vim-cmd, which are commonly abused by ransomware groups targeting VMware hypervisors (Cheerscrypt, BlackCat/ALPHV ESXi variant) to enumerate datastores and VMDK files before encryption.

Hunting — KQL
kql
// Hunt: ESXi storage enumeration via esxcli
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where FileName =~ "esxcli" 
    or (ProcessCommandLine has "esxcli" and ProcessCommandLine has_any ("storage", "core", "volume", "adapter", "device", "vmfs", "nfs", "filesystem"))
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
| order by TimeGenerated desc
union
(
    // Also catch vim-cmd storage commands
    DeviceProcessEvents
    | where TimeGenerated > ago(7d)
    | where FileName =~ "vim-cmd" and ProcessCommandLine has_any ("hostsvc/datastore", "hostsvc/storage")
    | project TimeGenerated, DeviceName, AccountName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine
)
Hunting — SPL
spl
index=* (sourcetype=syslog OR sourcetype=linux_secure)
| eval lower_msg=lower(_raw)
| where (like(lower_msg, "%esxcli%storage%") OR like(lower_msg, "%esxcli%core%device%") OR like(lower_msg, "%esxcli%storage%filesystem%") OR like(lower_msg, "%vim-cmd%hostsvc/datastore%") OR like(lower_msg, "%vim-cmd%hostsvc/storage%"))
| rex field=_raw "user=(?<user>\S+)"
| rex field=_raw "cmd=(?<cmd>[^\n]+)"
| stats count values(_raw) as raw_events by host, user
| sort - count
| table host, user, count, raw_events

Hunts for cloud storage enumeration (Azure disk list, AWS DescribeVolumes) originating from non-RFC1918 IP addresses outside expected corporate egress ranges, which may indicate compromised cloud credentials being used by a remote attacker to map target cloud storage before exfiltration or destruction.

Hunting — KQL
kql
// Hunt: Cloud storage enumeration from anomalous source IPs
AuditLogs
| where TimeGenerated > ago(24h)
| where OperationName has_any ("Microsoft.Compute/disks/read", "Microsoft.Storage/storageAccounts/listKeys", "List Disks")
| extend CallerIPAddress = tostring(InitiatedBy.user.ipAddress)
| where CallerIPAddress !startswith "10." and CallerIPAddress !startswith "172.16." and CallerIPAddress !startswith "192.168."
| project TimeGenerated, OperationName, CallerIPAddress, 
    InitiatedByUser = tostring(InitiatedBy.user.userPrincipalName),
    Result, ResourceId, CorrelationId
| join kind=leftouter (
    SigninLogs
    | where TimeGenerated > ago(24h)
    | project UserPrincipalName, IPAddress, Location, RiskLevelDuringSignIn
) on $left.InitiatedByUser == $right.UserPrincipalName
| order by TimeGenerated desc
Hunting — SPL
spl
index=* sourcetype=aws:cloudtrail eventName=DescribeVolumes OR eventName=DescribeInstances OR eventName=ListDisks
| iplocation sourceIPAddress
| eval is_private=if(match(sourceIPAddress, "^10\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^192\.168\."), "yes", "no")
| where is_private="no"
| stats count values(eventName) as events values(Country) as source_countries by sourceIPAddress, userIdentity.arn, awsRegion
| sort - count
| table sourceIPAddress, userIdentity.arn, awsRegion, events, source_countries, count

Atomic Red Team Tests

Test 1 Windows WMIC LogicalDisk Enumeration
windows

Simulates adversary use of wmic to enumerate all logical disk drives and their attributes including size, free space, and drive type — a technique used by Cuba ransomware and other threats prior to encryption.

Command

powershell
wmic logicaldisk get caption,description,drivetype,filesystem,freespace,size,volumename,volumeserialnumber

Cleanup

powershell
No cleanup required — read-only operation

Expected Telemetry

DeviceProcessEvents: FileName=wmic.exe, ProcessCommandLine contains 'logicaldisk get'. Security Event 4688 if process creation auditing enabled. Sysmon EventCode=1 with full command line.

Expected Detection

T1680 Local Storage Discovery — WMIC LogicalDisk Enum alert should fire

Test 2 PowerShell Storage Enumeration via Get-Disk and Get-Volume
windows

Uses PowerShell Storage cmdlets to enumerate physical disks, partitions, and volumes — commonly used by adversaries with script-based loaders to profile the storage environment before ransomware deployment.

Command

powershell
powershell.exe -Command "Get-Disk | Select-Object Number,FriendlyName,OperationalStatus,TotalSize; Get-Volume | Select-Object DriveLetter,FileSystemLabel,FileSystem,SizeRemaining,Size; Get-Partition | Select-Object DiskNumber,PartitionNumber,Size,Type"

Cleanup

powershell
No cleanup required — read-only operation

Expected Telemetry

DeviceProcessEvents: FileName=powershell.exe, ProcessCommandLine contains 'Get-Disk' and 'Get-Volume'. PowerShell Script Block Logging (Event 4104) will record the script block if enabled. Sysmon EventCode=1.

Expected Detection

T1680 Local Storage Discovery — PowerShell Storage Cmdlet alert should fire

Test 3 DiskPart Volume and Disk Listing
windows

Invokes diskpart.exe with automated input to list all disks and volumes without interactive prompts — automated diskpart usage is a red flag as it requires script input piped to the process.

Command

powershell
echo list disk > %TEMP%\disk_enum.txt && echo list volume >> %TEMP%\disk_enum.txt && echo list partition >> %TEMP%\disk_enum.txt && diskpart /s %TEMP%\disk_enum.txt

Cleanup

powershell
del %TEMP%\disk_enum.txt

Expected Telemetry

DeviceProcessEvents: FileName=diskpart.exe with /s flag and temp file path. DeviceFileEvents: temp script file creation in %TEMP%. Security Event 4688 or Sysmon EventCode=1.

Expected Detection

T1680 Local Storage Discovery — DiskPart Enumeration alert should fire

Test 4 Linux Block Device Enumeration
linux

Simulates adversary enumeration of block devices and filesystems on Linux using lsblk, fdisk, and df — technique used by TeamTNT and cryptomining malware to profile storage before data theft or container escape.

Command

bash
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID; fdisk -l 2>/dev/null; df -h --output=source,fstype,size,used,avail,target; blkid

Cleanup

bash
No cleanup required — read-only operation

Expected Telemetry

Syslog or auditd EXECVE records for lsblk, fdisk, df, blkid. auditd: type=EXECVE msg containing lsblk and fdisk arguments. bash history update.

Expected Detection

T1680 Local Storage Discovery — Linux storage enumeration detection should fire if auditd/syslog ingestion is configured

Test 5 ESXi Storage Enumeration via esxcli
linux

Simulates adversary use of esxcli to enumerate datastores and storage adapters on a VMware ESXi host — the first step in ransomware attacks targeting hypervisors to identify VMDK files for encryption.

Command

bash
esxcli storage filesystem list; esxcli storage core device list; esxcli storage nfs list 2>/dev/null; vim-cmd hostsvc/datastore/listsummary 2>/dev/null

Cleanup

bash
No cleanup required — read-only operation

Expected Telemetry

ESXi shell.log (/var/log/shell.log): command execution entries for esxcli storage filesystem list and vim-cmd. Syslog entries if syslog forwarding is configured to a SIEM.

Expected Detection

T1680 Local Storage Discovery — ESXi Storage Enumeration hunt query should surface this activity

Test 6 AWS Cloud Volume Discovery
linux

Uses AWS CLI to enumerate all EBS volumes in a region — simulates an adversary with compromised cloud credentials performing cloud storage reconnaissance to identify high-value data volumes for exfiltration or encryption.

Command

bash
aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,Size:Size,State:State,Type:VolumeType,AZ:AvailabilityZone}' --output table; aws ec2 describe-instances --query 'Reservations[*].Instances[*].{ID:InstanceId,State:State.Name,Volumes:BlockDeviceMappings[*].Ebs.VolumeId}' --output table

Cleanup

bash
No cleanup required — read-only API calls

Expected Telemetry

AWS CloudTrail: DescribeVolumes and DescribeInstances API calls with sourceIPAddress, userIdentity.arn, and eventTime. CloudTrail log should appear in S3 bucket within 15 minutes.

Expected Detection

T1680 Cloud Storage Enumeration hunting query should surface this activity if CloudTrail is ingested into SIEM

Related Detections

Tactic Hub