Detection rules › Sublime MQL

Brand impersonation: Google Meet with malicious link

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

Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.

Threat classification

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

CategoryValues
Attack typesCredential Phishing
Tactics and techniquesImpersonation: Brand, Social engineering

Event coverage

Rule body MQL

type.inbound
and any(body.current_thread.links,
        .display_text == "Join with Google Meet"
        and not strings.contains(.href_url.domain.domain, "meet.google.com")
)
and (
  // finding the logo tag in the html
  any(html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes,
      .raw is not null
  )
  // OR find the green button
  or any(html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes,
         .display_text == "Join with Google Meet"
  )
)
// finding the "Guests"/"Join by phone" tables NOT being present in the message is a good way to filter out the legit messages. 
and length(html.xpath(body.html,
                      '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]'
           ).nodes
) == 0
// we're filtering out some more "generic" table heading for google meets with this one
and not any(distinct(map(html.xpath(body.html, '//table//h2').nodes,
                         .inner_text
                     )
            ),
            . in ("Meeting link", "Join by phone", "Guests")
)

Detection logic

Scope: inbound message.

Detects messages with 'Join with Google Meet' display text that redirects to domains other than meet.google.com.

  1. inbound message
  2. any of body.current_thread.links where all hold:
    • .display_text is 'Join with Google Meet'
    • not:
      • .href_url.domain.domain contains 'meet.google.com'
  3. any of:
    • any of html.xpath(body.html, '//img[@alt="[Optional Logo]"]').nodes where:
      • .raw is set
    • any of html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes where:
      • .display_text is 'Join with Google Meet'
  4. length(html.xpath(body.html, '//table/tbody/tr/td/h2[contains(@style, "color:rgb(60,64,67)")]').nodes) is 0
  5. not:
    • any of distinct(...) where:
      • . in ('Meeting link', 'Join by phone', 'Guests')

Inspects: body.current_thread.links, body.current_thread.links[].display_text, body.current_thread.links[].href_url.domain.domain, body.html, type.inbound. Sensors: html.xpath, strings.contains.

Indicators matched (6)

FieldMatchValue
body.current_thread.links[].display_textequalsJoin with Google Meet
strings.containssubstringmeet.google.com
html.xpath(body.html, '//a[contains(@style, "rgb(52,168,83)")]').nodes[].display_textequalsJoin with Google Meet
distinct(...)[]memberMeeting link
distinct(...)[]memberJoin by phone
distinct(...)[]memberGuests