Brand impersonation: Paperless Post

Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication.

Sublime rule (View on GitHub)

 1name: "Brand impersonation: Paperless Post"
 2description: "Detects messages containing multiple images hosted on ppassets.com (Paperless Post's asset domain) but with fewer than 3 legitimate Paperless Post links, while excluding authentic forwards/replies and messages from verified Paperless Post domains with valid DMARC authentication."
 3type: "rule"
 4severity: "high"
 5source: |
 6  type.inbound
 7  and (
 8    (
 9      strings.contains(body.html.raw, 'ppassets.com')
10      and length(filter(html.xpath(body.html, '//img/@src').nodes,
11                        // calling parse_url allows url decoding to help us
12                        strings.parse_url(.raw).domain.root_domain == 'ppassets.com'
13                 )
14      ) >= 1
15      and (
16        length(filter(body.links,
17                      .href_url.domain.domain == "links.paperlesspost.com"
18                      or (
19                        .href_url.domain.root_domain == "paperlesspost.com"
20                        and strings.istarts_with(.href_url.path, '/go/')
21                      )
22               )
23        ) < 2
24        or any(body.links,
25               regex.icontains(.display_text, '(?:view the card|view and reply)')
26               and .href_url.domain.root_domain != "paperlesspost.com"
27        )
28      )
29    )
30    or any(body.links,
31           regex.icontains(.href_url.domain.domain,
32                           'paperless[-_]?(?:post|invit)'
33           )
34           and .href_url.domain.root_domain != "paperlesspost.com"
35    )
36  )
37  and not (
38    (subject.is_forward or subject.is_reply)
39    and (
40      (length(headers.references) != 0 or headers.in_reply_to is not null)
41      or length(body.previous_threads) > 0
42    )
43  )
44  and not (
45    (
46      sender.email.domain.root_domain == "paperlesspost.com"
47      or sender.email.domain.domain == 'paperlesspost.zendesk.com'
48    )
49    and headers.auth_summary.dmarc.pass
50  )  
51attack_types:
52  - "Credential Phishing"
53  - "Malware/Ransomware"
54tactics_and_techniques:
55  - "Impersonation: Brand"
56detection_methods:
57  - "Content analysis"
58  - "Header analysis"
59  - "HTML analysis"
60  - "Sender analysis"
61  - "URL analysis"
62id: "e9ec5e09-e50f-5d02-ad14-35a1a1442960"
to-top