Detection rules › Sublime MQL
Brand impersonation: Booking.com
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).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Impersonation: 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.
- inbound message
- length(body.links) < 10
any of:
any of
ml.nlu_classifier(body.current_thread.text).topicswhere 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'
any of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere 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'
any of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is 'cred_theft'
any of
body.linkswhere 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()]]').nodeswhere:- .display_text is 'Booking'
any of
html.xpath(body.html, '//*[text()[normalize-space()]]').nodeswhere:- .display_text is '.com'
not:
all of:
- sender.email.domain.root_domain in ('booking.com', 'siteminder.com', 'thinkreservations.com')
- headers.auth_summary.dmarc.pass
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
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.hopswhere all hold:- .index is 0
any of
.fieldswhere 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)
| Field | Match | Value |
|---|---|---|
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Travel and Transportation |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Customer Service and Support |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Security and Authentication |
strings.icontains | substring | booking.com |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | org |
ml.nlu_classifier(body.current_thread.text).entities[].text | equals | Booking.com |
strings.icontains | substring | booking.com |
strings.icontains | substring | Booking.com |
strings.icontains | substring | Oosterdokskade 163 |
strings.icontains | substring | Amsterdam |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
strings.ilike | substring | *review* |
19 more
strings.ilike | substring | *response* |
strings.ilike | substring | *respond* |
strings.ilike | substring | *complaint* |
strings.ilike | substring | *contact* |
strings.ilike | substring | *accommodation* |
strings.ilike | substring | *view*details* |
body.links[].display_url.domain.root_domain | equals | booking.com |
body.links[].href_url.domain.root_domain | equals | share.google |
strings.icontains | substring | /redir |
regex.icontains | regex | (?:book\sa|open)\srooms |
strings.ilike | substring | * availab* |
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_text | equals | Booking |
html.xpath(body.html, '//*[text()[normalize-space()]]').nodes[].display_text | equals | .com |
sender.email.domain.root_domain | member | booking.com |
sender.email.domain.root_domain | member | siteminder.com |
sender.email.domain.root_domain | member | thinkreservations.com |
sender.email.email | equals | quarantine@messaging.microsoft.com |
headers.hops[].fields[].name | equals | X-MS-Exchange-CrossTenant-AuthAs |
headers.hops[].fields[].value | equals | Internal |