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

Siemphony@siemphonylowT1102.001unverified
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

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.