Skip to content

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

Siemphony’s repertoire

Mshta launching remote or inline script content

Matches the process-creation leg of AN1397: a `mshta.exe` start whose command line carries the two things that distinguish proxied execution from opening a local application — content fetched from off the host, or script handed to the HTA engine inline rather than as a file — plus a third arm for the parent processes MITRE's `SuspiciousParentProcesses` knob names, populated here with the Office applications and the WSH interpreters. A bare `mshta.exe` gate is deliberately not used on its own: mshta is a shipped Windows binary and an in-house `.hta` opened from a desktop shortcut produces the same image name, so every arm is a second gate applied on top of it. Three limits are worth stating plainly. The analytic's Sysmon EventID 3 and 22 legs describe the network fetch, and its EventID 11 leg the file the payload drops, but each is a separate event that MITRE's `TimeWindow` knob correlates with this one — a cross-event join lib/sigma cannot express — so this rule stops at the invocation. An HTA already staged on disk by an earlier stage and run as `mshta.exe C:\Users\Public\x.hta` matches no arm here unless its parent is one of the listed ones. And `AllowedHTASources` is a knob for an allowlist a site has to build, not something a shipped rule can populate. Vocabulary and prerequisite: this is written in the Sysmon-shaped `process_creation` vocabulary the brief specifies, and the brief feeds it from Security EventID 4688, where `Image` maps to `NewProcessName` and `ParentImage` to `ParentProcessName`. That feed needs *Audit Process Creation*, and two of the three arms read `CommandLine`, which needs the separate *Include command line in process creation events* policy — without it those arms return zero rows, and zero rows reads as quiet when it actually means blind. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0506, 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: Mshta launching remote or inline script contentid: 0c5fdea0-050b-49f2-ac6e-a69476df4ed1status: experimentaldescription: |  Matches the process-creation leg of AN1397: a `mshta.exe` start whose command  line carries the two things that distinguish proxied execution from opening a  local application — content fetched from off the host, or script handed to the  HTA engine inline rather than as a file — plus a third arm for the parent  processes MITRE's `SuspiciousParentProcesses` knob names, populated here with  the Office applications and the WSH interpreters. A bare `mshta.exe` gate is  deliberately not used on its own: mshta is a shipped Windows binary and an  in-house `.hta` opened from a desktop shortcut produces the same image name, so  every arm is a second gate applied on top of it. Three limits are worth stating  plainly. The analytic's Sysmon EventID 3 and 22 legs describe the network  fetch, and its EventID 11 leg the file the payload drops, but each is a  separate event that MITRE's `TimeWindow` knob correlates with this one — a  cross-event join lib/sigma cannot express — so this rule stops at the  invocation. An HTA already staged on disk by an earlier stage and run as  `mshta.exe C:\Users\Public\x.hta` matches no arm here unless its parent is one  of the listed ones. And `AllowedHTASources` is a knob for an allowlist a site  has to build, not something a shipped rule can populate. Vocabulary and  prerequisite: this is written in the Sysmon-shaped `process_creation`  vocabulary the brief specifies, and the brief feeds it from Security EventID  4688, where `Image` maps to `NewProcessName` and `ParentImage` to  `ParentProcessName`. That feed needs *Audit Process Creation*, and two of the  three arms read `CommandLine`, which needs the separate *Include command line  in process creation events* policy — without it those arms return zero rows,  and zero rows reads as quiet when it actually means blind.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0506, 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/T1218/005  - https://attack.mitre.org/detectionstrategies/DET0506author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.defense-evasion  - attack.t1218.005logsource:  category: process_creation  product: windowsdetection:  selection_tool:    Image|endswith: '\mshta.exe'  context_remote_content:    CommandLine|contains:      - 'http://'      - 'https://'      - 'ftp://'      - '\\\\'  context_inline_script:    CommandLine|contains:      - 'vbscript:'      - 'javascript:'      - 'jscript:'      - 'about:'      - 'GetObject('      - 'RunHTMLApplication'  context_suspicious_parent:    ParentImage|endswith:      - '\winword.exe'      - '\excel.exe'      - '\powerpnt.exe'      - '\outlook.exe'      - '\msaccess.exe'      - '\onenote.exe'      - '\visio.exe'      - '\wscript.exe'      - '\cscript.exe'      - '\eqnedt32.exe'  condition: selection_tool and 1 of context_*falsepositives:  - "Line-of-business HTA applications published from a file share or an intranet site, which are launched as `mshta.exe \\fileserver\\apps\\tool.hta` or `mshta.exe http://intranet/tool.hta` and match the remote-content arm on every open. In an estate that still ships HTA front-ends this is the highest-volume match by a wide margin, and it is why this rule is medium rather than high."  - "Vendor installers, uninstall stubs and OEM support tools that display a dialog or a progress window through a bundled `.hta` staged on a share, and legacy setup wrappers that call `mshta.exe vbscript:Close(...)` to close their own window — the documented idiom, and identical on the command line to the inline-script arm this rule targets."  - "Help-desk and packaging scripts driven from `wscript.exe` or `cscript.exe` that hand a local `.hta` to mshta for a prompt, which matches the parent arm regardless of what the HTA does."  - "Office documents belonging to internal tooling that legitimately shell out to an HTA form — a macro-enabled workbook opening its own front-end — which produces a winword.exe or excel.exe parent for a benign mshta child."level: medium

Sentinel · KQL

Run this as a search.

DeviceProcessEvents| where (FolderPath endswith "\\mshta.exe" and ((ProcessCommandLine contains "http://" or ProcessCommandLine contains "https://" or ProcessCommandLine contains "ftp://" or ProcessCommandLine contains "\\\\") or (ProcessCommandLine contains "vbscript:" or ProcessCommandLine contains "javascript:" or ProcessCommandLine contains "jscript:" or ProcessCommandLine contains "about:" or ProcessCommandLine contains "GetObject(" or ProcessCommandLine contains "RunHTMLApplication") or (InitiatingProcessFolderPath endswith "\\winword.exe" or InitiatingProcessFolderPath endswith "\\excel.exe" or InitiatingProcessFolderPath endswith "\\powerpnt.exe" or InitiatingProcessFolderPath endswith "\\outlook.exe" or InitiatingProcessFolderPath endswith "\\msaccess.exe" or InitiatingProcessFolderPath endswith "\\onenote.exe" or InitiatingProcessFolderPath endswith "\\visio.exe" or InitiatingProcessFolderPath endswith "\\wscript.exe" or InitiatingProcessFolderPath endswith "\\cscript.exe" or InitiatingProcessFolderPath endswith "\\eqnedt32.exe")))

Splunk · SPL

Run this as a search.

index=* (Image="*\\mshta.exe" AND ((CommandLine="*http://*" OR CommandLine="*https://*" OR CommandLine="*ftp://*" OR CommandLine="*\\\\*") OR (CommandLine="*vbscript:*" OR CommandLine="*javascript:*" OR CommandLine="*jscript:*" OR CommandLine="*about:*" OR CommandLine="*GetObject(*" OR CommandLine="*RunHTMLApplication*") OR (ParentImage="*\\winword.exe" OR ParentImage="*\\excel.exe" OR ParentImage="*\\powerpnt.exe" OR ParentImage="*\\outlook.exe" OR ParentImage="*\\msaccess.exe" OR ParentImage="*\\onenote.exe" OR ParentImage="*\\visio.exe" OR ParentImage="*\\wscript.exe" OR ParentImage="*\\cscript.exe" OR ParentImage="*\\eqnedt32.exe")))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (TO_LOWER(process.executable) LIKE "*\\\\mshta.exe" AND ((TO_LOWER(process.command_line) LIKE "*http://*" OR TO_LOWER(process.command_line) LIKE "*https://*" OR TO_LOWER(process.command_line) LIKE "*ftp://*" OR TO_LOWER(process.command_line) LIKE "*\\\\\\\\*") OR (TO_LOWER(process.command_line) LIKE "*vbscript:*" OR TO_LOWER(process.command_line) LIKE "*javascript:*" OR TO_LOWER(process.command_line) LIKE "*jscript:*" OR TO_LOWER(process.command_line) LIKE "*about:*" OR TO_LOWER(process.command_line) LIKE "*getobject(*" OR TO_LOWER(process.command_line) LIKE "*runhtmlapplication*") OR (TO_LOWER(process.parent.executable) LIKE "*\\\\winword.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\excel.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\powerpnt.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\outlook.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\msaccess.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\onenote.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\visio.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\wscript.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\cscript.exe" OR TO_LOWER(process.parent.executable) LIKE "*\\\\eqnedt32.exe")))

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. -->  <!-- 3 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="Image" type="pcre2">(?i)\\mshta\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(http://|https://|ftp://|\\\\)</field>    <description>Mshta launching remote or inline script content (1/3)</description>    <mitre>      <id>T1218.005</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)\\mshta\.exe$</field>    <field name="CommandLine" type="pcre2">(?i)(vbscript:|javascript:|jscript:|about:|GetObject\(|RunHTMLApplication)</field>    <description>Mshta launching remote or inline script content (2/3)</description>    <mitre>      <id>T1218.005</id>    </mitre>  </rule>   <rule id="100002" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)\\mshta\.exe$</field>    <field name="ParentImage" type="pcre2">(?i)(\\winword\.exe$|\\excel\.exe$|\\powerpnt\.exe$|\\outlook\.exe$|\\msaccess\.exe$|\\onenote\.exe$|\\visio\.exe$|\\wscript\.exe$|\\cscript\.exe$|\\eqnedt32\.exe$)</field>    <description>Mshta launching remote or inline script content (3/3)</description>    <mitre>      <id>T1218.005</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.