Skip to content

Commit b6cca4a

Browse files
[PR #3441] added rule: Extortion / sextortion (untrusted sender)
1 parent 1026c9e commit b6cca4a

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
name: "Extortion / sextortion (untrusted sender)"
2+
description: |
3+
Detects extortion and sextortion attempts by analyzing the email body text from an untrusted sender.
4+
references:
5+
- "https://krebsonsecurity.com/2018/07/sextortion-scam-uses-recipients-hacked-passwords/"
6+
type: "rule"
7+
severity: "low"
8+
source: |
9+
type.inbound
10+
and length(filter(body.links, .display_text is not null)) < 10
11+
and not (
12+
ml.nlu_classifier(body.current_thread.text).language == "english"
13+
and any(ml.nlu_classifier(body.html.display_text).topics,
14+
.name in (
15+
"News and Current Events",
16+
"Newsletters and Digests",
17+
"Advertising and Promotions"
18+
)
19+
and .confidence in ("high", "medium")
20+
)
21+
)
22+
and (
23+
(
24+
any(ml.nlu_classifier(strings.replace_confusables(body.current_thread.text)).intents,
25+
(.name == "extortion" and .confidence != "low")
26+
)
27+
and (
28+
any(ml.nlu_classifier(strings.replace_confusables(body.current_thread.text
29+
)
30+
).entities,
31+
.name == "financial"
32+
or (
33+
.name is not null
34+
and regex.icontains(.text,
35+
"cybḛ[rŗřṙȑȓɍʀɼɽг]c[rŗřṙȑȓɍʀɼɽг]imina[lĺļľḷḹḽłƖʟḻ]s"
36+
)
37+
)
38+
)
39+
or any(ml.nlu_classifier(strings.replace_confusables(body.current_thread.text
40+
)
41+
).topics,
42+
.name == "Financial Communications" and .confidence != "low"
43+
)
44+
)
45+
)
46+
// manual indicators failsafe
47+
or 3 of (
48+
// malware terms
49+
regex.icontains(strings.replace_confusables(body.current_thread.text),
50+
"(?:(?:spy|[mṁ][aȁ]l)[wŵ][aȁ][rŗ]e|[tŢ][rŗȓ][oố]j[aǻ][nņ]|[rȓ]emote (?:entry|cont[rř]o[lĺ])|infiltrat(?:ed|ion)|backdoor|vi[rṙ]us|intruder|(?:your|the).{0,15}(?:device|system|computer|phone).{0,10}(?:became|was|got|is).{0,5}comprom[ḯiïíįī]sed|prov[ḯiïíįī]d[ḯiïíįī]ng.{0,20}full [aảǡą]ccess)"
51+
),
52+
// actions recorded
53+
regex.icontains(strings.replace_confusables(body.current_thread.text),
54+
"(?:p[oộ][rŗ]n|a[dȡ]ult (?:web)?site|webcam|mastu[rŗ]bating|je[rŗ]king off|pleasu[rŗȑ]i[nŋ]g you[rŗṛ]self|getting off|expli[cƈ]it|cl[ḯiïíįī]ps.{0,20}screenshots)"
55+
),
56+
regex.icontains(strings.replace_confusables(body.current_thread.text),
57+
"(?:pe[rŗ]ve[rŗ]t|pe[rŗ]ve[rŗ]sion|mastu[rŗ]bat)"
58+
),
59+
// a timeframe to pay
60+
regex.icontains(strings.replace_confusables(body.current_thread.text),
61+
'[ilo0-9]{2} (?:hou[rŗṝ][sṣ]|uu[rŗ])',
62+
'(?:one|tw[oờ]|2|th[rŗ]ee|\d) [dḍ][aảǡą]y[sṣ]?'
63+
),
64+
// a promise from the actor
65+
regex.icontains(strings.replace_confusables(body.current_thread.text),
66+
'(?:pe[rŗ]manently|will|I''ll) delete|([rŗ]emove|destroy) (?:[\p{L}\p{M}\p{N}]+\s*){0,4} (?:data|ev[ḯiïįīí]dence|v[ḯiïíįī]deos?)'
67+
),
68+
// a threat from the actor
69+
regex.icontains(strings.replace_confusables(body.current_thread.text),
70+
'(?:\bsen[dt]|forward|expose)\s*(?:[\p{L}\p{N}]+\s*){0,5}\s*to\s*(?:[\p{L}\p{N}]+\s*){0,5}(?:contacts|media|family|f[rŗ]iends|coworkers|associates)'
71+
),
72+
// bitcoin language (excluding newsletters)
73+
(
74+
regex.icontains(strings.replace_confusables(body.current_thread.text),
75+
'[bḆḂ]it[cĉƈ][oöة]+in|\bbtc\b|blockchain'
76+
)
77+
// negate cryptocurrency newsletters
78+
and not (
79+
any(body.links,
80+
strings.icontains(.display_text, "unsubscribe")
81+
and (
82+
strings.icontains(.href_url.path, "unsubscribe")
83+
// handle mimecast URL rewrites
84+
or (
85+
.href_url.domain.root_domain == 'mimecastprotect.com'
86+
and strings.icontains(.href_url.query_params,
87+
sender.email.domain.root_domain
88+
)
89+
)
90+
)
91+
)
92+
)
93+
),
94+
(
95+
regex.icontains(strings.replace_confusables(body.current_thread.text),
96+
'(?:contact the police|(?:bitcoin|\bbtc\b).{0,20}wallet)'
97+
)
98+
and regex.icontains(strings.replace_confusables(body.current_thread.text),
99+
'(?:\b[13][a-km-zA-HJ-NP-Z0-9]{24,34}\b)|\bX[1-9A-HJ-NP-Za-km-z]{33}\b|\b(?:0x[a-fA-F0-9]{40})\b|\b[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}\b|\b[48][0-9AB][1-9A-HJ-NP-Za-km-z]{93}\b'
100+
)
101+
),
102+
regex.icontains(strings.replace_confusables(body.current_thread.text),
103+
'bc1q.{0,50}\b'
104+
)
105+
)
106+
)
107+
and (
108+
not profile.by_sender().solicited
109+
or (
110+
profile.by_sender().any_messages_malicious_or_spam
111+
and not profile.by_sender().any_messages_benign
112+
)
113+
or any(headers.hops, any(.fields, .name == "X-Google-Group-Id"))
114+
115+
// many extortion emails spoof sender domains and fail sender authentication
116+
or (
117+
not headers.auth_summary.dmarc.pass
118+
or headers.auth_summary.dmarc.pass is null
119+
or not headers.auth_summary.spf.pass
120+
)
121+
)
122+
123+
// negate benign newsletters that mention cyber extortion
124+
and not (
125+
any(body.links,
126+
strings.icontains(.display_text, "unsubscribe")
127+
and strings.icontains(.href_url.path, "unsubscribe")
128+
)
129+
// newsletters are typically longer than the average extortion script
130+
and length(body.current_thread.text) > 2000
131+
)
132+
and length(body.current_thread.text) < 8000
133+
// negate highly trusted sender domains unless they fail DMARC authentication
134+
and (
135+
(
136+
sender.email.domain.root_domain in $high_trust_sender_root_domains
137+
and not headers.auth_summary.dmarc.pass
138+
)
139+
or sender.email.domain.root_domain not in $high_trust_sender_root_domains
140+
)
141+
142+
attack_types:
143+
- "Extortion"
144+
tactics_and_techniques:
145+
- "Social engineering"
146+
- "Spoofing"
147+
detection_methods:
148+
- "Content analysis"
149+
- "Header analysis"
150+
- "Natural Language Understanding"
151+
- "Sender analysis"
152+
id: "f96a8612-c76d-52b3-8d40-af91a82b83d5"
153+
og_id: "265913eb-2ccd-5f77-9a09-f6d8539fd2f6"
154+
testing_pr: 3441
155+
testing_sha: be00577766620181880493edc8559726bcd4db15

0 commit comments

Comments
 (0)