Skip to content

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

Siemphony’s repertoire

Named pipe created with a known command-relay pipe name

Windows named pipes are the one IPC mechanism in AN1357 that has no sub-technique of its own — COM is T1559.001 and DDE is T1559.002 — so the pipe leg is where a parent-level rule belongs. This matches Sysmon pipe events (EventID 17 creation and 18 connection — the selection carries no EventID constraint, so both are captured, and the connecting client is often the more interesting half for a relay pipe) on two families of pipe name. selection_cmd_relay covers pipes whose purpose is to relay a remotely executed command's stdin/stdout back to the caller: the post-exploitation job pipes of a widely deployed offensive framework (postex_, status_), and PsExec's own service pipe (PSEXESVC). PSEXESVC is dual-filed — the SMB service install that creates it is T1569.002 with T1021.002 for the transport — but the pipe itself carries the executed command's I/O, which is the local IPC behaviour this rule is filed under, so it stays. selection_peer_channel covers msagent_ and MSSE-, the same framework's SMB peer-to-peer beacon channel; this is C2 traffic riding a named pipe rather than command relay and is dual-filed under T1090.001/T1572 — a hit on this arm should be triaged as a beacon channel, not as local command execution. paexec, remcom_ and csexecsvc were dropped from an earlier draft: they are the same class of service-based remote-execution pipe as svcctl and atsvc, which this rule already excludes on the grounds that their abuse is the observable of remote service execution rather than local IPC — the same reasoning now applies consistently across all of them. MITRE names the PipeNamePattern knob and offers only the svcctl example, which this rule does not use for that reason; every prefix below was assembled here, not taken from the brief. The status_ prefix is a generic word matched with nothing beyond startswith, so an unrelated product that names a pipe that way will also match — that is a precision limit on selection_cmd_relay, not a false positive, since no real benign source can be named for it. Two further limits are structural. A pipe name is a default, so an operator who changes it leaves nothing here, and this rule therefore ages out rather than generalising. The other two Windows log sources in the analytic cannot substitute: the brief maps Security 4663 onto the Sysmon-shaped file_event category, whose TargetFilename cannot carry a pipe object, and the 4656/4670 leg needs a SACL on the named-pipe device that no default or CIS baseline sets. Sysmon must also be configured with a PipeEvent section — pipe creation is not logged by a stock or minimal configuration, and a silent rule here means blind, not quiet. UNVERIFIED — derived from MITRE ATT&CK DET0493 and never executed against logs.Full description

The detection

The 3 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: Named pipe created with a known command-relay pipe nameid: 70a46951-2fa4-40ad-a3f0-8bf411e30211status: experimentaldescription: |  Windows named pipes are the one IPC mechanism in AN1357 that has no  sub-technique of its own — COM is T1559.001 and DDE is T1559.002 — so the pipe  leg is where a parent-level rule belongs. This matches Sysmon pipe events  (EventID 17 creation and 18 connection — the selection carries no EventID  constraint, so both are captured, and the connecting client is often the more  interesting half for a relay pipe) on two families of pipe name.  selection_cmd_relay covers pipes whose purpose is to relay a remotely  executed command's stdin/stdout back to the caller: the post-exploitation job  pipes of a widely deployed offensive framework (postex_, status_), and  PsExec's own service pipe (PSEXESVC). PSEXESVC is dual-filed — the SMB  service install that creates it is T1569.002 with T1021.002 for the transport  — but the pipe itself carries the executed command's I/O, which is the local  IPC behaviour this rule is filed under, so it stays. selection_peer_channel  covers msagent_ and MSSE-, the same framework's SMB peer-to-peer beacon  channel; this is C2 traffic riding a named pipe rather than command relay and  is dual-filed under T1090.001/T1572 — a hit on this arm should be triaged as  a beacon channel, not as local command execution. paexec, remcom_ and  csexecsvc were dropped from an earlier draft: they are the same class of  service-based remote-execution pipe as svcctl and atsvc, which this rule  already excludes on the grounds that their abuse is the observable of remote  service execution rather than local IPC — the same reasoning now applies  consistently across all of them. MITRE names the PipeNamePattern knob and  offers only the svcctl example, which this rule does not use for that reason;  every prefix below was assembled here, not taken from the brief. The status_  prefix is a generic word matched with nothing beyond startswith, so an  unrelated product that names a pipe that way will also match — that is a  precision limit on selection_cmd_relay, not a false positive, since no real  benign source can be named for it. Two further limits are structural. A pipe  name is a default, so an operator who changes it leaves nothing here, and  this rule therefore ages out rather than generalising. The other two Windows  log sources in the analytic cannot substitute: the brief maps Security 4663  onto the Sysmon-shaped file_event category, whose TargetFilename cannot carry  a pipe object, and the 4656/4670 leg needs a SACL on the named-pipe device  that no default or CIS baseline sets. Sysmon must also be configured with a  PipeEvent section — pipe creation is not logged by a stock or minimal  configuration, and a silent rule here means blind, not quiet.  UNVERIFIED — derived from MITRE ATT&CK DET0493 and never executed against logs.references:  - https://attack.mitre.org/techniques/T1559  - https://attack.mitre.org/detectionstrategies/DET0493author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.execution  - attack.t1559logsource:  category: pipe_created  product: windowsdetection:  selection_cmd_relay:    PipeName|startswith:      - '\postex_'      - '\status_'      - '\PSEXESVC'  selection_peer_channel:    PipeName|startswith:      - '\msagent_'      - '\MSSE-'  condition: 1 of selection_*falsepositives:  - "Sanctioned use of Sysinternals PsExec, a standard administration tool embedded in software distribution scripts, remote-support tooling, imaging task sequences and ad hoc break-fix work; every invocation creates the PSEXESVC pipe on the target and matches selection_cmd_relay. In an estate that still permits PsExec this is the dominant match on that arm, which is why this rule is scored medium rather than higher."  - "Purple-team and control-validation runs, and licensed red-team engagements, using the offensive framework whose default pipe prefixes are listed here. These produce clean matches on every exercise and are indistinguishable from an intrusion at the level of a pipe name."  - "Monitoring, backup and patch agents that ship a bundled copy of Sysinternals PsExec to run a command on a peer, so the PSEXESVC pipe appears on a schedule from a service account rather than from an interactive session."level: medium

Splunk · SPL

Run this as a search.

index=* ((PipeName="\\postex_*" OR PipeName="\\status_*" OR PipeName="\\PSEXESVC*") OR (PipeName="\\msagent_*" OR PipeName="\\MSSE-*"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(file.name) LIKE "\\\\postex_*" OR TO_LOWER(file.name) LIKE "\\\\status_*" OR TO_LOWER(file.name) LIKE "\\\\psexesvc*") OR (TO_LOWER(file.name) LIKE "\\\\msagent_*" OR TO_LOWER(file.name) LIKE "\\\\msse-*"))

Wazuh · XML rule

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

<group name="sigma,windows,pipe_created,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="PipeName" type="pcre2">(?i)((^\\postex_|^\\status_|^\\PSEXESVC)|(^\\msagent_|^\\MSSE-))</field>    <description>Named pipe created with a known command-relay pipe name</description>    <mitre>      <id>T1559</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"category":"pipe_created","product":"windows"}), so there is nothing honest to query. Pick a logsource this translator maps, or write the KQL by hand. The Sigma source is on the first tab, unchanged.

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.

2 threads

  • @priya-raman

    Every operator worth worrying about renames these — the prefixes here are framework defaults, and defaults are what you get from the people who did not read the docs. That is not an argument against the rule, it is an argument for the medium it already carries: a hit is worth looking at, a miss proves nothing at all. The failure mode to avoid is someone putting this on a coverage map and calling the technique covered.

  • @nadia-brandt

    PSEXESVC will fire every time your software distribution tooling touches a host, so we pulled that prefix into its own rule with an allowlist of source accounts and left postex_ and msagent_ in the one that pages. They answer different questions: one is "did somebody use an admin tool", the other is "is there an implant". Merging them means the second one is muted by the noise of the first.