Skip to content

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

Siemphony’s repertoire

Outbound RDP initiated by a process that is not an RDP client

Matches a host opening an outbound connection to the Remote Desktop port when the process making it is not one of the shipped Remote Desktop clients. AN0931 lists the logon record and the network connection side by side; the logon record describes the destination host and says only that someone signed in, which on its own is a report of RDP usage rather than a detection. The network event is the source side of the same session, and it names the process, which is the part an adversary cannot avoid: credential-reuse tooling, a SOCKS or port-forward proxy, and a script driving RDP all reach 3389 from something that is not mstsc.exe or msrdc.exe. `Initiated` is pinned to true so the rule stays on the connecting host and does not re-report every inbound session on the terminal server. The post-access half of the analytic — unusual process execution inside a time window after the logon — is a correlation Sigma cannot express and is not attempted. Two limits worth stating: Sysmon network connection logging is not enabled by a default install and is filtered down hard in the widely used configurations, so an empty result means the feed is off rather than the estate is quiet; and the port is the literal default, so RDP moved to another port is invisible here. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0327, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 2 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: Outbound RDP initiated by a process that is not an RDP clientid: 9a5c9d9a-4c06-4f1e-a244-2d84bd10030cstatus: experimentaldescription: |  Matches a host opening an outbound connection to the Remote Desktop port when  the process making it is not one of the shipped Remote Desktop clients. AN0931  lists the logon record and the network connection side by side; the logon  record describes the destination host and says only that someone signed in,  which on its own is a report of RDP usage rather than a detection. The network  event is the source side of the same session, and it names the process, which  is the part an adversary cannot avoid: credential-reuse tooling, a SOCKS or  port-forward proxy, and a script driving RDP all reach 3389 from something  that is not mstsc.exe or msrdc.exe. `Initiated` is pinned to true so the rule  stays on the connecting host and does not re-report every inbound session on  the terminal server. The post-access half of the analytic — unusual process  execution inside a time window after the logon — is a correlation Sigma cannot  express and is not attempted. Two limits worth stating: Sysmon network  connection logging is not enabled by a default install and is filtered down  hard in the widely used configurations, so an empty result means the feed is  off rather than the estate is quiet; and the port is the literal default, so  RDP moved to another port is invisible here.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0327, 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/T1021/001  - https://attack.mitre.org/detectionstrategies/DET0327author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.lateral-movement  - attack.t1021.001logsource:  category: network_connection  product: windowsdetection:  selection:    DestinationPort: 3389    Initiated: 'true'  filter_rdp_clients:    Image|endswith:      - '\mstsc.exe'      - '\msrdc.exe'  condition: selection and not filter_rdp_clientsfalsepositives:  - "Third-party session managers and connection brokers — RDCMan, mRemoteNG, Remote Desktop Manager, Royal TS and similar — which host the RDP control themselves and therefore open 3389 under their own image name. These are the rule's top talkers on any administrator workstation and are deliberately left out of the filter, because the same shape is what a custom client looks like; allowlist the ones your estate actually deploys, by image and by user."  - "Vulnerability scanners, asset-discovery and network-inventory tooling sweeping 3389 across the estate. One scanner host produces a connection per target and will dominate the volume, so scope by source host rather than by process name."  - "Administrative port-forwarding and tunnelling — ssh.exe, plink.exe or a VPN client relaying a desktop session — which is indistinguishable from an adversary tunnelling RDP and separated only by who ran it. MITRE's UserContext and HostAccessPatterns knobs are aimed at this, the second by keeping only first-time source-to-destination pairs, which needs baselining outside the rule."  - "Remote-support, patching and monitoring agents that broker or health-check a Remote Desktop listener on a schedule, appearing as a service process connecting to 3389 at a fixed interval."level: medium

Splunk · SPL

Run this as a search.

index=* ((DestinationPort="3389" AND Initiated="true") AND NOT ((Image="*\\mstsc.exe" OR Image="*\\msrdc.exe")))

Wazuh · XML rule

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

<group name="sigma,windows,network_connection,">  <!-- 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="DestinationPort" type="pcre2">(?i)^3389$</field>    <field name="Initiated" type="pcre2">(?i)^true$</field>    <field name="Image" negate="yes" type="pcre2">(?i)(\\mstsc\.exe$|\\msrdc\.exe$)</field>    <description>Outbound RDP initiated by a process that is not an RDP client</description>    <mitre>      <id>T1021.001</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. `Initiated` has no Sentinel column: Defender expresses connection direction in `ActionType`, not as a boolean column, so `Initiated` cannot be renamed — it needs a different predicate. The Sigma source is on the first tab, unchanged.

Elastic · ES|QL

Run this as a search.

Elastic cannot express this construct. `Initiated` has no ECS field: ECS expresses connection direction as `network.direction` with values like `egress`, not as a boolean, so `Initiated` needs a different predicate rather than a rename. 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.

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