dns-security-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +723 -0
- package/dist/blocklist/index.d.ts +3 -0
- package/dist/blocklist/index.d.ts.map +1 -0
- package/dist/blocklist/index.js +596 -0
- package/dist/blocklist/index.js.map +1 -0
- package/dist/ct/index.d.ts +3 -0
- package/dist/ct/index.d.ts.map +1 -0
- package/dist/ct/index.js +534 -0
- package/dist/ct/index.js.map +1 -0
- package/dist/data/dkim-selectors.d.ts +2 -0
- package/dist/data/dkim-selectors.d.ts.map +1 -0
- package/dist/data/dkim-selectors.js +60 -0
- package/dist/data/dkim-selectors.js.map +1 -0
- package/dist/data/dnsbl-lists.d.ts +8 -0
- package/dist/data/dnsbl-lists.d.ts.map +1 -0
- package/dist/data/dnsbl-lists.js +54 -0
- package/dist/data/dnsbl-lists.js.map +1 -0
- package/dist/data/takeover-fingerprints.d.ts +8 -0
- package/dist/data/takeover-fingerprints.d.ts.map +1 -0
- package/dist/data/takeover-fingerprints.js +84 -0
- package/dist/data/takeover-fingerprints.js.map +1 -0
- package/dist/data/tunneling-signatures.d.ts +17 -0
- package/dist/data/tunneling-signatures.d.ts.map +1 -0
- package/dist/data/tunneling-signatures.js +85 -0
- package/dist/data/tunneling-signatures.js.map +1 -0
- package/dist/dns/index.d.ts +3 -0
- package/dist/dns/index.d.ts.map +1 -0
- package/dist/dns/index.js +1211 -0
- package/dist/dns/index.js.map +1 -0
- package/dist/dnssec/index.d.ts +3 -0
- package/dist/dnssec/index.d.ts.map +1 -0
- package/dist/dnssec/index.js +1377 -0
- package/dist/dnssec/index.js.map +1 -0
- package/dist/domain/index.d.ts +3 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +938 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/email/index.d.ts +3 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +1188 -0
- package/dist/email/index.js.map +1 -0
- package/dist/hijack/index.d.ts +3 -0
- package/dist/hijack/index.d.ts.map +1 -0
- package/dist/hijack/index.js +1117 -0
- package/dist/hijack/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/index.d.ts +3 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +797 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/privacy/index.d.ts +3 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +772 -0
- package/dist/privacy/index.js.map +1 -0
- package/dist/protocol/mcp-server.d.ts +4 -0
- package/dist/protocol/mcp-server.d.ts.map +1 -0
- package/dist/protocol/mcp-server.js +32 -0
- package/dist/protocol/mcp-server.js.map +1 -0
- package/dist/protocol/tools.d.ts +3 -0
- package/dist/protocol/tools.d.ts.map +1 -0
- package/dist/protocol/tools.js +29 -0
- package/dist/protocol/tools.js.map +1 -0
- package/dist/report/index.d.ts +3 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +1167 -0
- package/dist/report/index.js.map +1 -0
- package/dist/threat/index.d.ts +3 -0
- package/dist/threat/index.d.ts.map +1 -0
- package/dist/threat/index.js +999 -0
- package/dist/threat/index.js.map +1 -0
- package/dist/tunnel/index.d.ts +3 -0
- package/dist/tunnel/index.d.ts.map +1 -0
- package/dist/tunnel/index.js +688 -0
- package/dist/tunnel/index.js.map +1 -0
- package/dist/types/index.d.ts +52 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/typo/index.d.ts +3 -0
- package/dist/typo/index.d.ts.map +1 -0
- package/dist/typo/index.js +625 -0
- package/dist/typo/index.js.map +1 -0
- package/dist/utils/cache.d.ts +11 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +35 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/dns-client.d.ts +37 -0
- package/dist/utils/dns-client.d.ts.map +1 -0
- package/dist/utils/dns-client.js +359 -0
- package/dist/utils/dns-client.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +10 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +35 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blocklist/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA+oBjD,eAAO,MAAM,cAAc,EAAE,OAAO,EAOnC,CAAC"}
|
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { json } from "../types/index.js";
|
|
3
|
+
import { reverseIp, createResolver, resolveAll, shannonEntropy } from "../utils/dns-client.js";
|
|
4
|
+
import { DNSBL_LISTS } from "../data/dnsbl-lists.js";
|
|
5
|
+
async function queryDnsbl(query, listName, listDomain, category, resolver) {
|
|
6
|
+
try {
|
|
7
|
+
const addresses = await resolver.resolve4(query);
|
|
8
|
+
let reason;
|
|
9
|
+
try {
|
|
10
|
+
const txtRecords = await resolver.resolveTxt(query);
|
|
11
|
+
reason = txtRecords.map((r) => r.join("")).join("; ");
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// TXT record not available
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
list: listName,
|
|
18
|
+
domain: listDomain,
|
|
19
|
+
category,
|
|
20
|
+
listed: true,
|
|
21
|
+
returnCode: addresses[0] ?? undefined,
|
|
22
|
+
reason,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// NXDOMAIN or SERVFAIL means NOT listed
|
|
27
|
+
return {
|
|
28
|
+
list: listName,
|
|
29
|
+
domain: listDomain,
|
|
30
|
+
category,
|
|
31
|
+
listed: false,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function fetchRdapDomainAge(domain) {
|
|
36
|
+
try {
|
|
37
|
+
const res = await fetch(`https://rdap.org/domain/${encodeURIComponent(domain)}`, {
|
|
38
|
+
signal: AbortSignal.timeout(5000),
|
|
39
|
+
headers: { Accept: "application/rdap+json" },
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok)
|
|
42
|
+
return null;
|
|
43
|
+
const data = (await res.json());
|
|
44
|
+
const events = data.events;
|
|
45
|
+
if (!events)
|
|
46
|
+
return null;
|
|
47
|
+
const regEvent = events.find((e) => e.eventAction === "registration");
|
|
48
|
+
if (!regEvent)
|
|
49
|
+
return null;
|
|
50
|
+
const regDate = new Date(regEvent.eventDate);
|
|
51
|
+
const now = new Date();
|
|
52
|
+
const ageDays = Math.floor((now.getTime() - regDate.getTime()) / (1000 * 60 * 60 * 24));
|
|
53
|
+
return { age_days: ageDays, registration_date: regEvent.eventDate };
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function sleep(ms) {
|
|
60
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
61
|
+
}
|
|
62
|
+
function getSubnet16(ip) {
|
|
63
|
+
const parts = ip.split(".");
|
|
64
|
+
return `${parts[0]}.${parts[1]}`;
|
|
65
|
+
}
|
|
66
|
+
// ─── Tool 1: bl_check_dnsbl ───
|
|
67
|
+
const blCheckDnsbl = {
|
|
68
|
+
name: "bl_check_dnsbl",
|
|
69
|
+
description: "Check an IP address against multiple DNS-based blocklists (DNSBL/RBL). Reverses the IP and queries each blocklist in parallel. Returns per-list result with listing status and reason.",
|
|
70
|
+
schema: {
|
|
71
|
+
ip: z.string().describe("IPv4 address to check against blocklists (e.g. '192.168.1.1')"),
|
|
72
|
+
lists: z
|
|
73
|
+
.array(z.string())
|
|
74
|
+
.optional()
|
|
75
|
+
.describe("Specific DNSBL list domains to check. If omitted, checks all known IP-based blocklists."),
|
|
76
|
+
},
|
|
77
|
+
async execute(args) {
|
|
78
|
+
const ip = args.ip;
|
|
79
|
+
const customLists = args.lists;
|
|
80
|
+
const resolver = createResolver();
|
|
81
|
+
const reversedIp = reverseIp(ip);
|
|
82
|
+
// Filter to IP-type lists, optionally filtered by custom list
|
|
83
|
+
let listsToCheck = DNSBL_LISTS.filter((l) => l.type === "ip");
|
|
84
|
+
if (customLists && customLists.length > 0) {
|
|
85
|
+
listsToCheck = listsToCheck.filter((l) => customLists.includes(l.domain));
|
|
86
|
+
// Also add any custom domains not in our built-in list
|
|
87
|
+
for (const customDomain of customLists) {
|
|
88
|
+
if (!listsToCheck.find((l) => l.domain === customDomain)) {
|
|
89
|
+
listsToCheck.push({ name: customDomain, domain: customDomain, type: "ip", category: "custom" });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const tasks = listsToCheck.map((list) => {
|
|
94
|
+
const query = `${reversedIp}.${list.domain}`;
|
|
95
|
+
return queryDnsbl(query, list.name, list.domain, list.category, resolver);
|
|
96
|
+
});
|
|
97
|
+
const results = await Promise.all(tasks);
|
|
98
|
+
const listed = results.filter((r) => r.listed);
|
|
99
|
+
return json({
|
|
100
|
+
ip,
|
|
101
|
+
reversed_ip: reversedIp,
|
|
102
|
+
total_lists_checked: results.length,
|
|
103
|
+
listed_count: listed.length,
|
|
104
|
+
listed_on: listed,
|
|
105
|
+
all_results: results,
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
// ─── Tool 2: bl_check_surbl ───
|
|
110
|
+
const blCheckSurbl = {
|
|
111
|
+
name: "bl_check_surbl",
|
|
112
|
+
description: "Check a domain against domain-based blocklists (SURBL, Spamhaus DBL, URIBL, etc.). Returns listed/not listed per list with category.",
|
|
113
|
+
schema: {
|
|
114
|
+
domain: z.string().describe("Domain to check against domain-based blocklists (e.g. 'example.com')"),
|
|
115
|
+
},
|
|
116
|
+
async execute(args) {
|
|
117
|
+
const domain = args.domain.toLowerCase().trim();
|
|
118
|
+
const resolver = createResolver();
|
|
119
|
+
const domainLists = DNSBL_LISTS.filter((l) => l.type === "domain");
|
|
120
|
+
const tasks = domainLists.map((list) => {
|
|
121
|
+
const query = `${domain}.${list.domain}`;
|
|
122
|
+
return queryDnsbl(query, list.name, list.domain, list.category, resolver);
|
|
123
|
+
});
|
|
124
|
+
const results = await Promise.all(tasks);
|
|
125
|
+
const listed = results.filter((r) => r.listed);
|
|
126
|
+
return json({
|
|
127
|
+
domain,
|
|
128
|
+
total_lists_checked: results.length,
|
|
129
|
+
listed_count: listed.length,
|
|
130
|
+
listed_on: listed,
|
|
131
|
+
all_results: results,
|
|
132
|
+
});
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
// ─── Tool 3: bl_check_phishing ───
|
|
136
|
+
const blCheckPhishing = {
|
|
137
|
+
name: "bl_check_phishing",
|
|
138
|
+
description: "Check a domain for phishing indicators by querying Spamhaus DBL, SURBL phishing list, and checking domain age via RDAP. Returns phishing indicators and confidence level (0-100).",
|
|
139
|
+
schema: {
|
|
140
|
+
domain: z.string().describe("Domain to check for phishing indicators (e.g. 'suspicious-login-page.com')"),
|
|
141
|
+
},
|
|
142
|
+
async execute(args) {
|
|
143
|
+
const domain = args.domain.toLowerCase().trim();
|
|
144
|
+
const resolver = createResolver();
|
|
145
|
+
const indicators = [];
|
|
146
|
+
let confidence = 0;
|
|
147
|
+
// Check Spamhaus DBL
|
|
148
|
+
try {
|
|
149
|
+
const dblQuery = `${domain}.dbl.spamhaus.org`;
|
|
150
|
+
const addresses = await resolver.resolve4(dblQuery);
|
|
151
|
+
if (addresses.length > 0) {
|
|
152
|
+
indicators.push({ source: "Spamhaus DBL", detail: `Listed: ${addresses[0]}`, weight: 30 });
|
|
153
|
+
confidence += 30;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Not listed
|
|
158
|
+
}
|
|
159
|
+
// Check SURBL Phishing
|
|
160
|
+
try {
|
|
161
|
+
const surblQuery = `${domain}.phishing.surbl.org`;
|
|
162
|
+
const addresses = await resolver.resolve4(surblQuery);
|
|
163
|
+
if (addresses.length > 0) {
|
|
164
|
+
indicators.push({ source: "SURBL Phishing", detail: `Listed: ${addresses[0]}`, weight: 35 });
|
|
165
|
+
confidence += 35;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// Not listed
|
|
170
|
+
}
|
|
171
|
+
// Check SURBL Multi
|
|
172
|
+
try {
|
|
173
|
+
const surblMultiQuery = `${domain}.multi.surbl.org`;
|
|
174
|
+
const addresses = await resolver.resolve4(surblMultiQuery);
|
|
175
|
+
if (addresses.length > 0) {
|
|
176
|
+
indicators.push({ source: "SURBL Multi", detail: `Listed: ${addresses[0]}`, weight: 15 });
|
|
177
|
+
confidence += 15;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Not listed
|
|
182
|
+
}
|
|
183
|
+
// Check domain age via RDAP
|
|
184
|
+
const ageInfo = await fetchRdapDomainAge(domain);
|
|
185
|
+
if (ageInfo) {
|
|
186
|
+
if (ageInfo.age_days < 30) {
|
|
187
|
+
indicators.push({
|
|
188
|
+
source: "Domain Age",
|
|
189
|
+
detail: `Registered ${ageInfo.age_days} days ago (${ageInfo.registration_date})`,
|
|
190
|
+
weight: 20,
|
|
191
|
+
});
|
|
192
|
+
confidence += 20;
|
|
193
|
+
}
|
|
194
|
+
else if (ageInfo.age_days < 90) {
|
|
195
|
+
indicators.push({
|
|
196
|
+
source: "Domain Age",
|
|
197
|
+
detail: `Registered ${ageInfo.age_days} days ago (${ageInfo.registration_date})`,
|
|
198
|
+
weight: 10,
|
|
199
|
+
});
|
|
200
|
+
confidence += 10;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
indicators.push({
|
|
205
|
+
source: "Domain Age",
|
|
206
|
+
detail: "Could not determine domain age via RDAP",
|
|
207
|
+
weight: 0,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Check Shannon entropy of domain name (high entropy = suspicious)
|
|
211
|
+
const namePart = domain.split(".")[0];
|
|
212
|
+
const entropy = shannonEntropy(namePart);
|
|
213
|
+
if (entropy > 3.5) {
|
|
214
|
+
indicators.push({
|
|
215
|
+
source: "Entropy Analysis",
|
|
216
|
+
detail: `High entropy: ${entropy.toFixed(2)} (threshold: 3.5)`,
|
|
217
|
+
weight: 10,
|
|
218
|
+
});
|
|
219
|
+
confidence += 10;
|
|
220
|
+
}
|
|
221
|
+
// Cap confidence at 100
|
|
222
|
+
confidence = Math.min(confidence, 100);
|
|
223
|
+
let verdict;
|
|
224
|
+
if (confidence >= 70)
|
|
225
|
+
verdict = "high_risk";
|
|
226
|
+
else if (confidence >= 40)
|
|
227
|
+
verdict = "suspicious";
|
|
228
|
+
else if (confidence >= 15)
|
|
229
|
+
verdict = "low_risk";
|
|
230
|
+
else
|
|
231
|
+
verdict = "clean";
|
|
232
|
+
return json({
|
|
233
|
+
domain,
|
|
234
|
+
phishing_confidence: confidence,
|
|
235
|
+
verdict,
|
|
236
|
+
indicators,
|
|
237
|
+
domain_age: ageInfo ?? null,
|
|
238
|
+
});
|
|
239
|
+
},
|
|
240
|
+
};
|
|
241
|
+
// ─── Tool 4: bl_check_malware ───
|
|
242
|
+
const blCheckMalware = {
|
|
243
|
+
name: "bl_check_malware",
|
|
244
|
+
description: "Check a domain against malware-specific blocklists: abuse.ch URLhaus, Spamhaus DBL, SURBL malware category. Returns whether malware association was found and the source.",
|
|
245
|
+
schema: {
|
|
246
|
+
domain: z.string().describe("Domain to check for malware associations (e.g. 'malware-host.com')"),
|
|
247
|
+
},
|
|
248
|
+
async execute(args) {
|
|
249
|
+
const domain = args.domain.toLowerCase().trim();
|
|
250
|
+
const resolver = createResolver();
|
|
251
|
+
const malwareLists = [
|
|
252
|
+
{ name: "abuse.ch URLhaus", query: `${domain}.urlhaus.abuse.ch` },
|
|
253
|
+
{ name: "Spamhaus DBL", query: `${domain}.dbl.spamhaus.org` },
|
|
254
|
+
{ name: "SURBL Malware", query: `${domain}.malware.surbl.org` },
|
|
255
|
+
{ name: "SURBL Cracked", query: `${domain}.cr.surbl.org` },
|
|
256
|
+
];
|
|
257
|
+
const results = [];
|
|
258
|
+
const tasks = malwareLists.map(async (list) => {
|
|
259
|
+
try {
|
|
260
|
+
const addresses = await resolver.resolve4(list.query);
|
|
261
|
+
let reason;
|
|
262
|
+
try {
|
|
263
|
+
const txtRecords = await resolver.resolveTxt(list.query);
|
|
264
|
+
reason = txtRecords.map((r) => r.join("")).join("; ");
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// No TXT record
|
|
268
|
+
}
|
|
269
|
+
results.push({
|
|
270
|
+
source: list.name,
|
|
271
|
+
listed: true,
|
|
272
|
+
returnCode: addresses[0],
|
|
273
|
+
reason,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
results.push({ source: list.name, listed: false });
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
await Promise.all(tasks);
|
|
281
|
+
const listed = results.filter((r) => r.listed);
|
|
282
|
+
const malwareFound = listed.length > 0;
|
|
283
|
+
return json({
|
|
284
|
+
domain,
|
|
285
|
+
malware_associated: malwareFound,
|
|
286
|
+
sources_flagged: listed.length,
|
|
287
|
+
total_sources_checked: results.length,
|
|
288
|
+
flagged_sources: listed,
|
|
289
|
+
all_results: results,
|
|
290
|
+
});
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
// ─── Tool 5: bl_fast_flux_detect ───
|
|
294
|
+
const blFastFluxDetect = {
|
|
295
|
+
name: "bl_fast_flux_detect",
|
|
296
|
+
description: "Detect fast-flux DNS behavior by resolving a domain multiple times with intervals. Fast-flux indicators: rapidly changing IPs, very low TTL (<300), multiple IPs per query, IPs in different /16 subnets. Returns flux score 0-100.",
|
|
297
|
+
schema: {
|
|
298
|
+
domain: z.string().describe("Domain to check for fast-flux behavior (e.g. 'suspicious-domain.com')"),
|
|
299
|
+
samples: z
|
|
300
|
+
.number()
|
|
301
|
+
.optional()
|
|
302
|
+
.describe("Number of DNS resolution samples to take (default: 5)"),
|
|
303
|
+
interval_ms: z
|
|
304
|
+
.number()
|
|
305
|
+
.optional()
|
|
306
|
+
.describe("Interval between DNS samples in milliseconds (default: 2000)"),
|
|
307
|
+
},
|
|
308
|
+
async execute(args) {
|
|
309
|
+
const domain = args.domain.toLowerCase().trim();
|
|
310
|
+
const samples = args.samples ?? 5;
|
|
311
|
+
const intervalMs = args.interval_ms ?? 2000;
|
|
312
|
+
const resolver = createResolver();
|
|
313
|
+
const sampleResults = [];
|
|
314
|
+
for (let i = 0; i < samples; i++) {
|
|
315
|
+
try {
|
|
316
|
+
const records = await resolver.resolve4(domain, { ttl: true });
|
|
317
|
+
sampleResults.push({
|
|
318
|
+
sample: i + 1,
|
|
319
|
+
ips: records.map((r) => r.address),
|
|
320
|
+
ttls: records.map((r) => r.ttl),
|
|
321
|
+
timestamp: new Date().toISOString(),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
sampleResults.push({
|
|
326
|
+
sample: i + 1,
|
|
327
|
+
ips: [],
|
|
328
|
+
ttls: [],
|
|
329
|
+
timestamp: new Date().toISOString(),
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
if (i < samples - 1) {
|
|
333
|
+
await sleep(intervalMs);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Analyze results
|
|
337
|
+
const allIps = new Set();
|
|
338
|
+
const allTtls = [];
|
|
339
|
+
const ipChanges = [];
|
|
340
|
+
let prevIpSet = new Set();
|
|
341
|
+
for (const sample of sampleResults) {
|
|
342
|
+
for (const ip of sample.ips)
|
|
343
|
+
allIps.add(ip);
|
|
344
|
+
allTtls.push(...sample.ttls);
|
|
345
|
+
const currentIpSet = new Set(sample.ips);
|
|
346
|
+
if (prevIpSet.size > 0) {
|
|
347
|
+
// Count IPs that changed
|
|
348
|
+
let changed = 0;
|
|
349
|
+
for (const ip of currentIpSet) {
|
|
350
|
+
if (!prevIpSet.has(ip))
|
|
351
|
+
changed++;
|
|
352
|
+
}
|
|
353
|
+
for (const ip of prevIpSet) {
|
|
354
|
+
if (!currentIpSet.has(ip))
|
|
355
|
+
changed++;
|
|
356
|
+
}
|
|
357
|
+
ipChanges.push(changed);
|
|
358
|
+
}
|
|
359
|
+
prevIpSet = currentIpSet;
|
|
360
|
+
}
|
|
361
|
+
const uniqueIpCount = allIps.size;
|
|
362
|
+
const avgTtl = allTtls.length > 0 ? allTtls.reduce((a, b) => a + b, 0) / allTtls.length : 0;
|
|
363
|
+
const minTtl = allTtls.length > 0 ? Math.min(...allTtls) : 0;
|
|
364
|
+
const totalIpChanges = ipChanges.reduce((a, b) => a + b, 0);
|
|
365
|
+
// Count unique /16 subnets
|
|
366
|
+
const subnets = new Set();
|
|
367
|
+
for (const ip of allIps)
|
|
368
|
+
subnets.add(getSubnet16(ip));
|
|
369
|
+
const uniqueSubnets = subnets.size;
|
|
370
|
+
// Average IPs per query
|
|
371
|
+
const validSamples = sampleResults.filter((s) => s.ips.length > 0);
|
|
372
|
+
const avgIpsPerQuery = validSamples.length > 0
|
|
373
|
+
? validSamples.reduce((a, s) => a + s.ips.length, 0) / validSamples.length
|
|
374
|
+
: 0;
|
|
375
|
+
// Calculate flux score (0-100)
|
|
376
|
+
let fluxScore = 0;
|
|
377
|
+
// IP change rate (max 30 points)
|
|
378
|
+
if (samples > 1) {
|
|
379
|
+
const changeRate = totalIpChanges / (samples - 1);
|
|
380
|
+
fluxScore += Math.min(changeRate * 10, 30);
|
|
381
|
+
}
|
|
382
|
+
// Low TTL (max 25 points)
|
|
383
|
+
if (minTtl > 0 && minTtl < 300) {
|
|
384
|
+
fluxScore += Math.min(25, Math.round((300 - minTtl) / 12));
|
|
385
|
+
}
|
|
386
|
+
// Multiple unique IPs (max 25 points)
|
|
387
|
+
if (uniqueIpCount > 1) {
|
|
388
|
+
fluxScore += Math.min((uniqueIpCount - 1) * 5, 25);
|
|
389
|
+
}
|
|
390
|
+
// Multiple /16 subnets (max 20 points)
|
|
391
|
+
if (uniqueSubnets > 1) {
|
|
392
|
+
fluxScore += Math.min((uniqueSubnets - 1) * 10, 20);
|
|
393
|
+
}
|
|
394
|
+
fluxScore = Math.min(Math.round(fluxScore), 100);
|
|
395
|
+
let verdict;
|
|
396
|
+
if (fluxScore >= 70)
|
|
397
|
+
verdict = "fast_flux_detected";
|
|
398
|
+
else if (fluxScore >= 40)
|
|
399
|
+
verdict = "suspicious_flux";
|
|
400
|
+
else if (fluxScore >= 15)
|
|
401
|
+
verdict = "minor_variation";
|
|
402
|
+
else
|
|
403
|
+
verdict = "stable";
|
|
404
|
+
return json({
|
|
405
|
+
domain,
|
|
406
|
+
flux_score: fluxScore,
|
|
407
|
+
verdict,
|
|
408
|
+
analysis: {
|
|
409
|
+
total_samples: samples,
|
|
410
|
+
successful_samples: validSamples.length,
|
|
411
|
+
unique_ips: uniqueIpCount,
|
|
412
|
+
unique_subnets: uniqueSubnets,
|
|
413
|
+
total_ip_changes: totalIpChanges,
|
|
414
|
+
avg_ips_per_query: Math.round(avgIpsPerQuery * 100) / 100,
|
|
415
|
+
min_ttl: minTtl,
|
|
416
|
+
avg_ttl: Math.round(avgTtl),
|
|
417
|
+
all_ips: [...allIps],
|
|
418
|
+
all_subnets: [...subnets],
|
|
419
|
+
},
|
|
420
|
+
samples: sampleResults,
|
|
421
|
+
});
|
|
422
|
+
},
|
|
423
|
+
};
|
|
424
|
+
// ─── Tool 6: bl_domain_score ───
|
|
425
|
+
const blDomainScore = {
|
|
426
|
+
name: "bl_domain_score",
|
|
427
|
+
description: "Calculate an aggregated domain risk score (0-100) from multiple sources: DNSBL listings, domain age, DNSSEC presence, SPF/DMARC configuration. Returns score, contributing factors, and verdict.",
|
|
428
|
+
schema: {
|
|
429
|
+
domain: z.string().describe("Domain to calculate risk score for (e.g. 'example.com')"),
|
|
430
|
+
},
|
|
431
|
+
async execute(args) {
|
|
432
|
+
const domain = args.domain.toLowerCase().trim();
|
|
433
|
+
const resolver = createResolver();
|
|
434
|
+
let score = 0;
|
|
435
|
+
const factors = [];
|
|
436
|
+
// 1. Check domain-based DNSBLs (max 60 points, +20 per listing, capped at 3)
|
|
437
|
+
const domainLists = DNSBL_LISTS.filter((l) => l.type === "domain");
|
|
438
|
+
let dnsblListings = 0;
|
|
439
|
+
const dnsblTasks = domainLists.map(async (list) => {
|
|
440
|
+
try {
|
|
441
|
+
await resolver.resolve4(`${domain}.${list.domain}`);
|
|
442
|
+
return { listed: true, name: list.name };
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return { listed: false, name: list.name };
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
const dnsblResults = await Promise.all(dnsblTasks);
|
|
449
|
+
const listedOn = [];
|
|
450
|
+
for (const result of dnsblResults) {
|
|
451
|
+
if (result.listed) {
|
|
452
|
+
dnsblListings++;
|
|
453
|
+
listedOn.push(result.name);
|
|
454
|
+
if (dnsblListings <= 3) {
|
|
455
|
+
const points = 20;
|
|
456
|
+
score += points;
|
|
457
|
+
factors.push({
|
|
458
|
+
factor: "DNSBL Listing",
|
|
459
|
+
detail: `Listed on ${result.name}`,
|
|
460
|
+
points,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// 2. Check domain age via RDAP (+15 if < 30 days)
|
|
466
|
+
const ageInfo = await fetchRdapDomainAge(domain);
|
|
467
|
+
if (ageInfo && ageInfo.age_days < 30) {
|
|
468
|
+
const points = 15;
|
|
469
|
+
score += points;
|
|
470
|
+
factors.push({
|
|
471
|
+
factor: "Domain Age",
|
|
472
|
+
detail: `Domain is ${ageInfo.age_days} days old (registered ${ageInfo.registration_date})`,
|
|
473
|
+
points,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
// 3. Check DNSSEC (+5 if missing)
|
|
477
|
+
let hasDnssec = false;
|
|
478
|
+
try {
|
|
479
|
+
// Query DNSKEY for the domain — if present, DNSSEC is configured
|
|
480
|
+
const records = await resolveAll(domain, ["DNSKEY"], undefined);
|
|
481
|
+
if (records && records.length > 0) {
|
|
482
|
+
hasDnssec = true;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
// No DNSSEC
|
|
487
|
+
}
|
|
488
|
+
// Fallback: check via DoH for DS record
|
|
489
|
+
if (!hasDnssec) {
|
|
490
|
+
try {
|
|
491
|
+
const dohRes = await fetch(`https://cloudflare-dns.com/dns-query?name=${encodeURIComponent(domain)}&type=DS`, { headers: { Accept: "application/dns-json" }, signal: AbortSignal.timeout(5000) });
|
|
492
|
+
if (dohRes.ok) {
|
|
493
|
+
const dohData = (await dohRes.json());
|
|
494
|
+
if (dohData.Answer && dohData.Answer.length > 0) {
|
|
495
|
+
hasDnssec = true;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
// Unable to check
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
if (!hasDnssec) {
|
|
504
|
+
const points = 5;
|
|
505
|
+
score += points;
|
|
506
|
+
factors.push({
|
|
507
|
+
factor: "No DNSSEC",
|
|
508
|
+
detail: "Domain does not have DNSSEC configured",
|
|
509
|
+
points,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
// 4. Check SPF (+10 if missing)
|
|
513
|
+
let hasSpf = false;
|
|
514
|
+
try {
|
|
515
|
+
const txtRecords = await resolver.resolveTxt(domain);
|
|
516
|
+
for (const record of txtRecords) {
|
|
517
|
+
const txt = record.join("");
|
|
518
|
+
if (txt.startsWith("v=spf1")) {
|
|
519
|
+
hasSpf = true;
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
// No TXT records
|
|
526
|
+
}
|
|
527
|
+
if (!hasSpf) {
|
|
528
|
+
const points = 10;
|
|
529
|
+
score += points;
|
|
530
|
+
factors.push({
|
|
531
|
+
factor: "No SPF",
|
|
532
|
+
detail: "Domain does not have an SPF record configured",
|
|
533
|
+
points,
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
// 5. Check DMARC (+10 if missing)
|
|
537
|
+
let hasDmarc = false;
|
|
538
|
+
try {
|
|
539
|
+
const dmarcRecords = await resolver.resolveTxt(`_dmarc.${domain}`);
|
|
540
|
+
for (const record of dmarcRecords) {
|
|
541
|
+
const txt = record.join("");
|
|
542
|
+
if (txt.startsWith("v=DMARC1")) {
|
|
543
|
+
hasDmarc = true;
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
// No DMARC record
|
|
550
|
+
}
|
|
551
|
+
if (!hasDmarc) {
|
|
552
|
+
const points = 10;
|
|
553
|
+
score += points;
|
|
554
|
+
factors.push({
|
|
555
|
+
factor: "No DMARC",
|
|
556
|
+
detail: "Domain does not have a DMARC record configured",
|
|
557
|
+
points,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
// Cap score at 100
|
|
561
|
+
score = Math.min(score, 100);
|
|
562
|
+
let verdict;
|
|
563
|
+
if (score >= 70)
|
|
564
|
+
verdict = "high_risk";
|
|
565
|
+
else if (score >= 40)
|
|
566
|
+
verdict = "medium_risk";
|
|
567
|
+
else if (score >= 15)
|
|
568
|
+
verdict = "low_risk";
|
|
569
|
+
else
|
|
570
|
+
verdict = "clean";
|
|
571
|
+
return json({
|
|
572
|
+
domain,
|
|
573
|
+
risk_score: score,
|
|
574
|
+
verdict,
|
|
575
|
+
factors,
|
|
576
|
+
summary: {
|
|
577
|
+
dnsbl_listings: dnsblListings,
|
|
578
|
+
dnsbl_listed_on: listedOn,
|
|
579
|
+
domain_age: ageInfo ?? null,
|
|
580
|
+
has_dnssec: hasDnssec,
|
|
581
|
+
has_spf: hasSpf,
|
|
582
|
+
has_dmarc: hasDmarc,
|
|
583
|
+
},
|
|
584
|
+
});
|
|
585
|
+
},
|
|
586
|
+
};
|
|
587
|
+
// ─── Export ───
|
|
588
|
+
export const blocklistTools = [
|
|
589
|
+
blCheckDnsbl,
|
|
590
|
+
blCheckSurbl,
|
|
591
|
+
blCheckPhishing,
|
|
592
|
+
blCheckMalware,
|
|
593
|
+
blFastFluxDetect,
|
|
594
|
+
blDomainScore,
|
|
595
|
+
];
|
|
596
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blocklist/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ct/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA+mBjD,eAAO,MAAM,OAAO,EAAE,OAAO,EAQ5B,CAAC"}
|