Skip to content

Siemphony is in beta and still being built. What ships today, and what does not.

Siemphony’s repertoire

Named pipe created with a known command-relay pipe name

Siemphony@siemphonymediumT1559unverified
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

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.