Detection rules › Sublime MQL

Sublime MQL rules: bec

BEC/Fraud: Generic scam attempt to undisclosed recipients

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.reply_to
  • recipients
  • sender.email
  • type

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.

  1. inbound message
  2. any of [recipients.to, recipients.bcc, recipients.cc] where:
    • any of . where:
      • .display_name is 'Undisclosed recipients'
  3. all of:
    • length(headers.reply_to) > 0
    • all of headers.reply_to where:
      • .email.domain.root_domain is not sender.email.domain.root_domain
  4. any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
    • .name is 'recipient'
    • .text matches '(sir|madam)'
  5. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'request'
  6. all of ml.nlu_classifier(body.current_thread.text).intents where:
    • .name is not 'bec'
  7. 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)

FieldMatchValue
[recipients.to, recipients.bcc, recipients.cc][][].display_nameequalsUndisclosed recipients
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrecipient
regex.icontainsregex(sir|madam)
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest

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.

FieldKindValuesSearch
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC/Fraud: Penpal scam

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesFree email provider, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.auth_summary
  • headers.reply_to
  • sender.email
  • type

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.

  1. inbound message
  2. 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_to where:
        • .email.domain.root_domain in $free_email_providers
  3. body.current_thread.text matches 'pen\\s?pal'
  4. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .name is 'request'
  5. any of:
    • length(headers.references) is 0
    • headers.in_reply_to is missing
  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.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)

FieldMatchValue
regex.containsregexpen\s?pal
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest

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.

BEC/Fraud: Reply-chain manipulation with urgent keywords and self-reply

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering, Evasion

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.previous_threads
  • recipients
  • recipients.to
  • sender.email
  • subject
  • type

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.

  1. inbound message
  2. subject.is_reply
  3. length(attachments) is 0
  4. length(body.current_thread.text) < 25
  5. length(body.previous_threads) is 1
  6. any of recipients.to where:
    • .email.domain.root_domain is not sender.email.domain.root_domain
  7. any of:
    • sender.display_name matches '\\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\\b'
    • sender.email.local_part matches '(?:task|ceo|executive)'
  8. any of body.previous_threads where:
    • 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)

FieldMatchValue
regex.icontainsregex\b(?:(?:crucial|urgent|immediate|important|quick)(?:ly)?|immediatetask|emergency)\b
regex.icontainsregex(?: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.

BEC/Fraud: Romance scam

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesFree email provider, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • sender.email
  • type

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.

  1. inbound message
  2. 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.links where:
        • .href_url.domain.root_domain is not sender.email.domain.root_domain
  3. length(attachments) is 0
  4. 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_providers where:
        • 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)

FieldMatchValue
regex.icontainsregex(?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+
regex.containsregex[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}
regex.icontainsregex(?:I am|My name is) .* (?:from|staying in) .+\.
regex.icontainsregex(?:years old|cm|kg).*\.
regex.icontainsregex(?:photo|pictures|sexy).*\.
regex.icontainsregex(?:email|contact me|write to me|reply to me) at .*@.*\.
regex.matchregex[A-Z][a-z]+ [A-Z][a-z]+
regex.icontainsregex(?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,]
regex.icontainsregex(?: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.

FieldKindValuesSearch
body.current_thread.textregex_match
  • (?:I am|My name is) .* (?:from|staying in) .+.
  • (?:I am|My name is) [^.!?]{1,30} from [^.!?]{1,50}[.!?,]
  • (?:can I|please) (?:talk to|contact|meet|chat with) (?:you|me)
  • (?:email|contact me|write to me|reply to me) at .*@.*.
  • (?:photo|pictures|sexy).*.
  • (?:years old|cm|kg).*.
  • [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
field:"body.current_thread.text" kind:regex_match
sender.display_nameregex_match
  • (?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev).?[ \t]+
  • [A-Z][a-z]+ [A-Z][a-z]+
field:"sender.display_name" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC/Fraud: Scam lure with freemail pivot

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesFree email provider, Out of band pivot

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.links
  • recipients
  • recipients.to
  • sender.email
  • type

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.

  1. inbound message
  2. length(body.current_thread.text) < 800
  3. length(recipients.to) is 1
  4. all of recipients.to where all hold:
    • .email.email is sender.email.email
    • any of:
      • .email.domain.valid
      • .display_name contains 'undisclosed'
  5. all of recipients.to where all hold:
    • .email.domain.root_domain not in $org_domains
    • any of:
      • .email.domain.valid
      • .display_name contains 'undisclosed'
  6. length(body.links) is 1
  7. all of body.links where:
    • .href_url.domain.root_domain is not sender.email.domain.root_domain
  8. body.current_thread.text matches '((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\\.?[ \\t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch)'
  9. all of:
    • body.current_thread.text matches '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}'
    • any of $free_email_providers where:
      • 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)

FieldMatchValue
strings.icontainssubstringundisclosed
regex.icontainsregex((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev)\.?[ \t]+)|(sir|madam|kindly)|(dringend|eingefordert|anspruch)
regex.containsregex[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.

FieldKindValuesSearch
body.current_thread.textregex_match
    • ((?:Mr|Mrs|Ms|Miss|Dr|Prof|Sir|Lady|Rev).?[ \t]+)
    • (sir|madam|kindly)
    • (dringend|eingefordert|anspruch)
  • [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
field:"body.current_thread.text" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC/Fraud: Student loan callback phishing

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesFree email provider, Out of band pivot, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.html
  • sender.email
  • type

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.

  1. inbound message
  2. body.html.raw is missing
  3. body.current_thread.text matches '<[^>]+>.*?</[^>]+>'
  4. body.current_thread.text contains 'Student Loan'
  5. sender.email.domain.root_domain in $free_email_providers
  6. 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}
  7. any of ml.nlu_classifier(body.current_thread.text).entities where:
    • .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)

FieldMatchValue
regex.containsregex<[^>]+>.*?</[^>]+>
strings.icontainssubstringStudent Loan
regex.containsregex\+?(\d{1}.)?\(?\d{3}?\)?.\d{3}.?\d{4}
regex.containsregex\+\d{1,3}[ilo0-9]{10}
regex.containsregex[ilo0-9]{3}\.[ilo0-9]{3}\.[ilo0-9]{4}
regex.containsregex[ilo0-9]{3}-[ilo0-9]{3}-[ilo0-9]{4}
regex.containsregex\([ilo0-9]{3}\)\s[ilo0-9]{3}-[ilo0-9]{4}
regex.containsregex\([ilo0-9]{3}\)[\s-]+[ilo0-9]{3}[\s-]+[ilo0-9]{4}
regex.containsregex1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4}
regex.containsregex8\d{9}
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsrequest

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.

FieldKindValuesSearch
body.current_thread.textcontains
  • Student Loan
field:"body.current_thread.text" kind:contains value:"Student Loan"
body.current_thread.textregex_match
  • <[^>]+>.*?</[^>]+>
field:"body.current_thread.text" kind:regex_match value:"<[^>]+>.*?</[^>]+>"
body.html.rawis_null
  • (no value, null check)
field:"body.html.raw" kind:is_null
strings.replace_confusables(body.current_thread.text)regex_match
  • 1 [ilo0-9]{3} [ilo0-9]{3} [ilo0-9]{4}
  • 8\d{9}
  • [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}[\s-]+[ilo0-9]{4}
  • ([ilo0-9]{3})\s[ilo0-9]{3}-[ilo0-9]{4}
  • +?(\d{1}.)?(?\d{3}?)?.\d{3}.?\d{4}
  • +\d{1,3}[ilo0-9]{10}
field:"strings.replace_confusables(body.current_thread.text)" kind:regex_match
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC/Fraud: Unsolicited business acquisition offer

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesSocial engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • body.plain
  • subject
  • type

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.

  1. inbound message
  2. subject.base contains any of 2 patterns
    • Offer to Purchase
    • Transaction Opportunity
  3. any of:
    • body.plain.raw contains any of 4 patterns
      • private equity
      • acquiring companies
      • discuss the opportunity
      • pe firm
    • all of:
      • any of ml.nlu_classifier(body.current_thread.text).entities where all hold:
        • .name is 'financial'
        • .text contains 'purchase'
      • any of ml.nlu_classifier(body.current_thread.text).topics where 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)

FieldMatchValue
strings.icontainssubstringOffer to Purchase
strings.icontainssubstringTransaction Opportunity
strings.icontainssubstringprivate equity
strings.icontainssubstringacquiring companies
strings.icontainssubstringdiscuss the opportunity
strings.icontainssubstringpe firm
ml.nlu_classifier(body.current_thread.text).entities[].nameequalsfinancial
strings.icontainssubstringpurchase
ml.nlu_classifier(body.current_thread.text).topics[].nameequalsB2B Cold Outreach
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh

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.

FieldKindValuesSearch
body.plain.rawcontains
  • acquiring companies
  • discuss the opportunity
  • pe firm
  • private equity
field:"body.plain.raw" kind:contains
subject.basecontains
  • Offer to Purchase
  • Transaction Opportunity
field:"subject.base" kind:contains
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC/Fraud: Urgent language and suspicious sending/infrastructure patterns

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

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).

CategoryValues
Attack typesBEC/Fraud, Callback Phishing, Spam
Tactics and techniquesImpersonation: Brand, Social engineering, Free email provider

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • headers
  • headers.reply_to
  • headers.x_originating_ip
  • recipients
  • recipients.to
  • sender.email
  • subject
  • type

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.

  1. inbound message
  2. 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
  3. at least 3 of:
    • sender.email.domain.root_domain in $free_email_providers
    • network.whois(sender.email.domain).days_old < 30
    • any of recipients.to where:
      • .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)
  4. 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)

FieldMatchValue
strings.ilikesubstring*quick question*
strings.ilikesubstring*urgent*request*
strings.ilikesubstring*are you available*
strings.ilikesubstring*need assistance*
strings.ilikesubstring*help*needed*
regex.icontainsregexfavor\b
strings.ilikesubstring*checking in*
strings.ilikesubstring*awaiting*response*
strings.ilikesubstring*catch*up*
strings.ilikesubstring*sorry to bother*
strings.ilikesubstring*are you busy*
strings.ilikesubstring*can you help*
8 more
strings.ilikesubstring*do you have a moment*
strings.ilikesubstring*please respond*asap*
regex.icontainsregexa\s?m\s?a\s?z\s?[o0]\s?n
regex.icontainsregexp\s?a\s?y\s?p\s?a\s?l
regex.icontainsregexa\s?p\s?p\s?l\s?e
strings.ilikesubstringundisclosed?recipients
strings.starts_withprefixOpen-Xchange Mailer
strings.ilikesubstring*.*.*.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.

FieldKindValuesSearch
body.current_thread.textregex_match
  • a\s?m\s?a\s?z\s?[o0]\s?n
  • a\s?p\s?p\s?l\s?e
  • p\s?a\s?y\s?p\s?a\s?l
field:"body.current_thread.text" kind:regex_match
body.current_thread.textwildcard
  • *are you busy*
  • *can you help*
  • *do you have a moment*
  • *please respond*asap*
  • *sorry to bother*
field:"body.current_thread.text" kind:wildcard
headers.mailerstarts_with
  • Open-Xchange Mailer
field:"headers.mailer" kind:starts_with value:"Open-Xchange Mailer"
headers.x_originating_ip.ipwildcard
  • *.*.*.0
field:"headers.x_originating_ip.ip" kind:wildcard value:"*.*.*.0"
subject.subjectregex_match
  • favor\b
field:"subject.subject" kind:regex_match value:"favor\b"
subject.subjectwildcard
  • *are you available*
  • *awaiting*response*
  • *catch*up*
  • *checking in*
  • *help*needed*
  • *need assistance*
  • *quick question*
  • *urgent*request*
field:"subject.subject" kind:wildcard
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

BEC: Executive coaching vendor impersonation

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: Brand, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • body
  • body.current_thread
  • type

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.

  1. inbound message
  2. any of:
    • body.current_thread.text contains any of 2 patterns
      • ezra
      • hesion
    • body.current_thread.text matches any of 2 patterns
      • better\s?up
      • coach\s?hub
  3. strings.replace_confusables(body.current_thread.text) contains any of 5 patterns
    • leadership development coach
    • coaching, leadership development
    • accounting & collections department
    • executive coach for emerging leaders
    • accounts receivable - coaching division
  4. any of ml.nlu_classifier(body.current_thread.text).topics where all hold:
    • .name in ('Financial Communications', 'Payment Information', 'Request to View Invoice')
    • .confidence is 'high'
  5. any of ml.nlu_classifier(body.current_thread.text).intents where:
    • .name is 'bec'

Inspects: body.current_thread.text, type.inbound. Sensors: ml.nlu_classifier, regex.icontains, strings.icontains, strings.replace_confusables.

Indicators matched (14)

FieldMatchValue
strings.icontainssubstringezra
strings.icontainssubstringhesion
regex.icontainsregexbetter\s?up
regex.icontainsregexcoach\s?hub
strings.icontainssubstringleadership development coach
strings.icontainssubstringcoaching, leadership development
strings.icontainssubstringaccounting & collections department
strings.icontainssubstringexecutive coach for emerging leaders
strings.icontainssubstringaccounts receivable - coaching division
ml.nlu_classifier(body.current_thread.text).topics[].namememberFinancial Communications
ml.nlu_classifier(body.current_thread.text).topics[].namememberPayment Information
ml.nlu_classifier(body.current_thread.text).topics[].namememberRequest to View Invoice
2 more
ml.nlu_classifier(body.current_thread.text).topics[].confidenceequalshigh
ml.nlu_classifier(body.current_thread.text).intents[].nameequalsbec

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.

FieldKindValuesSearch
body.current_thread.textcontains
  • ezra
  • hesion
field:"body.current_thread.text" kind:contains
body.current_thread.textregex_match
  • better\s?up
  • coach\s?hub
field:"body.current_thread.text" kind:regex_match
strings.replace_confusables(body.current_thread.text)contains
  • accounting & collections department
  • accounts receivable - coaching division
  • coaching, leadership development
  • executive coach for emerging leaders
  • leadership development coach
field:"strings.replace_confusables(body.current_thread.text)" kind:contains
type.inboundeq
  • true transforms: boolean
field:"type.inbound" kind:eq value:"true"

Fraudulent e-commerce operators

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

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).

CategoryValues
Attack typesBEC/Fraud
Tactics and techniquesImpersonation: Brand, Lookalike domain, Social engineering

Telemetry coverage

PlatformRecord / event type
SublimeInbound email message

Message attributes

  • headers
  • sender.email
  • type

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.

  1. inbound message
  2. headers.mailer starts with 'Open-Xchange Mailer'
  3. headers.message_id ends with '@privateemail.com>'
  4. sender.email.domain.sld matches '.*(?:llc|ltd|inc|corp|llp|co)'
  5. 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)

FieldMatchValue
strings.starts_withprefixOpen-Xchange Mailer
strings.ends_withsuffix@privateemail.com>
regex.imatchregex.*(?: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.

FieldKindExcluded valuesSearch
sender.email.domain.root_domaineqsimpelllc.comexcludes:sender.email.domain.root_domain field:"sender.email.domain.root_domain" value:"simpelllc.com"

Indicators

These rows show field, operator, and value matches.