AvisLoader: Tox P2P Windows Loader
Executive Summary
AvisLoader is a Windows malware loader that Varonis Threat Labs found on an exposed staging server together with a ClickFix lure, supporting tools and an operator web panel. Its command channel runs over Tox, an encrypted peer-to-peer messaging network, so there is no fixed C2 domain or server address to take down. The lure seen with it posed as a DocuSign signing request, hosted on Cloudflare Workers, and told the visitor to paste a command that pulls code from a Cloudflare Quick Tunnel (trycloudflare.com).
The recovered Windows client is a 3.4 MB 64-bit executable that statically links c-toxcore. Alongside it were auto.exe, a helper that references UACMe method 41, and hmn_hook.dll, a library that hooks NtQuerySystemInformation to filter a process name from results. Persistence code targets desktop and taskbar-pinned shortcuts and a VBScript launcher tied to the name VLCAssistant. Varonis stresses that successful elevation, process hiding and file transfers were not confirmed, and no victim counts were reported.
Defensive angle: detect the host behaviour (the pasted command, script hosts and shells touching a tunnel host, shortcut and launcher artifacts, a dllhost-spawned elevated shell) and treat network indicators as weak, because Tox traffic is encrypted and decentralised. The three published hashes ship at detect, not prevent, because they have a single origin.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 (primary) | Varonis Threat Labs blog, Daniel Kelley | Original research: ClickFix lure, c-toxcore client, auto.exe, hmn_hook.dll, shortcut persistence, three SHA-256 hashes, MITRE table. Page shows "Last updated September 23, 2026" | Yes (snapshot 01) |
| 2 | Hackread | Re-reports Varonis; adds the clipboard and Run-dialog advice. No new indicators | Partial (snapshot 03) |
| 2 | Cyber Security News | Re-reports Varonis; reproduces the Varonis IOC table including the shared-domain notes. Not independent of Varonis | Partial (snapshot 04) |
| 2 | SOC Prime | Detection aggregator; lists generic rules (numeric-name executables, trycloudflare DNS, Tox traffic). No new indicators | Partial (snapshot 05) |
| n/a | BleepingComputer | Fetch returned a Cloudflare bot challenge (HTTP 403), so nothing was read or saved. Not cited | No |
Hunt Brief & Attack Chain
Hypotheses (highest fidelity first)
- H1: a host executed or wrote one of the three published artifacts (Q1, Q2). High confidence, low FP.
- H2: a shell or script host references a Cloudflare Quick Tunnel host (Q3, Q4). High to medium.
- H3: the VLCAssistant launcher or a shortcut-style script launch is present (Q6, Q7). High to medium.
- H4: a pasted download one-liner started from explorer or a terminal (Q5). Medium; generic ClickFix shape.
- H5: a COM-surrogate elevation hands off a shell (Q8) or a numeric-named binary runs from a profile folder (Q9). Medium.
- H6: a non-browser process behaves like a Tox peer (Q10, Q11). Weak, analyst-added; enrichment only.
| Step | Behaviour | Telemetry | Hunt angle |
|---|---|---|---|
| 1 Lure | DocuSign-themed page on Cloudflare Workers asks the user to paste a "verification code" | Browser and proxy logs; outside endpoint telemetry | Proxy and DNS hunt for workers.dev lures (section 7) |
| 2 Execution | Pasted command fetches and runs code from a Quick Tunnel; parent is not the browser | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse, name inside AdditionalFields) | Q3, Q4, Q5 |
| 3 Client | 3.4 MB 64-bit Tox client, build path C:\Users\dev\Desktop\c-toxcore | Executable written to disk (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents FileCreated); Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q1, Q2, Q9 |
| 4 Elevation | auto.exe, UACMe method 41 via ICMLuaUtil; not confirmed to succeed | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q2, Q8 |
| 5 Stealth | hmn_hook.dll hooks NtQuerySystemInformation; deployment not confirmed | Executable written to disk (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents FileCreated) (the hook itself is not visible) | Q1, Q2 |
| 6 Persistence | Modified desktop and taskbar-pinned shortcuts, .backup copies, VLCAssistant VBScript launcher | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); shortcut file changes are not covered by a verified event | Q6, Q7; native sweep (section 7) |
| 7 C2 | Tox P2P, no fixed domain; Command Center sends shell tasks and files over Tox | Outbound network connection with owning process (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Q10, Q11 (weak) |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| SHA-256 | 35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc | High | Detect | 78324.exe, AvisLoader Windows client (Varonis) |
| SHA-256 | f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975 | High | Detect | auto.exe, bundled elevation-bypass helper (Varonis) |
| SHA-256 | cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5 | High | Detect | hmn_hook.dll, bundled process-hiding library (Varonis) |
| Filename | hmn_hook.dll | Medium | Hunt | Exports HMN_HideStart, HMN_HideStatus, HMN_HideStop |
| Filename | auto.exe | Low | Hunt | Generic name; confirm by hash |
| Launcher name | VLCAssistant | Medium | Hunt | Persistence-related VBScript launcher name |
| File extension | .backup | Low | Hunt | Shortcut backup extension, meaningful only beside modified shortcuts |
| Build path | C:\Users\dev\Desktop\c-toxcore | Medium | Hunt | String inside the loader; useful for sample triage, not for endpoint telemetry |
| COM CLSID | {3E5FC7F9-9A51-4367-9063-A120244FBEC7} | Medium | Hunt | Referenced by auto.exe for the elevation technique |
| Hooked API | NtQuerySystemInformation | Low | Enrich | Legitimate Windows function; not an indicator on its own |
| Domain | trycloudflare.com | Low | Enrich | Shared legitimate tunnel service; never block or prevent |
| Domain | workers.dev | Low | Enrich | Shared legitimate hosting; investigate in context only |
No C2 IP address or domain was published, which fits the Tox design. Nothing is invented to fill that gap.
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap |
|---|---|---|---|
| Windows workstations (user pastes a command) | Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | High | Clipboard and the lure page are outside endpoint telemetry |
| Name resolution for tunnel hosts | DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse, name inside AdditionalFields) | Medium | Browser lookups cannot always be attributed to a process |
| Executable and DLL drops | Executable written to disk (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents FileCreated) | High | The NtQuerySystemInformation hook happens in memory and is not visible |
| Desktop and taskbar shortcuts | No verified endpoint event is used in this pack | Medium | Shortcut edits are outside the telemetry used here; use the native sweep |
| Peer-to-peer C2 | Outbound network connection with owning process (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | Low | Tox is encrypted and decentralised; only heuristics are possible, and none was published by the sources |
| Web and proxy | Proxy, secure web gateway and DNS filter logs | Medium | Outside endpoint telemetry |
ATT&CK Mapping
| Tactic | Technique | Behaviour | Query or control |
|---|---|---|---|
| Execution | T1204.004 User Execution: Malicious Copy and Paste | ClickFix lure | Q3, Q5; hardening tier 1 |
| Persistence | T1547.009 Shortcut Modification | Desktop and taskbar shortcuts, VLCAssistant launcher | Q6, Q7; native sweep |
| Privilege Escalation / Defense Evasion | T1548.002 Bypass UAC | auto.exe, UACMe method 41 (not confirmed) | Q2, Q8; UAC hardening |
| Defense Evasion | T1014 Rootkit | hmn_hook.dll hooks NtQuerySystemInformation (not confirmed) | Q1, Q2 |
| Command and Control | T1071 Application Layer Protocol | Tox via c-toxcore | Q10, Q11 (weak) |
| Command and Control | T1105 Ingress Tool Transfer | Files over Tox; Quick Tunnel fetch | Q3, Q4 |
| Defense Evasion | T1036 Masquerading (analyst-added) | Numeric executable name, packer-like section names | Q9 |
The first six techniques are the ones in the Varonis MITRE table; T1036 is added by the pack author.
Native Audit-Log Hunts
Read-only checks that work without a Falcon sensor.
Shortcut and backup sweep (PowerShell, read-only)
# Lists desktop and taskbar-pinned shortcuts with their targets, plus any .backup files beside them.
$paths = @("$env:USERPROFILE\Desktop","$env:PUBLIC\Desktop","$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar")
$ws = New-Object -ComObject WScript.Shell
foreach ($p in $paths) { if (Test-Path $p) {
Get-ChildItem $p -Filter *.lnk -ErrorAction SilentlyContinue | ForEach-Object {
$l = $ws.CreateShortcut($_.FullName)
[pscustomobject]@{Shortcut=$_.FullName; Target=$l.TargetPath; Args=$l.Arguments; Modified=$_.LastWriteTime}
}
Get-ChildItem $p -Filter *.backup -ErrorAction SilentlyContinue | Select-Object FullName, LastWriteTime
}}
# Review: targets that are wscript.exe/cscript.exe, a .vbs, or any argument mentioning VLCAssistant.
Other checks
- RunMRU: inspect
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRUon a suspect host; it records commands typed or pasted into the Run dialog. - Process creation auditing (Event ID 4688 with command line) and PowerShell Script Block Logging (4104): search for trycloudflare.com and VLCAssistant.
- Sysmon (if deployed): Event ID 1 (process), 11 (file create for .lnk, .vbs, .backup), 22 (DNS query for trycloudflare.com).
- Proxy, DNS filter and secure web gateway: hunt for workers.dev pages that resemble document-signing requests and for trycloudflare.com requests from non-browser user agents.
- Network: if egress logs exist, look for workstation UDP traffic to many external hosts. Tox is encrypted; do not expect payload visibility.
Hunt Queries: CrowdStrike CQL, SentinelOne PowerQuery and Defender XDR KQL
Use your tenant's own address. SentinelOne does not document a link that pre-fills a query, so each "Copy & open SentinelOne" button copies the query and opens this console: paste it into PowerQuery.
Pick your portal. Microsoft documents a Share link in advanced hunting but not its URL format, so each "Copy & open Defender" button copies the query and opens Advanced hunting: paste it into the editor.
Run each over 7 to 30 days. Q10 and Q11 are analyst-added heuristics, not published indicators. None of these queries has been run against a live tenant.
Looks for: any execution or on-disk write of the three artifacts Varonis published. Hash coverage is brittle: a rebuilt loader will not match.
Known limitations and deployment notes
- PowerQuery: A payload modified in place after an earlier write is seen only if the hash matches at process start.
- PowerQuery assumes: tgt.process.image.sha256 and tgt.file.sha256 are populated on the tenant and hold lowercase hex.
- PowerQuery assumes: File Creation stands in for the CQL's executable-write events; File Modification is not queried.
- KQL – Defender XDR: Files written but never executed are not covered: that needs DeviceFileEvents, a second table.
- KQL – Defender XDR: SHA256 is documented as usually not populated in DeviceProcessEvents; the source publishes no SHA1 to pivot on, so an empty result is not a clean result until the readiness test shows SHA256 is populated.
- KQL – Defender XDR: The query covers 30 days (Advanced Hunting retention); the CQL tab covers the full retention of the Falcon tenant.
- KQL – Defender XDR assumes: SHA256 is populated for the created process on the tenant.
// HUNT: AvisLoader published SHA-256 hashes (78324.exe, auto.exe, hmn_hook.dll) // MITRE: T1204.002, T1548.002, T1014 // CONF: high FP: low COST: low | REQUIRES: process creation and PE-write telemetry with SHA256HashData // FALSE POSITIVES: none expected; the hashes are campaign specific (single origin: Varonis Threat Labs) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | in(field=SHA256HashData, values=["35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc", "f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975", "cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5"]) | table([@timestamp, aid, ComputerName, #event_simpleName, UserName, FileName, CommandLine, ParentBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation and File Creation events
Required fields
event.type: Event typetgt.process.image.sha256: Created process SHA-256tgt.file.sha256: Created file SHA-256
Recommended fields
tgt.process.image.path: Created process pathtgt.file.path: Created file path
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.sha256 = * | limit 5 | columns event.type, tgt.process.image.sha256, tgt.file.sha256
// HUNT: AvisLoader published SHA-256 hashes (78324.exe, auto.exe, hmn_hook.dll)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1548.002, T1014
// CONF: high | FP: low
// FALSE POSITIVES: none expected; the hashes are campaign specific (single origin: Varonis Threat Labs)
// EQUIVALENCE: equivalent-with-schema-assumptions - Same published SHA-256 set matched on a created process image (Process Creation) or a newly written file (File Creation). The CQL's executable-write population is approximated by File Creation.
// REQUIRES: SentinelOne process-creation and file-creation telemetry with SHA-256 populated
// TUNING: None expected: the hashes are campaign specific. Pair any hit with Q2 and Q8.
// LOOKBACK: 30d; the hashes are durable indicators
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A payload modified in place after an earlier write is seen only if the hash matches at process start.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.image.sha256 in ('35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc', 'f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975', 'cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5')) or (event.type = 'File Creation' tgt.file.sha256 in ('35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc', 'f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975', 'cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5'))
| sort -event.time
| limit 200
| columns event.time, endpoint.name, event.type, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.file.path, tgt.process.image.sha256, tgt.file.sha256Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeSHA256: Created process SHA-256
Recommended fields
FolderPath: Created process path
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot where the source publishes one.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, SHA256, FileName | take 5
// HUNT: AvisLoader published SHA-256 hashes (78324.exe, auto.exe, hmn_hook.dll)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.002, T1548.002, T1014
// CONF: high | FP: low
// FALSE POSITIVES: none expected; the hashes are campaign specific (single origin: Varonis Threat Labs)
// EQUIVALENCE: telemetry-gap - Partial pivot: the same three SHA-256 values matched on process creation only. SHA256 is often unpopulated in DeviceProcessEvents and the CQL's executable-write half is not covered by one table.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) with SHA256 populated
// TUNING: None expected: the hashes are campaign specific. Pair any hit with Q2 and Q8.
// LOOKBACK: 30d (Advanced Hunting retention); the hashes are durable indicators
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Files written but never executed are not covered: that needs DeviceFileEvents, a second table. SHA256 is documented as usually not populated in DeviceProcessEvents; the source publishes no SHA1 to pivot on, so an empty result is not a clean result until the readiness test shows SHA256 is populated. The query covers 30 days (Advanced Hunting retention); the CQL tab covers the full retention of the Falcon tenant.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where SHA256 in~ ("35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc", "f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975", "cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, FileName, FolderPath, ProcessCommandLine, InitiatingProcessFileName, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: the three filenames from the Varonis report. The hmn_hook.dll name is distinctive; auto.exe is not. FP: auto.exe is common. Treat a filename hit as a lead until the hash or the parent chain confirms it.
Known limitations and deployment notes
- PowerQuery: auto.exe is a generic name, so unrelated installers can match; the hash in Q1 is the confirming pivot.
- PowerQuery assumes: tgt.file.path holds the full path of the written file, so a trailing-name regex isolates the file name.
- PowerQuery assumes: File Creation stands in for the CQL's executable-write events; File Modification is not queried.
- KQL – Defender XDR: A copy of auto.exe or 78324.exe that is started without the sensor having seen it written is not caught here; the CQL and PowerQuery tabs cover process names.
- KQL – Defender XDR assumes: FileCreated and FileModified are the action types recorded for new and rewritten files on the tenant.
// HUNT: AvisLoader bundled filenames (execution or write) // MITRE: T1548.002, T1014 // CONF: medium FP: medium COST: low | REQUIRES: process creation and PE-write telemetry // FALSE POSITIVES: auto.exe is a generic name; unrelated software and installers use it // TUNING: pair every auto.exe hit with Q1 (hash) or Q8 (dllhost child); exclude signed vendor installs with | ImageFileName!=/REPLACE_WITH_APPROVED_VENDOR_PATH/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | FileName=/^(auto\.exe|hmn_hook\.dll|78324\.exe)$/i | table([@timestamp, aid, ComputerName, #event_simpleName, UserName, FileName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation and File Creation events
Required fields
event.type: Event typetgt.process.name: Created process nametgt.file.path: Created file path
Recommended fields
src.process.name: Creating process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'File Creation' tgt.file.path = * | limit 5 | columns event.type, tgt.process.name, tgt.file.path
// HUNT: AvisLoader bundled filenames (execution or write)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1548.002, T1014
// CONF: medium | FP: medium
// FALSE POSITIVES: auto.exe is a generic name; unrelated software and installers use it
// EQUIVALENCE: equivalent-with-schema-assumptions - Same three artifact names matched case-insensitively on a created process name (Process Creation) or on the last segment of a written file path (File Creation).
// REQUIRES: SentinelOne process-creation and file-creation telemetry
// TUNING: Pair every auto.exe hit with Q1 (hash) or Q8 (dllhost child); exclude signed vendor installs by image path after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: auto.exe is a generic name, so unrelated installers can match; the hash in Q1 is the confirming pivot.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.name in:anycase ('auto.exe', 'hmn_hook.dll', '78324.exe')) or (event.type = 'File Creation' tgt.file.path matches '(^|[^A-Za-z0-9_.-])(auto\\.exe|hmn_hook\\.dll|78324\\.exe)$')
| sort -event.time
| limit 200
| columns event.time, endpoint.name, event.type, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.file.path, tgt.process.image.sha256, tgt.file.sha256Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeActionType: Action typeFileName: File name
Recommended fields
FolderPath: File pathInitiatingProcessFileName: Writing process
Optional fields
SHA1: Hash. SHA256 is often unpopulated; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, FileName | take 5
// HUNT: AvisLoader bundled filenames (execution or write)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1548.002, T1014
// CONF: medium | FP: medium
// FALSE POSITIVES: auto.exe is a generic name; unrelated software and installers use it
// EQUIVALENCE: approximate-analytic - Same three artifact names matched on written files in DeviceFileEvents. The CQL also matches the name of a started process, which needs DeviceProcessEvents, a second table.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: Pair every auto.exe hit with Q1 (hash) or Q8 (dllhost child); exclude signed vendor installs by FolderPath after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A copy of auto.exe or 78324.exe that is started without the sensor having seen it written is not caught here; the CQL and PowerQuery tabs cover process names.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(7d)
| where ActionType in ("FileCreated", "FileModified")
| where FileName in~ ("auto.exe", "hmn_hook.dll", "78324.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, ActionType, FileName, FolderPath, InitiatingProcessFileName, InitiatingProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: the pasted ClickFix command: Varonis says it pulls and runs code from a Cloudflare Quick Tunnel address. trycloudflare.com is shared legitimate infrastructure, so this keys on the process that references it, never on the domain alone.
Known limitations and deployment notes
- PowerQuery: A tunnel host split across variables or encoded in the command line is not matched.
- PowerQuery assumes: tgt.process.name holds the executable file name including the .exe suffix on Windows.
- KQL – Defender XDR: A tunnel host split across variables or encoded in the command line is not matched.
- KQL – Defender XDR assumes: FileName holds the executable file name including the .exe suffix.
// HUNT: command shell or downloader whose command line references trycloudflare.com // MITRE: T1204.004, T1105 // CONF: high FP: low COST: low | REQUIRES: process creation with command line // FALSE POSITIVES: developers demoing a tunnel with curl or PowerShell #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/trycloudflare\.com/i | FileName=/^(powershell|pwsh|cmd|mshta|curl|wget|certutil|bitsadmin|wscript|cscript|msiexec|rundll32|regsvr32)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typetgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creating process
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.name = * tgt.process.cmdline = * | limit 5 | columns event.type, tgt.process.name, tgt.process.cmdline
// HUNT: command shell or downloader whose command line references trycloudflare.com
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.004, T1105
// CONF: high | FP: low
// FALSE POSITIVES: developers demoing a tunnel with curl or PowerShell
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a shell, script host or downloader whose command line references trycloudflare.com. contains is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne process-creation telemetry with command line
// TUNING: Exclude developer hosts that demo tunnels on purpose by endpoint.name after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A tunnel host split across variables or encoded in the command line is not matched.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name in:anycase ('powershell.exe', 'pwsh.exe', 'cmd.exe', 'mshta.exe', 'curl.exe', 'wget.exe', 'certutil.exe', 'bitsadmin.exe', 'wscript.exe', 'cscript.exe', 'msiexec.exe', 'rundll32.exe', 'regsvr32.exe') tgt.process.cmdline contains 'trycloudflare.com'
| sort -event.time
| limit 200
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Initiating process
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, ProcessCommandLine | take 5
// HUNT: command shell or downloader whose command line references trycloudflare.com
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.004, T1105
// CONF: high | FP: low
// FALSE POSITIVES: developers demoing a tunnel with curl or PowerShell
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a shell, script host or downloader whose command line references trycloudflare.com. contains is case-insensitive, which reproduces the CQL /i intent. The creator is InitiatingProcessFileName.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude developer hosts that demo tunnels on purpose by DeviceName after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A tunnel host split across variables or encoded in the command line is not matched.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName in~ ("powershell.exe", "pwsh.exe", "cmd.exe", "mshta.exe", "curl.exe", "wget.exe", "certutil.exe", "bitsadmin.exe", "wscript.exe", "cscript.exe", "msiexec.exe", "rundll32.exe", "regsvr32.exe")
| where ProcessCommandLine contains "trycloudflare.com"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: a script host, shell or downloader resolving a tunnel name. Browsers are excluded because the lure fetch itself is not the payload step. FP: cloudflared and developer tooling resolve this domain legitimately; baseline by host group first.
Known limitations and deployment notes
- PowerQuery: A lookup with no attributed process is included, because a null process name is not excluded by the negated list.
- PowerQuery assumes: event.dns.request holds the queried name; some schema versions use dns.request instead, so confirm which is populated before trusting an empty result.
- PowerQuery assumes: src.process.name is the requesting process on a DNS Resolved event.
- KQL – Defender XDR: A DNS lookup whose initiating process the sensor could not attribute is included, not excluded.
- KQL – Defender XDR assumes: The DnsQueryResponse action type is recorded on the tenant.
- KQL – Defender XDR assumes: AdditionalFields carries the queried name under DnsQueryString or QueryName.
// HUNT: non-browser process resolving a Cloudflare Quick Tunnel host // MITRE: T1105, T1071 // CONF: medium FP: medium COST: low | REQUIRES: DNS request telemetry with the requesting process // FALSE POSITIVES: developers and IT staff using cloudflared or quick tunnels on purpose // TUNING: exclude approved tunnel users by host group with | ComputerName!=/^REPLACE_WITH_DEV_HOST_PREFIX/i #event_simpleName=DnsRequest | DomainName=/(^|\.)trycloudflare\.com$/i | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|vivaldi|cloudflared)\.exe$/i | groupBy([aid, ComputerName, ContextBaseFileName, DomainName], function=[count(as=Lookups), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)]) | sort(Lookups, order=desc)
3 required fields · View requirements
Required telemetry
- DNS Resolved events
Required fields
event.type: Event typeevent.dns.request: Queried namesrc.process.name: Requesting process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'DNS Resolved' event.dns.request = * | limit 5 | columns event.type, event.dns.request, src.process.name
// HUNT: non-browser process resolving a Cloudflare Quick Tunnel host
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1105, T1071
// CONF: medium | FP: medium
// FALSE POSITIVES: developers and IT staff using cloudflared or quick tunnels on purpose
// EQUIVALENCE: equivalent-with-schema-assumptions - Same DNS predicate: lookups of trycloudflare.com or any subdomain by a process that is not a browser or cloudflared, counted per host, process and name with first and last seen.
// REQUIRES: SentinelOne DNS telemetry (DNS Resolved) with the requesting process
// TUNING: Exclude approved tunnel users by endpoint.name prefix after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A lookup with no attributed process is included, because a null process name is not excluded by the negated list.
// VALIDATION LEVEL: static-reviewed
event.type = 'DNS Resolved' event.dns.request matches '(^|\\.)trycloudflare\\.com$' !(src.process.name in:anycase ('chrome.exe', 'msedge.exe', 'firefox.exe', 'brave.exe', 'opera.exe', 'vivaldi.exe', 'cloudflared.exe'))
| group lookups = count(), first_seen = min(event.time), last_seen = max(event.time) by agent.uuid, endpoint.name, src.process.name, event.dns.request
| sort -lookups
| limit 200Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceEvents
Required fields
Timestamp: Event timeActionType: Action typeAdditionalFields: Queried name containerInitiatingProcessFileName: Requesting process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceEvents | where Timestamp > ago(1d) | where ActionType == "DnsQueryResponse" | project Timestamp, ActionType, AdditionalFields, InitiatingProcessFileName | take 5
// HUNT: non-browser process resolving a Cloudflare Quick Tunnel host
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1105, T1071
// CONF: medium | FP: medium
// FALSE POSITIVES: developers and IT staff using cloudflared or quick tunnels on purpose
// EQUIVALENCE: equivalent-with-schema-assumptions - Same DNS predicate on DeviceEvents DnsQueryResponse: lookups of trycloudflare.com or any subdomain by a process that is not a browser or cloudflared. The query name is read from AdditionalFields.
// REQUIRES: Defender for Endpoint DNS action telemetry (DeviceEvents, ActionType DnsQueryResponse)
// TUNING: Exclude approved tunnel users by DeviceName prefix after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A DNS lookup whose initiating process the sensor could not attribute is included, not excluded.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceEvents
| where Timestamp >= ago(7d)
| where ActionType == "DnsQueryResponse"
| extend DnsName = tostring(coalesce(parse_json(AdditionalFields)["DnsQueryString"], parse_json(AdditionalFields)["QueryName"]))
| where DnsName matches regex @"(?i)(^|\.)trycloudflare\.com$"
| where not(InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "firefox.exe", "brave.exe", "opera.exe", "vivaldi.exe", "cloudflared.exe"))
| summarize Lookups = count(), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName, InitiatingProcessFileName, DnsName
| sort by Lookups desc
| take 200Looks for: the generic ClickFix shape Varonis describes: a pasted command that downloads and runs code without the browser as parent. Broader than Q3 and not specific to AvisLoader. FP: Run-dialog use by IT staff. The pasted-command shape is common to many ClickFix families, so a hit is not proof of AvisLoader.
Known limitations and deployment notes
- PowerQuery: The https? marker is broad, so any URL on the command line from an explorer-launched shell matches; expect admin and updater noise.
- PowerQuery assumes: On a Process Creation event src.process.name is the creator and tgt.process.name the new process.
- PowerQuery assumes: The marker alternation is matched as a case-insensitive substring, as in the CQL.
- KQL – Defender XDR: The https? marker is broad, so any URL on the command line from an explorer-launched shell matches; expect admin and updater noise.
- KQL – Defender XDR assumes: The marker alternation is matched as a case-insensitive substring, as in the CQL.
// HUNT: Run-dialog or terminal paste launching a downloader one-liner (ClickFix) // MITRE: T1204.004, T1059.001 // CONF: medium FP: medium COST: medium | REQUIRES: process creation with command line and parent // FALSE POSITIVES: admins running one-liners from the Run dialog; some software updaters // TUNING: exclude known admin hosts and signed updater commands with | CommandLine!=/REPLACE_WITH_APPROVED_COMMAND_FRAGMENT/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(explorer|WindowsTerminal|wt)\.exe$/i | FileName=/^(powershell|pwsh|cmd|mshta)\.exe$/i | CommandLine=/(iex|invoke-expression|irm |iwr |invoke-restmethod|invoke-webrequest|downloadstring|curl |mshta +https?:|-enc |-encodedcommand|https?:)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typesrc.process.name: Creating process nametgt.process.name: Created process nametgt.process.cmdline: Created command line
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: Run-dialog or terminal paste launching a downloader one-liner (ClickFix)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.004, T1059.001
// CONF: medium | FP: medium
// FALSE POSITIVES: admins running one-liners from the Run dialog; some software updaters
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a PowerShell, cmd or mshta process started by explorer.exe, Windows Terminal or wt.exe whose command line carries a download-and-run marker. matches is case-insensitive, which reproduces the CQL /i intent. The creator is src.process.name.
// REQUIRES: SentinelOne process-creation telemetry with command line and creator
// TUNING: Exclude known admin hosts and signed updater command fragments after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The https? marker is broad, so any URL on the command line from an explorer-launched shell matches; expect admin and updater noise.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('explorer.exe', 'WindowsTerminal.exe', 'wt.exe') tgt.process.name in:anycase ('powershell.exe', 'pwsh.exe', 'cmd.exe', 'mshta.exe') tgt.process.cmdline matches '(iex|invoke-expression|irm |iwr |invoke-restmethod|invoke-webrequest|downloadstring|curl |mshta +https?:|-enc |-encodedcommand|https?:)'
| sort -event.time
| limit 200
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdlineAutomated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Initiating processFileName: Created process nameProcessCommandLine: Created command line
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName, ProcessCommandLine | take 5
// HUNT: Run-dialog or terminal paste launching a downloader one-liner (ClickFix)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.004, T1059.001
// CONF: medium | FP: medium
// FALSE POSITIVES: admins running one-liners from the Run dialog; some software updaters
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a PowerShell, cmd or mshta process started by explorer.exe, Windows Terminal or wt.exe whose command line carries a download-and-run marker. The creator is InitiatingProcessFileName and the (?i) prefix reproduces the CQL /i intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude known admin hosts and signed updater command fragments after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: The https? marker is broad, so any URL on the command line from an explorer-launched shell matches; expect admin and updater noise.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName in~ ("explorer.exe", "WindowsTerminal.exe", "wt.exe")
| where FileName in~ ("powershell.exe", "pwsh.exe", "cmd.exe", "mshta.exe")
| where ProcessCommandLine matches regex @"(?i)(iex|invoke-expression|irm |iwr |invoke-restmethod|invoke-webrequest|downloadstring|curl |mshta +https?:|-enc |-encodedcommand|https?:)"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine
| sort by Timestamp desc
| take 200Looks for: the persistence-related launcher name from the Varonis IOC table. A modified shortcut that runs the launcher then the real application would surface as a script host with this name.
Known limitations and deployment notes
- PowerQuery: A shortcut that exists on disk but has not launched since the sensor was installed produces no process event.
- PowerQuery assumes: tgt.process.image.path holds the full path of the created process image.
- KQL – Defender XDR: A shortcut that exists on disk but has not launched since the sensor was installed produces no process event.
- KQL – Defender XDR: The query covers 30 days (Advanced Hunting retention); the CQL tab covers the full retention of the Falcon tenant.
- KQL – Defender XDR assumes: FolderPath holds the full path of the created process image.
// HUNT: VLCAssistant VBScript launcher / shortcut-persistence name in any command line // MITRE: T1547.009, T1059.005 // CONF: high FP: low COST: low | REQUIRES: process creation with command line // FALSE POSITIVES: a legitimately named VLC helper script, which Varonis does not describe #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/VLCAssistant/i or ImageFileName=/VLCAssistant/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typetgt.process.cmdline: Created command linetgt.process.image.path: Created process path
Recommended fields
src.process.name: Creating process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, tgt.process.cmdline, tgt.process.image.path
// HUNT: VLCAssistant VBScript launcher / shortcut-persistence name in any command line // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1547.009, T1059.005 // CONF: high | FP: low // FALSE POSITIVES: a legitimately named VLC helper script, which Varonis does not describe // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the string VLCAssistant in the created process command line or its image path. contains is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne process-creation telemetry with command line and image path // TUNING: None expected: the string is campaign specific. Review any hit that is not a script host. // LOOKBACK: 30d; the launcher persists across reboots // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A shortcut that exists on disk but has not launched since the sensor was installed produces no process event. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' (tgt.process.cmdline contains 'VLCAssistant' or tgt.process.image.path contains 'VLCAssistant') | sort -event.time | limit 200 | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeProcessCommandLine: Created command lineFolderPath: Created process path
Recommended fields
InitiatingProcessFileName: Initiating process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, ProcessCommandLine, FolderPath | take 5
// HUNT: VLCAssistant VBScript launcher / shortcut-persistence name in any command line // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1547.009, T1059.005 // CONF: high | FP: low // FALSE POSITIVES: a legitimately named VLC helper script, which Varonis does not describe // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the string VLCAssistant in the created process command line or its image path. contains is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: None expected: the string is campaign specific. Review any hit that is not a script host. // LOOKBACK: 30d (Advanced Hunting retention); the launcher persists across reboots // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A shortcut that exists on disk but has not launched since the sensor was installed produces no process event. The query covers 30 days (Advanced Hunting retention); the CQL tab covers the full retention of the Falcon tenant. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where ProcessCommandLine contains "VLCAssistant" or FolderPath contains "VLCAssistant" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine | sort by Timestamp desc | take 200
Looks for: what a hijacked desktop or taskbar shortcut would do when opened: explorer starts a script host on a VBScript. This is an inference from the Varonis description, not an observed victim chain. FP: Legacy logon scripts. Baseline per environment before alerting.
Known limitations and deployment notes
- PowerQuery: A script launched with a relative path, so the folder never appears on the command line, is not matched.
- PowerQuery assumes: On a Process Creation event src.process.name is the creator and tgt.process.name the new process.
- PowerQuery assumes: The folder test runs on the command line, as in the CQL, not on the script file's own path.
- KQL – Defender XDR: A script launched with a relative path, so the folder never appears on the command line, is not matched.
- KQL – Defender XDR assumes: The folder test runs on the command line, as in the CQL, not on the script file's own path.
// HUNT: wscript/cscript run a .vbs from a user-writable path with explorer as parent (shortcut-launcher shape) // MITRE: T1547.009, T1059.005 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line and parent // FALSE POSITIVES: logon scripts and IT tooling that launch .vbs from a profile or ProgramData // TUNING: exclude known script paths with | CommandLine!=/REPLACE_WITH_APPROVED_SCRIPT_PATH/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^explorer\.exe$/i | FileName=/^(wscript|cscript)\.exe$/i | CommandLine=/\.vbs/i | CommandLine=/\\(AppData|ProgramData|Users\\Public|Temp)\\/i | table([@timestamp, aid, ComputerName, UserName, FileName, CommandLine]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typesrc.process.name: Creating process nametgt.process.name: Created process nametgt.process.cmdline: Created command line
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.cmdline = * | limit 5 | columns event.type, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: wscript/cscript run a .vbs from a user-writable path with explorer as parent (shortcut-launcher shape)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1547.009, T1059.005
// CONF: medium | FP: medium
// FALSE POSITIVES: logon scripts and IT tooling that launch .vbs from a profile or ProgramData
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: wscript or cscript started by explorer.exe with a .vbs argument and a user-writable folder (AppData, ProgramData, Users\Public or Temp) in the command line. The creator is src.process.name; matches is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne process-creation telemetry with command line and creator
// TUNING: Exclude known logon-script paths after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A script launched with a relative path, so the folder never appears on the command line, is not matched.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('explorer.exe') tgt.process.name in:anycase ('wscript.exe', 'cscript.exe') tgt.process.cmdline contains '.vbs' tgt.process.cmdline matches '\\\\(AppData|ProgramData|Users\\\\Public|Temp)\\\\'
| sort -event.time
| limit 200
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdlineAutomated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Initiating processFileName: Created process nameProcessCommandLine: Created command line
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName, ProcessCommandLine | take 5
// HUNT: wscript/cscript run a .vbs from a user-writable path with explorer as parent (shortcut-launcher shape)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1547.009, T1059.005
// CONF: medium | FP: medium
// FALSE POSITIVES: logon scripts and IT tooling that launch .vbs from a profile or ProgramData
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: wscript or cscript started by explorer.exe with a .vbs argument and a user-writable folder (AppData, ProgramData, Users\Public or Temp) in the command line. The creator is InitiatingProcessFileName; contains is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude known logon-script paths after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A script launched with a relative path, so the folder never appears on the command line, is not matched.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName =~ "explorer.exe"
| where FileName in~ ("wscript.exe", "cscript.exe")
| where ProcessCommandLine contains ".vbs"
| where ProcessCommandLine contains "\\AppData\\" or ProcessCommandLine contains "\\ProgramData\\" or ProcessCommandLine contains "\\Users\\Public\\" or ProcessCommandLine contains "\\Temp\\"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine
| sort by Timestamp desc
| take 200Looks for: a command interpreter started by dllhost.exe, which is how a COM-elevation UAC bypass hands off an elevated process. Pair with Q2 for auto.exe. FP: COM-based installers. The pattern is shared by other UAC bypasses, so it is not AvisLoader-specific.
Known limitations and deployment notes
- PowerQuery: Elevation is not tested: the query finds the spawn, not whether the child holds a high integrity token.
- PowerQuery assumes: On a Process Creation event src.process.name is the creator and tgt.process.name the new process.
- PowerQuery assumes: tgt.process.image.sha256 is populated on the tenant.
- KQL – Defender XDR: Elevation is not tested: the query finds the spawn, not whether the child holds a high integrity token.
- KQL – Defender XDR assumes: InitiatingProcessFileName holds the creator's file name including the .exe suffix.
// HUNT: shell or script host spawned by dllhost.exe, the COM surrogate abused by ICMLuaUtil elevation // MITRE: T1548.002 // CONF: medium FP: medium COST: low | REQUIRES: process creation with parent // NOTE: Varonis ties auto.exe to COM class 3E5FC7F9-9A51-4367-9063-A120244FBEC7 and says successful elevation was not confirmed // FALSE POSITIVES: installers and management tools that elevate through COM surrogates // TUNING: exclude known management parents or signed installers with | ComputerName!=/^REPLACE_WITH_ADMIN_HOST_PREFIX/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^dllhost\.exe$/i | FileName=/^(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|regsvr32|auto)\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typesrc.process.name: Creating process nametgt.process.name: Created process name
Optional fields
tgt.process.image.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' src.process.name = * tgt.process.name = * | limit 5 | columns event.type, src.process.name, tgt.process.name
// HUNT: shell or script host spawned by dllhost.exe, the COM surrogate abused by ICMLuaUtil elevation
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1548.002
// CONF: medium | FP: medium
// FALSE POSITIVES: installers and management tools that elevate through COM surrogates
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a shell, script host or auto.exe started by dllhost.exe. The creator is src.process.name; the query does not test whether the child is elevated, as the CQL does not.
// REQUIRES: SentinelOne process-creation telemetry with creator
// TUNING: Exclude known management hosts and signed installers by endpoint.name after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Elevation is not tested: the query finds the spawn, not whether the child holds a high integrity token.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' src.process.name in:anycase ('dllhost.exe') tgt.process.name in:anycase ('cmd.exe', 'powershell.exe', 'pwsh.exe', 'wscript.exe', 'cscript.exe', 'mshta.exe', 'rundll32.exe', 'regsvr32.exe', 'auto.exe')
| sort -event.time
| limit 200
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Initiating processFileName: Created process name
Recommended fields
ProcessCommandLine: Created command line
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName | take 5
// HUNT: shell or script host spawned by dllhost.exe, the COM surrogate abused by ICMLuaUtil elevation
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1548.002
// CONF: medium | FP: medium
// FALSE POSITIVES: installers and management tools that elevate through COM surrogates
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a shell, script host or auto.exe started by dllhost.exe. The creator is InitiatingProcessFileName; the query does not test whether the child is elevated, as the CQL does not.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude known management hosts and signed installers by DeviceName after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Elevation is not tested: the query finds the spawn, not whether the child holds a high integrity token.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where InitiatingProcessFileName =~ "dllhost.exe"
| where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "wscript.exe", "cscript.exe", "mshta.exe", "rundll32.exe", "regsvr32.exe", "auto.exe")
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: the loader name shape: the Varonis sample is 78324.exe. A rebuilt sample with another digit string still fits. SOC Prime ships a similar generic rule. FP: Temp-named installers. Use the hash (Q1) to separate AvisLoader from benign numeric names.
Known limitations and deployment notes
- PowerQuery: Temp-named installers and updaters match; use Q1 or Q2 to confirm.
- PowerQuery assumes: tgt.process.image.path holds the full path of the created process image, including drive and folder.
- KQL – Defender XDR: Temp-named installers and updaters match; use Q1 or Q2 to confirm.
- KQL – Defender XDR assumes: FolderPath holds the full path of the created process image, including drive and folder.
// HUNT: executable named only with digits (78324.exe pattern) running from a user-writable folder // MITRE: T1204.002, T1036 // CONF: medium FP: medium COST: low | REQUIRES: process creation with image path // FALSE POSITIVES: temp-named installers and updaters // TUNING: exclude signed installer parents with | ParentBaseFileName!=/^(msiexec|setup)\.exe$/i #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^[0-9]{3,8}\.exe$/i | ImageFileName=/\\(Users|ProgramData|Windows\\Temp)\\/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation events
Required fields
event.type: Event typetgt.process.name: Created process nametgt.process.image.path: Created process path
Recommended fields
src.process.name: Creating process
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Process Creation' tgt.process.image.path = * | limit 5 | columns event.type, tgt.process.name, tgt.process.image.path
// HUNT: executable named only with digits (78324.exe pattern) running from a user-writable folder
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1036
// CONF: medium | FP: medium
// FALSE POSITIVES: temp-named installers and updaters
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: an executable named with only three to eight digits whose image path sits under Users, ProgramData or Windows\Temp. matches is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne process-creation telemetry with image path
// TUNING: Exclude signed installer parents by src.process.name after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Temp-named installers and updaters match; use Q1 or Q2 to confirm.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name matches '^[0-9]{3,8}\\.exe$' tgt.process.image.path matches '\\\\(Users|ProgramData|Windows\\\\Temp)\\\\'
| sort -event.time
| limit 200
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, tgt.process.image.sha256Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameFolderPath: Created process path
Recommended fields
InitiatingProcessFileName: Initiating process
Optional fields
SHA1: Hash. SHA256 is often unpopulated in DeviceProcessEvents; SHA1 is the safer pivot.
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, FileName, FolderPath | take 5
// HUNT: executable named only with digits (78324.exe pattern) running from a user-writable folder
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.002, T1036
// CONF: medium | FP: medium
// FALSE POSITIVES: temp-named installers and updaters
// EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: an executable named with only three to eight digits whose image path sits under Users, ProgramData or Windows\Temp. The (?i) prefix reproduces the CQL /i intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude signed installer parents by InitiatingProcessFileName after a baseline review.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Temp-named installers and updaters match; use Q1 or Q2 to confirm.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(7d)
| where FileName matches regex @"(?i)^[0-9]{3,8}\.exe$"
| where FolderPath matches regex @"(?i)\\(Users|ProgramData|Windows\\Temp)\\"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: a process contacting the Tox default bootstrap port. This is a heuristic added by the pack author; the sources only say to look for unexpected Tox or P2P traffic.
Known limitations and deployment notes
- PowerQuery: Tox peers on other ports are not seen; this indicator is analyst knowledge and is not in the source report.
- PowerQuery assumes: dst.port.number is numeric and holds the remote port of an outbound IP Connect event.
- PowerQuery assumes: estimate_distinct returns an approximate count of distinct peers.
- KQL – Defender XDR: Tox peers on other ports are not seen; this indicator is analyst knowledge and is not in the source report.
- KQL – Defender XDR: RemoteIPType Public excludes link-local and carrier-grade NAT addresses, which the CQL treats as external.
- KQL – Defender XDR assumes: RemoteIPType is Public for routable addresses and is populated on the tenant.
- KQL – Defender XDR assumes: ConnectionSuccess, ConnectionFailed and ConnectionRequest are the outbound action types recorded on the tenant.
// HUNT: outbound connections to port 33445, the default Tox bootstrap port (analyst knowledge, NOT in the Varonis report) // MITRE: T1071 // CONF: medium FP: low COST: low | REQUIRES: network connection telemetry with the owning process // FALSE POSITIVES: people running a Tox chat client on purpose // NOTE: Tox is encrypted P2P and can use other ports; absence of hits proves nothing #event_simpleName=NetworkConnectIP4 | RemotePort=33445 | !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8"]) | groupBy([aid, ComputerName, ContextBaseFileName, RemotePort], function=[count(as=Connections), count(RemoteAddressIP4, distinct=true, as=DistinctPeers), min(@timestamp, as=FirstSeen), max(@timestamp, as=LastSeen)]) | sort(Connections, order=desc)
3 required fields · View requirements
Required telemetry
- IP Connect events
Required fields
event.type: Event typedst.port.number: Destination portdst.ip.address: Destination address
Recommended fields
src.process.name: Owning process name
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.port.number = * dst.ip.address = * | limit 5 | columns event.type, dst.port.number, dst.ip.address
// HUNT: outbound connections to port 33445, the default Tox bootstrap port (analyst knowledge, NOT in the Varonis report) // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1071 // CONF: medium | FP: low // FALSE POSITIVES: people running a Tox chat client on purpose // EQUIVALENCE: equivalent-with-schema-assumptions - Same network predicate: outbound connections to destination port 33445 where the destination is not RFC 1918 or loopback, counted per host, process and port with first and last seen and the number of distinct peers. // REQUIRES: SentinelOne network telemetry (IP Connect) with the owning process // TUNING: Exclude hosts where a Tox client is sanctioned by endpoint.name after a baseline review. Tox can use other ports, so an empty result proves nothing. // LOOKBACK: 7d; extend to 30d for the incident window // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Tox peers on other ports are not seen; this indicator is analyst knowledge and is not in the source report. // VALIDATION LEVEL: static-reviewed event.type = 'IP Connect' dst.port.number = 33445 !(net_rfc1918(dst.ip.address)) !(net_ipsubnet(dst.ip.address, '127.0.0.0/8')) | group connections = count(), distinct_peers = estimate_distinct(dst.ip.address), first_seen = min(event.time), last_seen = max(event.time) by agent.uuid, endpoint.name, src.process.name, dst.port.number | sort -connections | limit 200
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeActionType: Action typeRemotePort: Remote portRemoteIPType: Remote address class
Recommended fields
InitiatingProcessFileName: Owning processRemoteIP: Remote address
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, RemotePort, RemoteIPType | take 5
// HUNT: outbound connections to port 33445, the default Tox bootstrap port (analyst knowledge, NOT in the Varonis report)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1071
// CONF: medium | FP: low
// FALSE POSITIVES: people running a Tox chat client on purpose
// EQUIVALENCE: equivalent-with-schema-assumptions - Same network predicate: outbound connections to remote port 33445 where the remote address is public, counted per host, process and port with first and last seen and the number of distinct peers. RemoteIPType replaces the CQL subnet exclusions.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: Exclude hosts where a Tox client is sanctioned by DeviceName after a baseline review. Tox can use other ports, so an empty result proves nothing.
// LOOKBACK: 7d; extend to 30d for the incident window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: Tox peers on other ports are not seen; this indicator is analyst knowledge and is not in the source report. RemoteIPType Public excludes link-local and carrier-grade NAT addresses, which the CQL treats as external.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(7d)
| where ActionType in ("ConnectionSuccess", "ConnectionFailed", "ConnectionRequest")
| where RemotePort == 33445
| where RemoteIPType == "Public"
| summarize Connections = count(), DistinctPeers = dcount(RemoteIP), FirstSeen = min(Timestamp), LastSeen = max(Timestamp) by DeviceId, DeviceName, InitiatingProcessFileName, RemotePort
| sort by Connections desc
| take 200Looks for: peer-to-peer behaviour in general, because Varonis says the Tox connections stay observable next to the loader activity. Expect noise; use it to enrich a host already flagged by another query. FP: Many legitimate P2P-style clients. Low confidence by design.
Known limitations and deployment notes
- PowerQuery: estimate_distinct is approximate, so counts near fifteen can differ from the CQL's exact distinct count.
- PowerQuery assumes: dst.port.number is numeric and holds the remote port of an outbound IP Connect event.
- PowerQuery assumes: The fan-out threshold applies over the whole query window, as in the CQL.
- KQL – Defender XDR: dcount is approximate, so counts near fifteen can differ from the CQL's exact distinct count.
- KQL – Defender XDR: RemoteIPType Public excludes link-local and carrier-grade NAT addresses, which the CQL treats as external.
- KQL – Defender XDR assumes: RemoteIPType is Public for routable addresses and is populated on the tenant.
- KQL – Defender XDR assumes: ConnectionSuccess, ConnectionFailed and ConnectionRequest are the outbound action types recorded on the tenant.
// HUNT: single non-browser process connecting to many distinct public IPs on one port (P2P fan-out) // MITRE: T1071 // CONF: low FP: high COST: medium | REQUIRES: network connection telemetry with the owning process // FALSE POSITIVES: torrent, VoIP, game, backup and CDN clients; this is a weak heuristic // TUNING: exclude known P2P-like software with | ContextBaseFileName!=/^(Teams|Zoom|Slack|OneDrive|Dropbox|Steam)\.exe$/i and baseline per host group #event_simpleName=NetworkConnectIP4 | ContextBaseFileName!=/^(chrome|msedge|firefox|brave|opera|vivaldi|svchost)\.exe$/i | !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8", "169.254.0.0/16"]) | groupBy([aid, ComputerName, ContextBaseFileName, RemotePort], function=[count(RemoteAddressIP4, distinct=true, as=DistinctPeers), count(as=Connections)]) | test(DistinctPeers >= 15) | sort(DistinctPeers, order=desc)
4 required fields · View requirements
Required telemetry
- IP Connect events
Required fields
event.type: Event typedst.ip.address: Destination addresssrc.process.name: Owning process namedst.port.number: Destination port
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * src.process.name = * | limit 5 | columns event.type, dst.ip.address, src.process.name, dst.port.number
// HUNT: single non-browser process connecting to many distinct public IPs on one port (P2P fan-out)
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1071
// CONF: low | FP: high
// FALSE POSITIVES: torrent, VoIP, game, backup and CDN clients; this is a weak heuristic
// EQUIVALENCE: approximate-analytic - Same fan-out analytic: a process that is not a browser or svchost connecting to fifteen or more distinct public addresses per host and port. The distinct count is estimate_distinct, an approximation, so rows near the threshold may differ from the CQL's exact count.
// REQUIRES: SentinelOne network telemetry (IP Connect) with the owning process
// TUNING: Exclude known P2P-like software (Teams, Zoom, Slack, OneDrive, Dropbox, Steam) by src.process.name and baseline per host group. This is a weak heuristic with a high false-positive rate.
// LOOKBACK: 1d; the threshold is a daily fan-out and grows with the window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: estimate_distinct is approximate, so counts near fifteen can differ from the CQL's exact distinct count.
// VALIDATION LEVEL: static-reviewed
event.type = 'IP Connect' !(src.process.name in:anycase ('chrome.exe', 'msedge.exe', 'firefox.exe', 'brave.exe', 'opera.exe', 'vivaldi.exe', 'svchost.exe')) !(net_rfc1918(dst.ip.address)) !(net_ipsubnet(dst.ip.address, '127.0.0.0/8')) !(net_ipsubnet(dst.ip.address, '169.254.0.0/16'))
| group distinct_peers = estimate_distinct(dst.ip.address), connections = count() by agent.uuid, endpoint.name, src.process.name, dst.port.number
| filter distinct_peers >= 15
| sort -distinct_peers
| limit 200Automated validation: static-passed
6 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeActionType: Action typeRemoteIPType: Remote address classInitiatingProcessFileName: Owning processRemoteIP: Remote addressRemotePort: Remote port
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, RemoteIPType, InitiatingProcessFileName, RemoteIP, RemotePort | take 5
// HUNT: single non-browser process connecting to many distinct public IPs on one port (P2P fan-out)
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1071
// CONF: low | FP: high
// FALSE POSITIVES: torrent, VoIP, game, backup and CDN clients; this is a weak heuristic
// EQUIVALENCE: approximate-analytic - Same fan-out analytic: a process that is not a browser or svchost connecting to fifteen or more distinct public addresses per host and port. RemoteIPType replaces the CQL subnet exclusions and dcount is an estimate.
// REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents)
// TUNING: Exclude known P2P-like software (Teams, Zoom, Slack, OneDrive, Dropbox, Steam) by InitiatingProcessFileName and baseline per host group. This is a weak heuristic with a high false-positive rate.
// LOOKBACK: 1d; the threshold is a daily fan-out and grows with the window
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: dcount is approximate, so counts near fifteen can differ from the CQL's exact distinct count. RemoteIPType Public excludes link-local and carrier-grade NAT addresses, which the CQL treats as external.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0
DeviceNetworkEvents
| where Timestamp >= ago(1d)
| where ActionType in ("ConnectionSuccess", "ConnectionFailed", "ConnectionRequest")
| where RemoteIPType == "Public"
| where not(InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "firefox.exe", "brave.exe", "opera.exe", "vivaldi.exe", "svchost.exe"))
| summarize DistinctPeers = dcount(RemoteIP), Connections = count() by DeviceId, DeviceName, InitiatingProcessFileName, RemotePort
| where DistinctPeers >= 15
| sort by DistinctPeers desc
| take 200Detection Rules by Platform
CrowdStrike: Custom IOA
| IOA name | Pattern (Process Creation) | Promotes | Action | Exclusions |
|---|---|---|---|---|
| Shell or downloader referencing a Quick Tunnel | Image matches powershell, pwsh, cmd, mshta, curl, certutil or bitsadmin; command line contains trycloudflare.com | Promote Q3 | Detect, high | Approved developer hosts |
| VLCAssistant launcher | Command line or image path contains VLCAssistant | Promote Q6 | Detect, high | None known |
| dllhost.exe spawning a shell or script host | Parent image dllhost.exe; child cmd, powershell, wscript, cscript, mshta | Promote Q8 | Detect, medium | Management tooling parents |
| AvisLoader bundled filenames | Image file name hmn_hook.dll, 78324.exe, or auto.exe with other signals | Promote Q2 | Detect, medium | Signed vendor installs of auto.exe |
Alert package for Q3 and Q6
- Scheduled search name: DETECT - AvisLoader Tunnel Fetch or Launcher
- Description: Fires when a shell or script host references a Cloudflare Quick Tunnel, or when the VLCAssistant launcher name appears in a command line. Indicates a ClickFix-delivered loader.
- Email subject: [HIGH] Detection: AvisLoader - tunnel fetch or launcher on <ComputerName>
- Body: what fired (host, user, parent, command line); meaning: a user probably pasted a command from a fake signing page; immediate action: network-contain, keep powered on, start the triage list; escalate to IR if any of Q1, Q2 or Q8 also hits.
Triage checklist (L1)
- Confirm the hit: host, user, parent chain, full command line.
- Ask the user what page they were on and what they pasted.
- Run Q1 and Q2 for the same aid.
- Run Q6 and Q7, then the shortcut sweep (section 7).
- Run Q8 for an elevated child of dllhost.exe.
- Run Q10 and Q11 for peer-to-peer behaviour (weak signal).
- Isolate the host; do not power off.
- Escalate to IR; open credential-review tasks for the user.
Pivot queries
// host-scoped: process activity around the alert (replace the aid) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | aid=REPLACE_WITH_AID | table([@timestamp, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=asc) // environment-wide: which hosts resolved a Quick Tunnel name #event_simpleName=DnsRequest | DomainName=/(^|\.)trycloudflare\.com$/i | groupBy([ComputerName, ContextBaseFileName], function=count(as=Lookups)) | sort(Lookups, order=desc)
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Shell or downloader referencing a Quick Tunnel | Q3, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| VLCAssistant launcher | Q6, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| dllhost.exe spawning a shell or script host | Q8, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| AvisLoader bundled filenames | Q2, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
Create the rule with POST /web/api/v2.1/cloud-detection/rules, queryType: "scheduled" and queryLang: "2.0", with the query in data.scheduledParams.query. Use 2.0 operator spellings: a rule written with the 1.0 token ContainsCIS was accepted and never fired on a tenant. The API does not warn, so lint the body before deploying.
Microsoft Defender: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Shell or downloader referencing a Quick Tunnel | Q3, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| VLCAssistant launcher | Q6, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| dllhost.exe spawning a shell or script host | Q8, KQL – Defender XDR tab | Custom detection rule, alert only, every hour | The query returns Timestamp, ReportId and DeviceId, which Microsoft recommends for Defender for Endpoint tables so alerts carry the device group scope and the process tree. Remove the Timestamp filter and the final sort and take before saving the rule: the service applies the rule's lookback itself |
| AvisLoader bundled filenames | Q2, KQL – Defender XDR tab | Hunt only until the gap is closed | Q2 is only an approximation here. Same three artifact names matched on written files in DeviceFileEvents. The CQL also matches the name of a started process, which needs DeviceProcessEvents, a second table. |
Q1, Q4, Q5, Q7, Q9, Q10 and Q11 stay a hunt in this pack, not a rule. A rule can generate only 150 alerts per run. Continuous (NRT) frequency needs a single table and no comment lines, so delete the generated comment header from the query first.
Machine-Readable IOC Appendix
No C2 address or domain was published. trycloudflare.com and workers.dev are deliberately absent from the CSV: they are shared legitimate services. All rows ship at detect because the hashes have a single origin.
type,value,action,severity,expiration,description,tags sha256,35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc,detect,high,2027-04-15,AvisLoader Windows client 78324.exe (Varonis; single source),campaign:AvisLoader sha256,f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975,detect,high,2027-04-15,AvisLoader bundled UAC helper auto.exe (Varonis; single source),campaign:AvisLoader sha256,cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5,detect,high,2027-04-15,AvisLoader process-hiding DLL hmn_hook.dll (Varonis; single source),campaign:AvisLoader
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert FileSha256,35dd164a7f5d8b42b9870c7009f7425b1c8cb771280c9e6c525e09f3dd13c2cc,Audit,AvisLoader Windows client 78324.exe,AvisLoader Windows client 78324.exe (Varonis; single source),2027-04-15T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,f0a6870cb774a55775eda15fd39e8a17eb3169d5b9365186dae8edff07ff3975,Audit,AvisLoader bundled UAC helper auto.exe,AvisLoader bundled UAC helper auto.exe (Varonis; single source),2027-04-15T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True FileSha256,cd1e835f52e5f55279dcdf3857e11bc9298ea6caa88eb214ea2d40ff5d38b5f5,Audit,AvisLoader process-hiding DLL hmn_hook.dll,AvisLoader process-hiding DLL hmn_hook.dll (Varonis; single source),2027-04-15T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True
Column names and allowed values are from Microsoft's documented parameter table. Check each expirationTime before importing: an indicator whose date has passed is already expired. Download the sample CSV from the Import page to confirm the column order before a bulk import. Each file takes at most 500 indicators. Learn describes the import per entity type, so if a mixed file is rejected, split it by indicatorType. An imported indicator does nothing unless the matching Advanced features are on (for example Custom network indicators and Allow or block file).
This pack does not ship a SentinelOne import block: the import format could not be verified against SentinelOne's own documentation. Export a sample from your console and the block can be added with confidence.
VLCAssistant persistence launcher name trycloudflare.com in a shell/downloader command line dllhost.exe as parent of cmd/powershell/wscript (COM elevation shape) numeric-only exe name (e.g. 78324.exe) from a profile folder explorer.exe -> wscript/cscript -> .vbs in AppData/ProgramData/Temp
AvisLoader (Windows client, 78324.exe)
c-toxcore statically linked; build path C:\Users\dev\Desktop\c-toxcore
auto.exe (UACMe method 41, ICMLuaUtil)
hmn_hook.dll exports HMN_HideStart, HMN_HideStatus, HMN_HideStop
COM CLSID {3E5FC7F9-9A51-4367-9063-A120244FBEC7}
AvisLoader Command Center (operator web panel)Get-MpPreference | Select-Object -ExpandProperty AttackSurfaceReductionRules_Ids Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' -Name Enabled -ErrorAction SilentlyContinue Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' | Select ConsentPromptBehaviorAdmin,EnableLUA Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer' -Name NoRun -ErrorAction SilentlyContinue
Detection Validation Gates
- Telemetry ready: confirm process creation with command line and parent (Process creation with command line, image path and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents)), DNS lookups with the requesting process (DNS lookup with requesting process (CrowdStrike: DnsRequest. SentinelOne: DNS Resolved. Defender: DeviceEvents DnsQueryResponse, name inside AdditionalFields)) and network connections (Outbound network connection with owning process (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents)) are collected for workstations.
- Benign baseline: run Q4, Q5, Q7, Q8, Q9 and Q11 over 30 days and record the normal hits per host group before alerting. Q11 is expected to be noisy.
- Positive tests (harmless, no malware): on a test host run
powershell -NoProfile -Command "Write-Output trycloudflare.com"to exercise Q3,cmd /c echo VLCAssistantfor Q6, andnslookup example.trycloudflare.comfor Q4. There is no safe way to test Q1 or Q8 without the sample; keep them hash- and parent-based. - Promotion: promote Q3 and Q6 to IOAs after a clean baseline; keep Q4, Q5, Q7 to Q11 as hunts. Nothing here is promoted to prevent.
Hardening - Tiered & Deployable
- Block script and obfuscation abuse with ASR rules, audit first. Rules: Block JavaScript or VBScript from launching downloaded executable content; Block execution of potentially obfuscated scripts. MITRE M1049 (Antivirus/Antimalware), M1038 (Execution Prevention). Authority: Microsoft attack surface reduction rules reference. Verify:
Get-MpPreference | Select AttackSurfaceReductionRules_Ids,AttackSurfaceReductionRules_Actions - Turn on PowerShell Script Block Logging and process-creation command-line auditing. M1047 (Audit). Authority: CIS Microsoft Windows benchmarks, Microsoft security baseline. Verify: Event ID 4104 and 4688 appear.
- User training for ClickFix. M1017 (User Training): legitimate signing and verification pages never ask for a pasted command. Report, do not run. Best-practice, no formal benchmark.
- Disable Windows Script Host for users who do not need it. M1042 (Disable or Remove Feature). Counters the VBScript launcher. Authority: Microsoft guidance; not in every CIS profile. Verify:
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings" - Harden UAC. Set ConsentPromptBehaviorAdmin to prompt for consent on the secure desktop and keep EnableLUA on; remove standing local admin (M1026 Privileged Account Management, M1052 UAC). Authority: CIS Windows benchmark UAC settings. Counters UAC-bypass helpers, which also need a split-token admin user.
- Restrict the Run dialog where policy allows (NoRun) for standard users. M1038. Blunt control that breaks Win+R; pilot it. Best-practice, no formal benchmark. Does not stop a pasted command in a terminal.
- Application control for user-writable paths (WDAC or AppLocker, audit mode first). M1038. Authority: Microsoft WDAC guidance; CIS AppLocker recommendations.
- Egress control for tunnel services: allow-list trycloudflare.com and workers.dev by role at the proxy or DNS filter instead of allowing everything. M1037 (Filter Network Traffic). Do not block wholesale: both host legitimate services.
- Default-deny outbound for workstations on non-standard UDP, so Tox-style peer traffic cannot leave. M1031 (Network Intrusion Prevention), M1037. Best-practice, no formal benchmark.
- Protect shortcut locations: audit writes to Desktop and the pinned-taskbar folder (SACL) and baseline shortcut targets. M1022 (Restrict File and Directory Permissions). Best-practice, no formal benchmark.
- PowerShell Constrained Language Mode with WDAC. M1045 (Code Signing), M1038.
Deployable Playbooks
Raw configuration only. Test on a pilot ring first. Every step lists its prerequisites, reboot need and rollback.
Step 1: ASR rules in audit mode, then block
Prerequisites: Microsoft Defender Antivirus active (not passive mode); local admin or Intune/GPO.
Reboot required: No
# Audit first. Rule IDs (Microsoft docs): # D3E037E1-3EB8-44C8-A917-57927947596D Block JavaScript or VBScript from launching downloaded executable content # 5BEB7EFE-FD9A-4556-801D-275E5FFC04CC Block execution of potentially obfuscated scripts Add-MpPreference -AttackSurfaceReductionRules_Ids D3E037E1-3EB8-44C8-A917-57927947596D,5BEB7EFE-FD9A-4556-801D-275E5FFC04CC -AttackSurfaceReductionRules_Actions AuditMode,AuditMode # After a clean audit period (review Defender event 1122), switch the Actions to Enabled. Get-MpPreference | Select AttackSurfaceReductionRules_Ids,AttackSurfaceReductionRules_Actions
Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids D3E037E1-3EB8-44C8-A917-57927947596D,5BEB7EFE-FD9A-4556-801D-275E5FFC04CC
Step 2: Disable Windows Script Host (pilot ring)
Prerequisites: Confirm no logon scripts or line-of-business tools use .vbs/.js (check Q7 baseline).
Reboot required: No (new script launches fail immediately)
New-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' -Force | Out-Null Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' -Name Enabled -Value 0 -Type DWord # Verify Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' -Name Enabled
Rollback: Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings' -Name Enabled (or set it to 1).
Step 3: UAC: consent on the secure desktop for admins
Prerequisites: Inventory admin workflows that rely on silent elevation.
Reboot required: No (applies at next elevation; a sign-out is advisable)
$k='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' Set-ItemProperty $k -Name EnableLUA -Value 1 -Type DWord Set-ItemProperty $k -Name ConsentPromptBehaviorAdmin -Value 2 -Type DWord # 2 = prompt for consent on the secure desktop Get-ItemProperty $k | Select EnableLUA,ConsentPromptBehaviorAdmin
Rollback: Set ConsentPromptBehaviorAdmin back to its previous value (record it first with the Get-ItemProperty line; the Windows default is 5).
Step 4: Restrict the Run dialog for standard users (optional, blunt)
Prerequisites: Confirm users do not rely on Win+R; pilot with a small group.
Reboot required: No (sign out and back in)
$k='HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer' New-Item $k -Force | Out-Null Set-ItemProperty $k -Name NoRun -Value 1 -Type DWord # Deploy to users through GPO: User Configuration > Administrative Templates > Start Menu and Taskbar > Remove Run menu from Start Menu
Rollback: Remove-ItemProperty -Path $k -Name NoRun (or disable the GPO setting). This does not stop a command pasted into a terminal.
Step 5: Audit writes to the pinned-taskbar and desktop shortcut folders
Prerequisites: Local admin; Audit File System policy enabled.
Reboot required: No
$t = "$env:APPDATA\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"
$acl = Get-Acl $t
$rule = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone','Write,Delete','ContainerInherit,ObjectInherit','None','Success')
$acl.AddAuditRule($rule); Set-Acl $t $acl
# Events appear as Security 4663 once "Audit File System" (Success) is enabled.Rollback: $acl.RemoveAuditRule($rule) | Out-Null; Set-Acl $t $acl
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host from the EDR console; keep it powered on. Block nothing at the domain level for trycloudflare.com. Disable the affected user session if elevation is suspected | SOC / IR | Containment record, aid, time |
| Isolate: by platform | CrowdStrike: network-contain the host. SentinelOne: network quarantine (Disconnect from Network; confirm the label in your console version). Microsoft Defender: Isolate device (full network isolation). Keep the host powered on for memory capture on all of them. | SOC / IR | Containment record, aid, time |
| Scope | Run Q1 to Q11 environment-wide over 30 days; pull the user's browser history for the lure page; check RunMRU | SOC | Query exports, RunMRU, proxy logs |
| Eradicate | Remove the loader, auto.exe, hmn_hook.dll and the VLCAssistant script; restore shortcuts from the .backup copies only after review; remove any run-key or task found; reimage if elevation or the DLL is confirmed | IR | File list with hashes, shortcut before/after |
| Credentials | Treat the user as exposed: reset the password, revoke sessions and tokens, review MFA and mail rules. The loader can deliver additional payloads over Tox, so the scope of exposure is unknown | Identity | Reset and revoke log |
| Recover | Return to service after a clean re-scan; keep enhanced logging 30 days; add confirmed hashes to the IOC list | IR / IT | Sign-off |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | Gap | SentinelOne | Defender XDR |
|---|---|---|---|---|---|---|---|
| T1204.004 | ClickFix paste | Q3, Q5 | IOA 1 | Partial | The lure page and clipboard are outside endpoint telemetry; Q5 is generic | Good, with assumptions | Good, with assumptions |
| T1105 | Quick Tunnel fetch | Q3, Q4 | IOA 1 | Good | Browser-originated lookups excluded; tunnel names rotate | Good, with assumptions | Good, with assumptions |
| T1547.009 | Shortcut and launcher persistence | Q6, Q7 | IOA 2 | Partial | Shortcut file edits have no verified event here; use the native sweep | Good, with assumptions | Good, with assumptions |
| T1548.002 | UACMe method 41 | Q2, Q8 | IOA 3, IOA 4 | Partial | Elevation success was not confirmed by Varonis; pattern is shared by other bypasses | Good, with assumptions | Partial: Q2 approximate |
| T1014 | NtQuerySystemInformation hook | Q1, Q2 | IOA 4 | GAP | Only the DLL file is visible; the in-memory hook is not | Good, with assumptions | Partial: Q1 telemetry gap, Q2 approximate |
| T1071 | Tox P2P C2 | Q10, Q11 | none | GAP | Tox is encrypted and decentralised; no C2 address was published; Q10 and Q11 are weak, analyst-added heuristics | Partial: Q11 approximate | Partial: Q11 approximate |
| T1036 | Numeric-named loader | Q1, Q9 | none | Partial | Rebuilt samples change hashes; names alone are noisy | Good, with assumptions | Partial: Q1 telemetry gap |
Honest limits: endpoint telemetry cannot see the lure page, the clipboard, Tox payloads or the in-memory hook. Network-indicator coverage is weak by design of the malware. Validation gates are in section 11; no query has been run against a live tenant.
Hunt Summary Ticket
TITLE: AvisLoader Windows loader (Tox P2P C2, ClickFix delivery) SEVERITY: High (single-origin intelligence; capabilities not confirmed in victims) DATE: 2026-10-15 VERSION: v0.1 Draft 2026-10-15 SCOPE: Windows workstations, especially users who handle document-signing links HYPOTHESIS: A ClickFix paste fetches code from a Cloudflare Quick Tunnel, installs a Tox-based loader, and persists through shortcut and VBScript hijack. QUERIES: Q1 hashes; Q2 filenames; Q3 tunnel in command line; Q4 tunnel DNS; Q5 paste shape; Q6 VLCAssistant; Q7 explorer-vbs; Q8 dllhost child; Q9 numeric exe; Q10 Tox port; Q11 P2P fan-out DO FIRST: Run Q1, Q3, Q6 over 30 days; sweep desktop and taskbar shortcuts on suspect hosts. FINDINGS: any published hash, VLCAssistant, a shell referencing trycloudflare.com, or a dllhost-spawned shell. GAPS: the lure page, clipboard, Tox traffic and the in-memory API hook are outside endpoint telemetry. ACTIONS: contain, run section 14, reset credentials, add shortcut auditing, pilot ASR and WSH hardening. OWNER: SOC / Incident Response / Identity FOLLOW-UP: Re-hunt after 7 and 30 days and on any new Varonis or vendor indicators.
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| 1 | Varonis Threat Labs: Meet AvisLoader | Primary: behaviour, hashes, MITRE table | 2026-10-15 |
| 2 | Hackread | Corroboration, user guidance | 2026-10-15 |
| 2 | Cyber Security News | Corroboration, IOC table copy | 2026-10-15 |
| 2 | SOC Prime | Corroboration, generic detection ideas | 2026-10-15 |
| ref | Microsoft: attack surface reduction rules reference; MITRE ATT&CK mitigations; CIS Microsoft Windows benchmarks | Hardening authority | 2026-10-15 |
Generated 2026-10-15 by HuntPack. Defensive content only.