Skip to content

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

Siemphony’s repertoire

Script host or LOLBin connecting outbound to a proxy port

Matches the network leg of MITRE's AN0922: one of the script hosts or signed LOLBins the analytic names opening an outbound socket to a port that only a relay, SOCKS listener or forward proxy normally answers on, with destinations inside RFC1918 and link-local space subtracted. That subtraction is what makes this External Proxy and not T1090.001 Internal Proxy, and the log source is what keeps it distinct from the published T1090 rule, which matches Linux execve records for socat and ncat command lines; the address filter is a coarse stand-in for MITRE's DestinationASN knob, and an estate that routes public address space internally will need it replaced with its own ranges. The process list is restricted to binaries that perform their own HTTP in process, because Sysmon EventID 3 names the owner of the socket rather than the tool that was typed — bitsadmin.exe is absent because the BITS service in svchost.exe does the transfer, and scp.exe and sftp.exe are absent because ssh.exe owns the connection, so all three would be selectors that can never fire. Where the estate configures an explicit web proxy, every one of these requests terminates on that internal proxy instead of on the real destination and is removed by the private-address filter, so on such a fleet the rule is blind rather than quiet. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0325, 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: Script host or LOLBin connecting outbound to a proxy portid: 179f7391-1355-437a-8d66-7f22fda8285bstatus: experimentaldescription: |  Matches the network leg of MITRE's AN0922: one of the script hosts or signed  LOLBins the analytic names opening an outbound socket to a port that only a  relay, SOCKS listener or forward proxy normally answers on, with destinations  inside RFC1918 and link-local space subtracted. That subtraction is what makes  this External Proxy and not T1090.001 Internal Proxy, and the log source is  what keeps it distinct from the published T1090 rule, which matches Linux  execve records for socat and ncat command lines; the address filter is a coarse  stand-in for MITRE's DestinationASN knob, and an estate that routes public  address space internally will need it replaced with its own ranges. The process  list is restricted to binaries that perform their own HTTP in process, because  Sysmon EventID 3 names the owner of the socket rather than the tool that was  typed — bitsadmin.exe is absent because the BITS service in svchost.exe does  the transfer, and scp.exe and sftp.exe are absent because ssh.exe owns the  connection, so all three would be selectors that can never fire. Where the  estate configures an explicit web proxy, every one of these requests terminates  on that internal proxy instead of on the real destination and is removed by the  private-address filter, so on such a fleet the rule is blind rather than quiet.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0325, 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/T1090/002  - https://attack.mitre.org/detectionstrategies/DET0325author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.command-and-control  - attack.t1090.002logsource:  category: network_connection  product: windowsdetection:  selection_lolbin:    Image|endswith:      - '\rundll32.exe'      - '\mshta.exe'      - '\wscript.exe'      - '\cscript.exe'      - '\regsvr32.exe'      - '\certutil.exe'  selection_proxy_port:    Initiated: 'true'    DestinationPort:      - 1080      - 3128      - 4444      - 8080      - 8081      - 8888      - 9001      - 9050      - 9051      - 9150  filter_internal_destination:    DestinationIp|startswith:      - '10.'      - '127.'      - '169.254.'      - '172.16.'      - '172.17.'      - '172.18.'      - '172.19.'      - '172.20.'      - '172.21.'      - '172.22.'      - '172.23.'      - '172.24.'      - '172.25.'      - '172.26.'      - '172.27.'      - '172.28.'      - '172.29.'      - '172.30.'      - '172.31.'      - '192.168.'      - 'fd'      - 'fe80:'      - '::1'  condition: selection_lolbin and selection_proxy_port and not filter_internal_destinationfalsepositives:  - "An externally hosted web gateway or cloud filtering service published on 3128 or 8080. Where the estate uses one, every scripted or LOLBin-hosted request reaches it on a public address and matches, which makes it the rule's dominant volume and the reason the level is medium rather than high."  - "Vendor installers, patching agents and management tooling that hand a download to certutil.exe or to a rundll32-hosted component against a distribution endpoint published on 8080 or 8081."  - "Developer, QA and monitoring scripts run under wscript.exe or cscript.exe that call an external partner API, staging service or test endpoint on a non-standard port."  - "Privacy and threat-research tooling on analyst workstations that routes traffic through an external anonymising relay on 9050 or 9150, which is the same shape as the behaviour being hunted."level: medium

Splunk · SPL

Run this as a search.

index=* (((Image="*\\rundll32.exe" OR Image="*\\mshta.exe" OR Image="*\\wscript.exe" OR Image="*\\cscript.exe" OR Image="*\\regsvr32.exe" OR Image="*\\certutil.exe") AND (Initiated="true" AND (DestinationPort="1080" OR DestinationPort="3128" OR DestinationPort="4444" OR DestinationPort="8080" OR DestinationPort="8081" OR DestinationPort="8888" OR DestinationPort="9001" OR DestinationPort="9050" OR DestinationPort="9051" OR DestinationPort="9150"))) AND NOT ((DestinationIp="10.*" OR DestinationIp="127.*" OR DestinationIp="169.254.*" OR DestinationIp="172.16.*" OR DestinationIp="172.17.*" OR DestinationIp="172.18.*" OR DestinationIp="172.19.*" OR DestinationIp="172.20.*" OR DestinationIp="172.21.*" OR DestinationIp="172.22.*" OR DestinationIp="172.23.*" OR DestinationIp="172.24.*" OR DestinationIp="172.25.*" OR DestinationIp="172.26.*" OR DestinationIp="172.27.*" OR DestinationIp="172.28.*" OR DestinationIp="172.29.*" OR DestinationIp="172.30.*" OR DestinationIp="172.31.*" OR DestinationIp="192.168.*" OR DestinationIp="fd*" OR DestinationIp="fe80:*" OR DestinationIp="::1*")))

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="Image" type="pcre2">(?i)(\\rundll32\.exe$|\\mshta\.exe$|\\wscript\.exe$|\\cscript\.exe$|\\regsvr32\.exe$|\\certutil\.exe$)</field>    <field name="Initiated" type="pcre2">(?i)^true$</field>    <field name="DestinationPort" type="pcre2">(?i)(^1080$|^3128$|^4444$|^8080$|^8081$|^8888$|^9001$|^9050$|^9051$|^9150$)</field>    <field name="DestinationIp" negate="yes" type="pcre2">(?i)(^10\.|^127\.|^169\.254\.|^172\.16\.|^172\.17\.|^172\.18\.|^172\.19\.|^172\.20\.|^172\.21\.|^172\.22\.|^172\.23\.|^172\.24\.|^172\.25\.|^172\.26\.|^172\.27\.|^172\.28\.|^172\.29\.|^172\.30\.|^172\.31\.|^192\.168\.|^fd|^fe80:|^::1)</field>    <description>Script host or LOLBin connecting outbound to a proxy port</description>    <mitre>      <id>T1090.002</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.