Detection rules › Sublime MQL
Sublime MQL rules: bec
BEC/Fraud: Generic scam attempt to undisclosed recipients
#Detects potential generic scams by analyzing text within the email body and other suspicious signals.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// undisclosed recipients
and any([recipients.to, recipients.bcc, recipients.cc],
any(., .display_name =~ "Undisclosed recipients")
)
// mismatched sender (from) and Reply-to
and (
length(headers.reply_to) > 0
and all(headers.reply_to,
.email.domain.root_domain != sender.email.domain.root_domain
)
)
// generic recipient
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "recipient" and regex.icontains(.text, "(sir|madam)")
)
// request made
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "request"
)
// not a bec scam
and all(ml.nlu_classifier(body.current_thread.text).intents, .name != "bec")
// 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.
Detects potential generic scams by analyzing text within the email body and other suspicious signals.
- inbound message
any of
[recipients.to, recipients.bcc, recipients.cc]where:any of
.where:- .display_name is 'Undisclosed recipients'
all of:
- length(headers.reply_to) > 0
all of
headers.reply_towhere:- .email.domain.root_domain is not sender.email.domain.root_domain
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'recipient'
- .text matches '(sir|madam)'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere:- .name is 'request'
all of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is not 'bec'
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.current_thread.text, headers.auth_summary.dmarc.pass, headers.reply_to, headers.reply_to[].email.domain.root_domain, recipients.bcc, recipients.cc, recipients.to, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.icontains. Reference lists: $high_trust_sender_root_domains.
Indicators matched (4)
| Field | Match | Value |
|---|---|---|
[recipients.to, recipients.bcc, recipients.cc][][].display_name | equals | Undisclosed recipients |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | recipient |
regex.icontains | regex | (sir|madam) |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | request |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
any([recipients.to, recipients.bcc, recipients.cc])
any([recipients.to, recipients.bcc, recipients.cc])
[recipients.to, recipients.bcc, recipients.cc].display_name eq "Undisclosed recipients"
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "recipient"
ml.nlu_classifier(body.current_thread.text).entities.text regex_match "(sir|madam)"
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
headers.reply_to length_compare "0"
type.inbound eq "true"
macro "all(headers.reply_to)"
macro "all(ml.nlu_classifier(body.current_thread.text).intents)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Penpal scam
#This rule detects messages from individuals looking to establish contact under the guise of seeking friendship or a penpal relationship. Over time, they build trust and then exploit this relationship by asking for money, personal information, or involvement in suspicious activities.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// the sender or the reply-to is a freemail provider
and (
sender.email.domain.domain in $free_email_providers
or (
not sender.email.domain.root_domain in $free_email_providers
and any(headers.reply_to,
.email.domain.root_domain in $free_email_providers
)
)
)
// body contains pen ?pal
and regex.contains(body.current_thread.text, 'pen\s?pal')
// and NLU Request
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "request"
)
// not a reply
and (length(headers.references) == 0 or headers.in_reply_to is null)
// 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.
This rule detects messages from individuals looking to establish contact under the guise of seeking friendship or a penpal relationship. Over time, they build trust and then exploit this relationship by asking for money, personal information, or involvement in suspicious activities.
- inbound message
any of:
- sender.email.domain.domain in $free_email_providers
all of:
not:
- sender.email.domain.root_domain in $free_email_providers
any of
headers.reply_towhere:- .email.domain.root_domain in $free_email_providers
- body.current_thread.text matches 'pen\\s?pal'
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere:- .name is 'request'
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
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.current_thread.text, headers.auth_summary.dmarc.pass, headers.in_reply_to, headers.references, headers.reply_to, headers.reply_to[].email.domain.root_domain, sender.email.domain.domain, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.contains. Reference lists: $free_email_providers, $high_trust_sender_root_domains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
regex.contains | regex | pen\s?pal |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | request |
Stages and Predicates
Stage 1: mql_rule
and
or
and
not
headers.auth_summary.dmarc.pass eq "true"
macro "sender.email.domain.root_domain in high_trust_sender_root_domains"
macro "sender.email.domain.root_domain not in high_trust_sender_root_domains"
or
and
any(headers.reply_to)
macro "headers.reply_to[].email.domain.root_domain in free_email_providers"
not
macro "sender.email.domain.root_domain in free_email_providers"
macro "sender.email.domain.domain in free_email_providers"
or
headers.in_reply_to is_null
headers.references length_compare "0"
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
body.current_thread.text regex_match "pen\\s?pal"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"pen\s?pal" |
headers.in_reply_to | is_null | field:"headers.in_reply_to" kind:is_null | |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Reply-chain manipulation with urgent keywords and self-reply
#Detects suspicious reply messages with urgent language in sender name or email address, minimal body content, and the sender's email address appearing in previous thread content, indicating a self reply.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Social engineering, Evasion |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and subject.is_reply
and length(attachments) == 0
// short current thread
and length(body.current_thread.text) < 25
// only 1 previous thread
and length(body.previous_threads) == 1
and any(recipients.to,
.email.domain.root_domain != sender.email.domain.root_domain
)
// urgent or authority based keywords in sender display name or local part
and (
regex.icontains(sender.display_name,
'\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\b'
)
or regex.icontains(sender.email.local_part, '(?:task|ceo|executive)')
)
// sender replied to themselves
and any(body.previous_threads, strings.icontains(.preamble, sender.email.email))
Detection logic
Scope: inbound message.
Detects suspicious reply messages with urgent language in sender name or email address, minimal body content, and the sender's email address appearing in previous thread content, indicating a self reply.
- inbound message
- subject.is_reply
- length(attachments) is 0
- length(body.current_thread.text) < 25
- length(body.previous_threads) is 1
any of
recipients.towhere:- .email.domain.root_domain is not sender.email.domain.root_domain
any of:
- sender.display_name matches '\\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\\b'
- sender.email.local_part matches '(?:task|ceo|executive)'
any of
body.previous_threadswhere:- strings.icontains(.preamble)
Inspects: body.current_thread.text, body.previous_threads, body.previous_threads[].preamble, recipients.to, recipients.to[].email.domain.root_domain, sender.display_name, sender.email.domain.root_domain, sender.email.email, sender.email.local_part, subject.is_reply, type.inbound. Sensors: regex.icontains, strings.icontains.
Indicators matched (2)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | \b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\b |
regex.icontains | regex | (?:task|ceo|executive) |
Stages and Predicates
Stage 1: mql_rule
and
any(recipients.to)
recipients.to.email.domain.root_domain cross_field_compare "sender.email.domain.root_domain"
or
sender.display_name regex_match "\\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\\b"
sender.email.local_part regex_match "(?:task|ceo|executive)"
any(body.previous_threads)
strings.icontains func_call "strings.icontains(body.previous_threads[].preamble)"
attachments length_compare "0"
body.current_thread.text length_compare "25"
body.previous_threads length_compare "1"
subject.is_reply eq "true"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match value:"\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\b" |
sender.email.local_part | regex_match |
| field:"sender.email.local_part" kind:regex_match value:"(?:task|ceo|executive)" |
subject.is_reply | eq |
| field:"subject.is_reply" kind:eq value:"true" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Romance scam
#This rule detects messages attempting to initiate a Romance scam. The rule leverage tells such as undisclosed recipients, freemail emails in the body and common scam phrasing. Romance scams are deceptive schemes where scammers establish false romantic intentions towards individuals to gain their trust and eventually exploit them financially.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// no links
and (
length(body.links) == 0
// or 1 link, but link doesn't match the sender's domain
or (
length(body.links) == 1
and sender.email.domain.root_domain not in $free_email_providers
and all(body.links,
.href_url.domain.root_domain != sender.email.domain.root_domain
)
)
)
// no attachments
and length(attachments) == 0
and (
(
// honorific
regex.icontains(sender.display_name,
'(?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+'
)
// And an email is found in the body, and a freemail domain is found also
and regex.contains(body.current_thread.text,
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
)
and any($free_email_providers,
strings.icontains(body.current_thread.text, .)
)
// scammy phrases
and regex.icontains(body.current_thread.text,
'(?:I am|My name is) .* (?:from|staying in) .+\.',
'(?:years old|cm|kg).*\.',
'(?:photo|pictures|sexy).*\.',
'(?:email|contact me|write to me|reply to me) at .*@.*\.'
)
)
or (
// simple firstname lastname from freemail
sender.email.domain.root_domain in $free_email_providers
and regex.match(sender.display_name, '[A-Z][a-z]+ [A-Z][a-z]+')
// short message
and length(body.current_thread.text) < 200
and regex.icontains(body.current_thread.text,
"(?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,]"
)
and regex.icontains(body.current_thread.text,
'(?:can I|please) (?:talk to|contact|meet|chat with) (?:you|me)'
)
)
)
Detection logic
Scope: inbound message.
This rule detects messages attempting to initiate a Romance scam. The rule leverage tells such as undisclosed recipients, freemail emails in the body and common scam phrasing. Romance scams are deceptive schemes where scammers establish false romantic intentions towards individuals to gain their trust and eventually exploit them financially.
- inbound message
any of:
- length(body.links) is 0
all of:
- length(body.links) is 1
- sender.email.domain.root_domain not in $free_email_providers
all of
body.linkswhere:- .href_url.domain.root_domain is not sender.email.domain.root_domain
- length(attachments) is 0
any of:
all of:
- sender.display_name matches '(?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\\.?[ \\t]+'
- body.current_thread.text matches '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}'
any of
$free_email_providerswhere:- strings.icontains(body.current_thread.text)
body.current_thread.text matches any of 4 patterns
(?:I am|My name is) .* (?:from|staying in) .+\.(?:years old|cm|kg).*\.(?:photo|pictures|sexy).*\.(?:email|contact me|write to me|reply to me) at .*@.*\.
all of:
- sender.email.domain.root_domain in $free_email_providers
- sender.display_name matches '[A-Z][a-z]+ [A-Z][a-z]+'
- length(body.current_thread.text) < 200
- body.current_thread.text matches '(?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,]'
- body.current_thread.text matches '(?:can I|please) (?:talk to|contact|meet|chat with) (?:you|me)'
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, sender.display_name, sender.email.domain.root_domain, type.inbound. Sensors: regex.contains, regex.icontains, regex.match, strings.icontains. Reference lists: $free_email_providers.
Indicators matched (9)
| Field | Match | Value |
|---|---|---|
regex.icontains | regex | (?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+ |
regex.contains | regex | [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,} |
regex.icontains | regex | (?:I am|My name is) .* (?:from|staying in) .+\. |
regex.icontains | regex | (?:years old|cm|kg).*\. |
regex.icontains | regex | (?:photo|pictures|sexy).*\. |
regex.icontains | regex | (?:email|contact me|write to me|reply to me) at .*@.*\. |
regex.match | regex | [A-Z][a-z]+ [A-Z][a-z]+ |
regex.icontains | regex | (?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,] |
regex.icontains | regex | (?:can I|please) (?:talk to|contact|meet|chat with) (?:you|me) |
Stages and Predicates
Stage 1: mql_rule
and
or
and
or
body.current_thread.text regex_match "(?:I am|My name is) .* (?:from|staying in) .+\\."
body.current_thread.text regex_match "(?:email|contact me|write to me|reply to me) at .*@.*\\."
body.current_thread.text regex_match "(?:photo|pictures|sexy).*\\."
body.current_thread.text regex_match "(?:years old|cm|kg).*\\."
any($free_email_providers)
strings.icontains func_call "strings.icontains(body.current_thread.text)"
body.current_thread.text regex_match "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}"
sender.display_name regex_match "(?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\\.?[ \\t]+"
and
body.current_thread.text length_compare "200"
body.current_thread.text regex_match "(?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,]"
body.current_thread.text regex_match "(?:can I|please) (?:talk to|contact|meet|chat with) (?:you|me)"
sender.display_name regex_match "[A-Z][a-z]+ [A-Z][a-z]+"
macro "sender.email.domain.root_domain in free_email_providers"
or
and
body.links length_compare "1"
macro "all(body.links)"
macro "sender.email.domain.root_domain not in free_email_providers"
body.links length_compare "0"
attachments length_compare "0"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
sender.display_name | regex_match |
| field:"sender.display_name" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Scam lure with freemail pivot
#This message detects BEC/Fraud lures attempting to solicit the victim to pivot out of band via a freemail address in the body.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider, Out of band pivot |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// body is short
and length(body.current_thread.text) < 800
// one recipient
and length(recipients.to) == 1
// all recipients are the sender
and all(recipients.to,
.email.email == sender.email.email
and (
.email.domain.valid or strings.icontains(.display_name, "undisclosed")
)
)
// not an org domain
and all(recipients.to,
.email.domain.root_domain not in $org_domains
and (
.email.domain.valid or strings.icontains(.display_name, "undisclosed")
)
)
// one link
and length(body.links) == 1
// links don't match sender
and all(body.links,
.href_url.domain.root_domain != sender.email.domain.root_domain
)
// scam indicators
and regex.icontains(body.current_thread.text,
'((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch)'
)
// body contains an email address to a freemail provider
and (
regex.contains(body.current_thread.text,
"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
)
and any($free_email_providers, strings.icontains(body.current_thread.text, .))
)
Detection logic
Scope: inbound message.
This message detects BEC/Fraud lures attempting to solicit the victim to pivot out of band via a freemail address in the body.
- inbound message
- length(body.current_thread.text) < 800
- length(recipients.to) is 1
all of
recipients.towhere all hold:- .email.email is sender.email.email
any of:
- .email.domain.valid
- .display_name contains 'undisclosed'
all of
recipients.towhere all hold:- .email.domain.root_domain not in $org_domains
any of:
- .email.domain.valid
- .display_name contains 'undisclosed'
- length(body.links) is 1
all of
body.linkswhere:- .href_url.domain.root_domain is not sender.email.domain.root_domain
- body.current_thread.text matches '((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\\.?[ \\t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch)'
all of:
- body.current_thread.text matches '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}'
any of
$free_email_providerswhere:- strings.icontains(body.current_thread.text)
Inspects: body.current_thread.text, body.links, body.links[].href_url.domain.root_domain, recipients.to, recipients.to[].display_name, recipients.to[].email.domain.root_domain, recipients.to[].email.domain.valid, recipients.to[].email.email, sender.email.domain.root_domain, sender.email.email, type.inbound. Sensors: regex.contains, regex.icontains, strings.icontains. Reference lists: $free_email_providers, $org_domains.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | undisclosed |
regex.icontains | regex | ((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch) |
regex.contains | regex | [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,} |
Stages and Predicates
Stage 1: mql_rule
and
any($free_email_providers)
strings.icontains func_call "strings.icontains(body.current_thread.text)"
body.current_thread.text length_compare "800"
body.current_thread.text regex_match "((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\\.?[ \\t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch)"
body.current_thread.text regex_match "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}"
body.links length_compare "1"
recipients.to length_compare "1"
type.inbound eq "true"
macro "all(body.links)"
macro "all(recipients.to)"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Student loan callback phishing
#This rule detects phishing emails that attempt to engage the recipient by soliciting a callback under the guise of student loan forgiveness or assistance. The messages often come from free email providers, lack a proper HTML structure, and include suspicious indicators such as phone numbers embedded in the text. These emails typically contain language urging the recipient to respond or take immediate action, leveraging urgency around student loan repayment to entice engagement.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Free email provider, Out of band pivot, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
// there is no HTML body
and body.html.raw is null
// but the current thread contains what's most likely an html tag
// (eg. <>'s' followed by a closing </> )
and regex.contains(body.current_thread.text, '<[^>]+>.*?</[^>]+>')
// and the body mentions student loans
and strings.icontains(body.current_thread.text, "Student Loan")
// sourced from a free mail provider
and sender.email.domain.root_domain in $free_email_providers
// contains a phone number
and (
regex.contains(strings.replace_confusables(body.current_thread.text),
'\+?(\d{1}.)?\(?\d{3}?\)?.\d{3}.?\d{4}'
)
or regex.contains(strings.replace_confusables(body.current_thread.text),
'\+\d{1,3}[ilo0-9]{10}'
)
// +12028001238
or regex.contains(strings.replace_confusables(body.current_thread.text),
'[ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4}'
)
// 202.800.1238
or regex.contains(strings.replace_confusables(body.current_thread.text),
'[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}'
)
// 202-800-1238
or regex.contains(strings.replace_confusables(body.current_thread.text),
'\([ilo0-9]{3}\)\s[ilo0-9]{3}-[ilo0-9]{4}'
)
// (202) 800-1238
or regex.contains(strings.replace_confusables(body.current_thread.text),
'\([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}'
)
// (202)-800-1238
or regex.contains(strings.replace_confusables(body.current_thread.text),
'1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4}'
) // 8123456789
or regex.contains(strings.replace_confusables(body.current_thread.text),
'8\d{9}'
)
)
// contains a request
and any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "request"
)
Detection logic
Scope: inbound message.
This rule detects phishing emails that attempt to engage the recipient by soliciting a callback under the guise of student loan forgiveness or assistance. The messages often come from free email providers, lack a proper HTML structure, and include suspicious indicators such as phone numbers embedded in the text. These emails typically contain language urging the recipient to respond or take immediate action, leveraging urgency around student loan repayment to entice engagement.
- inbound message
- body.html.raw is missing
- body.current_thread.text matches '<[^>]+>.*?</[^>]+>'
- body.current_thread.text contains 'Student Loan'
- sender.email.domain.root_domain in $free_email_providers
strings.replace_confusables(body.current_thread.text) matches any of 8 patterns
\+?(\d{1}.)?\(?\d{3}?\)?.\d{3}.?\d{4}\+\d{1,3}[ilo0-9]{10}[ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4}[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}\([ilo0-9]{3}\)\s[ilo0-9]{3}-[ilo0-9]{4}\([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4}8\d{9}
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere:- .name is 'request'
Inspects: body.current_thread.text, body.html.raw, sender.email.domain.root_domain, type.inbound. Sensors: ml.nlu_classifier, regex.contains, strings.icontains, strings.replace_confusables. Reference lists: $free_email_providers.
Indicators matched (11)
| Field | Match | Value |
|---|---|---|
regex.contains | regex | <[^>]+>.*?</[^>]+> |
strings.icontains | substring | Student Loan |
regex.contains | regex | \+?(\d{1}.)?\(?\d{3}?\)?.\d{3}.?\d{4} |
regex.contains | regex | \+\d{1,3}[ilo0-9]{10} |
regex.contains | regex | [ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4} |
regex.contains | regex | [ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4} |
regex.contains | regex | \([ilo0-9]{3}\)\s[ilo0-9]{3}-[ilo0-9]{4} |
regex.contains | regex | \([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4} |
regex.contains | regex | 1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4} |
regex.contains | regex | 8\d{9} |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | request |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).entities)
ml.nlu_classifier(body.current_thread.text).entities.name eq "request"
or
strings.replace_confusables(body.current_thread.text) regex_match "1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4}"
strings.replace_confusables(body.current_thread.text) regex_match "8\\d{9}"
strings.replace_confusables(body.current_thread.text) regex_match "[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}"
strings.replace_confusables(body.current_thread.text) regex_match "[ilo0-9]{3}\\.[ilo0-9]{3}\\.[ilo0-9]{4}"
strings.replace_confusables(body.current_thread.text) regex_match "\\([ilo0-9]{3}\\)[\\s-]+[ilo0-9]{3}[\\s-]+[ilo0-9]{4}"
strings.replace_confusables(body.current_thread.text) regex_match "\\([ilo0-9]{3}\\)\\s[ilo0-9]{3}-[ilo0-9]{4}"
strings.replace_confusables(body.current_thread.text) regex_match "\\+?(\\d{1}.)?\\(?\\d{3}?\\)?.\\d{3}.?\\d{4}"
strings.replace_confusables(body.current_thread.text) regex_match "\\+\\d{1,3}[ilo0-9]{10}"
body.current_thread.text contains "Student Loan"
body.current_thread.text regex_match "<[^>]+>.*?</[^>]+>"
body.html.raw is_null
type.inbound eq "true"
macro "sender.email.domain.root_domain in free_email_providers"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains value:"Student Loan" |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match value:"<[^>]+>.*?</[^>]+>" |
body.html.raw | is_null | field:"body.html.raw" kind:is_null | |
strings.replace_confusables(body.current_thread.text) | regex_match |
| field:"strings.replace_confusables(body.current_thread.text)" kind:regex_match |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Unsolicited business acquisition offer
#Detects inbound messages with subjects referencing an offer to purchase, combined with body content mentioning private equity, acquiring companies, or discussing an opportunity. These messages are characteristic of fraudulent or unsolicited business acquisition solicitations designed to engage targets in fraudulent financial dealings.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and strings.icontains(subject.base,
"Offer to Purchase",
"Transaction Opportunity"
)
and (
strings.icontains(body.plain.raw,
"private equity",
"acquiring companies",
"discuss the opportunity",
"pe firm"
)
or (
any(ml.nlu_classifier(body.current_thread.text).entities,
.name == "financial" and strings.icontains(.text, "purchase")
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name == "B2B Cold Outreach" and .confidence == "high"
)
)
)
Detection logic
Scope: inbound message.
Detects inbound messages with subjects referencing an offer to purchase, combined with body content mentioning private equity, acquiring companies, or discussing an opportunity. These messages are characteristic of fraudulent or unsolicited business acquisition solicitations designed to engage targets in fraudulent financial dealings.
- inbound message
subject.base contains any of 2 patterns
Offer to PurchaseTransaction Opportunity
any of:
body.plain.raw contains any of 4 patterns
private equityacquiring companiesdiscuss the opportunitype firm
all of:
any of
ml.nlu_classifier(body.current_thread.text).entitieswhere all hold:- .name is 'financial'
- .text contains 'purchase'
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name is 'B2B Cold Outreach'
- .confidence is 'high'
Inspects: body.current_thread.text, body.plain.raw, subject.base, type.inbound. Sensors: ml.nlu_classifier, strings.icontains.
Indicators matched (10)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | Offer to Purchase |
strings.icontains | substring | Transaction Opportunity |
strings.icontains | substring | private equity |
strings.icontains | substring | acquiring companies |
strings.icontains | substring | discuss the opportunity |
strings.icontains | substring | pe firm |
ml.nlu_classifier(body.current_thread.text).entities[].name | equals | financial |
strings.icontains | substring | purchase |
ml.nlu_classifier(body.current_thread.text).topics[].name | equals | B2B Cold Outreach |
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
Stages and Predicates
Stage 1: mql_rule
and
or
and
any(ml.nlu_classifier(body.current_thread.text).entities)
and
ml.nlu_classifier(body.current_thread.text).entities.name eq "financial"
ml.nlu_classifier(body.current_thread.text).entities.text contains "purchase"
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name eq "B2B Cold Outreach"
body.plain.raw contains "acquiring companies"
body.plain.raw contains "discuss the opportunity"
body.plain.raw contains "pe firm"
body.plain.raw contains "private equity"
or
subject.base contains "Offer to Purchase"
subject.base contains "Transaction Opportunity"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.plain.raw | contains |
| field:"body.plain.raw" kind:contains |
subject.base | contains |
| field:"subject.base" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC/Fraud: Urgent language and suspicious sending/infrastructure patterns
#Identifies inbound messages using urgent language patterns and sender behavioral traits common in social manipulation. Combines multiple indicators including urgent subject lines, characteristic message content, short message length, and suspicious sender attributes.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud, Callback Phishing, Spam |
| Tactics and techniques | Impersonation: Brand, Social engineering, Free email provider |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and 3 of (
// urgent subjects
strings.ilike(subject.subject, '*quick question*'),
strings.ilike(subject.subject, '*urgent*request*'),
strings.ilike(subject.subject, '*are you available*'),
strings.ilike(subject.subject, '*need assistance*'),
strings.ilike(subject.subject, '*help*needed*'),
regex.icontains(subject.subject, 'favor\b'),
strings.ilike(subject.subject, '*checking in*'),
strings.ilike(subject.subject, '*awaiting*response*'),
strings.ilike(subject.subject, '*catch*up*'),
// BEC body patterns
strings.ilike(body.current_thread.text, '*sorry to bother*'),
strings.ilike(body.current_thread.text, '*are you busy*'),
strings.ilike(body.current_thread.text, '*can you help*'),
strings.ilike(body.current_thread.text, '*do you have a moment*'),
strings.ilike(body.current_thread.text, '*please respond*asap*'),
strings.ilike(subject.subject, '*quick question*'),
// brand name
regex.icontains(body.current_thread.text, 'a\s?m\s?a\s?z\s?[o0]\s?n'), // Catches "Amaz on", "Amazon", etc.
regex.icontains(body.current_thread.text, 'p\s?a\s?y\s?p\s?a\s?l'),
regex.icontains(body.current_thread.text, 'a\s?p\s?p\s?l\s?e'),
// short body
length(body.current_thread.text) < 200,
strings.count(body.current_thread.text, ' ') < 30
)
and 3 of (
// suspicious sender
sender.email.domain.root_domain in $free_email_providers,
network.whois(sender.email.domain).days_old < 30,
// suspicious recipient pattern
any(recipients.to, strings.ilike(.display_name, 'undisclosed?recipients')),
length(recipients.to) <= 1, // Single or 0 recipients
// header checks
strings.starts_with(headers.mailer, 'Open-Xchange Mailer'),
strings.ilike(headers.x_originating_ip.ip, '*.*.*.0'), // Common in some BEC campaigns
// deifferent reply-to address
(
length(headers.reply_to) > 0
and sender.email.email not in map(headers.reply_to, .email.email)
),
// sender display name is part of the subject
strings.icontains(subject.subject, sender.display_name),
)
and profile.by_sender_email().prevalence not in ("common")
Detection logic
Scope: inbound message.
Identifies inbound messages using urgent language patterns and sender behavioral traits common in social manipulation. Combines multiple indicators including urgent subject lines, characteristic message content, short message length, and suspicious sender attributes.
- inbound message
at least 3 of:
- subject.subject matches '*quick question*'
- subject.subject matches '*urgent*request*'
- subject.subject matches '*are you available*'
- subject.subject matches '*need assistance*'
- subject.subject matches '*help*needed*'
- subject.subject matches 'favor\\b'
- subject.subject matches '*checking in*'
- subject.subject matches '*awaiting*response*'
- subject.subject matches '*catch*up*'
- body.current_thread.text matches '*sorry to bother*'
- body.current_thread.text matches '*are you busy*'
- body.current_thread.text matches '*can you help*'
- body.current_thread.text matches '*do you have a moment*'
- body.current_thread.text matches '*please respond*asap*'
- subject.subject matches '*quick question*'
- body.current_thread.text matches 'a\\s?m\\s?a\\s?z\\s?[o0]\\s?n'
- body.current_thread.text matches 'p\\s?a\\s?y\\s?p\\s?a\\s?l'
- body.current_thread.text matches 'a\\s?p\\s?p\\s?l\\s?e'
- length(body.current_thread.text) < 200
- strings.count(body.current_thread.text, ' ') < 30
at least 3 of:
- sender.email.domain.root_domain in $free_email_providers
- network.whois(sender.email.domain).days_old < 30
any of
recipients.towhere:- .display_name matches 'undisclosed?recipients'
- length(recipients.to) ≤ 1
- headers.mailer starts with 'Open-Xchange Mailer'
- headers.x_originating_ip.ip matches '*.*.*.0'
all of:
- length(headers.reply_to) > 0
- sender.email.email not in map(headers.reply_to, .email.email)
- strings.icontains(subject.subject)
- profile.by_sender_email().prevalence not in ('common')
Inspects: body.current_thread.text, headers.mailer, headers.reply_to, headers.reply_to[].email.email, headers.x_originating_ip.ip, recipients.to, recipients.to[].display_name, sender.display_name, sender.email.domain, sender.email.domain.root_domain, sender.email.email, subject.subject, type.inbound. Sensors: network.whois, profile.by_sender_email, regex.icontains, strings.count, strings.icontains, strings.ilike, strings.starts_with. Reference lists: $free_email_providers.
Indicators matched (20)
| Field | Match | Value |
|---|---|---|
strings.ilike | substring | *quick question* |
strings.ilike | substring | *urgent*request* |
strings.ilike | substring | *are you available* |
strings.ilike | substring | *need assistance* |
strings.ilike | substring | *help*needed* |
regex.icontains | regex | favor\b |
strings.ilike | substring | *checking in* |
strings.ilike | substring | *awaiting*response* |
strings.ilike | substring | *catch*up* |
strings.ilike | substring | *sorry to bother* |
strings.ilike | substring | *are you busy* |
strings.ilike | substring | *can you help* |
8 more
strings.ilike | substring | *do you have a moment* |
strings.ilike | substring | *please respond*asap* |
regex.icontains | regex | a\s?m\s?a\s?z\s?[o0]\s?n |
regex.icontains | regex | p\s?a\s?y\s?p\s?a\s?l |
regex.icontains | regex | a\s?p\s?p\s?l\s?e |
strings.ilike | substring | undisclosed?recipients |
strings.starts_with | prefix | Open-Xchange Mailer |
strings.ilike | substring | *.*.*.0 |
Stages and Predicates
Stage 1: mql_rule
and
or
and
headers.reply_to length_compare "0"
macro "sender.email.email not in map(headers.reply_to, .email.email)"
any(recipients.to)
recipients.to.display_name eq "undisclosed?recipients"
headers.mailer starts_with "Open-Xchange Mailer"
headers.x_originating_ip.ip wildcard "*.*.*.0"
network.whois func_call "network.whois(sender.email.domain).days_old < 30"
recipients.to length_compare "1"
strings.icontains func_call "strings.icontains(subject.subject)"
macro "sender.email.domain.root_domain in free_email_providers"
or
body.current_thread.text length_compare "200"
body.current_thread.text match "are you busy"
body.current_thread.text match "can you help"
body.current_thread.text match "do you have a moment"
body.current_thread.text match "sorry to bother"
body.current_thread.text regex_match "a\\s?m\\s?a\\s?z\\s?[o0]\\s?n"
body.current_thread.text regex_match "a\\s?p\\s?p\\s?l\\s?e"
body.current_thread.text regex_match "p\\s?a\\s?y\\s?p\\s?a\\s?l"
body.current_thread.text wildcard "*please respond*asap*"
strings.count func_call "strings.count(body.current_thread.text, \" \") < 30"
subject.subject match "are you available"
subject.subject match "checking in"
subject.subject match "need assistance"
subject.subject match "quick question"
subject.subject regex_match "favor\\b"
subject.subject wildcard "*awaiting*response*"
subject.subject wildcard "*catch*up*"
subject.subject wildcard "*help*needed*"
subject.subject wildcard "*urgent*request*"
profile.by_sender_email func_call "profile.by_sender_email().prevalence not in (common)"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
body.current_thread.text | wildcard |
| field:"body.current_thread.text" kind:wildcard |
headers.mailer | starts_with |
| field:"headers.mailer" kind:starts_with value:"Open-Xchange Mailer" |
headers.x_originating_ip.ip | wildcard |
| field:"headers.x_originating_ip.ip" kind:wildcard value:"*.*.*.0" |
subject.subject | regex_match |
| field:"subject.subject" kind:regex_match value:"favor\b" |
subject.subject | wildcard |
| field:"subject.subject" kind:wildcard |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
BEC: Executive coaching vendor impersonation
#Detects fraudulent messages impersonating leadership development coaching services. The rule identifies inbound messages referencing coaching and executive services terminology alongside financial indicators such as invoices and W-9 forms. Natural language understanding is used to confirm high-confidence financial communication intent and BEC signals.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and (
strings.icontains(body.current_thread.text, "ezra", "hesion")
or regex.icontains(body.current_thread.text, 'better\s?up', 'coach\s?hub')
)
and strings.icontains(strings.replace_confusables(body.current_thread.text),
'leadership development coach',
'coaching, leadership development',
'accounting & collections department',
'executive coach for emerging leaders',
'accounts receivable - coaching division'
)
and any(ml.nlu_classifier(body.current_thread.text).topics,
.name in (
"Financial Communications",
"Payment Information",
"Request to View Invoice"
)
and .confidence == "high"
)
and any(ml.nlu_classifier(body.current_thread.text).intents, .name == "bec")
Detection logic
Scope: inbound message.
Detects fraudulent messages impersonating leadership development coaching services. The rule identifies inbound messages referencing coaching and executive services terminology alongside financial indicators such as invoices and W-9 forms. Natural language understanding is used to confirm high-confidence financial communication intent and BEC signals.
- inbound message
any of:
body.current_thread.text contains any of 2 patterns
ezrahesion
body.current_thread.text matches any of 2 patterns
better\s?upcoach\s?hub
strings.replace_confusables(body.current_thread.text) contains any of 5 patterns
leadership development coachcoaching, leadership developmentaccounting & collections departmentexecutive coach for emerging leadersaccounts receivable - coaching division
any of
ml.nlu_classifier(body.current_thread.text).topicswhere all hold:- .name in ('Financial Communications', 'Payment Information', 'Request to View Invoice')
- .confidence is 'high'
any of
ml.nlu_classifier(body.current_thread.text).intentswhere:- .name is 'bec'
Inspects: body.current_thread.text, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.replace_confusables.
Indicators matched (14)
| Field | Match | Value |
|---|---|---|
strings.icontains | substring | ezra |
strings.icontains | substring | hesion |
regex.icontains | regex | better\s?up |
regex.icontains | regex | coach\s?hub |
strings.icontains | substring | leadership development coach |
strings.icontains | substring | coaching, leadership development |
strings.icontains | substring | accounting & collections department |
strings.icontains | substring | executive coach for emerging leaders |
strings.icontains | substring | accounts receivable - coaching division |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Financial Communications |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Payment Information |
ml.nlu_classifier(body.current_thread.text).topics[].name | member | Request to View Invoice |
2 more
ml.nlu_classifier(body.current_thread.text).topics[].confidence | equals | high |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | bec |
Stages and Predicates
Stage 1: mql_rule
and
any(ml.nlu_classifier(body.current_thread.text).topics)
and
ml.nlu_classifier(body.current_thread.text).topics.confidence eq "high"
ml.nlu_classifier(body.current_thread.text).topics.name in ["Financial Communications", "Payment Information", "Request to View Invoice"]
or
body.current_thread.text contains "ezra"
body.current_thread.text contains "hesion"
body.current_thread.text regex_match "better\\s?up"
body.current_thread.text regex_match "coach\\s?hub"
any(ml.nlu_classifier(body.current_thread.text).intents)
ml.nlu_classifier(body.current_thread.text).intents.name eq "bec"
or
strings.replace_confusables(body.current_thread.text) contains "accounting & collections department"
strings.replace_confusables(body.current_thread.text) contains "accounts receivable - coaching division"
strings.replace_confusables(body.current_thread.text) contains "coaching, leadership development"
strings.replace_confusables(body.current_thread.text) contains "executive coach for emerging leaders"
strings.replace_confusables(body.current_thread.text) contains "leadership development coach"
type.inbound eq "true"Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
body.current_thread.text | contains |
| field:"body.current_thread.text" kind:contains |
body.current_thread.text | regex_match |
| field:"body.current_thread.text" kind:regex_match |
strings.replace_confusables(body.current_thread.text) | contains |
| field:"strings.replace_confusables(body.current_thread.text)" kind:contains |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |
Fraudulent e-commerce operators
#This attacker group engages in fraudulent activity by registering lookalike domains through Namecheap, often mimicking well-known brands by appending terms like LLC, LTD, Inc, or Corp. Their tactics involve sending fraudulent quote requests via Namecheap's private email service, followed by attempts to purchase goods on credit. These goods are routed through freight forwarders, typically bound for Western Africa. With increasing scrutiny on cash transactions to high-risk regions, they have shifted focus to acquiring goods. It is crucial to thoroughly validate any flagged messages and verify credit information before releasing products to these entities.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | BEC/Fraud |
| Tactics and techniques | Impersonation: Brand, Lookalike domain, Social engineering |
Telemetry coverage
| Platform | Record / event type |
|---|---|
| Sublime | Inbound email message |
Message attributes
Rule body
type.inbound
and strings.starts_with(headers.mailer, 'Open-Xchange Mailer')
and strings.ends_with(headers.message_id, '@privateemail.com>')
and regex.imatch(sender.email.domain.sld, '.*(?:llc|ltd|inc|corp|llp|co)')
and not sender.email.domain.root_domain == "simpelllc.com"
Detection logic
Scope: inbound message.
This attacker group engages in fraudulent activity by registering lookalike domains through Namecheap, often mimicking well-known brands by appending terms like LLC, LTD, Inc, or Corp. Their tactics involve sending fraudulent quote requests via Namecheap's private email service, followed by attempts to purchase goods on credit. These goods are routed through freight forwarders, typically bound for Western Africa. With increasing scrutiny on cash transactions to high-risk regions, they have shifted focus to acquiring goods. It is crucial to thoroughly validate any flagged messages and verify credit information before releasing products to these entities.
- inbound message
- headers.mailer starts with 'Open-Xchange Mailer'
- headers.message_id ends with '@privateemail.com>'
- sender.email.domain.sld matches '.*(?:llc|ltd|inc|corp|llp|co)'
not:
- sender.email.domain.root_domain is 'simpelllc.com'
Inspects: headers.mailer, headers.message_id, sender.email.domain.root_domain, sender.email.domain.sld, type.inbound. Sensors: regex.imatch, strings.ends_with, strings.starts_with.
Indicators matched (3)
| Field | Match | Value |
|---|---|---|
strings.starts_with | prefix | Open-Xchange Mailer |
strings.ends_with | suffix | @privateemail.com> |
regex.imatch | regex | .*(?:llc|ltd|inc|corp|llp|co) |
Stages and Predicates
Stage 1: mql_rule
and
not
sender.email.domain.root_domain eq "simpelllc.com"
headers.mailer starts_with "Open-Xchange Mailer"
headers.message_id ends_with "@privateemail.com>"
sender.email.domain.sld regex_match ".*(?:llc|ltd|inc|corp|llp|co)"
type.inbound eq "true"Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
sender.email.domain.root_domain | eq | simpelllc.com | excludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"simpelllc.com" |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
headers.mailer | starts_with |
| field:"headers.mailer" kind:starts_with value:"Open-Xchange Mailer" |
headers.message_id | ends_with |
| field:"headers.message_id" kind:ends_with value:"@privateemail.com>" |
sender.email.domain.sld | regex_match |
| field:"sender.email.domain.sld" kind:regex_match value:".*(?:llc|ltd|inc|corp|llp|co)" |
type.inbound | eq |
| field:"type.inbound" kind:eq value:"true" |