Detection rules › Sublime MQL
Brand impersonation: Microsoft with low reputation links
Detects low reputation links with Microsoft specific indicators in the body.
Threat classification
Sublime's own taxonomy (not MITRE ATT&CK).
| Category | Values |
|---|---|
| Attack types | Credential Phishing |
| Tactics and techniques | Free file host, Image as content, Impersonation: Brand, Social engineering |
Event coverage
Rule body MQL
type.inbound
and 0 < length(body.links) < 50
// suspicious link
and any(body.links,
(
.href_url.domain.tld == "ru"
or .href_url.domain.root_domain not in $tranco_1m
or .href_url.domain.domain in $free_file_hosts
or .href_url.domain.root_domain in $free_file_hosts
or .href_url.domain.root_domain in $free_subdomain_hosts
or .href_url.domain.domain in $url_shorteners
or .href_url.domain.domain in $social_landing_hosts
// account for URL rewrites
or (
any(.href_url.query_params_decoded["domain"],
strings.parse_domain(.).tld == "ru"
or strings.parse_domain(.).root_domain not in~ $tranco_1m
or strings.parse_domain(.).domain in~ $free_file_hosts
or strings.parse_domain(.).root_domain in~ $free_file_hosts
or strings.parse_domain(.).root_domain in~ $free_subdomain_hosts
or strings.parse_domain(.).domain in~ $url_shorteners
or strings.parse_domain(.).domain in~ $social_landing_hosts
)
)
or
// mass mailer link, masks the actual URL
.href_url.domain.root_domain in (
"hubspotlinks.com",
"mandrillapp.com",
"sendgrid.net",
"rs6.net"
)
// Google AMP redirect
or (
.href_url.domain.sld == "google"
and strings.starts_with(.href_url.path, "/amp/")
)
// Recipient email address in link
or any(body.links,
any(recipients.to,
strings.icontains(..href_url.url, .email.email)
and any(recipients.to, .email.domain.valid)
)
)
or .href_url.domain.root_domain == "beehiiv.com"
)
// exclude sources of potential FPs
and (
.href_url.domain.root_domain not in (
"svc.ms",
"sharepoint.com",
"1drv.ms",
"microsoft.com",
"aka.ms",
"msftauthimages.net",
"office.com",
"microsoftproject.com"
)
or any(body.links, .href_url.domain.domain in $free_file_hosts)
)
and .href_url.domain.root_domain not in $org_domains
and .href_url.domain.valid
)
// not a reply
and (length(headers.references) == 0 or headers.in_reply_to is null)
// Microsoft logo
and (
any(attachments,
.file_type in $file_types_images
and any(ml.logo_detect(.).brands, strings.starts_with(.name, "Microsoft"))
)
or strings.istarts_with(strings.replace_confusables(body.current_thread.text),
"Microsoft "
)
or (
regex.imatch(strings.replace_confusables(body.current_thread.text),
'[\n\s]*[o0O]ff[il1]ce\b.*'
)
and not regex.icontains(strings.replace_confusables(body.current_thread.text
),
'office (for lease|rent|sale)'
)
)
or any(ml.logo_detect(file.message_screenshot()).brands,
strings.starts_with(.name, "Microsoft")
)
or (
regex.icontains(body.html.raw,
'<table[^>]*>\s*<tbody[^>]*>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2}\s*</tr>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2}'
)
or regex.icontains(body.html.raw,
'<td style="background:\s*rgb\(246,\s*93,\s*53\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(129,\s*187,\s*5\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(4,\s*165,\s*240\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(255,\s*186,\s*7\);\s*height:\d+px;">'
)
or 4 of (
regex.icontains(body.html.raw,
'<td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(245, 189, 67\);">.{0,10}</td>'
),
regex.icontains(body.html.raw,
'<td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(137, 184, 57\);">.{0,10}</td>'
),
regex.icontains(body.html.raw,
'<td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(217, 83, 51\);">.{0,10}</td>'
),
regex.icontains(body.html.raw,
'<td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(71, 160, 218\);">.{0,10}</td>'
)
)
)
or regex.icontains(body.html.raw,
'<table[^>]*>\s*<tbody[^>]*>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2}\s*</tr>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2}'
)
or 3 of (
regex.icontains(body.html.raw, '.password-expiration'),
regex.icontains(body.html.raw, 'color: #2672ec;'),
regex.icontains(body.html.raw, 'M\x{00AD}ic\x{00AD}ro\x{00AD}so\x{00AD}ft')
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(246,\s?93,\s?53\)'),
regex.icontains(body.html.raw, 'rgb\(129,\s?187,\s?5\)'),
regex.icontains(body.html.raw, 'rgb\(4,\s?165,\s?240\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?186,\s?7\)'),
)
or 4 of (
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)red'
),
regex.icontains(body.html.raw, 'rgb\(19,\s?186,\s?132\)'),
regex.icontains(body.html.raw, 'rgb\(4,\s?166,\s?240\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?186,\s?8\)'),
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(245,\s?189,\s?67\)'),
regex.icontains(body.html.raw, 'rgb\(137,\s?184,\s?57\)'),
regex.icontains(body.html.raw, 'rgb\(217,\s?83,\s?51\)'),
regex.icontains(body.html.raw, 'rgb\(71,\s?160,\s?218\)')
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(73,\s?161,\s?232\)'),
regex.icontains(body.html.raw, 'rgb\(224,\s?92,\s?53\)'),
regex.icontains(body.html.raw, 'rgb\(139,\s?183,\s?55\)'),
regex.icontains(body.html.raw, 'rgb\(244,\s?188,\s?65\)')
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(213,\s?56,\s?62\)'),
regex.icontains(body.html.raw, 'rgb\(0,\s?114,\s?30\)'),
regex.icontains(body.html.raw, 'rgb\(0,\s?110,\s?173\)'),
regex.icontains(body.html.raw, 'rgb\(227,\s?209,\s?43\)'),
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(246,\s?93,\s?53\)'),
regex.icontains(body.html.raw, 'rgb\(129,\s?187,\s?5\)'),
regex.icontains(body.html.raw, 'rgb\(4,\s?165,\s?240\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?186,\s?7\)')
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(242,\s?80,\s?34\)'),
regex.icontains(body.html.raw, 'rgb\(127,\s?186,\s?0\)'),
regex.icontains(body.html.raw, 'rgb\(0,\s?164,\s?239\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?185,\s?0\)'),
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(243,\s?83,\s?37\)'),
regex.icontains(body.html.raw, 'rgb\(129,\s?188,\s?6\)'),
regex.icontains(body.html.raw, 'rgb\(5,\s?166,\s?240\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?186,\s?8\)')
)
or 4 of (
regex.icontains(body.html.raw, 'rgb\(243,\s?80,\s?34\)'),
regex.icontains(body.html.raw, 'rgb\(128,\s?187,\s?3\)'),
regex.icontains(body.html.raw, 'rgb\(3,\s?165,\s?240\)'),
regex.icontains(body.html.raw, 'rgb\(255,\s?185,\s?3\)')
)
or 4 of (
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?(#)?(FF1940|eb5024|F25022|FF1941|red)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?(#)?(36ba57|3eb55d|7db606|7FBA00|36ba58|green)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(04a1d6|04B5F0|05a1e8|00A4EF|01a4ef|04a5f0)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(FFCA07|f7b408|FFB900|FFCA08|ffb901|ffba07)'
),
)
or 4 of (
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(f65314|f65d35|49a1e8|E74F23|F35325)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(7cbf42|81bb05|e05c35|7AB206|81BC06)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(00a4ef|0078d7|8bb737|04a5f0|059EE4|05A6F0)'
),
regex.icontains(body.html.raw,
'(background-color:|background:|bgcolor=)(.)?#(ffb900|ffba07|f4bc41|F2B108|FFBA08)'
),
)
// fuzzy approach
or 4 of (
regex.icontains(body.html.raw,
'rgb\((2[1-4][0-9]|250),\s?(7[0-9]|8[0-9]|9[0-3]),\s?(3[0-9]|4[0-9]|5[0-3])\)'
),
regex.icontains(body.html.raw,
'rgb\((12[0-9]|13[0-9]),\s?(18[0-9]|190),\s?([0-9]|10)\)'
),
regex.icontains(body.html.raw,
'rgb\(([0-9]|1[0-5]),\s?(16[0-5]|166),\s?(23[0-9]|240)\)'
),
regex.icontains(body.html.raw,
'rgb\((25[0-5]),\s?(18[5-9]|19[0-9]),\s?([0-9]|10)\)'
)
)
)
// suspicious content
and (
// current thread is empty, but an image attachment is branded as microsoft.
// common in image as content
(
body.current_thread.text == ""
and any(attachments,
.file_type in $file_types_images
and any(ml.logo_detect(.).brands,
strings.starts_with(.name, "Microsoft")
)
)
)
or (
strings.ilike(body.plain.raw,
"*password*",
"*document*",
"*voicemail*",
"*cache*",
"*fax*",
"*storage*",
"*quota*",
"*message*"
)
and strings.ilike(body.plain.raw,
"*terminated*",
"*review*",
"*expire*",
"*click*",
"*view*",
"*exceed*",
"*clear*",
"*only works*",
"*failed*",
"*deleted*",
"*revalidated*",
"*renewal*"
)
)
or (
any(attachments,
.file_type in $file_types_images
and any(file.explode(.),
strings.ilike(.scan.ocr.raw,
"*password*",
"*document*",
"*voicemail*",
"*cache*",
"*fax*",
"*storage*",
"*quota*",
"*messages*"
)
and strings.ilike(.scan.ocr.raw,
"*terminated*",
"*review*",
"*expire*",
"*click*",
"*view*",
"*exceed*",
"*clear*",
"*only works*",
"*failed*",
"*deleted*"
)
)
)
)
or (
//
// 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
//
strings.ilike(beta.ocr(file.message_screenshot()).text,
"*password*",
"*document*",
"*voicemail*",
"*cache*",
"*fax*",
"*storage*",
"*quota*",
"*messages*"
)
and strings.ilike(beta.ocr(file.message_screenshot()).text,
"*terminated*",
"*review*",
"*expire*",
"*click*",
"*view*",
"*exceed*",
"*clear*",
"*only works*",
"*failed*",
"*deleted*",
"*revalidated*",
"*renewal*"
)
)
or (
any(ml.nlu_classifier(body.current_thread.text).intents,
.name == "cred_theft" and .confidence in~ ("medium", "high")
)
or any(attachments,
.file_type in $file_types_images
and any(file.explode(.),
any(ml.nlu_classifier(.scan.ocr.raw).intents,
.name == "cred_theft"
and .confidence in ("medium", "high")
)
)
)
)
)
and sender.email.domain.root_domain not in (
"bing.com",
"microsoft.com",
"microsoftonline.com",
"microsoftproject.com",
"microsoftstoreemail.com",
"microsoftsupport.com",
"microsoft365.com",
"office.com",
"office365.com",
"onedrive.com",
"sharepointonline.com",
"yammer.com",
)
// negate legitimate Office 365 bouncebacks
and not (
length(attachments) > 0
and all(attachments,
.content_type in ("message/delivery-status", "message/rfc822")
)
and (sender.email.local_part in ('postmaster', 'mailer-daemon'))
)
// negate Microsoft "welcome to the X group" notifications
and not (
headers.auth_summary.dmarc.pass
and length(attachments) == 6
and length(filter(attachments,
strings.istarts_with(.file_name, "GuestWelcomeEmail")
)
) == 5
and length(filter(body.links,
(
.href_url.domain.domain not in (
"outlook.office365.com",
"aka.ms",
"go.microsoft.com"
)
)
and not .href_url.domain.domain == sender.email.domain.domain
)
) == 0
and subject.subject == strings.replace_confusables(subject.subject)
)
// negate org domains unless they fail DMARC authentication
and (
(
sender.email.domain.root_domain in $org_domains
and (
not headers.auth_summary.dmarc.pass
// MS quarantine digest emails from an org domain are router "internally" to MS, therefore, there is no authentication information
or not (
headers.auth_summary.dmarc.pass is null
and all(headers.domains,
.root_domain in ("outlook.com", "office365.com")
)
// typical emails from freemail Outlook accounts are from prod.outlook.com
and strings.ends_with(headers.message_id, "protection.outlook.com>")
)
)
)
or sender.email.domain.root_domain not in $org_domains
)
// 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
)
and (
not profile.by_sender().solicited
or (
profile.by_sender().any_messages_malicious_or_spam
and not profile.by_sender().any_messages_benign
)
)
and not profile.by_sender().any_messages_benign
// exclude marketing jargon from ms partners
and not regex.icontains(body.current_thread.text,
'(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|(?:invite|virtual).{0,30}(webinar|presentation)'
)
Detection logic
Scope: inbound message.
Detects low reputation links with Microsoft specific indicators in the body.
- inbound message
all of:
- length(body.links) > 0
- length(body.links) < 50
any of
body.linkswhere all hold:any of:
- .href_url.domain.tld is 'ru'
- .href_url.domain.root_domain not in $tranco_1m
- .href_url.domain.domain in $free_file_hosts
- .href_url.domain.root_domain in $free_file_hosts
- .href_url.domain.root_domain in $free_subdomain_hosts
- .href_url.domain.domain in $url_shorteners
- .href_url.domain.domain in $social_landing_hosts
any of
.href_url.query_params_decoded['domain']where any holds:- strings.parse_domain(.).tld is 'ru'
- strings.parse_domain(.).root_domain not in $tranco_1m
- strings.parse_domain(.).domain in $free_file_hosts
- strings.parse_domain(.).root_domain in $free_file_hosts
- strings.parse_domain(.).root_domain in $free_subdomain_hosts
- strings.parse_domain(.).domain in $url_shorteners
- strings.parse_domain(.).domain in $social_landing_hosts
- .href_url.domain.root_domain in ('hubspotlinks.com', 'mandrillapp.com', 'sendgrid.net', 'rs6.net')
all of:
- .href_url.domain.sld is 'google'
- .href_url.path starts with '/amp/'
any of
body.linkswhere:any of
recipients.towhere all hold:- strings.icontains(.href_url.url)
any of
recipients.towhere:- .email.domain.valid
- .href_url.domain.root_domain is 'beehiiv.com'
any of:
- .href_url.domain.root_domain not in ('svc.ms', 'sharepoint.com', '1drv.ms', 'microsoft.com', 'aka.ms', 'msftauthimages.net', 'office.com', 'microsoftproject.com')
any of
body.linkswhere:- .href_url.domain.domain in $free_file_hosts
- .href_url.domain.root_domain not in $org_domains
- .href_url.domain.valid
any of:
- length(headers.references) is 0
- headers.in_reply_to is missing
any of:
any of
attachmentswhere all hold:- .file_type in $file_types_images
any of
ml.logo_detect(.).brandswhere:- .name starts with 'Microsoft'
- strings.replace_confusables(body.current_thread.text) starts with 'Microsoft '
all of:
- strings.replace_confusables(body.current_thread.text) matches '[\\n\\s]*[o0O]ff[il1]ce\\b.*'
not:
- strings.replace_confusables(body.current_thread.text) matches 'office (for lease|rent|sale)'
any of
ml.logo_detect(file.message_screenshot()).brandswhere:- .name starts with 'Microsoft'
any of:
- body.html.raw matches '<table[^>]*>\\s*<tbody[^>]*>\\s*<tr[^>]*>\\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\\s*&nbsp;\\s*</td>\\s*){2}\\s*</tr>\\s*<tr[^>]*>\\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\\s*&nbsp;\\s*</td>\\s*){2}'
- body.html.raw matches '<td style="background:\\s*rgb\\(246,\\s*93,\\s*53\\);\\s*height:\\d+px;">.*?<td style="background:\\s*rgb\\(129,\\s*187,\\s*5\\);\\s*height:\\d+px;">.*?<td style="background:\\s*rgb\\(4,\\s*165,\\s*240\\);\\s*height:\\d+px;">.*?<td style="background:\\s*rgb\\(255,\\s*186,\\s*7\\);\\s*height:\\d+px;">'
at least 4 of 4: body.html.raw matches any of 4 patterns
<td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(245, 189, 67\);">.{0,10}</td><td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(137, 184, 57\);">.{0,10}</td><td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(217, 83, 51\);">.{0,10}</td><td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(71, 160, 218\);">.{0,10}</td>
- body.html.raw matches '<table[^>]*>\\s*<tbody[^>]*>\\s*<tr[^>]*>\\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\\s*&nbsp;\\s*</td>\\s*){2}\\s*</tr>\\s*<tr[^>]*>\\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\\s*&nbsp;\\s*</td>\\s*){2}'
at least 3 of:
- body.html.raw matches '.password-expiration'
- body.html.raw matches 'color: #2672ec;'
- body.html.raw matches 'M\\x{00AD}ic\\x{00AD}ro\\x{00AD}so\\x{00AD}ft'
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(246,\s?93,\s?53\)rgb\(129,\s?187,\s?5\)rgb\(4,\s?165,\s?240\)rgb\(255,\s?186,\s?7\)
at least 4 of 4: body.html.raw matches any of 4 patterns
(background-color:|background:|bgcolor=)(.)redrgb\(19,\s?186,\s?132\)rgb\(4,\s?166,\s?240\)rgb\(255,\s?186,\s?8\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(245,\s?189,\s?67\)rgb\(137,\s?184,\s?57\)rgb\(217,\s?83,\s?51\)rgb\(71,\s?160,\s?218\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(73,\s?161,\s?232\)rgb\(224,\s?92,\s?53\)rgb\(139,\s?183,\s?55\)rgb\(244,\s?188,\s?65\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(213,\s?56,\s?62\)rgb\(0,\s?114,\s?30\)rgb\(0,\s?110,\s?173\)rgb\(227,\s?209,\s?43\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(246,\s?93,\s?53\)rgb\(129,\s?187,\s?5\)rgb\(4,\s?165,\s?240\)rgb\(255,\s?186,\s?7\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(242,\s?80,\s?34\)rgb\(127,\s?186,\s?0\)rgb\(0,\s?164,\s?239\)rgb\(255,\s?185,\s?0\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(243,\s?83,\s?37\)rgb\(129,\s?188,\s?6\)rgb\(5,\s?166,\s?240\)rgb\(255,\s?186,\s?8\)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\(243,\s?80,\s?34\)rgb\(128,\s?187,\s?3\)rgb\(3,\s?165,\s?240\)rgb\(255,\s?185,\s?3\)
at least 4 of 4: body.html.raw matches any of 4 patterns
(background-color:|background:|bgcolor=)(.)?(#)?(FF1940|eb5024|F25022|FF1941|red)(background-color:|background:|bgcolor=)(.)?(#)?(36ba57|3eb55d|7db606|7FBA00|36ba58|green)(background-color:|background:|bgcolor=)(.)?#(04a1d6|04B5F0|05a1e8|00A4EF|01a4ef|04a5f0)(background-color:|background:|bgcolor=)(.)?#(FFCA07|f7b408|FFB900|FFCA08|ffb901|ffba07)
at least 4 of 4: body.html.raw matches any of 4 patterns
(background-color:|background:|bgcolor=)(.)?#(f65314|f65d35|49a1e8|E74F23|F35325)(background-color:|background:|bgcolor=)(.)?#(7cbf42|81bb05|e05c35|7AB206|81BC06)(background-color:|background:|bgcolor=)(.)?#(00a4ef|0078d7|8bb737|04a5f0|059EE4|05A6F0)(background-color:|background:|bgcolor=)(.)?#(ffb900|ffba07|f4bc41|F2B108|FFBA08)
at least 4 of 4: body.html.raw matches any of 4 patterns
rgb\((2[1-4][0-9]|250),\s?(7[0-9]|8[0-9]|9[0-3]),\s?(3[0-9]|4[0-9]|5[0-3])\)rgb\((12[0-9]|13[0-9]),\s?(18[0-9]|190),\s?([0-9]|10)\)rgb\(([0-9]|1[0-5]),\s?(16[0-5]|166),\s?(23[0-9]|240)\)rgb\((25[0-5]),\s?(18[5-9]|19[0-9]),\s?([0-9]|10)\)
any of:
all of:
- body.current_thread.text is ''
any of
attachmentswhere all hold:- .file_type in $file_types_images
any of
ml.logo_detect(.).brandswhere:- .name starts with 'Microsoft'
all of:
body.plain.raw matches any of 8 patterns
*password**document**voicemail**cache**fax**storage**quota**message*
body.plain.raw matches any of 12 patterns
*terminated**review**expire**click**view**exceed**clear**only works**failed**deleted**revalidated**renewal*
any of
attachmentswhere all hold:- .file_type in $file_types_images
any of
file.explode(.)where all hold:.scan.ocr.raw matches any of 8 patterns
*password**document**voicemail**cache**fax**storage**quota**messages*
.scan.ocr.raw matches any of 10 patterns
*terminated**review**expire**click**view**exceed**clear**only works**failed**deleted*
all of:
beta.ocr(file.message_screenshot()).text matches any of 8 patterns
*password**document**voicemail**cache**fax**storage**quota**messages*
beta.ocr(file.message_screenshot()).text matches any of 12 patterns
*terminated**review**expire**click**view**exceed**clear**only works**failed**deleted**revalidated**renewal*
any of:
any of
ml.nlu_classifier(body.current_thread.text).intentswhere all hold:- .name is 'cred_theft'
- .confidence in ('medium', 'high')
any of
attachmentswhere all hold:- .file_type in $file_types_images
any of
file.explode(.)where:any of
ml.nlu_classifier(.scan.ocr.raw).intentswhere all hold:- .name is 'cred_theft'
- .confidence in ('medium', 'high')
- sender.email.domain.root_domain not in ('bing.com', 'microsoft.com', 'microsoftonline.com', 'microsoftproject.com', 'microsoftstoreemail.com', 'microsoftsupport.com', 'microsoft365.com', 'office.com', 'office365.com', 'onedrive.com', 'sharepointonline.com', 'yammer.com')
not:
all of:
- length(attachments) > 0
all of
attachmentswhere:- .content_type in ('message/delivery-status', 'message/rfc822')
- sender.email.local_part in ('postmaster', 'mailer-daemon')
not:
all of:
- headers.auth_summary.dmarc.pass
- length(attachments) is 6
- length(filter(attachments, strings.istarts_with(.file_name, 'GuestWelcomeEmail'))) is 5
- length(filter(body.links, .href_url.domain.domain not in ('outlook.office365.com', 'aka.ms', 'go.microsoft.com') and not .href_url.domain.domain == sender.email.domain.domain)) is 0
- subject.subject is strings.replace_confusables(subject.subject)
any of:
all of:
- sender.email.domain.root_domain in $org_domains
any of:
not:
- headers.auth_summary.dmarc.pass
not:
all of:
- headers.auth_summary.dmarc.pass is missing
all of
headers.domainswhere:- .root_domain in ('outlook.com', 'office365.com')
- headers.message_id ends with 'protection.outlook.com>'
- sender.email.domain.root_domain not in $org_domains
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
any of:
not:
- profile.by_sender().solicited
all of:
- profile.by_sender().any_messages_malicious_or_spam
not:
- profile.by_sender().any_messages_benign
not:
- profile.by_sender().any_messages_benign
not:
- body.current_thread.text matches '(schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|(?:invite|virtual).{0,30}(webinar|presentation)'
Inspects: attachments[].content_type, attachments[].file_name, attachments[].file_type, body.current_thread.text, body.html.raw, body.links, body.links[].href_url.domain.domain, body.links[].href_url.domain.root_domain, body.links[].href_url.domain.sld, body.links[].href_url.domain.tld, body.links[].href_url.domain.valid, body.links[].href_url.path, body.links[].href_url.query_params_decoded['domain'], body.links[].href_url.url, body.plain.raw, headers.auth_summary.dmarc.pass, headers.domains, headers.domains[].root_domain, headers.in_reply_to, headers.message_id, headers.references, recipients.to, recipients.to[].email.domain.valid, recipients.to[].email.email, sender.email.domain.domain, sender.email.domain.root_domain, sender.email.local_part, subject.subject, type.inbound. Sensors: beta.ocr, file.explode, file.message_screenshot, ml.logo_detect, ml.nlu_classifier, profile.by_sender, regex.icontains, regex.imatch, strings.ends_with, strings.icontains, strings.ilike, strings.istarts_with, strings.parse_domain, strings.replace_confusables, strings.starts_with. Reference lists: $file_types_images, $free_file_hosts, $free_subdomain_hosts, $high_trust_sender_root_domains, $org_domains, $social_landing_hosts, $tranco_1m, $url_shorteners.
Indicators matched (124)
| Field | Match | Value |
|---|---|---|
body.links[].href_url.domain.tld | equals | ru |
body.links[].href_url.domain.root_domain | member | hubspotlinks.com |
body.links[].href_url.domain.root_domain | member | mandrillapp.com |
body.links[].href_url.domain.root_domain | member | sendgrid.net |
body.links[].href_url.domain.root_domain | member | rs6.net |
body.links[].href_url.domain.sld | equals | google |
strings.starts_with | prefix | /amp/ |
body.links[].href_url.domain.root_domain | equals | beehiiv.com |
body.links[].href_url.domain.root_domain | member | svc.ms |
body.links[].href_url.domain.root_domain | member | sharepoint.com |
body.links[].href_url.domain.root_domain | member | 1drv.ms |
body.links[].href_url.domain.root_domain | member | microsoft.com |
112 more
body.links[].href_url.domain.root_domain | member | aka.ms |
body.links[].href_url.domain.root_domain | member | msftauthimages.net |
body.links[].href_url.domain.root_domain | member | office.com |
body.links[].href_url.domain.root_domain | member | microsoftproject.com |
strings.starts_with | prefix | Microsoft |
strings.istarts_with | prefix | Microsoft |
regex.imatch | regex | [\n\s]*[o0O]ff[il1]ce\b.* |
regex.icontains | regex | office (for lease|rent|sale) |
regex.icontains | regex | <table[^>]*>\s*<tbody[^>]*>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2}\s*</tr>\s*<tr[^>]*>\s*(<td[^>]*bgcolor="#[0-9A-Fa-f]{6}"[^>]*>\s*&nbsp;\s*</td>\s*){2} |
regex.icontains | regex | <td style="background:\s*rgb\(246,\s*93,\s*53\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(129,\s*187,\s*5\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(4,\s*165,\s*240\);\s*height:\d+px;">.*?<td style="background:\s*rgb\(255,\s*186,\s*7\);\s*height:\d+px;"> |
regex.icontains | regex | <td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(245, 189, 67\);">.{0,10}</td> |
regex.icontains | regex | <td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(137, 184, 57\);">.{0,10}</td> |
regex.icontains | regex | <td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(217, 83, 51\);">.{0,10}</td> |
regex.icontains | regex | <td style="width:.\d.px;.height:.\d.px;.background-color:.rgb\(71, 160, 218\);">.{0,10}</td> |
regex.icontains | regex | .password-expiration |
regex.icontains | regex | color: #2672ec; |
regex.icontains | regex | M\x{00AD}ic\x{00AD}ro\x{00AD}so\x{00AD}ft |
regex.icontains | regex | rgb\(246,\s?93,\s?53\) |
regex.icontains | regex | rgb\(129,\s?187,\s?5\) |
regex.icontains | regex | rgb\(4,\s?165,\s?240\) |
regex.icontains | regex | rgb\(255,\s?186,\s?7\) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)red |
regex.icontains | regex | rgb\(19,\s?186,\s?132\) |
regex.icontains | regex | rgb\(4,\s?166,\s?240\) |
regex.icontains | regex | rgb\(255,\s?186,\s?8\) |
regex.icontains | regex | rgb\(245,\s?189,\s?67\) |
regex.icontains | regex | rgb\(137,\s?184,\s?57\) |
regex.icontains | regex | rgb\(217,\s?83,\s?51\) |
regex.icontains | regex | rgb\(71,\s?160,\s?218\) |
regex.icontains | regex | rgb\(73,\s?161,\s?232\) |
regex.icontains | regex | rgb\(224,\s?92,\s?53\) |
regex.icontains | regex | rgb\(139,\s?183,\s?55\) |
regex.icontains | regex | rgb\(244,\s?188,\s?65\) |
regex.icontains | regex | rgb\(213,\s?56,\s?62\) |
regex.icontains | regex | rgb\(0,\s?114,\s?30\) |
regex.icontains | regex | rgb\(0,\s?110,\s?173\) |
regex.icontains | regex | rgb\(227,\s?209,\s?43\) |
regex.icontains | regex | rgb\(242,\s?80,\s?34\) |
regex.icontains | regex | rgb\(127,\s?186,\s?0\) |
regex.icontains | regex | rgb\(0,\s?164,\s?239\) |
regex.icontains | regex | rgb\(255,\s?185,\s?0\) |
regex.icontains | regex | rgb\(243,\s?83,\s?37\) |
regex.icontains | regex | rgb\(129,\s?188,\s?6\) |
regex.icontains | regex | rgb\(5,\s?166,\s?240\) |
regex.icontains | regex | rgb\(243,\s?80,\s?34\) |
regex.icontains | regex | rgb\(128,\s?187,\s?3\) |
regex.icontains | regex | rgb\(3,\s?165,\s?240\) |
regex.icontains | regex | rgb\(255,\s?185,\s?3\) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?(#)?(FF1940|eb5024|F25022|FF1941|red) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?(#)?(36ba57|3eb55d|7db606|7FBA00|36ba58|green) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(04a1d6|04B5F0|05a1e8|00A4EF|01a4ef|04a5f0) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(FFCA07|f7b408|FFB900|FFCA08|ffb901|ffba07) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(f65314|f65d35|49a1e8|E74F23|F35325) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(7cbf42|81bb05|e05c35|7AB206|81BC06) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(00a4ef|0078d7|8bb737|04a5f0|059EE4|05A6F0) |
regex.icontains | regex | (background-color:|background:|bgcolor=)(.)?#(ffb900|ffba07|f4bc41|F2B108|FFBA08) |
regex.icontains | regex | rgb\((2[1-4][0-9]|250),\s?(7[0-9]|8[0-9]|9[0-3]),\s?(3[0-9]|4[0-9]|5[0-3])\) |
regex.icontains | regex | rgb\((12[0-9]|13[0-9]),\s?(18[0-9]|190),\s?([0-9]|10)\) |
regex.icontains | regex | rgb\(([0-9]|1[0-5]),\s?(16[0-5]|166),\s?(23[0-9]|240)\) |
regex.icontains | regex | rgb\((25[0-5]),\s?(18[5-9]|19[0-9]),\s?([0-9]|10)\) |
body.current_thread.text | equals | |
strings.ilike | substring | *password* |
strings.ilike | substring | *document* |
strings.ilike | substring | *voicemail* |
strings.ilike | substring | *cache* |
strings.ilike | substring | *fax* |
strings.ilike | substring | *storage* |
strings.ilike | substring | *quota* |
strings.ilike | substring | *message* |
strings.ilike | substring | *terminated* |
strings.ilike | substring | *review* |
strings.ilike | substring | *expire* |
strings.ilike | substring | *click* |
strings.ilike | substring | *view* |
strings.ilike | substring | *exceed* |
strings.ilike | substring | *clear* |
strings.ilike | substring | *only works* |
strings.ilike | substring | *failed* |
strings.ilike | substring | *deleted* |
strings.ilike | substring | *revalidated* |
strings.ilike | substring | *renewal* |
strings.ilike | substring | *messages* |
ml.nlu_classifier(body.current_thread.text).intents[].name | equals | cred_theft |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | medium |
ml.nlu_classifier(body.current_thread.text).intents[].confidence | member | high |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].name | equals | cred_theft |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].confidence | member | medium |
ml.nlu_classifier(file.explode(attachments[])[].scan.ocr.raw).intents[].confidence | member | high |
sender.email.domain.root_domain | member | bing.com |
sender.email.domain.root_domain | member | microsoft.com |
sender.email.domain.root_domain | member | microsoftonline.com |
sender.email.domain.root_domain | member | microsoftproject.com |
sender.email.domain.root_domain | member | microsoftstoreemail.com |
sender.email.domain.root_domain | member | microsoftsupport.com |
sender.email.domain.root_domain | member | microsoft365.com |
sender.email.domain.root_domain | member | office.com |
sender.email.domain.root_domain | member | office365.com |
sender.email.domain.root_domain | member | onedrive.com |
sender.email.domain.root_domain | member | sharepointonline.com |
sender.email.domain.root_domain | member | yammer.com |
attachments[].content_type | member | message/delivery-status |
attachments[].content_type | member | message/rfc822 |
sender.email.local_part | member | postmaster |
sender.email.local_part | member | mailer-daemon |
strings.istarts_with | prefix | GuestWelcomeEmail |
body.links[].href_url.domain.domain | member | outlook.office365.com |
body.links[].href_url.domain.domain | member | aka.ms |
body.links[].href_url.domain.domain | member | go.microsoft.com |
headers.domains[].root_domain | member | outlook.com |
headers.domains[].root_domain | member | office365.com |
strings.ends_with | suffix | protection.outlook.com> |
regex.icontains | regex | (schedul(e|ing)|set up).{0,20}(call|meeting|demo|zoom|conversation|time|tool|discussion)|book.{0,10}(meeting|demo|call|slot|time)|connect.{0,12}(with me|phone|email)|my.{0,10}(calendar|cal)|reserve.{0,10}s[pl]ot|break the ice|want to know more?|miss your chance|if you no longer wish|if you no longer want|if you wish to opt out|low-code (development|approach|solution|journey|platform)|(?:invite|virtual).{0,30}(webinar|presentation) |