Skip to content

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

Siemphony’s repertoire

Script host resolving a public content host used as a dead drop

Matches AN0158 on Sysmon EventID 22: a scripting engine, transfer utility or signed-binary proxy — never a browser and never a mail client — resolving one of the public paste, raw-file and profile-page services an implant reads to learn where its real C2 lives. The analytic offers a network-connection leg as well; `dns_query` is chosen because every one of these services sits behind shared CDN address space, so the destination address in a Sysmon EventID 3 record identifies nothing, and because EventID 22 attributes the lookup to the process that called the resolver while EventID 3 names whichever process owns the socket. For the same reason bitsadmin.exe is absent from the image list: BITS performs the transfer inside svchost.exe and resolves nothing under its own name. The domain list is MITRE's `TargetDomain` knob populated here, and it is deliberately the complement of the corpus's T1102.002 rule, which excluded exactly these read-only endpoints on the grounds that a channel with no return path is a different sub-technique — the two lists share no entry. Two siblings do overlap, both on the identical logsource and fields. Three names (pastebin.com, hastebin.com, paste.ee) appear in this corpus's T1567 rule, and the two GitHub raw hosts are subsumed by the broader `githubusercontent.com` entry in its T1567.001 rule, so a lookup of any of those five raises two rules at once; the difference is only which hypothesis is being tested, exfiltration there and C2 resolution here. The coverage genuinely new to this rule is therefore the paste and profile-page hosts neither sibling carries — pastebin.pl, rentry.co, controlc.com, justpaste.it, telegra.ph, t.me and steamcommunity.com — and those, not the GitHub hosts that dominate the false positives below, are where its value sits. What a name resolution cannot tell you is the whole of the technique's point: the encoded address of the second-stage server lives in the response body, which no log source in this brief carries, so a match says a script fetched something from a content host and never that it read a resolver. MITRE's `TimeWindow` knob, which would tie the fetch to the follow-on connection, is a cross-event correlation lib/sigma has no timeframe or join to express. Coverage is also blind to a name already in the host resolver cache, to DNS-over-HTTPS, to a hard-coded IP, and to any service outside the list. Prerequisite: Sysmon EventID 22 requires DNS query logging to be switched on in the running configuration, which several widely used community configs filter heavily or omit. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0058, 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: Script host resolving a public content host used as a dead dropid: a6a99a21-4b3a-4013-b12d-7bd8095ba9fdstatus: experimentaldescription: |  Matches AN0158 on Sysmon EventID 22: a scripting engine, transfer utility or  signed-binary proxy — never a browser and never a mail client — resolving one  of the public paste, raw-file and profile-page services an implant reads to  learn where its real C2 lives. The analytic offers a network-connection leg as  well; `dns_query` is chosen because every one of these services sits behind  shared CDN address space, so the destination address in a Sysmon EventID 3  record identifies nothing, and because EventID 22 attributes the lookup to the  process that called the resolver while EventID 3 names whichever process owns  the socket. For the same reason bitsadmin.exe is absent from the image list:  BITS performs the transfer inside svchost.exe and resolves nothing under its  own name. The domain list is MITRE's `TargetDomain` knob populated here, and  it is deliberately the complement of the corpus's T1102.002 rule, which  excluded exactly these read-only endpoints on the grounds that a channel with  no return path is a different sub-technique — the two lists share no entry.  Two siblings do overlap, both on the identical logsource and fields. Three  names (pastebin.com, hastebin.com, paste.ee) appear in this corpus's T1567  rule, and the two GitHub raw hosts are subsumed by the broader  `githubusercontent.com` entry in its T1567.001 rule, so a lookup of any of  those five raises two rules at once; the difference is only which hypothesis  is being tested, exfiltration there and C2 resolution here. The coverage  genuinely new to this rule is therefore the paste and profile-page hosts  neither sibling carries — pastebin.pl, rentry.co, controlc.com, justpaste.it,  telegra.ph, t.me and steamcommunity.com — and those, not the GitHub hosts  that dominate the false positives below, are where its value sits.  What a name resolution cannot tell you is the whole of the technique's point:  the encoded address of the second-stage server lives in the response body,  which no log source in this brief carries, so a match says a script fetched  something from a content host and never that it read a resolver. MITRE's  `TimeWindow` knob, which would tie the fetch to the follow-on connection, is a  cross-event correlation lib/sigma has no timeframe or join to express.  Coverage is also blind to a name already in the host resolver cache, to  DNS-over-HTTPS, to a hard-coded IP, and to any service outside the list.  Prerequisite: Sysmon EventID 22 requires DNS query logging to be switched on  in the running configuration, which several widely used community configs  filter heavily or omit.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0058, 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/T1102/001  - https://attack.mitre.org/detectionstrategies/DET0058author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.command-and-control  - attack.t1102.001logsource:  category: dns_query  product: windowsdetection:  selection_process:    Image|endswith:      - '\powershell.exe'      - '\pwsh.exe'      - '\wscript.exe'      - '\cscript.exe'      - '\mshta.exe'      - '\rundll32.exe'      - '\regsvr32.exe'      - '\certutil.exe'      - '\curl.exe'      - '\python.exe'      - '\pythonw.exe'  selection_deaddrop:    QueryName|endswith:      - 'raw.githubusercontent.com'      - 'gist.githubusercontent.com'      - 'pastebin.com'      - 'pastebin.pl'      - 'paste.ee'      - 'hastebin.com'      - 'rentry.co'      - 'controlc.com'      - 'justpaste.it'      - 'telegra.ph'      - 't.me'      - 'steamcommunity.com'  condition: selection_process and selection_deaddropfalsepositives:  - "PowerShell and curl.exe fetching bootstrap and install scripts from raw.githubusercontent.com. The documented installation command for Chocolatey, scoop, nvm-windows, oh-my-posh and a very large number of vendor and internal tools is a download from that host piped straight into the interpreter, so on any estate with developers or build agents this is the highest-volume match by a wide margin, and it is what sets the level."  - "Build and packaging pipelines on CI runners, where a job fetches a pinned script, manifest or checksum file from raw.githubusercontent.com or gist.githubusercontent.com on every single run, producing a steady high-rate stream from a small number of hosts that looks nothing like a human pattern."  - "Python tooling on analyst, engineering and data workstations that reads its configuration, wordlists, signature sets or reference datasets from raw.githubusercontent.com and gist.githubusercontent.com, which is how a great deal of open-source tooling ships data files it does not want to vendor."  - "Staff sharing text through a paste service. Support and engineering teams routinely put logs and configuration into pastebin.com or rentry.co, and any helper script or PowerShell one-liner that posts or retrieves one resolves the same names from a process on this list."level: low

Splunk · SPL

Run this as a search.

index=* ((Image="*\\powershell.exe" OR Image="*\\pwsh.exe" OR Image="*\\wscript.exe" OR Image="*\\cscript.exe" OR Image="*\\mshta.exe" OR Image="*\\rundll32.exe" OR Image="*\\regsvr32.exe" OR Image="*\\certutil.exe" OR Image="*\\curl.exe" OR Image="*\\python.exe" OR Image="*\\pythonw.exe") AND (QueryName="*raw.githubusercontent.com" OR QueryName="*gist.githubusercontent.com" OR QueryName="*pastebin.com" OR QueryName="*pastebin.pl" OR QueryName="*paste.ee" OR QueryName="*hastebin.com" OR QueryName="*rentry.co" OR QueryName="*controlc.com" OR QueryName="*justpaste.it" OR QueryName="*telegra.ph" OR QueryName="*t.me" OR QueryName="*steamcommunity.com"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(process.executable) LIKE "*\\\\powershell.exe" OR TO_LOWER(process.executable) LIKE "*\\\\pwsh.exe" OR TO_LOWER(process.executable) LIKE "*\\\\wscript.exe" OR TO_LOWER(process.executable) LIKE "*\\\\cscript.exe" OR TO_LOWER(process.executable) LIKE "*\\\\mshta.exe" OR TO_LOWER(process.executable) LIKE "*\\\\rundll32.exe" OR TO_LOWER(process.executable) LIKE "*\\\\regsvr32.exe" OR TO_LOWER(process.executable) LIKE "*\\\\certutil.exe" OR TO_LOWER(process.executable) LIKE "*\\\\curl.exe" OR TO_LOWER(process.executable) LIKE "*\\\\python.exe" OR TO_LOWER(process.executable) LIKE "*\\\\pythonw.exe") AND (TO_LOWER(dns.question.name) LIKE "*raw.githubusercontent.com" OR TO_LOWER(dns.question.name) LIKE "*gist.githubusercontent.com" OR TO_LOWER(dns.question.name) LIKE "*pastebin.com" OR TO_LOWER(dns.question.name) LIKE "*pastebin.pl" OR TO_LOWER(dns.question.name) LIKE "*paste.ee" OR TO_LOWER(dns.question.name) LIKE "*hastebin.com" OR TO_LOWER(dns.question.name) LIKE "*rentry.co" OR TO_LOWER(dns.question.name) LIKE "*controlc.com" OR TO_LOWER(dns.question.name) LIKE "*justpaste.it" OR TO_LOWER(dns.question.name) LIKE "*telegra.ph" OR TO_LOWER(dns.question.name) LIKE "*t.me" OR TO_LOWER(dns.question.name) LIKE "*steamcommunity.com"))

Wazuh · XML rule

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

<group name="sigma,windows,dns_query,">  <!-- 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 windows so this only evaluates relevant events. -->    <field name="Image" type="pcre2">(?i)(\\powershell\.exe$|\\pwsh\.exe$|\\wscript\.exe$|\\cscript\.exe$|\\mshta\.exe$|\\rundll32\.exe$|\\regsvr32\.exe$|\\certutil\.exe$|\\curl\.exe$|\\python\.exe$|\\pythonw\.exe$)</field>    <field name="QueryName" type="pcre2">(?i)(raw\.githubusercontent\.com$|gist\.githubusercontent\.com$|pastebin\.com$|pastebin\.pl$|paste\.ee$|hastebin\.com$|rentry\.co$|controlc\.com$|justpaste\.it$|telegra\.ph$|t\.me$|steamcommunity\.com$)</field>    <description>Script host resolving a public content host used as a dead drop</description>    <mitre>      <id>T1102.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 ({"category":"dns_query","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.

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