Link: Zoho form link from unsolicited sender

This detection rule matches on messages containing at least one link to forms.zohopublic.com from an unsolicited sender. Zoho provides a free plan enabling users to create custom websites and file hosting. This service has been abused by threat actors to host landing pages via forms directing victims to a next stage of credential phishing.

Sublime rule (View on GitHub)

 1name: "Link: Zoho form link from unsolicited sender"
 2description: "This detection rule matches on messages containing at least one link to forms.zohopublic.com from an unsolicited sender. Zoho provides a free plan enabling users to create custom websites and file hosting. This service has been abused by threat actors to host landing pages via forms directing victims to a next stage of credential phishing."
 3type: "rule"
 4severity: "medium"
 5source: |
 6  type.inbound
 7  and (
 8    // filter links to zoho forms
 9    any(filter(body.links,
10               // zoho forms link, zfrmz.com is the short form domain
11               .href_url.domain.domain in ('forms.zohopublic.com', 'zfrmz.com')
12               // remove a common FP for linking directly
13               and not strings.istarts_with(.href_url.path, '/quickbooking/')
14        ),
15        // remove FPs by checking there is only one link
16        // ensure the link is within the current_thread
17        (
18          strings.contains(body.current_thread.text, .display_text)
19          or strings.contains(body.current_thread.text, .href_url.url)
20        )
21        // and ensure that link only occurs once within body.html
22        and (
23          (
24            body.html.raw is not null
25            and (
26              strings.count(body.html.raw, .display_text) == 1
27              or strings.count(body.html.raw, .href_url.url) == 1
28            )
29          )
30          or (
31            // and ensure that link only occurs once within plaintext if html.raw is null
32            body.plain.raw is not null
33            and (
34              strings.count(body.plain.raw, .display_text) == 1
35              or strings.count(body.plain.raw, .href_url.url) == 1
36            )
37          )
38        )
39    )
40    // or the form link is only reachable inside a pdf attachment
41    or any(filter(attachments, .file_type == "pdf"),
42           any(file.explode(.),
43               any(.scan.url.urls,
44                   .domain.domain in ('forms.zohopublic.com', 'zfrmz.com')
45                   and not strings.istarts_with(.path, '/quickbooking/')
46               )
47           )
48    )
49  )
50  
51  // dont match messages with lots of links or long bodies, often marketing messages
52  and length(body.links) < 20
53  and coalesce(length(body.current_thread.text), 0) < 900
54  // not solicited or from malicious/spam user with no FPs
55  and (
56    not profile.by_sender().solicited
57    or (
58      profile.by_sender().any_messages_malicious_or_spam
59      and not profile.by_sender().any_messages_benign
60    )
61  )
62  
63  // not from high trust sender root domains
64  and not (
65    sender.email.domain.root_domain in $high_trust_sender_root_domains
66    and coalesce(headers.auth_summary.dmarc.pass, false)
67  )  
68attack_types:
69  - "Callback Phishing"
70tactics_and_techniques:
71  - "Free file host"
72detection_methods:
73  - "Content analysis"
74  - "URL analysis"
75  - "Sender analysis"
76id: "eb04a9f2-c40b-5fcc-97de-bee7111bc3d8"
to-top