Skip to content

Siemphony is in beta and still being built. What ships today, and what does not.

Siemphony’s repertoire

Script host resolving a web service used for two-way C2

Siemphony@siemphonymediumT1102.002unverified
Matches a Sysmon DNS query where a scripting engine or signed-binary proxy — never a browser or a mail client — resolves a web service whose API supports both fetching an instruction and posting a result, which is AN0100's "suspicious process contacting common web service domains" leg. dns_query is chosen over the network-connection source the same analytic offers because every one of these services is fronted by shared CDN address space, so the destination IP identifies nothing, and because Sysmon EventID 22 attributes the query to the process that called the resolver while EventID 3 would only name whichever process owns the socket. The domain list is MITRE's DomainPattern knob populated here with bidirectional APIs only: read-only dead-drop endpoints such as pastebin and raw.githubusercontent are left out because a channel with no return path is a different sub-technique, and graph.microsoft.com is left out because the Graph PowerShell module makes it ordinary traffic for the very processes selected here. Two limits worth stating — the rule sees a name and nothing else, so it cannot tell a C2 poll from a legitimate API call, and it goes blind entirely against direct-to-IP callbacks, DNS-over-HTTPS, or a name already in the host resolver cache; Sysmon EventID 22 also needs DNS query logging switched on in the running configuration, which the common community configs filter hard. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0035, 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") AND (QueryName="*api.telegram.org" OR QueryName="*discord.com" OR QueryName="*discordapp.com" OR QueryName="*api.github.com" OR QueryName="*gist.github.com" OR QueryName="*slack.com" OR QueryName="*api.trello.com" OR QueryName="*api.dropboxapi.com" OR QueryName="*content.dropboxapi.com" OR QueryName="*api.notion.com" OR QueryName="*api.imgur.com" OR QueryName="*firebaseio.com" OR QueryName="*api.twitter.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") AND (TO_LOWER(dns.question.name) LIKE "*api.telegram.org" OR TO_LOWER(dns.question.name) LIKE "*discord.com" OR TO_LOWER(dns.question.name) LIKE "*discordapp.com" OR TO_LOWER(dns.question.name) LIKE "*api.github.com" OR TO_LOWER(dns.question.name) LIKE "*gist.github.com" OR TO_LOWER(dns.question.name) LIKE "*slack.com" OR TO_LOWER(dns.question.name) LIKE "*api.trello.com" OR TO_LOWER(dns.question.name) LIKE "*api.dropboxapi.com" OR TO_LOWER(dns.question.name) LIKE "*content.dropboxapi.com" OR TO_LOWER(dns.question.name) LIKE "*api.notion.com" OR TO_LOWER(dns.question.name) LIKE "*api.imgur.com" OR TO_LOWER(dns.question.name) LIKE "*firebaseio.com" OR TO_LOWER(dns.question.name) LIKE "*api.twitter.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="7">    <!-- 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$)</field>    <field name="QueryName" type="pcre2">(?i)(api\.telegram\.org$|discord\.com$|discordapp\.com$|api\.github\.com$|gist\.github\.com$|slack\.com$|api\.trello\.com$|api\.dropboxapi\.com$|content\.dropboxapi\.com$|api\.notion\.com$|api\.imgur\.com$|firebaseio\.com$|api\.twitter\.com$)</field>    <description>Script host resolving a web service used for two-way C2</description>    <mitre>      <id>T1102.002</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.