Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

Windows indirection utility spawning a scripting or download tool

Steps 1 and 2 of AN0576's chain in a single event: a process creation whose parent is one of the Windows utilities that exist to launch something else — forfiles.exe, pcalua.exe, ScriptRunner.exe — and whose own image is one of the interpreters, proxy binaries and downloaders that indirection is used to reach. That child list is MITRE's `HighRiskChildren` knob, populated here with its named entries plus wscript, cscript and certutil. A second, independent selection covers the ssh.exe variant the technique text describes: `ProxyCommand` and `LocalCommand` make ssh.exe execute a local command, and both appear literally on the command line when passed with -o. wsl.exe is named by both MITRE and the analytic and is deliberately absent. A command run through WSL executes inside the Linux VM and never surfaces as a Windows process creation, so the parent/child pair cannot fire for it; the only remaining option would be matching wsl.exe's own command line, which on a developer workstation is ordinary daily use. The ssh.exe selection has the mirror-image weakness: an operator who writes ProxyCommand or LocalCommand into %USERPROFILE%\.ssh\config instead of passing -o leaves nothing on the command line, and catching that needs the file-access leg of the analytic on a separate logsource. The rest of AN0576 is out of reach here. Step 3 — the SSH config write — and the network connections from the utility or its child are different events on different logsources, and the analytic's `TimeWindow` knob for correlating them is a join Sigma cannot express; `DestCIDRs` and `UserContext` are likewise post-hoc filters rather than literals. Prerequisite: the brief maps this to Sysmon EventID 1, so the fields are Sysmon's, and the rule sees nothing unless Sysmon is installed with a configuration that does not exclude these images from process creation. A Security 4688 feed needs the field names remapped (NewProcessName / ParentProcessName), plus Audit Process Creation and the separate command-line policy for the ssh.exe selection to have anything to read. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0200, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 4 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.

detection.yml

title: Windows indirection utility spawning a scripting or download toolid: 6a33dcce-199f-4195-a4ea-03c30555b867status: experimentaldescription: |  Steps 1 and 2 of AN0576's chain in a single event: a process creation whose  parent is one of the Windows utilities that exist to launch something else —  forfiles.exe, pcalua.exe, ScriptRunner.exe — and whose own image is one of  the interpreters, proxy binaries and downloaders that indirection is used to  reach. That child list is MITRE's `HighRiskChildren` knob, populated here  with its named entries plus wscript, cscript and certutil. A second,  independent selection covers the ssh.exe variant the technique text  describes: `ProxyCommand` and `LocalCommand` make ssh.exe execute a local  command, and both appear literally on the command line when passed with -o.  wsl.exe is named by both MITRE and the analytic and is deliberately absent.  A command run through WSL executes inside the Linux VM and never surfaces as  a Windows process creation, so the parent/child pair cannot fire for it; the  only remaining option would be matching wsl.exe's own command line, which on  a developer workstation is ordinary daily use. The ssh.exe selection has the  mirror-image weakness: an operator who writes ProxyCommand or LocalCommand  into %USERPROFILE%\.ssh\config instead of passing -o leaves nothing on the  command line, and catching that needs the file-access leg of the analytic on  a separate logsource.  The rest of AN0576 is out of reach here. Step 3 — the SSH config write — and  the network connections from the utility or its child are different events on  different logsources, and the analytic's `TimeWindow` knob for correlating  them is a join Sigma cannot express; `DestCIDRs` and `UserContext` are  likewise post-hoc filters rather than literals. Prerequisite: the brief maps  this to Sysmon EventID 1, so the fields are Sysmon's, and the rule sees  nothing unless Sysmon is installed with a configuration that does not exclude  these images from process creation. A Security 4688 feed needs the field  names remapped (NewProcessName / ParentProcessName), plus Audit Process  Creation and the separate command-line policy for the ssh.exe selection to  have anything to read.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0200, not hand-written and not tested by its author. Any lab result is on this rule's own page.references:  - https://attack.mitre.org/techniques/T1202  - https://attack.mitre.org/detectionstrategies/DET0200author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.defense-evasion  - attack.t1202logsource:  category: process_creation  product: windowsdetection:  selection_indirection_parent:    ParentImage|endswith:      - '\forfiles.exe'      - '\pcalua.exe'      - '\scriptrunner.exe'  selection_high_risk_child:    Image|endswith:      - '\powershell.exe'      - '\pwsh.exe'      - '\cmd.exe'      - '\wscript.exe'      - '\cscript.exe'      - '\mshta.exe'      - '\rundll32.exe'      - '\regsvr32.exe'      - '\msiexec.exe'      - '\curl.exe'      - '\bitsadmin.exe'      - '\certutil.exe'  selection_ssh_command_option:    Image|endswith: '\ssh.exe'    CommandLine|contains:      - 'ProxyCommand'      - 'LocalCommand'  condition: (selection_indirection_parent and selection_high_risk_child) or selection_ssh_command_optionfalsepositives:  - "Scheduled log and cache pruning built on forfiles.exe. Its /c argument is always executed through cmd.exe, so every run of the classic forfiles delete one-liner produces the parent/child pair this rule matches, on a fixed schedule, on every server that runs one."  - "App-V and MSIX packages published through ScriptRunner.exe, which launches the package's own cmd.exe or powershell.exe scripts at publish, launch and removal time on every machine the package is deployed to."  - "The Program Compatibility Assistant relaunching a legacy installer or shortcut through pcalua.exe, which then calls msiexec.exe to complete an entirely ordinary installation."  - "Administrators and developers reaching an internal host through a jump box with an SSH ProxyCommand entry, which puts the option on ssh.exe's command line on every single hop."level: medium

Sentinel · KQL

Run this as a search.

DeviceProcessEvents| where (((InitiatingProcessFolderPath endswith "\\forfiles.exe" or InitiatingProcessFolderPath endswith "\\pcalua.exe" or InitiatingProcessFolderPath endswith "\\scriptrunner.exe") and (FolderPath endswith "\\powershell.exe" or FolderPath endswith "\\pwsh.exe" or FolderPath endswith "\\cmd.exe" or FolderPath endswith "\\wscript.exe" or FolderPath endswith "\\cscript.exe" or FolderPath endswith "\\mshta.exe" or FolderPath endswith "\\rundll32.exe" or FolderPath endswith "\\regsvr32.exe" or FolderPath endswith "\\msiexec.exe" or FolderPath endswith "\\curl.exe" or FolderPath endswith "\\bitsadmin.exe" or FolderPath endswith "\\certutil.exe")) or (FolderPath endswith "\\ssh.exe" and (ProcessCommandLine contains "ProxyCommand" or ProcessCommandLine contains "LocalCommand")))

Splunk · SPL

Run this as a search.

index=* (((ParentImage="*\\forfiles.exe" OR ParentImage="*\\pcalua.exe" OR ParentImage="*\\scriptrunner.exe") AND (Image="*\\powershell.exe" OR Image="*\\pwsh.exe" OR Image="*\\cmd.exe" OR Image="*\\wscript.exe" OR Image="*\\cscript.exe" OR Image="*\\mshta.exe" OR Image="*\\rundll32.exe" OR Image="*\\regsvr32.exe" OR Image="*\\msiexec.exe" OR Image="*\\curl.exe" OR Image="*\\bitsadmin.exe" OR Image="*\\certutil.exe")) OR (Image="*\\ssh.exe" AND (CommandLine="*ProxyCommand*" OR CommandLine="*LocalCommand*")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (((TO_LOWER(process.parent.executable) LIKE "*\\\\forfiles.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\pcalua.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\scriptrunner.exe") AND (TO_LOWER(process.executable) LIKE "*\\\\powershell.exe" OR TO_LOWER(process.executable) LIKE "*\\\\pwsh.exe" OR TO_LOWER(process.executable) LIKE "*\\\\cmd.exe" OR TO_LOWER(process.executable) LIKE "*\\\\wscript.exe" OR TO_LOWER(process.executable) LIKE "*\\\\cscript.exe" OR TO_LOWER(process.executable) LIKE "*\\\\mshta.exe" OR TO_LOWER(process.executable) LIKE "*\\\\rundll32.exe" OR TO_LOWER(process.executable) LIKE "*\\\\regsvr32.exe" OR TO_LOWER(process.executable) LIKE "*\\\\msiexec.exe" OR TO_LOWER(process.executable) LIKE "*\\\\curl.exe" OR TO_LOWER(process.executable) LIKE "*\\\\bitsadmin.exe" OR TO_LOWER(process.executable) LIKE "*\\\\certutil.exe")) OR (TO_LOWER(process.executable) LIKE "*\\\\ssh.exe" AND (TO_LOWER(process.command_line) LIKE "*proxycommand*" OR TO_LOWER(process.command_line) LIKE "*localcommand*")))

Wazuh · XML rule

Deploy to your manager — this is a rule, not a search.

<group name="sigma,windows,process_creation,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <!-- 2 rules: the Sigma condition ORs across different fields,       which one rule cannot express. Any one matching is a hit. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="ParentImage" type="pcre2">(?i)(\\forfiles\.exe$|\\pcalua\.exe$|\\scriptrunner\.exe$)</field>    <field name="Image" type="pcre2">(?i)(\\powershell\.exe$|\\pwsh\.exe$|\\cmd\.exe$|\\wscript\.exe$|\\cscript\.exe$|\\mshta\.exe$|\\rundll32\.exe$|\\regsvr32\.exe$|\\msiexec\.exe$|\\curl\.exe$|\\bitsadmin\.exe$|\\certutil\.exe$)</field>    <description>Windows indirection utility spawning a scripting or download tool (1/2)</description>    <mitre>      <id>T1202</id>    </mitre>  </rule>   <rule id="100001" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)\\ssh\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(ProxyCommand|LocalCommand)</field>    <description>Windows indirection utility spawning a scripting or download tool (2/2)</description>    <mitre>      <id>T1202</id>    </mitre>  </rule></group>

Verdicts · reactions · comments

Community

Verdicts from engineers who actually deployed it, and the conversation around it.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.

Log in to report a verdict.

Log in to join the discussion.

No comments yet. Someone who deploys this will have something to say about it.