Brand Impersonation: Microsoft Teams Invitation

Detects messages impersonating a Microsoft Teams invites by matching known invite text patterns while containing join links that do not resolve to Microsoft domains. Additional verification includes checking for absent phone dial-in options and missing standard Teams help text or HTML meeting components.

Sublime rule (View on GitHub)

 1name: "Brand Impersonation: Microsoft Teams Invitation"
 2description: "Detects messages impersonating a Microsoft Teams invites by matching known invite text patterns while containing join links that do not resolve to Microsoft domains. Additional verification includes checking for absent phone dial-in options and missing standard Teams help text or HTML meeting components."
 3type: "rule"
 4severity: "high"
 5source: |
 6  type.inbound
 7  and strings.icontains(body.current_thread.text, 'Microsoft Teams')
 8  and strings.icontains(body.current_thread.text, 'join the meeting now')
 9  and strings.contains(body.current_thread.text, 'Meeting ID:')
10  and strings.contains(body.current_thread.text, 'Passcode:')
11  
12  // not a reply
13  and length(headers.references) == 0
14  and headers.in_reply_to is null
15  // few links
16  and length(body.links) < 10
17
18  // no unsubscribe links
19  // common in newsletters which link to a webinar style event
20  and not any(body.links, strings.icontains(.display_text, "unsub"))
21
22  // one of the links contains "join the meeting now"
23  and any(body.links, .display_text =~ "join the meeting now")
24  
25  // the "join the meeting now" link does not go to microsoft
26  and all(filter(body.links, .display_text =~ "join the meeting now"),
27          .href_url.domain.root_domain not in ("microsoft.com", "microsoft.us")
28          // rewriters often abstract the link
29          and .href_url.domain.root_domain not in $bulk_mailer_url_root_domains
30  )
31  
32  // missing the dial by phone element
33  and not strings.icontains(body.current_thread.text, 'Dial in by phone')
34  
35  // any of these suspicious elements from the body
36  and (
37    // malicious samples leveraged recipient domain branding here
38    not strings.icontains(body.current_thread.text, 'Microsoft Teams Need help?')
39    // malicious samples contained unique html elements not present in legit ones
40    or strings.icontains(body.html.raw, '<div class="meeting-title">')
41    or strings.icontains(body.html.raw, '<div class="meeting-time">')
42    or strings.icontains(body.html.raw, '<div class="meeting-location">')
43    or strings.icontains(body.html.raw, '<span class="conflict-badge">')
44    or strings.icontains(body.html.raw, 'class="join-button"')
45  )
46
47  // negate highly trusted sender domains unless they fail DMARC authentication
48  and (
49    (
50      sender.email.domain.root_domain in $high_trust_sender_root_domains
51      and not headers.auth_summary.dmarc.pass
52    )
53    or sender.email.domain.root_domain not in $high_trust_sender_root_domains
54  )  
55attack_types:
56  - "Credential Phishing"
57tactics_and_techniques:
58  - "Impersonation: Brand"
59  - "Social engineering"
60detection_methods:
61  - "Content analysis"
62  - "Header analysis"
63  - "HTML analysis"
64  - "URL analysis"
65id: "46410ad8-3465-505f-a78e-f77704910a91"
to-top