Sirius Backdoor: FedEx Tax-Invoice Fileless Campaign
Executive Summary
Trellix (published 2026-10-26) describes a Korean-language spear-phishing campaign that poses as a FedEx tax invoice and delivers a previously undocumented variant of the Sirius Backdoor, a Microsoft Visual C++ remote-access backdoor. A ZIP carries a visually blank PDF whose /OpenAction and /Launch objects run hidden, encoded PowerShell. Each stage decrypts and reflectively loads the next in memory, the last stage patches ETW to blind endpoint sensors, then hollows msbuild.exe or svchost.exe with Early Bird APC injection to run the backdoor.
The operator gets hidden-desktop (HVNC) control, an embedded SOCKS5 proxy, webcam and microphone capture, a keylogger, a regex-driven cryptocurrency clipboard hijacker and Chromium credential harvesting. Persistence is unusually deep: Run key, scheduled task, Startup items, a logon script hijack, default-profile poisoning and a provisioning package that survives a full Windows reset.
Defensive angle: almost nothing lands on disk, and the stock binaries (svchost.exe, msbuild.exe, powershell.exe) are the cover. The highest-value detections are parent-context hunts: a PDF reader starting PowerShell (Q1), the exact stager flag set (Q2) and a hollowing host with the wrong parent (Q3). Atomic indicators are few and single-origin, so every one ships as detect.
Defender priority: enable the Adobe Reader child-process ASR rule in audit mode this week and run Q1 and Q3 across 30 days. If a host hits, reimage rather than reset: the .ppkg persistence is built to survive Push-Button Reset.
Source Review & Web Hunter Notes
| Tier | Source | Key finding | Carry forward |
|---|---|---|---|
| 1 vendor primary | Trellix, Unveiling Sirius Backdoor (2026-10-26) | Full chain, config structure, persistence flags, capabilities, Appendix A hashes and network indicators, defensive recommendations | YES |
| 3 secondary | Cyber Security News (2026-10-27) | Independent write-up of the Trellix report. Same hash table and network indicators, no new indicators | PARTIAL |
Source independence: the second source republishes Trellix's findings and indicators; it confirms that the values were transcribed consistently but is not independent analysis. Every atomic IOC therefore has one origin, so none ships at prevent or critical severity. Snapshots of both are saved beside this file in Sirius-Backdoor-FedEx-Hunt-sources/.
Decisions: no indicators from related campaigns were added. The sample config values (svchost.exe, %APPDATA%\Microsoft, %TEMP%\msupdate) are treated as a sample variant, so they become path and parent hunts, not blocks. The Trellix threat name is used as published; no other name is coined here.
Hunt Brief & Attack Chain
Hunt hypotheses
| # | Hypothesis | MITRE | Confidence | Queries |
|---|---|---|---|---|
| H1 | A PDF reader process starts a shell or script host after a user opens the blank invoice. | T1204.002, T1059.001 | HIGH | Q1, Q2, Q13 |
| H2 | A trusted host process (msbuild.exe, svchost.exe) is created by a shell or by something other than services.exe, then makes raw-TCP connections. | T1055.004, T1055.012 | MEDIUM | Q3, Q4, Q11 |
| H3 | The payload or a sideloaded user32.dll is written to disk outside the system directories. | T1036.005, T1574.001 | HIGH | Q4, Q5, Q12 |
| H4 | Behavior-flag persistence leaves registry, scheduled-task and Startup artifacts. | T1547.001, T1037.001, T1053.005, T1037.003 | MEDIUM | Q6, Q7, Q8 |
| H5 | Post-compromise defense impairment: Defender exclusions and shadow copy deletion. | T1562.001, T1490 | MEDIUM | Q9 |
| H6 | Endpoints contact the C2 address or the zeus.dat host. | T1071.001, T1095 | HIGH | Q10, Q11 |
Attack chain
| Step | Behavior | Telemetry (plain terms, then platforms) | Hunt angle |
|---|---|---|---|
| 1 Lure | Korean FedEx tax-invoice email, ZIP with blank PDF | Mail gateway and archive write (CrowdStrike: ZipFileWritten. SentinelOne: File Creation. Defender: DeviceFileEvents, EmailEvents) | Q13, native hunt N1 |
| 2 Trigger | PDF /OpenAction + /Launch runs hidden encoded PowerShell | Process creation with command line and parent (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | Q1, Q2 |
| 3 Stage 0 to 1 | AES-256-CBC + GZip decrypt, reflective .NET load, RC4 and 3-to-1 de-interleave | PowerShell script block content (Windows event 4104). No endpoint event of its own | Native hunt N2 |
| 4 Stage 2 | Patch EtwEventWrite and NtManageHotPatch, download zeus.dat over HTTP, hollow msbuild or svchost via NtQueueApcThread | Process creation with parent; outbound connection; DNS lookup (CrowdStrike: NetworkConnectIP4, DnsRequest. SentinelOne: IP Connect, DNS Resolved. Defender: DeviceNetworkEvents) | Q3, Q10, Q11 |
| 5 Install | Payload written as svchost.exe or user32.dll | Executable file write (CrowdStrike: PeFileWritten, NewExecutableWritten. SentinelOne: File Creation. Defender: DeviceFileEvents) | Q4, Q5 |
| 6 Persist | Run key, scheduled task, Startup .lnk/.vbs, UserInit script, BootExecute, default hive, PPKG, SetupComplete.cmd | Registry value set; process creation; non-PE file creation (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) | Q6, Q7, Q8, native N4 |
| 7 Operate | HVNC, SOCKS5, capture, clipboard hijack, Chromium theft, Defender exclusions, VSS delete | Process creation; outbound connection (as above) | Q9, Q10, Q11 |
Consolidated IOC Table
All values re-derived from the saved Trellix snapshot and cross-read against the second snapshot. All ship as detect: one origin, and none is a legitimate binary. Hashes are mostly for gateway and retrospective search because the loader, injector and backdoor run in memory only.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| sha256 | 87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51 | high | detect | Email (.eml) | 2027-04-30 |
| sha256 | 7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105 | high | detect | Fedex_tax_receipt.zip | 2027-04-30 |
| sha256 | 6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4 | high | detect | Fedex_tax_receipt.pdf | 2027-04-30 |
| sha256 | 899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05 | high | detect | .NET Stage 1 loader | 2027-04-30 |
| sha256 | eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c | high | detect | .NET Stage 2 injector | 2027-04-30 |
| sha256 | d6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee | high | detect | Sirius Backdoor (zeus.dat payload) | 2027-04-30 |
| md5 | 3cc5147d1dbe295c63da958afadac6c6 | high | detect | Email (.eml) | 2027-04-30 |
| md5 | 6ffcf5f7aa4b3b75b06bd7a7f49366a8 | high | detect | Fedex_tax_receipt.zip | 2027-04-30 |
| md5 | 39993389e1e95ebbd55aa54058cf7b52 | high | detect | Fedex_tax_receipt.pdf | 2027-04-30 |
| md5 | 64a9940fc78de8a895d968a4092ed10b | high | detect | .NET Stage 1 loader | 2027-04-30 |
| md5 | 62a458eb260e7aa26092dbdf9c2d8ed4 | high | detect | .NET Stage 2 injector | 2027-04-30 |
| md5 | e8b080c276519547e95930ab15028adb | high | detect | Sirius Backdoor (zeus.dat payload) | 2027-04-30 |
| ipv4 | 185.114.206.45 (port 4449) | high | detect | Backdoor C2 from the analysed config | 2027-01-30 |
| domain | dubaitechnicalservice.ae | high | detect | Hosts /prood/zeus.dat; Trellix NX has a named signature for it | 2027-01-30 |
| behavior | zeus.dat over HTTP from a PowerShell parent | medium | hunt | Filename of the downloaded final payload | n/a |
Affected Surface & Telemetry Matrix
| Surface | Telemetry (plain terms, then platforms) | Priority | Gap |
|---|---|---|---|
| Windows endpoints with a PDF reader | Process creation with parent and command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents) | P1 | None |
| Mail gateway | Message and attachment inspection, subject and attachment name | P1 | Outside endpoint telemetry |
| Hollowed host network | Outbound connection with process name (CrowdStrike: NetworkConnectIP4. SentinelOne: IP Connect. Defender: DeviceNetworkEvents) | P2 | None |
| Persistence registry | Registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate. SentinelOne: Registry Value Modified. Defender: DeviceRegistryEvents) | P2 | Hive mounted under HKEY_USERS\SURV_DEFAULT may not be reported uniformly |
| Startup, PPKG, SetupComplete.cmd files | Non-executable file creation | P2 | Outside endpoint telemetry for the CrowdStrike events used here; use Sysmon event 11 or file-system audit |
| Injection internals | Cross-process memory write and APC queue | P3 | Not a hunt event in the verified Falcon event set; rely on sensor prevention and Q3 context |
| PowerShell content | Script block logging (Windows event 4104) | P2 | Outside endpoint telemetry; needs the logging policy in Playbook P2 |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query or control |
|---|---|---|---|
| Initial Access | T1566.001 Spearphishing Attachment | Korean FedEx invoice email with Fedex_tax_receipt.zip | Q13, N1, P6 |
| Execution | T1204.002 Malicious File | User opens Fedex_tax_receipt.pdf | Q1, Q13 |
| Execution | T1059.001 PowerShell | PDF /Launch runs encoded PowerShell | Q1, Q2, P2 |
| Execution | T1059.003, T1059.005 | schtasks, logon.cmd, SetupComplete.cmd, updater.vbs | Q7, Q8 |
| Persistence | T1547.001 Run Keys / Startup Folder | HKCU Run, Startup .lnk and .vbs | Q6, Q8, N4 |
| Persistence | T1053.005 Scheduled Task | Generated XML task, LogonTrigger, HighestAvailable | Q7 |
| Persistence | T1037.001 Logon Script (Windows) | UserInitMgrLogonScriptName to logon.cmd (Trellix labels this T1547.010) | Q6, Q8 |
| Persistence | T1037.003 SetupComplete | C:\Windows\Setup\Scripts\SetupComplete.cmd | Q8, N4 |
| Persistence | T1547 Provisioning package | SysConfig_<CRC32>.ppkg in C:\Recovery\Customizations | Q8, N4 |
| Defense Evasion | T1055.004 APC injection; T1055.012 hollowing | Early Bird APC into msbuild.exe or svchost.exe | Q3, Q4, Q11 |
| Defense Evasion | T1562.002 / T1562.001 Impair defenses | Patch EtwEventWrite; Defender exclusions | Q9, N2 |
| Defense Evasion | T1140 Deobfuscate; T1620 Reflective loading | AES, GZip, RC4, de-interleave, Assembly.Load | N2 |
| Defense Evasion | T1548.002 UAC bypass; T1574.001 DLL sideload | RUNASADMIN flag; user32.dll copy | Q5, Q6 |
| Credential Access | T1555.003, T1056.001 | Chromium harvest, keylogging, clipboard | Containment C2 |
| Command and Control | T1071.001, T1095, T1219 | zeus.dat over HTTP; raw TCP C2; HVNC and SOCKS5 | Q10, Q11 |
| Impact | T1490 Inhibit Recovery | Volume Shadow Copy deletion | Q9 |
Native Audit-Log Hunts
| # | Source | Check | Why |
|---|---|---|---|
| N1 | Mail gateway | Search 30 days for subject [FedEx] A tax invoice has been issued. and for attachment Fedex_tax_receipt.zip; list recipients and any that opened it | Lure fingerprint from Trellix; Korean-language recipients are the stated target |
| N2 | Windows PowerShell Operational log | Event 4104 with Reflection.Assembly, AesManaged and GZipStream in one script block | Reconstructed stager content, per Trellix recommendation. Needs script block logging on |
| N3 | Defender Operational log | Events 1121 and 1122 for the Adobe Reader child-process rule GUID | Shows blocked or audited PDF-launched children |
| N4 | Sysmon or file-system audit | File creation of *.ppkg under C:\Recovery\Customizations, SetupComplete.cmd, updater.vbs, WindowsUpdate.lnk in Startup | Non-PE artifacts the Falcon events used here do not cover |
| N5 | Windows Security log | Event 4698 (task created) and 4688 with command line for schtasks /create /xml | Task registration cross-check for Q7 |
| N6 | Proxy or firewall | Connections to 185.114.206.45 on 4449/tcp and requests to dubaitechnicalservice.ae | Network twin of Q10; covers unmanaged hosts |
| N7 | Provisioning log | Microsoft-Windows-Provisioning-Diagnostics-Provider/Admin entries for unexpected packages | Surfaces a dropped provisioning package being applied |
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.
Looks for: The core Sirius trigger: the blank Fedex_tax_receipt.pdf runs powershell.exe through a /Launch action, so the PDF reader is the parent. A PDF reader should almost never start a shell. Trellix recommends alerting on exactly this lineage.
Known limitations and deployment notes
- PowerQuery: A shell started by a process the agent did not observe starting is not captured.
- PowerQuery assumes: The process name field holds the base file name, with the .exe extension on Windows; the optional extension in the pattern covers both forms.
- KQL – Defender XDR: A shell started by a process the sensor did not observe starting is not captured.
- KQL – Defender XDR assumes: FileName holds the base file name, with the .exe extension on Windows.
// HUNT: PDF reader launches PowerShell or a script host // MITRE: T1204.002, T1059.001, T1566.001 // CONF: high FP: low COST: low | REQUIRES: process creation with parent (ProcessRollup2) // FALSE POSITIVES: rare PDF workflows that call a helper script // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^(AcroRd32|Acrobat|AcroCEF|Foxit.*|SumatraPDF|PDFXCview)(\.exe)?$/i | FileName=/^(powershell|pwsh|cmd|wscript|cscript|mshta)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timesrc.process.name: Creator process nametgt.process.name: Created process name
Recommended fields
tgt.process.cmdline: Created command lineendpoint.name: Host
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, event.time, src.process.name, tgt.process.name, tgt.process.cmdline
// HUNT: PDF reader launches PowerShell or a script host // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1204.002, T1059.001, T1566.001 // CONF: high | FP: low // FALSE POSITIVES: rare PDF workflows that call a helper script // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: a PDF reader as the creator and a shell or script host as the created process. On a Process Creation event the creator is src.process and the new process is tgt.process. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint process-creation telemetry // TUNING: Exclude a sanctioned PDF workflow that calls a helper script, by creator and command line, after a baseline review. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: A shell started by a process the agent did not observe starting is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' src.process.name matches '^(AcroRd32|Acrobat|AcroCEF|Foxit.*|SumatraPDF|PDFXCview)(\\.exe)?$' tgt.process.name matches '^(powershell|pwsh|cmd|wscript|cscript|mshta)(\\.exe)?$' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Creator process nameFileName: 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, ProcessCommandLine | take 5
// HUNT: PDF reader launches PowerShell or a script host // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1204.002, T1059.001, T1566.001 // CONF: high | FP: low // FALSE POSITIVES: rare PDF workflows that call a helper script // EQUIVALENCE: equivalent-with-schema-assumptions - Same process-creation predicate: the creator is InitiatingProcessFileName and the created process is FileName. The regex is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Exclude a sanctioned PDF workflow that calls a helper script, by creator and command line, after a baseline review. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A shell started by a process the sensor did not observe starting is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where InitiatingProcessFileName matches regex @"(?i)^(AcroRd32|Acrobat|AcroCEF|Foxit.*|SumatraPDF|PDFXCview)(\.exe)?$" | where FileName matches regex @"(?i)^(powershell|pwsh|cmd|wscript|cscript|mshta)(\.exe)?$" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: The exact argument set the PDF passes: hidden window, no profile, non-interactive, execution policy bypass and an encoded command. The conjunction is what makes it specific; any one flag alone is common. FP: software-deployment and endpoint-management agents sometimes use the same flag set. Exclude by parent process, not by blanket flag.
Known limitations and deployment notes
- PowerQuery: A PowerShell launch whose command line is truncated or hidden from the agent is not captured.
- PowerQuery assumes: The command line field holds the full untruncated command line; a very long encoded command may be truncated on some tenants.
- KQL – Defender XDR: A PowerShell launch the sensor did not observe starting is not captured.
- KQL – Defender XDR assumes: ProcessCommandLine holds the full untruncated command line.
// HUNT: Hidden encoded PowerShell with the stager flag set // MITRE: T1059.001, T1027, T1140 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line (ProcessRollup2) // FALSE POSITIVES: management and deployment tools that launch hidden encoded PowerShell // TUNING: exclude your software-deployment agent parent processes and known signed management scripts by ParentBaseFileName; keep PDF readers, Office and browsers in scope // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(powershell|pwsh)(\.exe)?$/i | CommandLine=/-w(indowstyle)?\s+h(idden)?\b/i | CommandLine=/-nop(rofile)?\b/i | CommandLine=/-noni(nteractive)?\b/i | CommandLine=/-ep\s+bypass|-executionpolicy\s+bypass/i | CommandLine=/\s-(e|enc|encodedcommand)\s+[A-Za-z0-9+=]{40,}/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.name: Created process nametgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator processendpoint.name: Host
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, event.time, tgt.process.name, tgt.process.cmdline
// HUNT: Hidden encoded PowerShell with the stager flag set
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1059.001, T1027, T1140
// CONF: medium | FP: medium
// FALSE POSITIVES: management and deployment tools that launch hidden encoded PowerShell
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: PowerShell created with the hidden window, no-profile, non-interactive and execution-policy-bypass switches, plus an encoded command of 40 or more base64 characters. Each switch is its own condition, as in the CQL. Matching is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne endpoint process-creation telemetry with full command lines
// TUNING: Exclude your software-deployment agent creators and known signed management scripts by creator name; keep PDF readers, Office and browsers in scope.
// LOOKBACK: 30d; set the console time picker to match the CQL tab
// CONFIGURATION: No data table or lookup required.
// KNOWN GAPS: A PowerShell launch whose command line is truncated or hidden from the agent is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.name matches '^(powershell|pwsh)(\\.exe)?$' tgt.process.cmdline matches '-w(indowstyle)?\\s+h(idden)?\\b' tgt.process.cmdline matches '-nop(rofile)?\\b' tgt.process.cmdline matches '-noni(nteractive)?\\b' tgt.process.cmdline matches '-ep\\s+bypass|-executionpolicy\\s+bypass' tgt.process.cmdline matches '\\s-(e|enc|encodedcommand)\\s+[A-Za-z0-9+=]{40,}'
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid
| sort -event.time
| limit 200Automated 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: Creator 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: Hidden encoded PowerShell with the stager flag set
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1059.001, T1027, T1140
// CONF: medium | FP: medium
// FALSE POSITIVES: management and deployment tools that launch hidden encoded PowerShell
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: PowerShell created with the hidden window, no-profile, non-interactive and execution-policy-bypass switches, plus an encoded command of 40 or more base64 characters. Each switch is its own regex condition, as in the CQL, and (?i) reproduces the CQL /i intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude your software-deployment agent creators and known signed management scripts by InitiatingProcessFileName; keep PDF readers, Office and browsers in scope.
// LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A PowerShell launch the sensor did not observe starting is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where FileName matches regex @"(?i)^(powershell|pwsh)(\.exe)?$"
| where ProcessCommandLine matches regex @"(?i)-w(indowstyle)?\s+h(idden)?\b"
| where ProcessCommandLine matches regex @"(?i)-nop(rofile)?\b"
| where ProcessCommandLine matches regex @"(?i)-noni(nteractive)?\b"
| where ProcessCommandLine matches regex @"(?i)-ep\s+bypass|-executionpolicy\s+bypass"
| where ProcessCommandLine matches regex @"(?i)\s-(e|enc|encodedcommand)\s+[A-Za-z0-9+=]{40,}"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: Stage 2 creates a trusted host (msbuild.exe or svchost.exe) suspended and hollows it. Because the injector runs inside PowerShell, the host's parent is a shell, not Visual Studio or services.exe. The hunt keys on that parent context and never on the stock binary. FP: developer machines running msbuild from a shell, and uncommon svchost launchers. Tune by parent, never by blocking the binary.
Known limitations and deployment notes
- PowerQuery: A hollowed host started by a creator the agent did not observe is not captured.
- PowerQuery assumes: The creator name field is populated for the events of interest, which the presence test src.process.name = * requires.
- KQL – Defender XDR: A hollowed host started by a creator the sensor did not observe is not captured.
- KQL – Defender XDR assumes: InitiatingProcessFileName is populated for the events of interest.
// HUNT: Process-hollowing host with an anomalous parent // MITRE: T1055.004, T1055.012, T1036.005 // CONF: medium FP: medium COST: low | REQUIRES: process creation with parent (ProcessRollup2) // FALSE POSITIVES: build tooling that legitimately shells msbuild.exe; rare svchost launchers // TUNING: add parent names that your build servers and developer tooling use for msbuild.exe; for svchost.exe exclude any parent you confirm on a clean host // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=* | (FileName=/^msbuild(\.exe)?$/i and ParentBaseFileName=/^(powershell|pwsh|cmd|wscript|cscript|mshta|AcroRd32|Acrobat)(\.exe)?$/i) or (FileName=/^svchost(\.exe)?$/i and ParentBaseFileName!=/^services(\.exe)?$/i) | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timesrc.process.name: Creator process nametgt.process.name: Created process name
Recommended fields
tgt.process.image.path: Created image pathtgt.process.cmdline: Created command line
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, event.time, src.process.name, tgt.process.name
// HUNT: Process-hollowing host with an anomalous parent // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1055.004, T1055.012, T1036.005 // CONF: medium | FP: medium // FALSE POSITIVES: build tooling that legitimately shells msbuild.exe; rare svchost launchers // EQUIVALENCE: equivalent-with-schema-assumptions - Same two branches: msbuild created by a script host or PDF reader, or svchost created by anything other than services. The new process is tgt.process and its creator is src.process on a Process Creation event. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint process-creation telemetry // TUNING: Add the creators your build servers and developer tooling use for msbuild; for svchost exclude any creator you confirm on a clean host. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: A hollowed host started by a creator the agent did not observe is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' src.process.name = * ((tgt.process.name matches '^msbuild(\\.exe)?$' and src.process.name matches '^(powershell|pwsh|cmd|wscript|cscript|mshta|AcroRd32|Acrobat)(\\.exe)?$') or (tgt.process.name matches '^svchost(\\.exe)?$' and !(src.process.name matches '^services(\\.exe)?$'))) | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.image.path, tgt.process.cmdline, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Creator process nameFileName: Created process name
Recommended fields
FolderPath: Created image pathProcessCommandLine: Created command line
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceProcessEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, FileName | take 5
// HUNT: Process-hollowing host with an anomalous parent // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1055.004, T1055.012, T1036.005 // CONF: medium | FP: medium // FALSE POSITIVES: build tooling that legitimately shells msbuild.exe; rare svchost launchers // EQUIVALENCE: equivalent-with-schema-assumptions - Same two branches: msbuild created by a script host or PDF reader, or svchost created by anything other than services. The creator is InitiatingProcessFileName. The regex is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Add the creators your build servers and developer tooling use for msbuild; for svchost exclude any creator you confirm on a clean host. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A hollowed host started by a creator the sensor did not observe is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where isnotempty(InitiatingProcessFileName) | where (FileName matches regex @"(?i)^msbuild(\.exe)?$" and InitiatingProcessFileName matches regex @"(?i)^(powershell|pwsh|cmd|wscript|cscript|mshta|AcroRd32|Acrobat)(\.exe)?$") or (FileName matches regex @"(?i)^svchost(\.exe)?$" and not(InitiatingProcessFileName matches regex @"(?i)^services(\.exe)?$")) | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, FolderPath, ProcessCommandLine | sort by Timestamp desc | take 200
Looks for: The analysed config installs the payload as svchost.exe under %APPDATA%\Microsoft with a fallback of %TEMP%\msupdate. A real svchost only runs from System32, SysWOW64 or WinSxS. This is a path hunt: the name is abused, the binary is not blocked.
Known limitations and deployment notes
- PowerQuery: A copy that never starts as a new process is not captured.
- PowerQuery assumes: The image path field holds the full path of the created process.
- KQL – Defender XDR: A copy that never starts as a new process is not captured.
- KQL – Defender XDR assumes: FolderPath holds the full image path of the created process, including the file name.
// HUNT: svchost.exe running outside the Windows system directories // MITRE: T1036.005, T1055 // CONF: high FP: low COST: low | REQUIRES: process creation with image path (ProcessRollup2) // FALSE POSITIVES: none expected; a renamed copy is not legitimate // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^svchost(\.exe)?$/i | ImageFileName!=/\\Windows\\(System32|SysWOW64|WinSxS)\\/i | table([@timestamp, ComputerName, UserName, ImageFileName, ParentBaseFileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.name: Created process nametgt.process.image.path: Created image path
Recommended fields
src.process.name: Creator processtgt.process.cmdline: Created command line
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.image.path = * | limit 5 | columns event.type, event.time, tgt.process.name, tgt.process.image.path
// HUNT: svchost.exe running outside the Windows system directories // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1036.005, T1055 // CONF: high | FP: low // FALSE POSITIVES: none expected; a renamed copy is not legitimate // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a process named svchost whose image path is outside the Windows System32, SysWOW64 and WinSxS directories. The image path is tgt.process on a Process Creation event. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint process-creation telemetry with image paths // TUNING: None expected; a renamed copy is not legitimate. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: A copy that never starts as a new process is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.name matches '^svchost(\\.exe)?$' !(tgt.process.image.path matches '\\\\Windows\\\\(System32|SysWOW64|WinSxS)\\\\') | columns event.time, endpoint.name, src.process.user, tgt.process.image.path, src.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid | sort -event.time | limit 200
Automated 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: Creator processProcessCommandLine: 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, FileName, FolderPath | take 5
// HUNT: svchost.exe running outside the Windows system directories // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1036.005, T1055 // CONF: high | FP: low // FALSE POSITIVES: none expected; a renamed copy is not legitimate // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a process named svchost whose path is outside the Windows System32, SysWOW64 and WinSxS directories. The regex is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: None expected; a renamed copy is not legitimate. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A copy that never starts as a new process is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where FileName matches regex @"(?i)^svchost(\.exe)?$" | where not(FolderPath matches regex @"(?i)\\Windows\\(System32|SysWOW64|WinSxS)\\") | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, FolderPath, InitiatingProcessFileName, ProcessCommandLine, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: Behavior flag 0x0020 copies the backdoor to C:\Windows\System32\user32.dll for sideloading, and the default install writes svchost.exe into a user directory. Either write is anomalous. Pair a hit with the file hash against Q12. FP: Windows servicing replacing user32.dll. The exclusion line removes the servicing writers.
Known limitations and deployment notes
- PowerQuery: An existing file overwritten in place raises a modification event rather than a creation event and is not captured.
- PowerQuery assumes: File Creation covers the executable writes that the CQL reads from its two executable-write events; a file modified in place is not covered.
- PowerQuery assumes: The file path field holds the full path of the written file.
- KQL – Defender XDR: An existing file overwritten in place records a modification action rather than a creation and is not captured.
- KQL – Defender XDR assumes: FileCreated is the action type recorded for an executable written to disk; a file modified in place is not covered.
// HUNT: Payload drop: svchost.exe outside system paths or user32.dll into System32 // MITRE: T1036.005, T1574.001, T1547 // CONF: high FP: low COST: low | REQUIRES: executable file write (CrowdStrike: PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: servicing writes user32.dll via TrustedInstaller and TiWorker // TUNING: exclude the Windows servicing writers shown below; do not exclude svchost.exe or msbuild.exe as writers because the hollowed host is the likely writer // LOOKBACK: 30d #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | (TargetFileName=/\\Windows\\System32\\user32\.dll$/i) or (TargetFileName=/\\svchost\.exe$/i and TargetFileName!=/\\Windows\\(System32|SysWOW64|WinSxS)\\/i) | ContextBaseFileName!=/^(TiWorker|TrustedInstaller|SetupHost|MoUsoCoreWorker)(\.exe)?$/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName, SHA256HashData, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- File Creation
Required fields
event.type: Event typeevent.time: Event timetgt.file.path: Written file pathsrc.process.name: Writer process name
Recommended fields
endpoint.name: Host
Optional fields
tgt.file.sha256: Hash. Population varies by tenant.
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'File Creation' tgt.file.path = * src.process.name = * | limit 5 | columns event.type, event.time, tgt.file.path, src.process.name
// HUNT: Payload drop: svchost.exe outside system paths or user32.dll into System32 // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1036.005, T1574.001, T1547 // CONF: high | FP: low // FALSE POSITIVES: servicing writes user32.dll via TrustedInstaller and TiWorker // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: user32.dll written under Windows System32, or svchost.exe written outside the system directories, by a writer other than the Windows servicing processes. The writer is src.process on a File Creation event. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint file-creation telemetry // TUNING: Exclude the Windows servicing writers already listed; do not exclude svchost or msbuild as writers because the hollowed host is the likely writer. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: An existing file overwritten in place raises a modification event rather than a creation event and is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'File Creation' ((tgt.file.path matches '\\\\Windows\\\\System32\\\\user32\\.dll$') or (tgt.file.path matches '\\\\svchost\\.exe$' and !(tgt.file.path matches '\\\\Windows\\\\(System32|SysWOW64|WinSxS)\\\\'))) !(src.process.name matches '^(TiWorker|TrustedInstaller|SetupHost|MoUsoCoreWorker)(\\.exe)?$') | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.file.path, tgt.file.sha256, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeActionType: ActionFileName: Written file nameFolderPath: Written file folderInitiatingProcessFileName: Writer process name
Recommended fields
DeviceName: Host
Optional fields
SHA1: Hash
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, FileName, FolderPath, InitiatingProcessFileName | take 5
// HUNT: Payload drop: svchost.exe outside system paths or user32.dll into System32 // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1036.005, T1574.001, T1547 // CONF: high | FP: low // FALSE POSITIVES: servicing writes user32.dll via TrustedInstaller and TiWorker // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: user32.dll written under Windows System32, or svchost.exe written outside the system directories, by a writer other than the Windows servicing processes. The writer is InitiatingProcessFileName. The folder test is a substring match so it works whether the column holds the folder or the full path. // REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents) // TUNING: Exclude the Windows servicing writers already listed; do not exclude svchost or msbuild as writers because the hollowed host is the likely writer. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: An existing file overwritten in place records a modification action rather than a creation and is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceFileEvents | where Timestamp >= ago(30d) | where ActionType == "FileCreated" | where (FileName =~ "user32.dll" and FolderPath contains "\\Windows\\System32") or (FileName =~ "svchost.exe" and FolderPath !contains "\\Windows\\System32" and FolderPath !contains "\\Windows\\SysWOW64" and FolderPath !contains "\\Windows\\WinSxS") | where not(InitiatingProcessFileName matches regex @"(?i)^(TiWorker|TrustedInstaller|SetupHost|MoUsoCoreWorker)(\.exe)?$") | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, FileName, FolderPath, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: Four of the documented persistence switches in one pass: the UserInitMgrLogonScriptName logon script, an appended BootExecute value, the HKEY_USERS\SURV_DEFAULT mount used to poison the Default profile, and ~ RUNASADMIN under AppCompatFlags Layers. FP: BootExecute edits by servicing, and RUNASADMIN set by compatibility tooling. UserInitMgrLogonScriptName and SURV_DEFAULT have no common benign writers.
Known limitations and deployment notes
- PowerQuery: A key created without a value write is not captured.
- PowerQuery assumes: Registry Value Modified covers the value-set events that the CQL reads from three registry events.
- PowerQuery assumes: registry.keyPath holds the full key path and registry.value the written data.
- KQL – Defender XDR: A key created without a value write is not captured.
- KQL – Defender XDR assumes: RegistryValueSet is the action type for the value writes of interest; a key created without a value write is not covered.
// HUNT: Sirius registry persistence: UserInit, BootExecute, default-hive, RUNASADMIN // MITRE: T1547.010, T1547.001, T1548.002, T1112 // CONF: medium FP: medium COST: low | REQUIRES: registry value set (CrowdStrike: AsepValueUpdate, RegGenericValueUpdate, RegSystemConfigValueUpdate) // FALSE POSITIVES: BootExecute servicing, application compatibility settings set by admins // TUNING: exclude the stock BootExecute value (autocheck autochk *) and RUNASADMIN writes made by your compatibility-management tooling; keep every UserInitMgrLogonScriptName and SURV_DEFAULT hit // LOOKBACK: 30d #event_simpleName=/^(AsepValueUpdate|RegGenericValueUpdate|RegSystemConfigValueUpdate)$/ | (RegValueName=/^(UserInitMgrLogonScriptName|BootExecute)$/i) or (RegObjectName=/SURV_DEFAULT/i) or (RegObjectName=/AppCompatFlags\\Layers/i and RegStringValue=/RUNASADMIN/i) | RegStringValue!=/^autocheck autochk \*$/i | table([@timestamp, ComputerName, ImageFileName, RegObjectName, RegValueName, RegStringValue, aid]) | sort(@timestamp, order=desc)
5 required fields · View requirements
Required telemetry
- Registry Value Modified
Required fields
event.type: Event typeevent.time: Event timeregistry.valueName: Registry value nameregistry.keyPath: Registry key pathregistry.value: Registry value data
Recommended fields
src.process.image.path: Writer image path
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'Registry Value Modified' registry.keyPath = * | limit 5 | columns event.type, event.time, registry.valueName, registry.keyPath, registry.value
// HUNT: Sirius registry persistence: UserInit, BootExecute, default-hive, RUNASADMIN // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1547.010, T1547.001, T1548.002, T1112 // CONF: medium | FP: medium // FALSE POSITIVES: BootExecute servicing, application compatibility settings set by admins // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a registry value named UserInitMgrLogonScriptName or BootExecute, a key path containing SURV_DEFAULT, or an AppCompatFlags Layers value containing RUNASADMIN, excluding the stock autocheck BootExecute value. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint registry telemetry // TUNING: Exclude RUNASADMIN writes made by your compatibility-management tooling; keep every UserInitMgrLogonScriptName and SURV_DEFAULT hit. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: A key created without a value write is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Registry Value Modified' ((registry.valueName matches '^(UserInitMgrLogonScriptName|BootExecute)$') or (registry.keyPath matches 'SURV_DEFAULT') or (registry.keyPath matches 'AppCompatFlags\\\\Layers' and registry.value matches 'RUNASADMIN')) !(registry.value matches '^autocheck autochk [*]$') | columns event.time, endpoint.name, src.process.image.path, registry.keyPath, registry.valueName, registry.value, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
5 required fields · View requirements
Required telemetry
- DeviceRegistryEvents
Required fields
Timestamp: Event timeActionType: ActionRegistryValueName: Registry value nameRegistryKey: Registry keyRegistryValueData: Registry value data
Recommended fields
InitiatingProcessFileName: Writer process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceRegistryEvents | where Timestamp > ago(1d) | project Timestamp, ActionType, RegistryKey, RegistryValueName, RegistryValueData | take 5
// HUNT: Sirius registry persistence: UserInit, BootExecute, default-hive, RUNASADMIN
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1547.010, T1547.001, T1548.002, T1112
// CONF: medium | FP: medium
// FALSE POSITIVES: BootExecute servicing, application compatibility settings set by admins
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a registry value named UserInitMgrLogonScriptName or BootExecute, a key containing SURV_DEFAULT, or an AppCompatFlags Layers value containing RUNASADMIN, excluding the stock autocheck BootExecute value. The contains and in~ operators are case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: Defender for Endpoint registry telemetry (DeviceRegistryEvents)
// TUNING: Exclude RUNASADMIN writes made by your compatibility-management tooling; keep every UserInitMgrLogonScriptName and SURV_DEFAULT hit.
// LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A key created without a value write is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceRegistryEvents
| where Timestamp >= ago(30d)
| where ActionType == "RegistryValueSet"
| where RegistryValueName in~ ("UserInitMgrLogonScriptName", "BootExecute") or RegistryKey contains "SURV_DEFAULT" or (RegistryKey contains "AppCompatFlags\\Layers" and RegistryValueData contains "RUNASADMIN")
| where RegistryValueData !~ "autocheck autochk *"
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, RegistryKey, RegistryValueName, RegistryValueData
| sort by Timestamp desc
| take 200Looks for: Behavior flag 0x0010 writes a generated XML task (LogonTrigger, RunLevel HighestAvailable) and registers it with schtasks.exe. The registering parent is the implant host or a shell, and the XML sits in a user-writable path. FP: software installers and endpoint agents that register tasks from XML in ProgramData.
Known limitations and deployment notes
- PowerQuery: A task registered through the Task Scheduler API without schtasks is not captured.
- PowerQuery assumes: The command line field holds the full command line, including the XML path.
- KQL – Defender XDR: A task registered through the Task Scheduler API without schtasks is not captured.
- KQL – Defender XDR assumes: ProcessCommandLine holds the full command line, including the XML path.
// HUNT: Scheduled task created from XML by a shell or user-writable path // MITRE: T1053.005, T1059.003 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line (ProcessRollup2) // FALSE POSITIVES: installers and management agents that register tasks from XML // TUNING: exclude XML paths under your software-deployment cache and parent processes of your management agent // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^schtasks(\.exe)?$/i | CommandLine=/\/create/i | CommandLine=/\/xml/i | (ParentBaseFileName=/^(svchost|msbuild|powershell|pwsh|wscript|cscript)(\.exe)?$/i) or (CommandLine=/\\(AppData|Temp|ProgramData)\\/i) | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
5 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.name: Created process nametgt.process.cmdline: Created command linesrc.process.name: Creator process name
Recommended fields
endpoint.name: Host
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 = * src.process.name = * | limit 5 | columns event.type, event.time, tgt.process.name, tgt.process.cmdline, src.process.name
// HUNT: Scheduled task created from XML by a shell or user-writable path // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1053.005, T1059.003 // CONF: medium | FP: medium // FALSE POSITIVES: installers and management agents that register tasks from XML // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: schtasks creating a task from an XML file, where the creator is svchost, msbuild or a script host, or the command line names an AppData, Temp or ProgramData folder. The creator is src.process on a Process Creation event. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint process-creation telemetry with full command lines // TUNING: Exclude XML paths under your software-deployment cache and the creators of your management agent. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: A task registered through the Task Scheduler API without schtasks is not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.name matches '^schtasks(\\.exe)?$' tgt.process.cmdline matches '/create' tgt.process.cmdline matches '/xml' ((src.process.name matches '^(svchost|msbuild|powershell|pwsh|wscript|cscript)(\\.exe)?$') or (tgt.process.cmdline matches '\\\\(AppData|Temp|ProgramData)\\\\')) | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeFileName: Created process nameProcessCommandLine: Created command lineInitiatingProcessFileName: Creator process name
Recommended fields
DeviceName: Host
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, InitiatingProcessFileName | take 5
// HUNT: Scheduled task created from XML by a shell or user-writable path // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1053.005, T1059.003 // CONF: medium | FP: medium // FALSE POSITIVES: installers and management agents that register tasks from XML // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: schtasks creating a task from an XML file, where the creator is svchost, msbuild or a script host, or the command line names an AppData, Temp or ProgramData folder. The creator is InitiatingProcessFileName. contains and (?i) reproduce the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Exclude XML paths under your software-deployment cache and the creators of your management agent. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A task registered through the Task Scheduler API without schtasks is not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where FileName matches regex @"(?i)^schtasks(\.exe)?$" | where ProcessCommandLine contains "/create" and ProcessCommandLine contains "/xml" | where InitiatingProcessFileName matches regex @"(?i)^(svchost|msbuild|powershell|pwsh|wscript|cscript)(\.exe)?$" or ProcessCommandLine matches regex @"(?i)\\(AppData|Temp|ProgramData)\\" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: Names Trellix documents: updater.vbs in Startup (non-admin fallback), WindowsUpdate.lnk, logon.cmd, SetupComplete.cmd and a SysConfig_<CRC32>.ppkg in C:\Recovery\Customizations. Command-line visibility only; file creation of non-PE artifacts is a telemetry gap (section 15). FP: SetupComplete.cmd is a normal Windows setup hook and provisioning packages are normal in managed fleets.
Known limitations and deployment notes
- PowerQuery: An artifact run without its name on any command line is not captured.
- PowerQuery assumes: The command line field holds the full command line.
- KQL – Defender XDR: An artifact run without its name on any command line is not captured.
- KQL – Defender XDR assumes: ProcessCommandLine holds the full command line.
// HUNT: Execution of Sirius persistence artifacts by name // MITRE: T1547.001, T1037.003, T1059.005, T1547 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line (ProcessRollup2) // FALSE POSITIVES: legitimate SetupComplete.cmd in imaging, legitimate provisioning packages // TUNING: exclude SetupComplete.cmd and provisioning-package commands on build and imaging hosts or in your Autopilot and provisioning service accounts; updater.vbs and WindowsUpdate.lnk have few benign users // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(updater\.vbs|WindowsUpdate\.lnk|logon\.cmd|SetupComplete\.cmd|SysConfig_[0-9A-Fa-f]{8}\.ppkg|Recovery\\Customizations)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator processtgt.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' tgt.process.cmdline = * | limit 5 | columns event.type, event.time, tgt.process.cmdline
// HUNT: Execution of Sirius persistence artifacts by name
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1547.001, T1037.003, T1059.005, T1547
// CONF: medium | FP: medium
// FALSE POSITIVES: legitimate SetupComplete.cmd in imaging, legitimate provisioning packages
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a command line naming one of the Sirius persistence artifacts (updater.vbs, WindowsUpdate.lnk, logon.cmd, SetupComplete.cmd, a SysConfig provisioning package, or the Recovery Customizations folder). Matching is case-insensitive, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne endpoint process-creation telemetry with full command lines
// TUNING: Exclude SetupComplete.cmd and provisioning-package commands on build and imaging hosts or in your provisioning service accounts; updater.vbs and WindowsUpdate.lnk have few benign users.
// LOOKBACK: 30d; set the console time picker to match the CQL tab
// CONFIGURATION: No data table or lookup required.
// KNOWN GAPS: An artifact run without its name on any command line is not captured.
// VALIDATION LEVEL: static-reviewed
event.type = 'Process Creation' tgt.process.cmdline matches '(updater\\.vbs|WindowsUpdate\\.lnk|logon\\.cmd|SetupComplete\\.cmd|SysConfig_[0-9A-Fa-f]{8}\\.ppkg|Recovery\\\\Customizations)'
| columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid
| sort -event.time
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Creator processFileName: Created process name
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, ProcessCommandLine | take 5
// HUNT: Execution of Sirius persistence artifacts by name
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1547.001, T1037.003, T1059.005, T1547
// CONF: medium | FP: medium
// FALSE POSITIVES: legitimate SetupComplete.cmd in imaging, legitimate provisioning packages
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a command line naming one of the Sirius persistence artifacts (updater.vbs, WindowsUpdate.lnk, logon.cmd, SetupComplete.cmd, a SysConfig provisioning package, or the Recovery Customizations folder). contains and (?i) reproduce the CQL /i intent.
// REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents)
// TUNING: Exclude SetupComplete.cmd and provisioning-package commands on build and imaging hosts or in your provisioning service accounts; updater.vbs and WindowsUpdate.lnk have few benign users.
// LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: An artifact run without its name on any command line is not captured.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceProcessEvents
| where Timestamp >= ago(30d)
| where ProcessCommandLine contains "updater.vbs" or ProcessCommandLine contains "WindowsUpdate.lnk" or ProcessCommandLine contains "logon.cmd" or ProcessCommandLine contains "SetupComplete.cmd" or ProcessCommandLine matches regex @"(?i)SysConfig_[0-9A-F]{8}\.ppkg" or ProcessCommandLine contains "Recovery\\Customizations"
| project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256
| sort by Timestamp desc
| take 200Looks for: Post-compromise defense impairment documented for the backdoor: adding Defender exclusions (commands 0xC5, 0xC7) and deleting Volume Shadow Copies (0xC6). Note the implant may use APIs rather than these command lines, so absence here does not clear a host. FP: IT automation and backup tools that manage Defender or shadow copies.
Known limitations and deployment notes
- PowerQuery: Exclusions set through Group Policy, the registry or an API without a command line are not captured.
- PowerQuery assumes: The command line field holds the full command line.
- KQL – Defender XDR: Exclusions set through Group Policy, the registry or an API without a command line are not captured.
- KQL – Defender XDR assumes: ProcessCommandLine holds the full command line.
// HUNT: Defender exclusions and shadow copy deletion // MITRE: T1562.001, T1490 // CONF: medium FP: medium COST: low | REQUIRES: process creation with command line (ProcessRollup2) // FALSE POSITIVES: backup software, IT automation and security tooling // TUNING: exclude the parent processes of your backup and IT-automation agents; keep any hit whose parent is powershell, svchost or msbuild started from a user session // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(Add-MpPreference.*-Exclusion(Path|Process|Extension)|Set-MpPreference.*-DisableRealtimeMonitoring|vssadmin(\.exe)?\s+delete\s+shadows|shadowcopy\s+delete)/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData, aid]) | sort(@timestamp, order=desc)
3 required fields · View requirements
Required telemetry
- Process Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.cmdline: Created command line
Recommended fields
src.process.name: Creator processtgt.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' tgt.process.cmdline = * | limit 5 | columns event.type, event.time, tgt.process.cmdline
// HUNT: Defender exclusions and shadow copy deletion // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1562.001, T1490 // CONF: medium | FP: medium // FALSE POSITIVES: backup software, IT automation and security tooling // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a command line that adds a Defender exclusion, disables real-time monitoring, or deletes shadow copies. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint process-creation telemetry with full command lines // TUNING: Exclude the creators of your backup and IT-automation agents; keep any hit whose creator is powershell, svchost or msbuild started from a user session. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: Exclusions set through Group Policy, the registry or an API without a command line are not captured. // VALIDATION LEVEL: static-reviewed event.type = 'Process Creation' tgt.process.cmdline matches '(Add-MpPreference.*-Exclusion(Path|Process|Extension)|Set-MpPreference.*-DisableRealtimeMonitoring|vssadmin(\\.exe)?\\s+delete\\s+shadows|shadowcopy\\s+delete)' | columns event.time, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.process.image.sha256, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceProcessEvents
Required fields
Timestamp: Event timeProcessCommandLine: Created command line
Recommended fields
InitiatingProcessFileName: Creator processFileName: Created process name
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, ProcessCommandLine | take 5
// HUNT: Defender exclusions and shadow copy deletion // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1562.001, T1490 // CONF: medium | FP: medium // FALSE POSITIVES: backup software, IT automation and security tooling // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: a command line that adds a Defender exclusion, disables real-time monitoring, or deletes shadow copies. (?i) reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint process-creation telemetry (DeviceProcessEvents) // TUNING: Exclude the creators of your backup and IT-automation agents; keep any hit whose creator is powershell, svchost or msbuild started from a user session. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: Exclusions set through Group Policy, the registry or an API without a command line are not captured. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceProcessEvents | where Timestamp >= ago(30d) | where ProcessCommandLine matches regex @"(?i)(Add-MpPreference.*-Exclusion(Path|Process|Extension)|Set-MpPreference.*-DisableRealtimeMonitoring|vssadmin(\.exe)?\s+delete\s+shadows|shadowcopy\s+delete)" | project Timestamp, ReportId, DeviceId, DeviceName, AccountName, InitiatingProcessFileName, FileName, ProcessCommandLine, SHA1, SHA256 | sort by Timestamp desc | take 200
Looks for: Both network indicators in one sweep: the backdoor C2 185.114.206.45:4449 and the zeus.dat host dubaitechnicalservice.ae. Run it over the longest retention you have, then re-run Q11 for the behavioral view.
Known limitations and deployment notes
- PowerQuery: If DNS events are not collected on a tenant, only the address half of the hunt returns rows.
- PowerQuery assumes: event.dns.request is the populated lookup field on this tenant; some schema versions use dns.request instead.
- PowerQuery assumes: The substring test also matches a longer name that merely contains the domain.
- KQL – Defender XDR: A name lookup that never led to a connection is not captured; use the CQL tab for the lookup events.
- KQL – Defender XDR assumes: RemoteUrl is populated for connections to the payload domain; it can be empty for connections made by address.
// HUNT: Sirius C2 address and payload domain // MITRE: T1071.001, T1095 // CONF: high FP: low COST: low | REQUIRES: outbound connection and DNS lookup (CrowdStrike: NetworkConnectIP4, DnsRequest) // FALSE POSITIVES: none expected for this IP and domain // LOOKBACK: 30d #event_simpleName=/^(NetworkConnectIP4|DnsRequest)$/ | (RemoteAddressIP4="185.114.206.45") or (DomainName=/(^|\.)dubaitechnicalservice\.ae$/i) | table([@timestamp, ComputerName, UserName, ContextBaseFileName, DomainName, RemoteAddressIP4, RemotePort, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- IP Connect
- DNS Resolved
Required fields
event.type: Event typeevent.time: Event timedst.ip.address: Destination addressevent.dns.request: Looked-up name
Recommended fields
src.process.name: Acting processdst.port.number: Destination port
Fallbacks
event.dns.request→dns.request: Some schema versions populate the other spelling; check which one returns rows.
Readiness test
event.category = 'dns' | limit 5 | columns event.type, event.time, dst.ip.address, event.dns.request
// HUNT: Sirius C2 address and payload domain // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1071.001, T1095 // CONF: high | FP: low // FALSE POSITIVES: none expected for this IP and domain // EQUIVALENCE: equivalent-with-schema-assumptions - Same two indicators across the two event populations the CQL reads: an outbound connection to the C2 address, or a DNS lookup of the payload domain. The domain test is a substring match, which also covers its subdomains. // REQUIRES: SentinelOne endpoint network and DNS telemetry // TUNING: None expected for this address and domain. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: If DNS events are not collected on a tenant, only the address half of the hunt returns rows. // VALIDATION LEVEL: static-reviewed (event.type = 'IP Connect' dst.ip.address = '185.114.206.45') or (event.type = 'DNS Resolved' event.dns.request contains 'dubaitechnicalservice.ae') | columns event.time, endpoint.name, src.process.name, event.dns.request, dst.ip.address, dst.port.number, agent.uuid | sort -event.time | limit 200
Automated validation: static-passed
3 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeRemoteIP: Remote addressRemoteUrl: Remote URL
Recommended fields
InitiatingProcessFileName: Acting processRemotePort: Remote port
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, RemoteIP, RemoteUrl, RemotePort | take 5
// HUNT: Sirius C2 address and payload domain // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1071.001, T1095 // CONF: high | FP: low // FALSE POSITIVES: none expected for this IP and domain // EQUIVALENCE: approximate-analytic - The address is matched on RemoteIP and the payload domain on RemoteUrl of connections. The CQL also reads name lookups, which have no endpoint table here; a lookup that never led to a connection is not visible. // REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents) // TUNING: None expected for this address and domain. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: A name lookup that never led to a connection is not captured; use the CQL tab for the lookup events. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0 DeviceNetworkEvents | where Timestamp >= ago(30d) | where RemoteIP == "185.114.206.45" or RemoteUrl contains "dubaitechnicalservice.ae" | project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, RemoteUrl, RemoteIP, RemotePort | sort by Timestamp desc | take 200
Looks for: A hollowed msbuild.exe carries the backdoor's raw-TCP C2. Outside build servers, msbuild rarely talks to the internet. This is the behavioral twin of Q10 and catches a rotated C2. FP: restore and build traffic on developer and build hosts.
Known limitations and deployment notes
- PowerQuery: The CQL tab's 500 row grouping cap has no equivalent; the output is capped at 200 rows.
- PowerQuery assumes: net_rfc1918 covers the 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 ranges that the CQL excludes.
- PowerQuery assumes: IPv6 destinations are not filtered.
- KQL – Defender XDR: The CQL tab's 500 row grouping cap has no equivalent; the output is capped at 200 rows.
- KQL – Defender XDR assumes: ipv4_is_private covers the 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 ranges that the CQL excludes.
- KQL – Defender XDR assumes: IPv6 destinations are not filtered.
// HUNT: msbuild.exe making external connections // MITRE: T1127.001, T1055.012, T1071.001 // CONF: medium FP: medium COST: medium | REQUIRES: outbound connection with process name (CrowdStrike: NetworkConnectIP4) // FALSE POSITIVES: package restore and build agents reaching public registries // TUNING: add your known package-feed and build-service destinations by RemoteAddressIP4 range, or scope the query to hosts outside the build-server asset group // LOOKBACK: 30d #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^msbuild(\.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, RemoteAddressIP4, RemotePort], function=[count(as=Conns), max(@timestamp, as=LastSeen)], limit=500) | sort(Conns, order=desc, limit=200)
5 required fields · View requirements
Required telemetry
- IP Connect
Required fields
event.type: Event typeevent.time: Event timesrc.process.name: Acting process namedst.ip.address: Destination addressdst.port.number: Destination port
Recommended fields
endpoint.name: Host
Fallbacks
endpoint.name→agent.uuid: Changes the displayed host identifier only.
Readiness test
event.type = 'IP Connect' dst.ip.address = * | limit 5 | columns event.type, event.time, src.process.name, dst.ip.address, dst.port.number
// HUNT: msbuild.exe making external connections // SCHEMA PROFILE: sentinelone-endpoint-ocsf // MITRE: T1127.001, T1055.012, T1071.001 // CONF: medium | FP: medium // FALSE POSITIVES: package restore and build agents reaching public registries // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msbuild connecting to a non-private, non-loopback, non-link-local address, summarised per host, destination and port. The acting process is src.process on an IP Connect event. Matching is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: SentinelOne endpoint network telemetry with the acting process // TUNING: Add your known package-feed and build-service destinations, or scope the query to hosts outside the build-server group. // LOOKBACK: 30d; set the console time picker to match the CQL tab // CONFIGURATION: No data table or lookup required. // KNOWN GAPS: The CQL tab's 500 row grouping cap has no equivalent; the output is capped at 200 rows. // VALIDATION LEVEL: static-reviewed event.type = 'IP Connect' src.process.name matches '^msbuild(\\.exe)?$' dst.ip.address = * !(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 connections = count(), last_seen = max(event.time) by agent.uuid, endpoint.name, dst.ip.address, dst.port.number | sort -connections | limit 200
Automated validation: static-passed
4 required fields · View requirements
Required telemetry
- DeviceNetworkEvents
Required fields
Timestamp: Event timeInitiatingProcessFileName: Acting process nameRemoteIP: Remote addressRemotePort: Remote port
Recommended fields
DeviceName: Host
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceNetworkEvents | where Timestamp > ago(1d) | project Timestamp, InitiatingProcessFileName, RemoteIP, RemotePort | take 5
// HUNT: msbuild.exe making external connections // SCHEMA PROFILE: microsoft-defender-xdr // MITRE: T1127.001, T1055.012, T1071.001 // CONF: medium | FP: medium // FALSE POSITIVES: package restore and build agents reaching public registries // EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: msbuild connecting to a non-private, non-loopback, non-link-local address, summarised per host, destination and port. The regex is case-insensitive, which reproduces the CQL /i intent. // REQUIRES: Defender for Endpoint network telemetry (DeviceNetworkEvents) // TUNING: Add your known package-feed and build-service destinations, or scope the query to hosts outside the build-server group. // LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab) // CONFIGURATION: No lookup objects required. // KNOWN GAPS: The CQL tab's 500 row grouping cap has no equivalent; the output is capped at 200 rows. // VALIDATION LEVEL: schema-aligned // AUTOMATED VALIDATION: static-passed; static=passed-with-warnings; fixtures=0/0 DeviceNetworkEvents | where Timestamp >= ago(30d) | where InitiatingProcessFileName matches regex @"(?i)^msbuild(\.exe)?$" | where isnotempty(RemoteIP) and not(ipv4_is_private(RemoteIP)) and not(ipv4_is_in_range(RemoteIP, "127.0.0.0/8")) and not(ipv4_is_in_range(RemoteIP, "169.254.0.0/16")) | summarize Connections = count(), LastSeen = max(Timestamp) by DeviceId, DeviceName, RemoteIP, RemotePort | sort by Connections desc | take 200
Looks for: Six SHA-256 values from the Trellix appendix. Expect few endpoint hits: the loader, injector and backdoor run only in memory, so the ZIP and PDF are the likeliest on-disk matches. The email hash is for gateway search. Ships as detect only.
Known limitations and deployment notes
- PowerQuery: A sample that is renamed or repacked has a different hash and is not captured.
- PowerQuery assumes: tgt.process.image.sha256 and tgt.file.sha256 are populated on this tenant; an unpopulated hash returns no rows rather than an error.
- PowerQuery assumes: File Creation covers archive writes as well as executable writes.
- KQL – Defender XDR: A sample that is started but whose write was not observed is not captured here; the CQL tab also matches process starts.
- KQL – Defender XDR: The CQL has no SHA1 or MD5 values, so none are searched.
- KQL – Defender XDR assumes: SHA256 is populated in DeviceFileEvents on this tenant; Microsoft notes it is often unpopulated on other tables, and an empty column returns no rows rather than an error.
// HUNT: Known Sirius file hashes // MITRE: T1204.002, T1055 // CONF: high FP: low COST: low | REQUIRES: file hash on process or file write (CrowdStrike: ProcessRollup2, PeFileWritten, NewExecutableWritten, ZipFileWritten) // FALSE POSITIVES: none expected // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|PeFileWritten|NewExecutableWritten|ZipFileWritten)$/ | in(field=SHA256HashData, values=["87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51", "7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105", "6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4", "899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05", "eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c", "d6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee"]) | table([@timestamp, ComputerName, UserName, #event_simpleName, FileName, TargetFileName, SHA256HashData, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.image.sha256: Created process hashtgt.file.sha256: Created file hash
Recommended fields
tgt.file.path: Written 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, event.time, tgt.process.image.sha256, tgt.file.sha256
// HUNT: Known Sirius file hashes
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1204.002, T1055
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: equivalent-with-schema-assumptions - Same indicators: the six Sirius SHA-256 values on a created process image or a created file. File Creation covers the executable and archive writes the CQL reads. The list is matched case-insensitively.
// REQUIRES: SentinelOne endpoint process and file telemetry with SHA-256 populated
// TUNING: None expected; these are file hashes of known malicious samples.
// LOOKBACK: 30d; set the console time picker to match the CQL tab
// CONFIGURATION: No data table or lookup required.
// KNOWN GAPS: A sample that is renamed or repacked has a different hash and is not captured.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.image.sha256 in:anycase ('87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51', '7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105', '6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4', '899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05', 'eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c', 'd6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee')) or (event.type = 'File Creation' tgt.file.sha256 in:anycase ('87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51', '7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105', '6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4', '899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05', 'eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c', 'd6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee'))
| columns event.time, event.type, endpoint.name, src.process.name, tgt.process.name, tgt.file.path, tgt.process.image.sha256, tgt.file.sha256, agent.uuid
| sort -event.time
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeSHA256: File hash
Recommended fields
FileName: Written file nameInitiatingProcessFileName: Writer process
Fallbacks
DeviceName→DeviceId: Changes the displayed host identifier only.
Readiness test
DeviceFileEvents | where Timestamp > ago(1d) | project Timestamp, FileName, SHA256 | take 5
// HUNT: Known Sirius file hashes
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1204.002, T1055
// CONF: high | FP: low
// FALSE POSITIVES: none expected
// EQUIVALENCE: approximate-analytic - The six Sirius SHA-256 values are matched on DeviceFileEvents, which sees the file writes. The CQL also matches a process start; one table per query means the process-start half is left to the CQL tab.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents) with SHA256 populated
// TUNING: None expected; these are file hashes of known malicious samples.
// LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A sample that is started but whose write was not observed is not captured here; the CQL tab also matches process starts. The CQL has no SHA1 or MD5 values, so none are searched.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where SHA256 in~ ("87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51", "7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105", "6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4", "899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05", "eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c", "d6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, FileName, FolderPath, SHA256
| sort by Timestamp desc
| take 200Looks for: Finds the archive landing on disk and the PDF being opened. Filenames are attacker-chosen and trivially changed, so treat a miss as meaningless.
Known limitations and deployment notes
- PowerQuery: A lure renamed before it is opened is not captured.
- PowerQuery assumes: The file path test is a substring match, so a name followed by a further extension also matches.
- KQL – Defender XDR: A lure named only on a command line, without a file event, is not captured here; the CQL tab also searches command lines.
- KQL – Defender XDR assumes: The file name is compared as an exact name, so a lure with a further extension is not matched.
// HUNT: Lure filename: Fedex_tax_receipt // MITRE: T1566.001, T1204.002 // CONF: medium FP: low COST: low | REQUIRES: process command line and archive write (CrowdStrike: ProcessRollup2, ZipFileWritten) // FALSE POSITIVES: a genuine file that reuses the name // LOOKBACK: 30d #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|ZipFileWritten)$/ | (CommandLine=/Fedex_tax_receipt\.(pdf|zip)/i) or (TargetFileName=/Fedex_tax_receipt\.(pdf|zip)$/i) | table([@timestamp, ComputerName, UserName, #event_simpleName, ParentBaseFileName, FileName, CommandLine, TargetFileName, aid]) | sort(@timestamp, order=desc)
4 required fields · View requirements
Required telemetry
- Process Creation
- File Creation
Required fields
event.type: Event typeevent.time: Event timetgt.process.cmdline: Created command linetgt.file.path: Written file path
Recommended fields
src.process.name: Creator 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, event.time, tgt.process.cmdline, tgt.file.path
// HUNT: Lure filename: Fedex_tax_receipt
// SCHEMA PROFILE: sentinelone-endpoint-ocsf
// MITRE: T1566.001, T1204.002
// CONF: medium | FP: low
// FALSE POSITIVES: a genuine file that reuses the name
// EQUIVALENCE: equivalent-with-schema-assumptions - Same predicate: the lure name Fedex_tax_receipt with a pdf or zip extension, on a process command line or in a created file path. The name is matched as a substring, case-insensitively, which reproduces the CQL /i intent.
// REQUIRES: SentinelOne endpoint process-creation and file-creation telemetry
// TUNING: A genuine file that reuses the name is possible; confirm the sender and the origin before escalating.
// LOOKBACK: 30d; set the console time picker to match the CQL tab
// CONFIGURATION: No data table or lookup required.
// KNOWN GAPS: A lure renamed before it is opened is not captured.
// VALIDATION LEVEL: static-reviewed
(event.type = 'Process Creation' tgt.process.cmdline contains ('Fedex_tax_receipt.pdf', 'Fedex_tax_receipt.zip')) or (event.type = 'File Creation' tgt.file.path contains ('Fedex_tax_receipt.pdf', 'Fedex_tax_receipt.zip'))
| columns event.time, event.type, endpoint.name, src.process.user, src.process.name, tgt.process.name, tgt.process.cmdline, tgt.file.path, agent.uuid
| sort -event.time
| limit 200Automated validation: static-passed
2 required fields · View requirements
Required telemetry
- DeviceFileEvents
Required fields
Timestamp: Event timeFileName: File name
Recommended fields
InitiatingProcessFileName: Writer processFolderPath: Folder
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, FileName, FolderPath | take 5
// HUNT: Lure filename: Fedex_tax_receipt
// SCHEMA PROFILE: microsoft-defender-xdr
// MITRE: T1566.001, T1204.002
// CONF: medium | FP: low
// FALSE POSITIVES: a genuine file that reuses the name
// EQUIVALENCE: approximate-analytic - The lure name is matched on the file name in DeviceFileEvents. The CQL also reads process command lines; one table per query means that half is left to the CQL tab.
// REQUIRES: Defender for Endpoint file telemetry (DeviceFileEvents)
// TUNING: A genuine file that reuses the name is possible; confirm the sender and the origin before escalating.
// LOOKBACK: 30d (Advanced Hunting retention; matches the CQL tab)
// CONFIGURATION: No lookup objects required.
// KNOWN GAPS: A lure named only on a command line, without a file event, is not captured here; the CQL tab also searches command lines.
// VALIDATION LEVEL: schema-aligned
// AUTOMATED VALIDATION: static-passed; static=passed; fixtures=0/0
DeviceFileEvents
| where Timestamp >= ago(30d)
| where FileName in~ ("Fedex_tax_receipt.pdf", "Fedex_tax_receipt.zip")
| project Timestamp, ReportId, DeviceId, DeviceName, InitiatingProcessFileName, FileName, FolderPath, SHA1, SHA256
| sort by Timestamp desc
| take 200Detection Rules by Platform
Detect-only (Monitor). No rule blocks a stock binary. Blocking for the PDF-child behavior is delivered by the Defender ASR rule in Playbook P1, not by an IOA.
CrowdStrike: Custom IOA
| IOA name | From | Rule type | Pattern | Exclusions | Action |
|---|---|---|---|---|---|
| Sirius, PDF Reader Spawns Shell | Promote Q1 | Process Creation (Windows) | Parent image AcroRd32.exe or Acrobat.exe; image powershell.exe, cmd.exe, wscript.exe, cscript.exe or mshta.exe | None known | Detect: High |
| Sirius, Stager Flag Set | Promote Q2 | Process Creation (Windows) | Image powershell.exe; command line matches hidden window, -nop, -noni, bypass and -EncodedCommand | Management-agent parents | Detect: Medium |
| Sirius, Hollow Host Wrong Parent | Promote Q3 | Process Creation (Windows) | Image svchost.exe with parent not services.exe; or image msbuild.exe with parent powershell.exe | Build servers | Detect: Medium |
| Sirius, svchost Outside System Path | Promote Q4 | Process Creation (Windows) | Image svchost.exe not under \Windows\System32, \SysWOW64 or \WinSxS | None known | Detect: High (never Block: name is abused, binary is stock) |
| Sirius, UserInit Logon Script | Promote Q6 | Registry (Windows) | Value name UserInitMgrLogonScriptName written | None known | Detect: High |
SentinelOne: custom detection rules
| Rule | Source query | Run as | Notes |
|---|---|---|---|
| Sirius, PDF Reader Spawns Shell | Q1, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Sirius, Stager Flag Set | Q2, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Sirius, Hollow Host Wrong Parent | Q3, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Sirius, svchost Outside System Path | Q4, PowerQuery tab | Scheduled custom detection rule | Bind entities so the alert names the host instead of "Unknown Device" |
| Sirius, UserInit Logon Script | Q6, 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 |
|---|---|---|---|
| Sirius, PDF Reader Spawns Shell | Q1, 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 |
| Sirius, Stager Flag Set | Q2, 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 |
| Sirius, Hollow Host Wrong Parent | 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 |
| Sirius, svchost Outside System Path | Q4, 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 |
| Sirius, UserInit Logon Script | 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 |
Q5, Q7, Q8, Q9, Q10, Q11, Q12 and Q13 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
All CSV rows are detect. Port 4449 is part of the C2 context, not an importable field. The URL form is covered by the domain row.
type,value,action,severity,expiration,description,tags sha256,87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51,detect,medium,2027-04-30,Sirius campaign Email (.eml),campaign:SiriusBackdoor sha256,7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105,detect,medium,2027-04-30,Sirius campaign Fedex_tax_receipt.zip,campaign:SiriusBackdoor sha256,6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4,detect,medium,2027-04-30,Sirius campaign Fedex_tax_receipt.pdf,campaign:SiriusBackdoor sha256,899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05,detect,medium,2027-04-30,Sirius campaign .NET Stage 1 loader,campaign:SiriusBackdoor sha256,eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c,detect,medium,2027-04-30,Sirius campaign .NET Stage 2 injector,campaign:SiriusBackdoor sha256,d6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee,detect,medium,2027-04-30,Sirius campaign Sirius Backdoor (zeus.dat payload),campaign:SiriusBackdoor md5,3cc5147d1dbe295c63da958afadac6c6,detect,medium,2027-04-30,Sirius campaign Email (.eml),campaign:SiriusBackdoor md5,6ffcf5f7aa4b3b75b06bd7a7f49366a8,detect,medium,2027-04-30,Sirius campaign Fedex_tax_receipt.zip,campaign:SiriusBackdoor md5,39993389e1e95ebbd55aa54058cf7b52,detect,medium,2027-04-30,Sirius campaign Fedex_tax_receipt.pdf,campaign:SiriusBackdoor md5,64a9940fc78de8a895d968a4092ed10b,detect,medium,2027-04-30,Sirius campaign .NET Stage 1 loader,campaign:SiriusBackdoor md5,62a458eb260e7aa26092dbdf9c2d8ed4,detect,medium,2027-04-30,Sirius campaign .NET Stage 2 injector,campaign:SiriusBackdoor md5,e8b080c276519547e95930ab15028adb,detect,medium,2027-04-30,Sirius campaign Sirius Backdoor (zeus.dat payload),campaign:SiriusBackdoor ipv4,185.114.206.45,detect,high,2027-01-30,Sirius backdoor C2 port 4449,campaign:SiriusBackdoor domain,dubaitechnicalservice.ae,detect,high,2027-01-30,Sirius zeus.dat payload host,campaign:SiriusBackdoor
indicatorType,indicatorValue,action,title,description,expirationTime,severity,recommendedActions,rbacGroups,category,mitretechniques,GenerateAlert FileSha256,87aafaa8bb6444bae4d2ef82e395c46e85daf468a66754169b1e3d762ba04f51,Audit,Sirius campaign Email,Sirius campaign Email (.eml),2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,7ec38100faffb910ece1f379cb93ec09cc2beeb35ee8bdb401d7645469dca105,Audit,Sirius campaign Fedex_tax_receipt.zip,Sirius campaign Fedex_tax_receipt.zip,2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,6da827caff789c1c33dd9ad380c610541f6dd90678db527c4f5bdf5012e305d4,Audit,Sirius campaign Fedex_tax_receipt.pdf,Sirius campaign Fedex_tax_receipt.pdf,2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,899fc5fae0593dd47aef9db4b51ffb5aeae27be9d1b6beb41108411baca7ef05,Audit,Sirius campaign .NET Stage 1 loader,Sirius campaign .NET Stage 1 loader,2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,eedd60c6abfc4c18578c960ae55b177ea9ff14e8d41634c46f361cc8680df01c,Audit,Sirius campaign .NET Stage 2 injector,Sirius campaign .NET Stage 2 injector,2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True FileSha256,d6802fce5b918ed247ba85d6aa0545a8120cfbc3734b1c37794c4e381862d4ee,Audit,Sirius campaign Sirius Backdoor,Sirius campaign Sirius Backdoor (zeus.dat payload),2027-04-30T00:00:00.0Z,Medium,Investigate the device and pivot into the pack's queries,,,,True IpAddress,185.114.206.45,Audit,Sirius backdoor C2 port 4449,Sirius backdoor C2 port 4449,2027-01-30T00:00:00.0Z,High,Investigate the device and pivot into the pack's queries,,,,True DomainName,dubaitechnicalservice.ae,Audit,Sirius zeus.dat payload host,Sirius zeus.dat payload host,2027-01-30T00: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. Left out because this block maps only SHA-1, SHA-256, IPv4, domain and URL indicators: md5 6. 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.
# Process lineage (hunt by parent and path, never block the stock binary) AcroRd32.exe | Acrobat.exe -> powershell.exe | cmd.exe | wscript.exe | cscript.exe | mshta.exe powershell.exe -> msbuild.exe | svchost.exe (suspended host, then NtQueueApcThread) svchost.exe NOT started by services.exe svchost.exe outside \Windows\System32, \SysWOW64, \WinSxS # Stager command-line flags -W h -nop -NOni -ep BYPaSS -EncodedCommand # Filesystem %APPDATA%\Microsoft\svchost.exe (sample config install path) %TEMP%\msupdate\svchost.exe (sample config fallback path) C:\Windows\System32\user32.dll (written by a non-servicing process) C:\Recovery\Customizations\SysConfig_<CRC32>.ppkg C:\Windows\Setup\Scripts\SetupComplete.cmd %LOCALAPPDATA%\Microsoft\<dir>\<file> and %USERPROFILE%\Documents\<dir>\<file> (non-admin fallback) Startup folder: WindowsUpdate.lnk (default), updater.vbs logon.cmd registered by UserInitMgrLogonScriptName # Registry HKCU\Software\Microsoft\Windows\CurrentVersion\Run HKCU\Environment\UserInitMgrLogonScriptName HKLM\SYSTEM\CurrentControlSet\Control\Session Manager BootExecute (REG_MULTI_SZ) HKEY_USERS\SURV_DEFAULT (Default profile hive mounted by the implant) HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers value "~ RUNASADMIN"
Malware family : Sirius Backdoor (name used by Trellix) Config marker : <<SIRIUS_STUB_CONFIG>> in memory, or .rsrc resource Caffee_Config Lure archive : Fedex_tax_receipt.zip Lure document : Fedex_tax_receipt.pdf (blank page, /OpenAction -> /Launch) Lure subject : [FedEx] A tax invoice has been issued. Payload filename : zeus.dat (URL path /prood/zeus.dat) Injector techniques : Early Bird APC (CREATE_SUSPENDED, VirtualAllocEx, WriteProcessMemory, NtQueueApcThread, ResumeThread) EDR blinding : EtwEventWrite patch in ntdll.dll; NtManageHotPatch patch Trellix detections : FE_Backdoor_Win_Sirus_1, FE_Backdoor_Win_Sirus_2, Trojan.Sirius.IPCheck, Downloader.Sirius, Trojan.Sirius.DNS
# Patch / ASR / policy audit ASR rule (Block Adobe Reader from creating child processes): 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c Get-MpPreference | Select-Object AttackSurfaceReductionRules_Ids, AttackSurfaceReductionRules_Actions PowerShell script block logging (event 4104): Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -ErrorAction SilentlyContinue PowerShell language mode on a standard user session: $ExecutionContext.SessionState.LanguageMode # expect ConstrainedLanguage where WDAC or AppLocker enforces it Defender exclusions (review every entry): Get-MpPreference | Select-Object ExclusionPath, ExclusionProcess, ExclusionExtension Persistence spot checks: (Get-ItemProperty 'HKCU:\Environment').UserInitMgrLogonScriptName (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').BootExecute Get-ChildItem 'C:\Recovery\Customizations' -Force -ErrorAction SilentlyContinue Test-Path 'C:\Windows\Setup\Scripts\SetupComplete.cmd'
Detection Validation Gates
| Gate | Check | Pass condition |
|---|---|---|
| Telemetry ready | Process creation with parent and command line (CrowdStrike: ProcessRollup2. SentinelOne: Process Creation. Defender: DeviceProcessEvents); registry value set; outbound connection; executable file write | Each source returns events for a known-good test host in the last 24 hours |
| Benign baseline | Run Q1 to Q9 and Q11 over 30 days | Q1, Q4, Q5, Q10, Q12 return nothing; Q2, Q3, Q6 to Q9, Q11 list only explained parents, which go into TUNING |
| Positive tests | On an isolated test host: open a harmless PDF-reader child (for example a harmless cmd.exe started by a test harness whose parent is named like a PDF reader) and a renamed copy of a signed binary named svchost.exe in a user folder | Q1 and Q4 fire. Do not detonate real malware |
| Promotion | Promote Q1, Q2, Q3, Q4, Q6 as Custom IOAs in Monitor | 14 days at Monitor with no unexplained hits before any enforcement discussion |
Hardening: Tiered
- Block Adobe Reader from creating child processes (ASR GUID
7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c), audit first. Cited by Trellix; MITRE M1040 Behavior Prevention on Endpoint. Playbook P1. Verify: Defender events 1121 and 1122. - PowerShell Script Block Logging so event 4104 captures the decrypted stager. M1047 Audit; CIS Windows benchmark has a script block logging control. Playbook P2.
- Mail gateway: quarantine ZIP attachments that contain a PDF with a launch action, and flag the lure subject and attachment name. M1049; best practice, no formal benchmark. Playbook P6.
- Review Defender exclusions on all hosts; Sirius adds its own. M1047. Playbook P5.
- PowerShell Constrained Language Mode through WDAC or AppLocker, which blocks the dynamic .NET and reflection the stager uses. M1038 Execution Prevention; Trellix recommendation. Pilot in audit mode: it breaks admin scripts.
- Acrobat Protected View and launch-action restrictions through the product's enterprise policy. M1042 Disable or Remove Feature. Best practice; confirm the exact keys for your Acrobat build. Playbook P4.
- Restrict who can write
C:\Recovery\Customizations,C:\Windows\Setup\Scriptsand the Default profile hive to SYSTEM and TrustedInstaller. M1022 Restrict File and Directory Permissions. Best practice; check imaging tools first.
- WDAC allow-listing so a copy of svchost.exe or a DLL in a user path cannot run. M1038 and M1045 Code Signing.
- Remove PDF readers' ability to launch files by standardising on a reader without launch actions, or sandboxing it. M1042 and M1048 Application Isolation.
- Reimage standard: include a clean-out of the Recovery Customizations folder in the build so a reset cannot restore implant packages. Best practice, no formal benchmark.
Nothing in this pack recommends blocking svchost.exe, msbuild.exe, powershell.exe or user32.dll by name or hash.
Deployable Playbooks
P1 · ASR rule: Block Adobe Reader from creating child processes
Prerequisites: Microsoft Defender Antivirus active and not in passive mode; local admin or MDM; run in audit mode for 14 days and review events first.
Reboot required: No
Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c, or set the action to Disabled.
# 1. Audit first Add-MpPreference -AttackSurfaceReductionRules_Ids 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c -AttackSurfaceReductionRules_Actions AuditMode # 2. After 14 clean days, enforce Add-MpPreference -AttackSurfaceReductionRules_Ids 7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c -AttackSurfaceReductionRules_Actions Enabled # 3. Verify Get-MpPreference | Select-Object AttackSurfaceReductionRules_Ids, AttackSurfaceReductionRules_Actions
P2 · PowerShell Script Block Logging (event 4104)
Prerequisites: Local admin or GPO. Plan log volume and forwarding; script block logs can be large.
Reboot required: No
Rollback: reg delete the value below, or set it to 0.
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f # Verify: run any PowerShell command, then look for event 4104 Get-WinEvent -LogName 'Microsoft-Windows-PowerShell/Operational' -MaxEvents 5 | Where-Object Id -eq 4104
P3 · Persistence audit sweep (read-only)
Prerequisites: Local admin on the host. Read-only except the temporary hive load in the last block.
Reboot required: No
Rollback: none required for the read-only commands; for the hive check run reg unload HKU\TMPDEF.
(Get-ItemProperty 'HKCU:\Environment' -ErrorAction SilentlyContinue).UserInitMgrLogonScriptName (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager').BootExecute Get-ChildItem 'C:\Recovery\Customizations' -Force -ErrorAction SilentlyContinue Test-Path 'C:\Windows\Setup\Scripts\SetupComplete.cmd' Get-ItemProperty 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers' -ErrorAction SilentlyContinue Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" -Force Get-AuthenticodeSignature 'C:\Windows\System32\user32.dll' | Select-Object Status, SignerCertificate Get-MpPreference | Select-Object ExclusionPath, ExclusionProcess, ExclusionExtension # Default profile hive check (loads then unloads it) reg load HKU\TMPDEF C:\Users\Default\NTUSER.DAT reg query HKU\TMPDEF\Software\Microsoft\Windows\CurrentVersion\Run reg unload HKU\TMPDEF
P4 · Acrobat Protected View (best practice, confirm keys for your build)
Prerequisites: Acrobat or Reader enterprise policy access; test with a pilot ring. No formal benchmark covers this exact setting.
Reboot required: No (restart the reader)
Rollback: Delete the two values below.
reg add "HKLM\SOFTWARE\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown" /v bProtectedMode /t REG_DWORD /d 1 /f reg add "HKLM\SOFTWARE\Policies\Adobe\Adobe Acrobat\DC\FeatureLockDown" /v iProtectedView /t REG_DWORD /d 2 /f
P5 · Defender exclusion review
Prerequisites: Local admin. Removing an exclusion can slow a legitimate application; check each entry with its owner first.
Reboot required: No
Rollback: Add-MpPreference -ExclusionPath with the saved value.
# Record, then review every entry Get-MpPreference | Select-Object ExclusionPath, ExclusionProcess, ExclusionExtension | Out-File .\exclusions-before.txt # After owner sign-off, remove one entry Remove-MpPreference -ExclusionPath 'C:\Path\To\Unexplained\Entry'
P6 · Mail gateway rule (vendor-neutral outline)
Prerequisites: Mail gateway admin rights; run in tag-only mode first.
Reboot required: No
Rollback: Disable or delete the rule.
Condition A: attachment type ZIP whose inner file is a PDF containing /Launch or /OpenAction Condition B: subject equals "[FedEx] A tax invoice has been issued." OR attachment name equals Fedex_tax_receipt.zip Action: tag, then quarantine after 7 days of review
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Triage | Confirm which query fired; check Q1, Q3, Q4, Q10 and Q11 on the same aid; identify the user, mail message and time of PDF open. | SOC L1 | Process tree; query output; message trace |
| Isolate | Network-contain the host in Falcon. Keep it powered on: the loader and backdoor are memory-only. Capture memory if policy allows. | SOC L2 | Containment time; memory image |
| 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 L2 | Containment time; memory image |
| Credentials | Reset the user's passwords and revoke browser and SaaS sessions; Chromium profiles and cryptocurrency wallets on the host are assumed stolen; move wallet funds and rotate seeds. | IAM | Reset and revocation log |
| Block | Add 185.114.206.45 and dubaitechnicalservice.ae to firewall, DNS and proxy blocklists; search Q10 and N6 for other hosts. | Network | Hunt results |
| Eradicate | Reimage. Before any Windows reset, delete C:\Recovery\Customizations\*.ppkg and SetupComplete.cmd: Push-Button Reset restores packages from that folder. Check the Default profile hive and UserInitMgrLogonScriptName on neighbours. | Endpoint team | Post-image P3 output |
| Recover | Restore from a backup taken before the first hit; the implant deletes shadow copies, so rely on off-host backups. | IT | Restore log |
| Report | Record query hits, share any new infrastructure with your intel provider, update this pack. | SOC lead | Ticket |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | CrowdStrike coverage | SentinelOne | Defender XDR |
|---|---|---|---|---|---|---|
| T1566.001 Lure delivery | Archive and PDF named Fedex_tax_receipt | Q13 | No | Partial | Partial: same limit as CrowdStrike | Partial: Q13 approximate |
| T1204.002 / T1059.001 PDF to PowerShell | Reader spawns shell, stager flags | Q1, Q2 | Yes | Good | Good, with assumptions | Good, with assumptions |
| T1055.004 / T1055.012 Hollowing | Wrong-parent host, external msbuild traffic | Q3, Q11 | Yes | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1036.005 / T1574.001 Payload drop | svchost.exe path, user32.dll write | Q4, Q5 | Yes | Good | Good, with assumptions | Good, with assumptions |
| T1547.001 / T1037.001 Registry persistence | UserInit, BootExecute, SURV_DEFAULT, RUNASADMIN | Q6 | Yes | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1053.005 Scheduled task | schtasks /create /xml | Q7 | No | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1037.003 / T1547 File persistence | ppkg, SetupComplete, Startup .lnk and .vbs creation | Q8 | No | GAP: file creation outside Falcon events used; use N4 | GAP: same limit as CrowdStrike | GAP: same limit as CrowdStrike |
| T1562.001 / T1490 Impair defenses | Defender exclusion, VSS delete | Q9 | No | Partial | Partial: same limit as CrowdStrike | Partial: same limit as CrowdStrike |
| T1562.002 ETW patch | EtwEventWrite and NtManageHotPatch patching | None | No | GAP: no verified hunt event; sensor prevention and N2 | GAP | GAP |
| T1071.001 / T1095 C2 | Known IP and domain, hash sweep | Q10, Q12 | No | Good | Good, with assumptions | Partial: Q10 approximate, Q12 approximate |
| T1219 HVNC / SOCKS5 / capture | Operator actions inside the hollowed host | Q11 | No | GAP: behavior has no direct hunt; rely on network and containment | GAP: same limit as CrowdStrike | GAP: same limit as CrowdStrike |
Known gaps are listed above: non-PE file creation, ETW patching and in-memory injection are outside the Falcon events verified for this pack. Validation gates are in section 11.
Hunt Summary Ticket
TITLE: Sirius Backdoor via blank FedEx tax-invoice PDF, fileless loader chain and Early Bird APC hollowing
SEVERITY: High - Trellix report 2026-10-26; single vendor origin; no named actor
SCOPE: Windows endpoints with a PDF reader and interactive users, mail gateway, Korean-language and
finance or accounting recipients first.
HYPOTHESIS: A user opened Fedex_tax_receipt.pdf from a ZIP; the PDF /Launch action ran hidden encoded PowerShell;
in-memory stages patched ETW and hollowed msbuild.exe or svchost.exe to run a VC++ backdoor with
HVNC, SOCKS5, capture and clipboard hijack, plus deep persistence including a provisioning package.
QUERIES: Q1 PDF reader spawns shell CONF high | FP low | COST low
Q2 stager flag set CONF med | FP med | COST low
Q3 hollow host wrong parent CONF med | FP med | COST low
Q4 svchost outside system paths CONF high | FP low | COST low
Q5 svchost / user32.dll drop CONF high | FP low | COST low
Q6 registry persistence CONF med | FP med | COST low
Q7 schtasks /create /xml CONF med | FP med | COST low
Q8 persistence artifact names CONF med | FP med | COST low
Q9 Defender exclusion / VSS delete CONF med | FP med | COST low
Q10 C2 IP and payload domain CONF high | FP low | COST low
Q11 msbuild external connections CONF med | FP med | COST med
Q12 file hashes CONF high | FP low | COST low
Q13 lure filename CONF med | FP low | COST low
DO FIRST: 1. Q1, Q3, Q4, Q10 across 30 days
2. Mail gateway search N1 for the lure subject and attachment
3. Enable ASR rule in audit mode (P1) and script block logging (P2)
FINDINGS: [ ] Q1 hits: ______ [ ] Q4 hits: ______ [ ] Q10 hits: ______
GAPS: Non-PE file creation (ppkg, SetupComplete.cmd, Startup items) is outside endpoint telemetry used here;
ETW patching and APC injection have no verified hunt event. Use native hunts N2 and N4.
ACTIONS: [ ] Isolate and reimage any host with a hit (delete Recovery Customizations first)
[ ] Reset credentials and wallet seeds for affected users
[ ] Block 185.114.206.45 and dubaitechnicalservice.ae
OWNER: SOC L2 / Detection engineering
VERSION: v0.1 (Draft) 2026-10-30 - HuntPack
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| 1 | Trellix: Unveiling Sirius Backdoor | Chain, config, persistence flags, capabilities, IOCs, defensive recommendations | 2026-10-30 |
| 3 | Cyber Security News: Hackers Use Fake FedEx Invoices to Deploy Sirius Backdoor | Corroboration of lure details and indicator transcription | 2026-10-30 |
Frameworks cited by name: MITRE ATT&CK techniques and mitigations (M-numbers); CIS Windows benchmark for script block logging. Snapshots: Sirius-Backdoor-FedEx-Hunt-sources/.