Skip to content

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

Siemphony’s repertoire

Non-browser HTTP client user agent in web traffic

Matches Zeek http.log requests whose User-Agent identifies a scripting or library HTTP client rather than a browser, plus the obsolete "Mozilla/4.0 (compatible; MSIE" family that off-the-shelf C2 profiles still use to imitate one. This is the UserAgentAnomalies knob of AN0075 turned into logic, and the network view is chosen over the brief's Sysmon leg because the header only exists on the wire — a Sysmon EventID 3 record carries the process and the port and nothing about the request. The user agent list is authored for this rule; MITRE names the knob but supplies no values. Three limits belong in the reader's head before this is deployed: http.log holds cleartext HTTP only, so a C2 channel over HTTPS or a WebSocket upgraded inside TLS is invisible here and is what the brief's ssl.log and websocket.log sources exist for; a User-Agent is attacker-chosen and copying a current Chrome string defeats the rule entirely; and the beaconing, volume-ratio and byte-count discriminators the analytic leans on (OutboundByteRatioThreshold, BeaconIntervalWindow) need aggregation over time, which Sigma has no way to express, so this fires on a single request. There is also no direction test here: http.log carries requests in both directions, and where the sensor watches an internet-facing service the inbound scanners using these same libraries will outweigh anything leaving the estate, so the first tuning step is to constrain the originator to internal address space. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0027, not hand-written and not tested by its author. Any lab result is on this rule's own page.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: Non-browser HTTP client user agent in web trafficid: ec95ccdd-c836-4ff6-85ec-fdf9d6366ea0status: experimentaldescription: |  Matches Zeek http.log requests whose User-Agent identifies a scripting or  library HTTP client rather than a browser, plus the obsolete  "Mozilla/4.0 (compatible; MSIE" family that off-the-shelf C2 profiles still  use to imitate one. This is the UserAgentAnomalies knob of AN0075 turned  into logic, and the network view is chosen over the brief's Sysmon leg  because the header only exists on the wire — a Sysmon EventID 3 record  carries the process and the port and nothing about the request. The user  agent list is authored for this rule; MITRE names the knob but supplies no  values. Three limits belong in the reader's head before this is deployed:  http.log holds cleartext HTTP only, so a C2 channel over HTTPS or a  WebSocket upgraded inside TLS is invisible here and is what the brief's  ssl.log and websocket.log sources exist for; a User-Agent is attacker-chosen  and copying a current Chrome string defeats the rule entirely; and the  beaconing, volume-ratio and byte-count discriminators the analytic leans on  (OutboundByteRatioThreshold, BeaconIntervalWindow) need aggregation over  time, which Sigma has no way to express, so this fires on a single request.  There is also no direction test here: http.log carries requests in both  directions, and where the sensor watches an internet-facing service the  inbound scanners using these same libraries will outweigh anything leaving  the estate, so the first tuning step is to constrain the originator to  internal address space.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0027, 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/T1071/001  - https://attack.mitre.org/detectionstrategies/DET0027author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.command-and-control  - attack.t1071.001logsource:  product: zeek  service: httpdetection:  selection:    user_agent|contains:      - 'python-requests'      - 'python-urllib'      - 'Go-http-client'      - 'curl/'      - 'Wget/'      - 'libwww-perl'      - 'Java/'      - 'WindowsPowerShell'      - 'PowerShell/'      - 'WinHttp.WinHttpRequest'      - 'Microsoft BITS'      - 'Mozilla/4.0 (compatible; MSIE'  condition: selectionfalsepositives:  - "Monitoring, uptime and load-balancer health checks polling internal endpoints with curl or Wget every few seconds. On any network with a monitoring stack this single source outweighs everything else the rule returns, which is why the level here is low and why the first tuning step is to exclude the pollers by source address rather than to shorten the user agent list."  - "Package managers, CI runners and container builds pulling dependencies over plain HTTP from internal mirrors, which produce python-requests, Go-http-client and Java/ user agents in bulk from build hosts and registry proxies."  - "Windows software distribution and telemetry components: BITS transfers publish the Microsoft BITS string and WinHTTP-based agents publish the WinHttpRequest one, both as a normal part of update and inventory traffic."  - "Legacy intranet and line-of-business applications built on WinINet that still identify as an old MSIE version, which match the browser-spoof pattern with nothing unusual happening at all."  - "Inbound internet scanning and crawling of any web service the sensor sits in front of, which arrives with python-requests, Go-http-client and curl user agents continuously and has nothing to do with an internal host beaconing out."level: low

Splunk · SPL

Run this as a search.

index=* (user_agent="*python-requests*" OR user_agent="*python-urllib*" OR user_agent="*Go-http-client*" OR user_agent="*curl/*" OR user_agent="*Wget/*" OR user_agent="*libwww-perl*" OR user_agent="*Java/*" OR user_agent="*WindowsPowerShell*" OR user_agent="*PowerShell/*" OR user_agent="*WinHttp.WinHttpRequest*" OR user_agent="*Microsoft BITS*" OR user_agent="*Mozilla/4.0 (compatible; MSIE*")

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE (TO_LOWER(user_agent) LIKE "*python-requests*" OR TO_LOWER(user_agent) LIKE "*python-urllib*" OR TO_LOWER(user_agent) LIKE "*go-http-client*" OR TO_LOWER(user_agent) LIKE "*curl/*" OR TO_LOWER(user_agent) LIKE "*wget/*" OR TO_LOWER(user_agent) LIKE "*libwww-perl*" OR TO_LOWER(user_agent) LIKE "*java/*" OR TO_LOWER(user_agent) LIKE "*windowspowershell*" OR TO_LOWER(user_agent) LIKE "*powershell/*" OR TO_LOWER(user_agent) LIKE "*winhttp.winhttprequest*" OR TO_LOWER(user_agent) LIKE "*microsoft bits*" OR TO_LOWER(user_agent) LIKE "*mozilla/4.0 (compatible; msie*")

Wazuh · XML rule

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

<group name="sigma,zeek,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <rule id="100000" level="5">    <!-- Set <if_sid> to the decoder/base rule for zeek so this only evaluates relevant events. -->    <field name="user_agent" type="pcre2">(?i)(python-requests|python-urllib|Go-http-client|curl/|Wget/|libwww-perl|Java/|WindowsPowerShell|PowerShell/|WinHttp\.WinHttpRequest|Microsoft BITS|Mozilla/4\.0 \(compatible; MSIE)</field>    <description>Non-browser HTTP client user agent in web traffic</description>    <mitre>      <id>T1071.001</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"product":"zeek","service":"http"}), 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.

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