Detection rules › Sublime MQL

Brand impersonation: Booking.com

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

Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Event coverage

Rule body MQL

type.inbound
and length(body.links) < 10
and (
  any(ml.nlu_classifier(body.current_thread.text).topics,
      .name in (
        "Travel and Transportation",
        "Customer Service and Support",
        "Security and Authentication"
      )
      and .confidence != "low"
  )
  // handle instances in which ml_topic does not hit
  or (
    length(body.links) == 0
    and length(attachments) == 0
    and length(body.current_thread.text) < 1000
    and strings.icontains(sender.display_name, "booking.com")
  )
)
and (
  any(ml.nlu_classifier(body.current_thread.text).entities,
      .name == "org" and .text == "Booking.com"
  )
  or strings.icontains(body.current_thread.text, ' booking.com ')
  or strings.icontains(sender.display_name, "booking.com")
  or 2 of (
    strings.icontains(body.current_thread.text, "Booking.com"),
    strings.icontains(body.current_thread.text, "Oosterdokskade 163"),
    strings.icontains(body.current_thread.text, "Amsterdam")
  )
)
and (
  any(ml.nlu_classifier(body.current_thread.text).intents,
      .name == "cred_theft"
  )
  or any(body.links,
         strings.ilike(.display_text,
                       "*review*",
                       "*response*",
                       "*respond*",
                       "*complaint*",
                       "*contact*",
                       "*accommodation*",
                       "*view*details*"
         )
         or .display_url.domain.root_domain == "booking.com" and .mismatched
         or .href_url.domain.root_domain == 'share.google'
         or network.whois(.href_url.domain).days_old < 30
         or strings.icontains(.href_url.path, "/redir")
  )
  // check for text strings that betray intent
  or regex.icontains(body.current_thread.text, '(?:book\sa|open)\srooms', )
  or strings.ilike(body.current_thread.text, "* availab*", )
  // two seperate HTML elements impersonating the logo
  or (
    any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
        .display_text =~ "Booking"
    )
    and any(html.xpath(body.html, '//*[text()[normalize-space()]]').nodes,
            .display_text =~ ".com"
    )
  )
)
and not (
  sender.email.domain.root_domain in~ (
    'booking.com',
    'siteminder.com',
    'thinkreservations.com'
  )
  and headers.auth_summary.dmarc.pass
)
and (
  not profile.by_sender().solicited
  or (
    profile.by_sender().any_messages_malicious_or_spam
    and not profile.by_sender().any_messages_benign
  )
)

// negate microsoft quarantine messages
and not (
  sender.email.email == "quarantine@messaging.microsoft.com"
  and (
    headers.auth_summary.dmarc.pass
    // no sender auth but MS AuthAs is Internal
    or (
      not coalesce(headers.auth_summary.dmarc.pass, false)
      and any(headers.hops,
              .index == 0
              and any(.fields,
                      .name == "X-MS-Exchange-CrossTenant-AuthAs"
                      and .value == "Internal"
              )
      )
    )
  )
)

Detection logic

Scope: inbound message.

Detects messages purporting to be from Booking.com's support team that contain suspicious credential collection patterns. The sender is not from a legitimate Booking.com domain and shows a history of problematic behavior or lacks prior solicited communication. Additional checks enforce DMARC authentication for trusted domains.

  1. inbound message
  2. length(body.links) < 10
  3. any of:
    • any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
      • .name in ('Travel and Transportation', 'Customer Service and Support', 'Security and Authentication')
      • .confidence is not 'low'
    • all of:
      • length(body.links) is 0
      • length(attachments) is 0
      • length(body.current_thread.text) < 1000
      • sender.display_name contains 'booking.com'
  4. any of:
    • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
      • .name is 'org'
      • .text is 'Booking.com'
    • body.current_thread.text contains ' booking.com '
    • sender.display_name contains 'booking.com'
    • at least 2 of:
      • body.current_thread.text contains 'Booking.com'
      • body.current_thread.text contains 'Oosterdokskade 163'
      • body.current_thread.text contains 'Amsterdam'
  5. any of:
    • any of ml.nlu_classifier(body.current_thread.text).intents where:
      • .name is 'cred_theft'
    • any of body.links where any holds:
      • .display_text matches any of 7 patterns
        • *review*
        • *response*
        • *respond*
        • *complaint*
        • *contact*
        • *accommodation*
        • *view*details*
      • all of:
        • .display_url.domain.root_domain is 'booking.com'
        • .mismatched
      • .href_url.domain.root_domain is 'share.google'
      • network.whois(.href_url.domain).days_old < 30
      • .href_url.path contains '/redir'
    • body.current_thread.text matches '(?:book\\sa|open)\\srooms'
    • body.current_thread.text matches '* availab*'
    • all of:
      • any of html.xpath(body.html, '//*[text()[normalize-space()]]').nodes where:
        • .display_text is 'Booking'
      • any of html.xpath(body.html, '//*[text()[normalize-space()]]').nodes where:
        • .display_text is '.com'
  6. not:
    • all of:
      • sender.email.domain.root_domain in ('booking.com', 'siteminder.com', 'thinkreservations.com')
      • headers.auth_summary.dmarc.pass
  7. any of:
    • not:
      • profile.by_sender().solicited
    • all of:
      • profile.by_sender().any_messages_malicious_or_spam
      • not:
        • profile.by_sender().any_messages_benign
  8. not:
    • all of:
      • sender.email.email is 'quarantine@messaging.microsoft.com'
      • any of:
        • headers.auth_summary.dmarc.pass
        • all of:
          • not:
            • coalesce(headers.auth_summary.dmarc.pass)
          • any of headers.hops where all hold:
            • .index is 0
            • any of .fields where all hold:
              • .name is 'X-MS-Exchange-CrossTenant-AuthAs'
              • .value is 'Internal'

Inspects: body.current_thread.text, body.html, body.links, body.links[].display_text, body.links[].display_url.domain.root_domain, body.links[].href_url.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.path, body.links[].mismatched, headers.auth_summary.dmarc.pass, headers.hops, headers.hops[].fields, headers.hops[].fields[].name, headers.hops[].fields[].value, headers.hops[].index, sender.display_name, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: html.xpath, ml.nlu_classifier, network.whois, profile.by_sender, regex.icontains, strings.icontains, strings.ilike.

Indicators matched (31)

FieldMatchValue
ml.nlu_classifier(body.current_thread.text).topics[].namememberTravel and Transportation
ml.nlu_classifier(body.current_thread.text).topics[].namememberCustomer Service and Support
ml.nlu_classifier(body.current_thread.text).topics[].namememberSecurity and Authentication
strings.icontainssubstringbooking.com
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsorg
ml.nlu_classifier(body.current_thread.text).entities[].textequalsBooking.com
strings.icontainssubstring booking.com
strings.icontainssubstringBooking.com
strings.icontainssubstringOosterdokskade 163
strings.icontainssubstringAmsterdam
ml.nlu_classifier(body.current_thread.text).intents[].nameequalscred_theft
strings.ilikesubstring*review*
19 more
strings.ilikesubstring*response*
strings.ilikesubstring*respond*
strings.ilikesubstring*complaint*
strings.ilikesubstring*contact*
strings.ilikesubstring*accommodation*
strings.ilikesubstring*view*details*
body.links[].display_url.domain.root_domainequalsbooking.com
body.links[].href_url.domain.root_domainequalsshare.google
strings.icontainssubstring/redir
regex.icontainsregex(?:book\sa|open)\srooms
strings.ilikesubstring* availab*
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_textequalsBooking
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_textequals.com
sender.email.domain.root_domainmemberbooking.com
sender.email.domain.root_domainmembersiteminder.com
sender.email.domain.root_domainmemberthinkreservations.com
sender.email.emailequalsquarantine@messaging.microsoft.com
headers.hops[].fields[].nameequalsX-MS-Exchange-CrossTenant-AuthAs
headers.hops[].fields[].valueequalsInternal