Brand impersonation: Punchbowl
Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain.
Sublime rule (View on GitHub)
1name: "Brand impersonation: Punchbowl"
2description: "Detects messages impersonating Punchbowl invitations not originating from legitimate Punchbowl domain."
3type: "rule"
4severity: "medium"
5source: |
6 type.inbound
7 // Looking for Punchbowl phrasing in all body threads
8 and (
9 strings.icontains(body.current_thread.text, "punchbowl")
10 // Look for alt text in HTML for standardized Punchbowl formatting if string is not avail.
11 or strings.icontains(body.html.raw, 'alt="Punchbowl"')
12 // image sourced from punchbowl
13 or any(html.xpath(body.html, '//img/@src').nodes,
14 strings.parse_url(.raw).domain.domain == "static.punchbowl.com"
15 and strings.icontains(strings.parse_url(.raw).path, '/invitation')
16 )
17 )
18
19 // Phrasing is typically "You're invited"
20 and (
21 strings.icontains(body.current_thread.text, "you're invited")
22 or any([
23 html.xpath(body.html,
24 '//a//img[contains(@src, "btn_open_invitation")]'
25 ).nodes,
26 html.xpath(body.html,
27 '//a//img[contains(@src, "btn_open_save_the_date")]'
28 ).nodes,
29 ],
30 any(.,
31 regex.icontains(.inner_text,
32 '(?:open|save).{0,10}(?:invitation|the date)'
33 )
34 )
35 )
36 )
37 // Legitimate sender will be from punchbowl, negating known non-associated domains.
38 and not sender.email.domain.root_domain in ("punchbowl.com", "punchbowl.news")
39 // Capping length to limit FP's
40 and length(body.current_thread.text) < 1500
41attack_types:
42 - "Credential Phishing"
43tactics_and_techniques:
44 - "Impersonation: Brand"
45 - "Social engineering"
46detection_methods:
47 - "Content analysis"
48 - "Sender analysis"
49id: "58937ba0-6966-559a-bd4f-759ee8b2979e"