Detection rules › Sublime MQL

Impersonation: Recipient organization in sender display name with credential theft image

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

Sender display name contains the recipient's organization domain while the actual email address differs. Message includes a single image attachment with OCR-detected credential theft language referencing the recipient's domain, and has no body text.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImage as content, Impersonation: Brand, Social engineering

Event coverage

Rule body MQL

type.inbound
and length(body.links) <= 1
and length(attachments) == 1
and strings.icontains(sender.display_name, recipients.to[0].email.domain.sld)
and length(recipients.to) == 1
and recipients.to[0].email.domain.root_domain in $org_domains
and 
// No body text
(
  length(body.current_thread.text) == 0 or body.current_thread.text is null
)
and all(attachments,
        .file_type in $file_types_images
        //
        // This rule makes use of a beta feature and is subject to change without notice
        // using the beta feature in custom rules is not suggested until it has been formally released
        //
        and strings.icontains(beta.ocr(.).text,
                              recipients.to[0].email.domain.sld
        )
        and any(ml.nlu_classifier(beta.ocr(.).text).intents,
                .name == "cred_theft" and .confidence == "high"
        )
)

Detection logic

Scope: inbound message.

Sender display name contains the recipient's organization domain while the actual email address differs. Message includes a single image attachment with OCR-detected credential theft language referencing the recipient's domain, and has no body text.

  1. inbound message
  2. length(body.links) ≤ 1
  3. length(attachments) is 1
  4. strings.icontains(sender.display_name)
  5. length(recipients.to) is 1
  6. recipients.to[0].email.domain.root_domain in $org_domains
  7. any of:
    • length(body.current_thread.text) is 0
    • body.current_thread.text is missing
  8. all of attachments where all hold:
    • .file_type in $file_types_images
    • strings.icontains(beta.ocr(.).text)
    • any of ml.nlu_classifier(beta.ocr(.).text).intents where all hold:
      • .name is 'cred_theft'
      • .confidence is 'high'

Inspects: attachments[].file_type, body.current_thread.text, body.links, recipients.to, recipients.to[0].email.domain.root_domain, recipients.to[0].email.domain.sld, sender.display_name, type.inbound. Sensors: beta.ocr, ml.nlu_classifier, strings.icontains. Reference lists: $file_types_images, $org_domains.

Indicators matched (2)

FieldMatchValue
ml.nlu_classifier(beta.ocr(attachments[]).text).intents[].nameequalscred_theft
ml.nlu_classifier(beta.ocr(attachments[]).text).intents[].confidenceequalshigh