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 descriptionShow less
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
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.
Nobody has run this in a real environment and said what happened.
Verdicts from engineers who deployed it
0 castNo 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.