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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +723 -0
  3. package/dist/blocklist/index.d.ts +3 -0
  4. package/dist/blocklist/index.d.ts.map +1 -0
  5. package/dist/blocklist/index.js +596 -0
  6. package/dist/blocklist/index.js.map +1 -0
  7. package/dist/ct/index.d.ts +3 -0
  8. package/dist/ct/index.d.ts.map +1 -0
  9. package/dist/ct/index.js +534 -0
  10. package/dist/ct/index.js.map +1 -0
  11. package/dist/data/dkim-selectors.d.ts +2 -0
  12. package/dist/data/dkim-selectors.d.ts.map +1 -0
  13. package/dist/data/dkim-selectors.js +60 -0
  14. package/dist/data/dkim-selectors.js.map +1 -0
  15. package/dist/data/dnsbl-lists.d.ts +8 -0
  16. package/dist/data/dnsbl-lists.d.ts.map +1 -0
  17. package/dist/data/dnsbl-lists.js +54 -0
  18. package/dist/data/dnsbl-lists.js.map +1 -0
  19. package/dist/data/takeover-fingerprints.d.ts +8 -0
  20. package/dist/data/takeover-fingerprints.d.ts.map +1 -0
  21. package/dist/data/takeover-fingerprints.js +84 -0
  22. package/dist/data/takeover-fingerprints.js.map +1 -0
  23. package/dist/data/tunneling-signatures.d.ts +17 -0
  24. package/dist/data/tunneling-signatures.d.ts.map +1 -0
  25. package/dist/data/tunneling-signatures.js +85 -0
  26. package/dist/data/tunneling-signatures.js.map +1 -0
  27. package/dist/dns/index.d.ts +3 -0
  28. package/dist/dns/index.d.ts.map +1 -0
  29. package/dist/dns/index.js +1211 -0
  30. package/dist/dns/index.js.map +1 -0
  31. package/dist/dnssec/index.d.ts +3 -0
  32. package/dist/dnssec/index.d.ts.map +1 -0
  33. package/dist/dnssec/index.js +1377 -0
  34. package/dist/dnssec/index.js.map +1 -0
  35. package/dist/domain/index.d.ts +3 -0
  36. package/dist/domain/index.d.ts.map +1 -0
  37. package/dist/domain/index.js +938 -0
  38. package/dist/domain/index.js.map +1 -0
  39. package/dist/email/index.d.ts +3 -0
  40. package/dist/email/index.d.ts.map +1 -0
  41. package/dist/email/index.js +1188 -0
  42. package/dist/email/index.js.map +1 -0
  43. package/dist/hijack/index.d.ts +3 -0
  44. package/dist/hijack/index.d.ts.map +1 -0
  45. package/dist/hijack/index.js +1117 -0
  46. package/dist/hijack/index.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +151 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/infra/index.d.ts +3 -0
  52. package/dist/infra/index.d.ts.map +1 -0
  53. package/dist/infra/index.js +797 -0
  54. package/dist/infra/index.js.map +1 -0
  55. package/dist/privacy/index.d.ts +3 -0
  56. package/dist/privacy/index.d.ts.map +1 -0
  57. package/dist/privacy/index.js +772 -0
  58. package/dist/privacy/index.js.map +1 -0
  59. package/dist/protocol/mcp-server.d.ts +4 -0
  60. package/dist/protocol/mcp-server.d.ts.map +1 -0
  61. package/dist/protocol/mcp-server.js +32 -0
  62. package/dist/protocol/mcp-server.js.map +1 -0
  63. package/dist/protocol/tools.d.ts +3 -0
  64. package/dist/protocol/tools.d.ts.map +1 -0
  65. package/dist/protocol/tools.js +29 -0
  66. package/dist/protocol/tools.js.map +1 -0
  67. package/dist/report/index.d.ts +3 -0
  68. package/dist/report/index.d.ts.map +1 -0
  69. package/dist/report/index.js +1167 -0
  70. package/dist/report/index.js.map +1 -0
  71. package/dist/threat/index.d.ts +3 -0
  72. package/dist/threat/index.d.ts.map +1 -0
  73. package/dist/threat/index.js +999 -0
  74. package/dist/threat/index.js.map +1 -0
  75. package/dist/tunnel/index.d.ts +3 -0
  76. package/dist/tunnel/index.d.ts.map +1 -0
  77. package/dist/tunnel/index.js +688 -0
  78. package/dist/tunnel/index.js.map +1 -0
  79. package/dist/types/index.d.ts +52 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +8 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/dist/typo/index.d.ts +3 -0
  84. package/dist/typo/index.d.ts.map +1 -0
  85. package/dist/typo/index.js +625 -0
  86. package/dist/typo/index.js.map +1 -0
  87. package/dist/utils/cache.d.ts +11 -0
  88. package/dist/utils/cache.d.ts.map +1 -0
  89. package/dist/utils/cache.js +35 -0
  90. package/dist/utils/cache.js.map +1 -0
  91. package/dist/utils/dns-client.d.ts +37 -0
  92. package/dist/utils/dns-client.d.ts.map +1 -0
  93. package/dist/utils/dns-client.js +359 -0
  94. package/dist/utils/dns-client.js.map +1 -0
  95. package/dist/utils/rate-limiter.d.ts +10 -0
  96. package/dist/utils/rate-limiter.d.ts.map +1 -0
  97. package/dist/utils/rate-limiter.js +35 -0
  98. package/dist/utils/rate-limiter.js.map +1 -0
  99. package/package.json +63 -0
@@ -0,0 +1,625 @@
1
+ import { z } from "zod";
2
+ import { json } from "../types/index.js";
3
+ import { createResolver } from "../utils/dns-client.js";
4
+ // ─── Constants ───
5
+ const MAX_DNS_CHECKS = 50;
6
+ // ─── Helpers ───
7
+ function splitDomain(domain) {
8
+ const parts = domain.split(".");
9
+ if (parts.length < 2)
10
+ return { name: domain, tld: "" };
11
+ const tld = parts.slice(-1)[0];
12
+ const name = parts.slice(0, -1).join(".");
13
+ return { name, tld };
14
+ }
15
+ async function checkRegistered(variant, resolver) {
16
+ try {
17
+ const ips = await resolver.resolve4(variant);
18
+ return { registered: true, ips };
19
+ }
20
+ catch {
21
+ return { registered: false, ips: [] };
22
+ }
23
+ }
24
+ async function batchCheckRegistration(variants, resolver, limit = MAX_DNS_CHECKS) {
25
+ const results = new Map();
26
+ const toCheck = variants.slice(0, limit);
27
+ const tasks = toCheck.map(async (v) => {
28
+ const result = await checkRegistered(v, resolver);
29
+ results.set(v, result);
30
+ });
31
+ await Promise.allSettled(tasks);
32
+ return results;
33
+ }
34
+ // ─── Homoglyph Substitutions ───
35
+ const LATIN_HOMOGLYPHS = {
36
+ o: ["0"],
37
+ l: ["1", "i"],
38
+ i: ["1", "l"],
39
+ "0": ["o"],
40
+ "1": ["l", "i"],
41
+ rn: ["m"],
42
+ m: ["rn"],
43
+ cl: ["d"],
44
+ d: ["cl"],
45
+ vv: ["w"],
46
+ w: ["vv"],
47
+ n: ["nn"],
48
+ nn: ["n"],
49
+ };
50
+ const CYRILLIC_HOMOGLYPHS = {
51
+ a: "\u0430", // Cyrillic а
52
+ e: "\u0435", // Cyrillic е
53
+ o: "\u043e", // Cyrillic о
54
+ c: "\u0441", // Cyrillic с
55
+ p: "\u0440", // Cyrillic р
56
+ y: "\u0443", // Cyrillic у
57
+ x: "\u0445", // Cyrillic х
58
+ };
59
+ function generateHomoglyphs(name) {
60
+ const variants = new Set();
61
+ // Single-character substitutions
62
+ for (let i = 0; i < name.length; i++) {
63
+ const ch = name[i];
64
+ const subs = LATIN_HOMOGLYPHS[ch];
65
+ if (subs) {
66
+ for (const sub of subs) {
67
+ variants.add(name.slice(0, i) + sub + name.slice(i + 1));
68
+ }
69
+ }
70
+ }
71
+ // Multi-character substitutions (bigram)
72
+ for (let i = 0; i < name.length - 1; i++) {
73
+ const bigram = name.slice(i, i + 2);
74
+ const subs = LATIN_HOMOGLYPHS[bigram];
75
+ if (subs) {
76
+ for (const sub of subs) {
77
+ variants.add(name.slice(0, i) + sub + name.slice(i + 2));
78
+ }
79
+ }
80
+ }
81
+ // Cyrillic lookalikes (one char at a time)
82
+ for (let i = 0; i < name.length; i++) {
83
+ const ch = name[i];
84
+ const cyrillic = CYRILLIC_HOMOGLYPHS[ch];
85
+ if (cyrillic) {
86
+ variants.add(name.slice(0, i) + cyrillic + name.slice(i + 1));
87
+ }
88
+ }
89
+ return [...variants];
90
+ }
91
+ // ─── Bitsquat Generation ───
92
+ function generateBitsquats(name) {
93
+ const variants = new Set();
94
+ const validChars = /^[a-z0-9-]$/;
95
+ for (let i = 0; i < name.length; i++) {
96
+ const charCode = name.charCodeAt(i);
97
+ for (let bit = 0; bit < 8; bit++) {
98
+ const flipped = charCode ^ (1 << bit);
99
+ const ch = String.fromCharCode(flipped);
100
+ if (ch !== name[i] && validChars.test(ch)) {
101
+ variants.add(name.slice(0, i) + ch + name.slice(i + 1));
102
+ }
103
+ }
104
+ }
105
+ return [...variants];
106
+ }
107
+ // ─── TLD Variations ───
108
+ const TLD_ALTERNATIVES = [
109
+ "com", "co", "cm", "om", "net", "org", "io", "biz", "info",
110
+ "xyz", "app", "dev", "me", "cc", "tv", "us", "uk",
111
+ ];
112
+ function generateTldVariations(name, originalTld) {
113
+ const variants = [];
114
+ for (const tld of TLD_ALTERNATIVES) {
115
+ if (tld !== originalTld) {
116
+ variants.push(`${name}.${tld}`);
117
+ }
118
+ }
119
+ return variants;
120
+ }
121
+ // ─── Combosquat Generation ───
122
+ const DEFAULT_COMBO_KEYWORDS = [
123
+ "login", "secure", "verify", "support", "account",
124
+ "update", "confirm", "alert", "service", "help",
125
+ ];
126
+ function generateCombosquats(name, tld, keywords) {
127
+ const variants = new Set();
128
+ for (const kw of keywords) {
129
+ variants.add(`${name}-${kw}.${tld}`);
130
+ variants.add(`${kw}-${name}.${tld}`);
131
+ }
132
+ // Also add common prefixes
133
+ for (const prefix of ["my", "get"]) {
134
+ variants.add(`${prefix}-${name}.${tld}`);
135
+ }
136
+ // Also add common suffixes
137
+ for (const suffix of ["app", "api", "mail", "pay"]) {
138
+ variants.add(`${name}-${suffix}.${tld}`);
139
+ }
140
+ return [...variants];
141
+ }
142
+ // ─── Soundsquat Generation ───
143
+ const SOUND_SUBSTITUTIONS = [
144
+ ["ph", "f"], ["f", "ph"],
145
+ ["ck", "k"], ["k", "ck"],
146
+ ["x", "ks"], ["z", "s"], ["s", "z"],
147
+ ["ee", "ea"], ["ea", "ee"],
148
+ ["oo", "u"], ["ou", "ow"], ["ow", "ou"],
149
+ ["ie", "y"], ["y", "ie"],
150
+ ];
151
+ function generateSoundsquats(name) {
152
+ const variants = new Set();
153
+ for (const [from, to] of SOUND_SUBSTITUTIONS) {
154
+ let idx = 0;
155
+ while (idx <= name.length - from.length) {
156
+ const found = name.indexOf(from, idx);
157
+ if (found === -1)
158
+ break;
159
+ variants.add(name.slice(0, found) + to + name.slice(found + from.length));
160
+ idx = found + 1;
161
+ }
162
+ }
163
+ return [...variants];
164
+ }
165
+ // ─── IDN Homograph Generation ───
166
+ const IDN_CHAR_MAP = {
167
+ a: ["\u0430", "\u03b1", "\u0561"], // Cyrillic а, Greek α, Armenian ա
168
+ c: ["\u0441", "\u03f2"], // Cyrillic с, Greek ϲ
169
+ d: ["\u0501"], // Cyrillic ԁ
170
+ e: ["\u0435", "\u03b5"], // Cyrillic е, Greek ε
171
+ g: ["\u0261"], // Latin ɡ
172
+ h: ["\u04bb"], // Cyrillic һ
173
+ i: ["\u0456", "\u03b9"], // Cyrillic і, Greek ι
174
+ j: ["\u0458"], // Cyrillic ј
175
+ k: ["\u03ba"], // Greek κ
176
+ l: ["\u04cf"], // Cyrillic ӏ
177
+ n: ["\u0578"], // Armenian ո
178
+ o: ["\u043e", "\u03bf", "\u0585"], // Cyrillic о, Greek ο, Armenian օ
179
+ p: ["\u0440", "\u03c1"], // Cyrillic р, Greek ρ
180
+ q: ["\u0566"], // Armenian զ
181
+ s: ["\u0455"], // Cyrillic ѕ
182
+ u: ["\u057d"], // Armenian ս
183
+ v: ["\u0475"], // Cyrillic ѵ
184
+ w: ["\u051d"], // Cyrillic ԝ
185
+ x: ["\u0445", "\u03c7"], // Cyrillic х, Greek χ
186
+ y: ["\u0443", "\u03b3"], // Cyrillic у, Greek γ
187
+ };
188
+ function generateIdnHomographs(name, tld) {
189
+ const variants = [];
190
+ const seen = new Set();
191
+ // Single character substitution for each position
192
+ for (let i = 0; i < name.length; i++) {
193
+ const ch = name[i];
194
+ const subs = IDN_CHAR_MAP[ch];
195
+ if (!subs)
196
+ continue;
197
+ for (const sub of subs) {
198
+ const visual = name.slice(0, i) + sub + name.slice(i + 1) + "." + tld;
199
+ try {
200
+ const url = new URL(`http://${visual}`);
201
+ const punycode = url.hostname;
202
+ if (!seen.has(punycode)) {
203
+ seen.add(punycode);
204
+ variants.push({ visual, punycode });
205
+ }
206
+ }
207
+ catch {
208
+ // Invalid IDN — skip
209
+ }
210
+ }
211
+ }
212
+ return variants;
213
+ }
214
+ // ─── Keyboard Proximity ───
215
+ const QWERTY_ADJACENT = {
216
+ q: ["w", "a"],
217
+ w: ["q", "e", "s"],
218
+ e: ["w", "r", "d"],
219
+ r: ["e", "t", "f"],
220
+ t: ["r", "y", "g"],
221
+ y: ["t", "u", "h"],
222
+ u: ["y", "i", "j"],
223
+ i: ["u", "o", "k"],
224
+ o: ["i", "p", "l"],
225
+ p: ["o", "l"],
226
+ a: ["q", "w", "s", "z"],
227
+ s: ["a", "w", "e", "d", "z", "x"],
228
+ d: ["s", "e", "r", "f", "x", "c"],
229
+ f: ["d", "r", "t", "g", "c", "v"],
230
+ g: ["f", "t", "y", "h", "v", "b"],
231
+ h: ["g", "y", "u", "j", "b", "n"],
232
+ j: ["h", "u", "i", "k", "n", "m"],
233
+ k: ["j", "i", "o", "l", "m"],
234
+ l: ["k", "o", "p"],
235
+ z: ["a", "s", "x"],
236
+ x: ["z", "s", "d", "c"],
237
+ c: ["x", "d", "f", "v"],
238
+ v: ["c", "f", "g", "b"],
239
+ b: ["v", "g", "h", "n"],
240
+ n: ["b", "h", "j", "m"],
241
+ m: ["n", "j", "k"],
242
+ };
243
+ function generateKeyboardProximity(name) {
244
+ const variants = new Set();
245
+ const validChars = /^[a-z0-9-]$/;
246
+ // Adjacent key substitution
247
+ for (let i = 0; i < name.length; i++) {
248
+ const ch = name[i];
249
+ const adjacent = QWERTY_ADJACENT[ch];
250
+ if (adjacent) {
251
+ for (const adj of adjacent) {
252
+ variants.add(name.slice(0, i) + adj + name.slice(i + 1));
253
+ }
254
+ }
255
+ }
256
+ // Character omission
257
+ for (let i = 0; i < name.length; i++) {
258
+ const omitted = name.slice(0, i) + name.slice(i + 1);
259
+ if (omitted.length > 0) {
260
+ variants.add(omitted);
261
+ }
262
+ }
263
+ // Character doubling
264
+ for (let i = 0; i < name.length; i++) {
265
+ if (validChars.test(name[i])) {
266
+ variants.add(name.slice(0, i) + name[i] + name[i] + name.slice(i + 1));
267
+ }
268
+ }
269
+ // Adjacent character swap
270
+ for (let i = 0; i < name.length - 1; i++) {
271
+ variants.add(name.slice(0, i) + name[i + 1] + name[i] + name.slice(i + 2));
272
+ }
273
+ return [...variants];
274
+ }
275
+ // ─── Tool 1: typo_homoglyph ───
276
+ const typoHomoglyph = {
277
+ name: "typo_homoglyph",
278
+ description: "Generate visually similar (homoglyph) domain variants using confusable characters like o/0, l/1, rn/m, cl/d, vv/w plus Cyrillic lookalikes. Checks DNS registration for each variant.",
279
+ schema: {
280
+ domain: z.string().describe("Target domain to generate homoglyph variants for (e.g. 'example.com')"),
281
+ },
282
+ async execute(args) {
283
+ const domain = args.domain.toLowerCase().trim();
284
+ const { name, tld } = splitDomain(domain);
285
+ const resolver = createResolver();
286
+ const homoglyphs = generateHomoglyphs(name);
287
+ const variants = homoglyphs.map((h) => `${h}.${tld}`);
288
+ const registrationMap = await batchCheckRegistration(variants, resolver);
289
+ const results = variants.map((v) => {
290
+ const reg = registrationMap.get(v);
291
+ return {
292
+ variant: v,
293
+ registered: reg?.registered ?? false,
294
+ ips: reg?.ips ?? [],
295
+ };
296
+ });
297
+ const registered = results.filter((r) => r.registered);
298
+ return json({
299
+ original: domain,
300
+ technique: "homoglyph",
301
+ total_variants: variants.length,
302
+ checked: Math.min(variants.length, MAX_DNS_CHECKS),
303
+ registered_count: registered.length,
304
+ registered_variants: registered,
305
+ all_variants: results,
306
+ });
307
+ },
308
+ };
309
+ // ─── Tool 2: typo_bitsquat ───
310
+ const typoBitsquat = {
311
+ name: "typo_bitsquat",
312
+ description: "Generate all single-bit-flip variants of each character in the domain name. Filters to valid domain characters [a-z0-9-] and checks DNS registration.",
313
+ schema: {
314
+ domain: z.string().describe("Target domain to generate bitsquat variants for (e.g. 'example.com')"),
315
+ },
316
+ async execute(args) {
317
+ const domain = args.domain.toLowerCase().trim();
318
+ const { name, tld } = splitDomain(domain);
319
+ const resolver = createResolver();
320
+ const bitsquats = generateBitsquats(name);
321
+ const variants = bitsquats.map((b) => `${b}.${tld}`);
322
+ const registrationMap = await batchCheckRegistration(variants, resolver);
323
+ const results = variants.map((v) => {
324
+ const reg = registrationMap.get(v);
325
+ return {
326
+ variant: v,
327
+ registered: reg?.registered ?? false,
328
+ ips: reg?.ips ?? [],
329
+ };
330
+ });
331
+ const registered = results.filter((r) => r.registered);
332
+ return json({
333
+ original: domain,
334
+ technique: "bitsquat",
335
+ total_variants: variants.length,
336
+ checked: Math.min(variants.length, MAX_DNS_CHECKS),
337
+ registered_count: registered.length,
338
+ registered_variants: registered,
339
+ all_variants: results,
340
+ });
341
+ },
342
+ };
343
+ // ─── Tool 3: typo_tld_variation ───
344
+ const typoTldVariation = {
345
+ name: "typo_tld_variation",
346
+ description: "Test common TLD confusions for a domain (e.g. .com to .co, .cm, .om, .net, .org, .io, etc.). Resolves each and reports registered ones with IPs.",
347
+ schema: {
348
+ domain: z.string().describe("Target domain to test TLD variations for (e.g. 'example.com')"),
349
+ },
350
+ async execute(args) {
351
+ const domain = args.domain.toLowerCase().trim();
352
+ const { name, tld } = splitDomain(domain);
353
+ const resolver = createResolver();
354
+ const variants = generateTldVariations(name, tld);
355
+ const registrationMap = await batchCheckRegistration(variants, resolver);
356
+ const results = variants.map((v) => {
357
+ const reg = registrationMap.get(v);
358
+ return {
359
+ variant: v,
360
+ registered: reg?.registered ?? false,
361
+ ips: reg?.ips ?? [],
362
+ };
363
+ });
364
+ const registered = results.filter((r) => r.registered);
365
+ return json({
366
+ original: domain,
367
+ technique: "tld_variation",
368
+ total_variants: variants.length,
369
+ registered_count: registered.length,
370
+ registered_variants: registered,
371
+ all_variants: results,
372
+ });
373
+ },
374
+ };
375
+ // ─── Tool 4: typo_combosquat ───
376
+ const typoCombosquat = {
377
+ name: "typo_combosquat",
378
+ description: "Generate brand+keyword combination domains (e.g. domain-login, domain-secure, my-domain). Uses default or custom keywords. Checks DNS registration.",
379
+ schema: {
380
+ domain: z.string().describe("Target domain to generate combosquat variants for (e.g. 'example.com')"),
381
+ keywords: z
382
+ .array(z.string())
383
+ .optional()
384
+ .describe("Custom keywords to combine with the domain name. Defaults: login, secure, verify, support, account, update, confirm, alert, service, help"),
385
+ },
386
+ async execute(args) {
387
+ const domain = args.domain.toLowerCase().trim();
388
+ const { name, tld } = splitDomain(domain);
389
+ const keywords = args.keywords ?? DEFAULT_COMBO_KEYWORDS;
390
+ const resolver = createResolver();
391
+ const variants = generateCombosquats(name, tld, keywords);
392
+ const registrationMap = await batchCheckRegistration(variants, resolver);
393
+ const results = variants.map((v) => {
394
+ const reg = registrationMap.get(v);
395
+ return {
396
+ variant: v,
397
+ registered: reg?.registered ?? false,
398
+ ips: reg?.ips ?? [],
399
+ };
400
+ });
401
+ const registered = results.filter((r) => r.registered);
402
+ return json({
403
+ original: domain,
404
+ technique: "combosquat",
405
+ keywords_used: keywords,
406
+ total_variants: variants.length,
407
+ checked: Math.min(variants.length, MAX_DNS_CHECKS),
408
+ registered_count: registered.length,
409
+ registered_variants: registered,
410
+ all_variants: results,
411
+ });
412
+ },
413
+ };
414
+ // ─── Tool 5: typo_soundsquat ───
415
+ const typoSoundsquat = {
416
+ name: "typo_soundsquat",
417
+ description: "Generate phonetically similar domain variants using sound substitutions (e.g. ph/f, ck/k, ee/ea, oo/u). Checks DNS registration.",
418
+ schema: {
419
+ domain: z.string().describe("Target domain to generate soundsquat variants for (e.g. 'facebook.com')"),
420
+ },
421
+ async execute(args) {
422
+ const domain = args.domain.toLowerCase().trim();
423
+ const { name, tld } = splitDomain(domain);
424
+ const resolver = createResolver();
425
+ const soundsquats = generateSoundsquats(name);
426
+ const variants = soundsquats.map((s) => `${s}.${tld}`);
427
+ const registrationMap = await batchCheckRegistration(variants, resolver);
428
+ const results = variants.map((v) => {
429
+ const reg = registrationMap.get(v);
430
+ return {
431
+ variant: v,
432
+ registered: reg?.registered ?? false,
433
+ ips: reg?.ips ?? [],
434
+ };
435
+ });
436
+ const registered = results.filter((r) => r.registered);
437
+ return json({
438
+ original: domain,
439
+ technique: "soundsquat",
440
+ total_variants: variants.length,
441
+ checked: Math.min(variants.length, MAX_DNS_CHECKS),
442
+ registered_count: registered.length,
443
+ registered_variants: registered,
444
+ all_variants: results,
445
+ });
446
+ },
447
+ };
448
+ // ─── Tool 6: typo_idn_homograph ───
449
+ const typoIdnHomograph = {
450
+ name: "typo_idn_homograph",
451
+ description: "Generate IDN homograph attack variants using Cyrillic, Greek, and Armenian characters that look identical to Latin. Reports visual rendering, punycode form, and DNS registration status.",
452
+ schema: {
453
+ domain: z.string().describe("Target domain to generate IDN homograph variants for (e.g. 'apple.com')"),
454
+ },
455
+ async execute(args) {
456
+ const domain = args.domain.toLowerCase().trim();
457
+ const { name, tld } = splitDomain(domain);
458
+ const resolver = createResolver();
459
+ const idnVariants = generateIdnHomographs(name, tld);
460
+ const punyDomains = idnVariants.map((v) => v.punycode);
461
+ const registrationMap = await batchCheckRegistration(punyDomains, resolver);
462
+ const results = idnVariants.map((v) => {
463
+ const reg = registrationMap.get(v.punycode);
464
+ return {
465
+ visual: v.visual,
466
+ punycode: v.punycode,
467
+ registered: reg?.registered ?? false,
468
+ ips: reg?.ips ?? [],
469
+ };
470
+ });
471
+ const registered = results.filter((r) => r.registered);
472
+ return json({
473
+ original: domain,
474
+ technique: "idn_homograph",
475
+ total_variants: idnVariants.length,
476
+ checked: Math.min(idnVariants.length, MAX_DNS_CHECKS),
477
+ registered_count: registered.length,
478
+ registered_variants: registered,
479
+ all_variants: results,
480
+ });
481
+ },
482
+ };
483
+ // ─── Tool 7: typo_keyboard_proximity ───
484
+ const typoKeyboardProximity = {
485
+ name: "typo_keyboard_proximity",
486
+ description: "Generate QWERTY keyboard proximity typosquat variants: adjacent key substitution, character omission, character doubling, and adjacent character swap. Checks DNS registration.",
487
+ schema: {
488
+ domain: z.string().describe("Target domain to generate keyboard proximity variants for (e.g. 'google.com')"),
489
+ },
490
+ async execute(args) {
491
+ const domain = args.domain.toLowerCase().trim();
492
+ const { name, tld } = splitDomain(domain);
493
+ const resolver = createResolver();
494
+ const proximityVariants = generateKeyboardProximity(name);
495
+ const variants = proximityVariants
496
+ .filter((v) => v.length > 0 && /^[a-z0-9-]+$/.test(v))
497
+ .map((v) => `${v}.${tld}`);
498
+ const registrationMap = await batchCheckRegistration(variants, resolver);
499
+ const results = variants.map((v) => {
500
+ const reg = registrationMap.get(v);
501
+ return {
502
+ variant: v,
503
+ registered: reg?.registered ?? false,
504
+ ips: reg?.ips ?? [],
505
+ };
506
+ });
507
+ const registered = results.filter((r) => r.registered);
508
+ return json({
509
+ original: domain,
510
+ technique: "keyboard_proximity",
511
+ total_variants: variants.length,
512
+ checked: Math.min(variants.length, MAX_DNS_CHECKS),
513
+ registered_count: registered.length,
514
+ registered_variants: registered,
515
+ all_variants: results,
516
+ });
517
+ },
518
+ };
519
+ // ─── Tool 8: typo_full_scan ───
520
+ const typoFullScan = {
521
+ name: "typo_full_scan",
522
+ description: "Run all 7 typosquatting detection techniques (homoglyph, bitsquat, TLD variation, combosquat, soundsquat, IDN homograph, keyboard proximity). Deduplicates across techniques. Optionally resolves each variant to report only registered domains.",
523
+ schema: {
524
+ domain: z.string().describe("Target domain to run full typosquat scan on (e.g. 'example.com')"),
525
+ check_registered: z
526
+ .boolean()
527
+ .optional()
528
+ .describe("Whether to resolve each variant via DNS to check registration (default: true)"),
529
+ },
530
+ async execute(args) {
531
+ const domain = args.domain.toLowerCase().trim();
532
+ const checkRegistered = args.check_registered ?? true;
533
+ const { name, tld } = splitDomain(domain);
534
+ const resolver = createResolver();
535
+ // Generate all variants per technique
536
+ const techniques = {};
537
+ // Homoglyph
538
+ const homoglyphs = generateHomoglyphs(name).map((h) => `${h}.${tld}`);
539
+ techniques.homoglyph = homoglyphs;
540
+ // Bitsquat
541
+ const bitsquats = generateBitsquats(name).map((b) => `${b}.${tld}`);
542
+ techniques.bitsquat = bitsquats;
543
+ // TLD variation
544
+ const tldVars = generateTldVariations(name, tld);
545
+ techniques.tld_variation = tldVars;
546
+ // Combosquat
547
+ const combos = generateCombosquats(name, tld, DEFAULT_COMBO_KEYWORDS);
548
+ techniques.combosquat = combos;
549
+ // Soundsquat
550
+ const sounds = generateSoundsquats(name).map((s) => `${s}.${tld}`);
551
+ techniques.soundsquat = sounds;
552
+ // IDN Homograph
553
+ const idnVariants = generateIdnHomographs(name, tld);
554
+ techniques.idn_homograph = idnVariants.map((v) => v.punycode);
555
+ // Keyboard proximity
556
+ const kbVariants = generateKeyboardProximity(name)
557
+ .filter((v) => v.length > 0 && /^[a-z0-9-]+$/.test(v))
558
+ .map((v) => `${v}.${tld}`);
559
+ techniques.keyboard_proximity = kbVariants;
560
+ // Deduplicate across all techniques
561
+ const allUnique = new Set();
562
+ const techniqueBreakdown = {};
563
+ for (const [technique, variants] of Object.entries(techniques)) {
564
+ const unique = [];
565
+ for (const v of variants) {
566
+ if (!allUnique.has(v) && v !== domain) {
567
+ allUnique.add(v);
568
+ unique.push(v);
569
+ }
570
+ }
571
+ techniqueBreakdown[technique] = { total: variants.length, unique };
572
+ }
573
+ const allVariants = [...allUnique];
574
+ if (!checkRegistered) {
575
+ return json({
576
+ original: domain,
577
+ technique: "full_scan",
578
+ total_unique_variants: allVariants.length,
579
+ check_registered: false,
580
+ per_technique: Object.fromEntries(Object.entries(techniqueBreakdown).map(([k, v]) => [k, { total: v.total, unique_count: v.unique.length }])),
581
+ all_variants: allVariants,
582
+ });
583
+ }
584
+ // DNS check (limited to MAX_DNS_CHECKS)
585
+ const registrationMap = await batchCheckRegistration(allVariants, resolver);
586
+ const registeredVariants = [];
587
+ for (const [variant, reg] of registrationMap) {
588
+ if (reg.registered) {
589
+ // Find which techniques generated this variant
590
+ const fromTechniques = [];
591
+ for (const [technique, breakdown] of Object.entries(techniqueBreakdown)) {
592
+ if (breakdown.unique.includes(variant)) {
593
+ fromTechniques.push(technique);
594
+ }
595
+ }
596
+ registeredVariants.push({
597
+ variant,
598
+ ips: reg.ips,
599
+ techniques: fromTechniques,
600
+ });
601
+ }
602
+ }
603
+ return json({
604
+ original: domain,
605
+ technique: "full_scan",
606
+ total_unique_variants: allVariants.length,
607
+ checked: Math.min(allVariants.length, MAX_DNS_CHECKS),
608
+ registered_count: registeredVariants.length,
609
+ registered_variants: registeredVariants,
610
+ per_technique: Object.fromEntries(Object.entries(techniqueBreakdown).map(([k, v]) => [k, { total: v.total, unique_count: v.unique.length }])),
611
+ });
612
+ },
613
+ };
614
+ // ─── Export ───
615
+ export const typoTools = [
616
+ typoHomoglyph,
617
+ typoBitsquat,
618
+ typoTldVariation,
619
+ typoCombosquat,
620
+ typoSoundsquat,
621
+ typoIdnHomograph,
622
+ typoKeyboardProximity,
623
+ typoFullScan,
624
+ ];
625
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/typo/index.ts"],"names":[],"mappings":"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"}