Detection rules › Sublime MQL

Open redirect: predictiveresponse.net

Severity
medium
Type
rule
Source
github.com/sublime-security/sublime-rules

Message contains use of the predictiveresponse.net open redirect. This has been exploited in the wild.

Threat classification

Sublime's own taxonomy (not MITRE ATT&CK).

CategoryValues
Attack typesCredential Phishing, Malware/Ransomware
Tactics and techniquesOpen redirect

Event coverage

Rule body MQL

type.inbound
and any(body.links,
        .href_url.domain.root_domain == "predictiveresponse.net"
        and strings.icontains(.href_url.query_params, 'redirect=')
        and not regex.icontains(.href_url.query_params,
                                'redirect=(?:https?(?:%3a|:))?(?:%2f|\/){2}[^&]*predictiveresponse\.net(?:\&|\/|$)'
        )
)
and not sender.email.domain.root_domain == "predictiveresponse.net"
// negate use of predictiveresponse infra
and not any(headers.domains, .root_domain == "predictiveresponse.net")
and not any(headers.hops,
            any(.fields,
                .name == "List-Unsubscribe"
                and strings.iends_with(.value, '@predictiveresponse.net>')
            )
)
// negate highly trusted sender domains unless they fail DMARC authentication
and (
  (
    sender.email.domain.root_domain in $high_trust_sender_root_domains
    and not headers.auth_summary.dmarc.pass
  )
  or sender.email.domain.root_domain not in $high_trust_sender_root_domains
)

Detection logic

Scope: inbound message.

Message contains use of the predictiveresponse.net open redirect. This has been exploited in the wild.

  1. inbound message
  2. any of body.links where all hold:
    • .href_url.domain.root_domain is 'predictiveresponse.net'
    • .href_url.query_params contains 'redirect='
    • not:
      • .href_url.query_params matches 'redirect=(?:https?(?:%3a|:))?(?:%2f|\\/){2}[^&]*predictiveresponse\\.net(?:\\&|\\/|$)'
  3. not:
    • sender.email.domain.root_domain is 'predictiveresponse.net'
  4. not:
    • any of headers.domains where:
      • .root_domain is 'predictiveresponse.net'
  5. not:
    • any of headers.hops where:
      • any of .fields where all hold:
        • .name is 'List-Unsubscribe'
        • .value ends with '@predictiveresponse.net>'
  6. any of:
    • all of:
      • sender.email.domain.root_domain in $high_trust_sender_root_domains
      • not:
        • headers.auth_summary.dmarc.pass
    • sender.email.domain.root_domain not in $high_trust_sender_root_domains

Inspects: body.links, body.links[].href_url.domain.root_domain, body.links[].href_url.query_params, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, sender.email.domain.root_domain, type.inbound. Sensors: regex.icontains, strings.icontains, strings.iends_with. Reference lists: $high_trust_sender_root_domains.

Indicators matched (7)

FieldMatchValue
body.links[].href_url.domain.root_domainequalspredictiveresponse.net
strings.icontainssubstringredirect=
regex.icontainsregexredirect=(?:https?(?:%3a|:))?(?:%2f|\/){2}[^&]*predictiveresponse\.net(?:\&|\/|$)
sender.email.domain.root_domainequalspredictiveresponse.net
headers.domains[].root_domainequalspredictiveresponse.net
headers.hops[].fields[].nameequalsList-Unsubscribe
strings.iends_withsuffix@predictiveresponse.net>