HTTP client fronting a CDN edge with an overridden Host header
Domain fronting is a mismatch between the TLS SNI and the HTTP Host header, and no single log source in this brief holds both fields. Sysmon EventID 3 records socket endpoints only and EventID 22 records `QueryName`, so neither Windows source can express the mismatch at all; Zeek carries `server_name` in ssl.log and `host` in http.log, but those are two separate log sources and Sigma cannot join them. What is left, and what AN0565 names explicitly, is the client side: `curl` or `wget` dialling an HTTPS URL whose hostname is a CDN edge while forcing a different Host header, which is the client-side shape of the SNI/Host mismatch. Both halves are required. The Host override alone is connection testing; `--resolve` and `--connect-to` are deliberately not selectors at all, because they change only the address dialled while SNI and the Host header both stay the URL's hostname — that is connection pinning, not fronting. The CDN list is the inverse use of MITRE's CDNAllowList knob, which names front-end domains to reason about; the four values below are populated here rather than sourced from MITRE, and an estate should add its own edge hostnames. Related but distinct: the T1001.003 rule in this corpus matches the same tools overriding Host to impersonate a named cloud API, with no CDN residency requirement; the CDN gate here is what makes a match evidence of fronting rather than of impersonation. This sees the invocation, not the fronting — an implant that fronts from inside its own code, a request without an explicit `https://` scheme, a front on a CDN not listed, and MITRE's empty-SNI "domainless" variant all pass without a match. On Alpine and other BusyBox userlands `wget` is an applet, so execve records `/bin/busybox`, which is why it is in the tool list; BusyBox wget supports only the `--header=Host:` form of the three. Prerequisite: auditd ships no execve rule by default, so without an explicit -a always,exit -F arch=b64 -S execve there is no process_creation telemetry on the host at all and this rule returns zero rows regardless of what ran. It also assumes a feed that reconstructs `CommandLine` from the a0..aN fields and hex-decodes them: auditd hex-encodes any argument containing whitespace, so on a raw feed the `-H 'Host: front.example'` form arrives as hex and only the whitespace-free `-H Host:front.example` form still matches. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0196, 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 4 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
Sentinel · KQL
Run this as a search.
DeviceProcessEvents| where ((((FolderPath endswith "/curl" or FolderPath endswith "/wget" or FolderPath endswith "/busybox") and (ProcessCommandLine contains "-H Host:" or ProcessCommandLine contains "-HHost:" or ProcessCommandLine contains "--header=Host:")) and ProcessCommandLine contains "https://") and (ProcessCommandLine contains "cloudfront.net" or ProcessCommandLine contains "azureedge.net" or ProcessCommandLine contains "fastly.net" or ProcessCommandLine contains "akamaihd.net"))
Splunk · SPL
Run this as a search.
index=* ((((Image="*/curl" OR Image="*/wget" OR Image="*/busybox") AND (CommandLine="*-H Host:*" OR CommandLine="*-HHost:*" OR CommandLine="*--header=Host:*")) AND CommandLine="*https://*") AND (CommandLine="*cloudfront.net*" OR CommandLine="*azureedge.net*" OR CommandLine="*fastly.net*" OR CommandLine="*akamaihd.net*"))Elastic · ES|QL
Run this as a search.
FROM logs-*| WHERE ((((TO_LOWER(process.executable) LIKE "*/curl" OR TO_LOWER(process.executable) LIKE "*/wget" OR TO_LOWER(process.executable) LIKE "*/busybox") AND (TO_LOWER(process.command_line) LIKE "*-h host:*" OR TO_LOWER(process.command_line) LIKE "*-hhost:*" OR TO_LOWER(process.command_line) LIKE "*--header=host:*")) AND TO_LOWER(process.command_line) LIKE "*https://*") AND (TO_LOWER(process.command_line) LIKE "*cloudfront.net*" OR TO_LOWER(process.command_line) LIKE "*azureedge.net*" OR TO_LOWER(process.command_line) LIKE "*fastly.net*" OR TO_LOWER(process.command_line) LIKE "*akamaihd.net*"))
Wazuh · XML rule
Deploy to your manager — this is a rule, not a search.
<group name="sigma,linux,process_creation,"> <!-- 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 linux so this only evaluates relevant events. --> <field name="Image" type="pcre2">(?i)(/curl$|/wget$|/busybox$)</field> <field name="CommandLine" type="pcre2">(?i)(-H Host:|-HHost:|--header=Host:)</field> <field name="CommandLine" type="pcre2">(?i)https://</field> <field name="CommandLine" type="pcre2">(?i)(cloudfront\.net|azureedge\.net|fastly\.net|akamaihd\.net)</field> <description>HTTP client fronting a CDN edge with an overridden Host header</description> <mitre> <id>T1090.004</id> </mitre> </rule></group>
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.