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,11 @@
|
|
|
1
|
+
export declare class TTLCache<T> {
|
|
2
|
+
private ttlMs;
|
|
3
|
+
private store;
|
|
4
|
+
constructor(ttlMs: number);
|
|
5
|
+
get(key: string): T | undefined;
|
|
6
|
+
set(key: string, value: T): void;
|
|
7
|
+
has(key: string): boolean;
|
|
8
|
+
clear(): void;
|
|
9
|
+
get size(): number;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AACA,qBAAa,QAAQ,CAAC,CAAC;IAGT,OAAO,CAAC,KAAK;IAFzB,OAAO,CAAC,KAAK,CAAoD;gBAE7C,KAAK,EAAE,MAAM;IAEjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAU/B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAIhC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAKjB;CACF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Simple in-memory TTL cache
|
|
2
|
+
export class TTLCache {
|
|
3
|
+
ttlMs;
|
|
4
|
+
store = new Map();
|
|
5
|
+
constructor(ttlMs) {
|
|
6
|
+
this.ttlMs = ttlMs;
|
|
7
|
+
}
|
|
8
|
+
get(key) {
|
|
9
|
+
const entry = this.store.get(key);
|
|
10
|
+
if (!entry)
|
|
11
|
+
return undefined;
|
|
12
|
+
if (Date.now() > entry.expires) {
|
|
13
|
+
this.store.delete(key);
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return entry.value;
|
|
17
|
+
}
|
|
18
|
+
set(key, value) {
|
|
19
|
+
this.store.set(key, { value, expires: Date.now() + this.ttlMs });
|
|
20
|
+
}
|
|
21
|
+
has(key) {
|
|
22
|
+
return this.get(key) !== undefined;
|
|
23
|
+
}
|
|
24
|
+
clear() {
|
|
25
|
+
this.store.clear();
|
|
26
|
+
}
|
|
27
|
+
get size() {
|
|
28
|
+
for (const [key, entry] of this.store) {
|
|
29
|
+
if (Date.now() > entry.expires)
|
|
30
|
+
this.store.delete(key);
|
|
31
|
+
}
|
|
32
|
+
return this.store.size;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,OAAO,QAAQ;IAGC;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEjE,YAAoB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAErC,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAQ;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IACrC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as dns from "node:dns/promises";
|
|
2
|
+
import * as dnsPacket from "dns-packet";
|
|
3
|
+
import type { DnsRecord, DnsFlags } from "../types/index.js";
|
|
4
|
+
export declare function createResolver(server?: string): dns.Resolver;
|
|
5
|
+
export declare function resolveAll(domain: string, types?: string[], server?: string): Promise<DnsRecord[]>;
|
|
6
|
+
export declare function queryRaw(domain: string, type: string, server: string, port?: number, opts?: {
|
|
7
|
+
rd?: boolean;
|
|
8
|
+
cd?: boolean;
|
|
9
|
+
dnssec?: boolean;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
answers: dnsPacket.Answer[];
|
|
12
|
+
authorities: dnsPacket.Answer[];
|
|
13
|
+
additionals: dnsPacket.Answer[];
|
|
14
|
+
flags: DnsFlags;
|
|
15
|
+
rcode: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function queryTcp(domain: string, type: string, server: string, port?: number): Promise<dnsPacket.Answer[]>;
|
|
18
|
+
export declare function queryDoH(domain: string, type: string, dohServer?: string): Promise<{
|
|
19
|
+
answers: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
type: number;
|
|
22
|
+
TTL: number;
|
|
23
|
+
data: string;
|
|
24
|
+
}>;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function queryDoT(domain: string, type: string, dotServer: string, port?: number): Promise<dnsPacket.Answer[]>;
|
|
27
|
+
export declare function reverseIp(ip: string): string;
|
|
28
|
+
export declare function isValidDomain(domain: string): boolean;
|
|
29
|
+
export declare function isValidIp(ip: string): boolean;
|
|
30
|
+
export declare function shannonEntropy(str: string): number;
|
|
31
|
+
export declare const PUBLIC_RESOLVERS: {
|
|
32
|
+
name: string;
|
|
33
|
+
ip: string;
|
|
34
|
+
location: string;
|
|
35
|
+
}[];
|
|
36
|
+
export declare const SUBDOMAIN_WORDLIST: string[];
|
|
37
|
+
//# sourceMappingURL=dns-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns-client.d.ts","sourceRoot":"","sources":["../../src/utils/dns-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAC;AAKzC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7D,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,QAAQ,CAI5D;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAM,EAAmE,EAChF,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,EAAE,CAAC,CAsEtB;AAID,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,SAAK,EACT,IAAI,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACtD,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoE5I;AAID,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,SAAK,GACR,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAuD7B;AAID,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,SAAyC,GACjD,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAQxF;AAID,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,IAAI,SAAM,GACT,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CA+C7B;AAID,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE7C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUlD;AAcD,eAAO,MAAM,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAqB5E,CAAC;AAIF,eAAO,MAAM,kBAAkB,UA+B9B,CAAC"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import * as dns from "node:dns/promises";
|
|
2
|
+
import * as dgram from "node:dgram";
|
|
3
|
+
import * as net from "node:net";
|
|
4
|
+
import * as tls from "node:tls";
|
|
5
|
+
import * as dnsPacket from "dns-packet";
|
|
6
|
+
// ─── Resolver Helpers ───
|
|
7
|
+
const DEFAULT_TIMEOUT = 5000;
|
|
8
|
+
export function createResolver(server) {
|
|
9
|
+
const resolver = new dns.Resolver();
|
|
10
|
+
if (server)
|
|
11
|
+
resolver.setServers([server]);
|
|
12
|
+
return resolver;
|
|
13
|
+
}
|
|
14
|
+
export async function resolveAll(domain, types = ["A", "AAAA", "MX", "TXT", "NS", "SOA", "CNAME", "SRV", "CAA"], server) {
|
|
15
|
+
const resolver = createResolver(server);
|
|
16
|
+
const records = [];
|
|
17
|
+
const tasks = types.map(async (type) => {
|
|
18
|
+
try {
|
|
19
|
+
switch (type.toUpperCase()) {
|
|
20
|
+
case "A": {
|
|
21
|
+
const res = await resolver.resolve4(domain, { ttl: true });
|
|
22
|
+
for (const r of res)
|
|
23
|
+
records.push({ name: domain, type: "A", ttl: r.ttl, data: r.address });
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case "AAAA": {
|
|
27
|
+
const res = await resolver.resolve6(domain, { ttl: true });
|
|
28
|
+
for (const r of res)
|
|
29
|
+
records.push({ name: domain, type: "AAAA", ttl: r.ttl, data: r.address });
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case "MX": {
|
|
33
|
+
const res = await resolver.resolveMx(domain);
|
|
34
|
+
for (const r of res)
|
|
35
|
+
records.push({ name: domain, type: "MX", ttl: 0, data: `${r.priority} ${r.exchange}` });
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "TXT": {
|
|
39
|
+
const res = await resolver.resolveTxt(domain);
|
|
40
|
+
for (const r of res)
|
|
41
|
+
records.push({ name: domain, type: "TXT", ttl: 0, data: r.join("") });
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case "NS": {
|
|
45
|
+
const res = await resolver.resolveNs(domain);
|
|
46
|
+
for (const r of res)
|
|
47
|
+
records.push({ name: domain, type: "NS", ttl: 0, data: r });
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case "SOA": {
|
|
51
|
+
const r = await resolver.resolveSoa(domain);
|
|
52
|
+
records.push({ name: domain, type: "SOA", ttl: 0, data: `${r.nsname} ${r.hostmaster} ${r.serial} ${r.refresh} ${r.retry} ${r.expire} ${r.minttl}` });
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case "CNAME": {
|
|
56
|
+
const res = await resolver.resolveCname(domain);
|
|
57
|
+
for (const r of res)
|
|
58
|
+
records.push({ name: domain, type: "CNAME", ttl: 0, data: r });
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case "SRV": {
|
|
62
|
+
const res = await resolver.resolveSrv(domain);
|
|
63
|
+
for (const r of res)
|
|
64
|
+
records.push({ name: domain, type: "SRV", ttl: 0, data: `${r.priority} ${r.weight} ${r.port} ${r.name}` });
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case "CAA": {
|
|
68
|
+
const res = await resolver.resolveCaa(domain);
|
|
69
|
+
for (const r of res)
|
|
70
|
+
records.push({ name: domain, type: "CAA", ttl: 0, data: `${r.critical ? "128" : "0"} ${r.contactemail ?? r.contactphone ?? r.issue ?? r.issuewild ?? r.iodef ?? ""}` });
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case "PTR": {
|
|
74
|
+
const res = await resolver.resolvePtr(domain);
|
|
75
|
+
for (const r of res)
|
|
76
|
+
records.push({ name: domain, type: "PTR", ttl: 0, data: r });
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case "NAPTR": {
|
|
80
|
+
const res = await resolver.resolveNaptr(domain);
|
|
81
|
+
for (const r of res)
|
|
82
|
+
records.push({ name: domain, type: "NAPTR", ttl: 0, data: `${r.order} ${r.preference} "${r.flags}" "${r.service}" "${r.regexp}" ${r.replacement}` });
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Record type not found — skip
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
await Promise.allSettled(tasks);
|
|
92
|
+
return records;
|
|
93
|
+
}
|
|
94
|
+
// ─── Raw DNS Queries via dns-packet + UDP ───
|
|
95
|
+
export async function queryRaw(domain, type, server, port = 53, opts) {
|
|
96
|
+
const rd = opts?.rd ?? true;
|
|
97
|
+
const cd = opts?.cd ?? false;
|
|
98
|
+
const question = {
|
|
99
|
+
type: type,
|
|
100
|
+
name: domain,
|
|
101
|
+
class: "IN",
|
|
102
|
+
};
|
|
103
|
+
const additionals = [];
|
|
104
|
+
if (opts?.dnssec) {
|
|
105
|
+
additionals.push({
|
|
106
|
+
type: "OPT",
|
|
107
|
+
name: ".",
|
|
108
|
+
udpPayloadSize: 4096,
|
|
109
|
+
flags: dnsPacket.DNSSEC_OK,
|
|
110
|
+
options: [],
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const buf = dnsPacket.encode({
|
|
114
|
+
type: "query",
|
|
115
|
+
id: Math.floor(Math.random() * 65535),
|
|
116
|
+
flags: (rd ? dnsPacket.RECURSION_DESIRED : 0) | (cd ? dnsPacket.CHECKING_DISABLED : 0),
|
|
117
|
+
questions: [question],
|
|
118
|
+
additionals: additionals.length > 0 ? additionals : undefined,
|
|
119
|
+
});
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const socket = dgram.createSocket("udp4");
|
|
122
|
+
const timer = setTimeout(() => {
|
|
123
|
+
socket.close();
|
|
124
|
+
reject(new Error(`DNS query timeout: ${domain} ${type} @${server}`));
|
|
125
|
+
}, DEFAULT_TIMEOUT);
|
|
126
|
+
socket.on("message", (msg) => {
|
|
127
|
+
clearTimeout(timer);
|
|
128
|
+
socket.close();
|
|
129
|
+
try {
|
|
130
|
+
const res = dnsPacket.decode(msg);
|
|
131
|
+
resolve({
|
|
132
|
+
answers: (res.answers ?? []),
|
|
133
|
+
authorities: (res.authorities ?? []),
|
|
134
|
+
additionals: (res.additionals ?? []),
|
|
135
|
+
rcode: rcodeToString(res.rcode ?? "NOERROR"),
|
|
136
|
+
flags: {
|
|
137
|
+
authoritative: !!(res.flags & dnsPacket.AUTHORITATIVE_ANSWER),
|
|
138
|
+
truncated: !!(res.flags & dnsPacket.TRUNCATED_RESPONSE),
|
|
139
|
+
recursionDesired: !!(res.flags & dnsPacket.RECURSION_DESIRED),
|
|
140
|
+
recursionAvailable: !!(res.flags & dnsPacket.RECURSION_AVAILABLE),
|
|
141
|
+
authenticatedData: !!(res.flags & dnsPacket.AUTHENTIC_DATA),
|
|
142
|
+
checkingDisabled: !!(res.flags & dnsPacket.CHECKING_DISABLED),
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
reject(err);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
socket.on("error", (err) => {
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
socket.close();
|
|
153
|
+
reject(err);
|
|
154
|
+
});
|
|
155
|
+
socket.send(buf, 0, buf.length, port, server);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// ─── TCP DNS Query (for AXFR, large responses) ───
|
|
159
|
+
export async function queryTcp(domain, type, server, port = 53) {
|
|
160
|
+
const buf = dnsPacket.encode({
|
|
161
|
+
type: "query",
|
|
162
|
+
id: Math.floor(Math.random() * 65535),
|
|
163
|
+
flags: 0,
|
|
164
|
+
questions: [{ type: type, name: domain, class: "IN" }],
|
|
165
|
+
});
|
|
166
|
+
// TCP DNS: 2-byte length prefix
|
|
167
|
+
const lenBuf = Buffer.alloc(2);
|
|
168
|
+
lenBuf.writeUInt16BE(buf.length, 0);
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
const socket = net.createConnection(port, server);
|
|
171
|
+
const chunks = [];
|
|
172
|
+
const timer = setTimeout(() => {
|
|
173
|
+
socket.destroy();
|
|
174
|
+
reject(new Error(`TCP DNS timeout: ${domain} ${type} @${server}`));
|
|
175
|
+
}, DEFAULT_TIMEOUT * 2);
|
|
176
|
+
socket.on("connect", () => {
|
|
177
|
+
socket.write(lenBuf);
|
|
178
|
+
socket.write(buf);
|
|
179
|
+
});
|
|
180
|
+
socket.on("data", (chunk) => {
|
|
181
|
+
chunks.push(chunk);
|
|
182
|
+
});
|
|
183
|
+
socket.on("end", () => {
|
|
184
|
+
clearTimeout(timer);
|
|
185
|
+
try {
|
|
186
|
+
const data = Buffer.concat(chunks);
|
|
187
|
+
const allAnswers = [];
|
|
188
|
+
let offset = 0;
|
|
189
|
+
while (offset + 2 < data.length) {
|
|
190
|
+
const len = data.readUInt16BE(offset);
|
|
191
|
+
offset += 2;
|
|
192
|
+
if (offset + len > data.length)
|
|
193
|
+
break;
|
|
194
|
+
const msg = data.subarray(offset, offset + len);
|
|
195
|
+
offset += len;
|
|
196
|
+
const res = dnsPacket.decode(msg);
|
|
197
|
+
if (res.answers)
|
|
198
|
+
allAnswers.push(...res.answers);
|
|
199
|
+
}
|
|
200
|
+
resolve(allAnswers);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
reject(err);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
socket.on("error", (err) => {
|
|
207
|
+
clearTimeout(timer);
|
|
208
|
+
reject(err);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// ─── DNS-over-HTTPS (DoH) ───
|
|
213
|
+
export async function queryDoH(domain, type, dohServer = "https://cloudflare-dns.com/dns-query") {
|
|
214
|
+
const url = `${dohServer}?name=${encodeURIComponent(domain)}&type=${encodeURIComponent(type)}`;
|
|
215
|
+
const res = await fetch(url, {
|
|
216
|
+
headers: { Accept: "application/dns-json" },
|
|
217
|
+
signal: AbortSignal.timeout(DEFAULT_TIMEOUT),
|
|
218
|
+
});
|
|
219
|
+
if (!res.ok)
|
|
220
|
+
throw new Error(`DoH error: ${res.status} ${res.statusText}`);
|
|
221
|
+
return res.json();
|
|
222
|
+
}
|
|
223
|
+
// ─── DNS-over-TLS (DoT) ───
|
|
224
|
+
export async function queryDoT(domain, type, dotServer, port = 853) {
|
|
225
|
+
const buf = dnsPacket.encode({
|
|
226
|
+
type: "query",
|
|
227
|
+
id: Math.floor(Math.random() * 65535),
|
|
228
|
+
flags: dnsPacket.RECURSION_DESIRED,
|
|
229
|
+
questions: [{ type: type, name: domain, class: "IN" }],
|
|
230
|
+
});
|
|
231
|
+
const lenBuf = Buffer.alloc(2);
|
|
232
|
+
lenBuf.writeUInt16BE(buf.length, 0);
|
|
233
|
+
return new Promise((resolve, reject) => {
|
|
234
|
+
const socket = tls.connect(port, dotServer, { servername: dotServer });
|
|
235
|
+
const chunks = [];
|
|
236
|
+
const timer = setTimeout(() => {
|
|
237
|
+
socket.destroy();
|
|
238
|
+
reject(new Error(`DoT timeout: ${domain} ${type} @${dotServer}`));
|
|
239
|
+
}, DEFAULT_TIMEOUT);
|
|
240
|
+
socket.on("secureConnect", () => {
|
|
241
|
+
socket.write(lenBuf);
|
|
242
|
+
socket.write(buf);
|
|
243
|
+
});
|
|
244
|
+
socket.on("data", (chunk) => {
|
|
245
|
+
chunks.push(chunk);
|
|
246
|
+
});
|
|
247
|
+
socket.on("end", () => {
|
|
248
|
+
clearTimeout(timer);
|
|
249
|
+
try {
|
|
250
|
+
const data = Buffer.concat(chunks);
|
|
251
|
+
if (data.length < 2) {
|
|
252
|
+
resolve([]);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const len = data.readUInt16BE(0);
|
|
256
|
+
const msg = data.subarray(2, 2 + len);
|
|
257
|
+
const res = dnsPacket.decode(msg);
|
|
258
|
+
resolve((res.answers ?? []));
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
reject(err);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
socket.on("error", (err) => {
|
|
265
|
+
clearTimeout(timer);
|
|
266
|
+
reject(err);
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// ─── Utility Helpers ───
|
|
271
|
+
export function reverseIp(ip) {
|
|
272
|
+
return ip.split(".").reverse().join(".");
|
|
273
|
+
}
|
|
274
|
+
export function isValidDomain(domain) {
|
|
275
|
+
return /^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/.test(domain);
|
|
276
|
+
}
|
|
277
|
+
export function isValidIp(ip) {
|
|
278
|
+
return /^(\d{1,3}\.){3}\d{1,3}$/.test(ip) && ip.split(".").every((o) => parseInt(o) <= 255);
|
|
279
|
+
}
|
|
280
|
+
export function shannonEntropy(str) {
|
|
281
|
+
if (str.length === 0)
|
|
282
|
+
return 0;
|
|
283
|
+
const freq = new Map();
|
|
284
|
+
for (const ch of str)
|
|
285
|
+
freq.set(ch, (freq.get(ch) ?? 0) + 1);
|
|
286
|
+
let entropy = 0;
|
|
287
|
+
for (const count of freq.values()) {
|
|
288
|
+
const p = count / str.length;
|
|
289
|
+
entropy -= p * Math.log2(p);
|
|
290
|
+
}
|
|
291
|
+
return entropy;
|
|
292
|
+
}
|
|
293
|
+
function rcodeToString(rcode) {
|
|
294
|
+
if (typeof rcode === "string")
|
|
295
|
+
return rcode;
|
|
296
|
+
const codes = {
|
|
297
|
+
0: "NOERROR", 1: "FORMERR", 2: "SERVFAIL", 3: "NXDOMAIN",
|
|
298
|
+
4: "NOTIMP", 5: "REFUSED", 6: "YXDOMAIN", 7: "YXRRSET",
|
|
299
|
+
8: "NXRRSET", 9: "NOTAUTH", 10: "NOTZONE",
|
|
300
|
+
};
|
|
301
|
+
return codes[rcode] ?? `RCODE_${rcode}`;
|
|
302
|
+
}
|
|
303
|
+
// ─── Public DNS Resolvers ───
|
|
304
|
+
export const PUBLIC_RESOLVERS = [
|
|
305
|
+
{ name: "Google", ip: "8.8.8.8", location: "US" },
|
|
306
|
+
{ name: "Google Secondary", ip: "8.8.4.4", location: "US" },
|
|
307
|
+
{ name: "Cloudflare", ip: "1.1.1.1", location: "US" },
|
|
308
|
+
{ name: "Cloudflare Secondary", ip: "1.0.0.1", location: "US" },
|
|
309
|
+
{ name: "Quad9", ip: "9.9.9.9", location: "US" },
|
|
310
|
+
{ name: "OpenDNS", ip: "208.67.222.222", location: "US" },
|
|
311
|
+
{ name: "OpenDNS Secondary", ip: "208.67.220.220", location: "US" },
|
|
312
|
+
{ name: "Comodo", ip: "8.26.56.26", location: "US" },
|
|
313
|
+
{ name: "CleanBrowsing", ip: "185.228.168.9", location: "EU" },
|
|
314
|
+
{ name: "AdGuard", ip: "94.140.14.14", location: "EU" },
|
|
315
|
+
{ name: "Yandex", ip: "77.88.8.8", location: "RU" },
|
|
316
|
+
{ name: "Ali DNS", ip: "223.5.5.5", location: "CN" },
|
|
317
|
+
{ name: "114DNS", ip: "114.114.114.114", location: "CN" },
|
|
318
|
+
{ name: "Verisign", ip: "64.6.64.6", location: "US" },
|
|
319
|
+
{ name: "Hurricane Electric", ip: "74.82.42.42", location: "US" },
|
|
320
|
+
{ name: "Freenom World", ip: "80.80.80.80", location: "EU" },
|
|
321
|
+
{ name: "UncensoredDNS", ip: "91.239.100.100", location: "DK" },
|
|
322
|
+
{ name: "DNS.WATCH", ip: "84.200.69.80", location: "DE" },
|
|
323
|
+
{ name: "SafeDNS", ip: "195.46.39.39", location: "RU" },
|
|
324
|
+
{ name: "CIRA Shield", ip: "149.112.121.10", location: "CA" },
|
|
325
|
+
];
|
|
326
|
+
// ─── Common subdomain wordlist (top 200) ───
|
|
327
|
+
export const SUBDOMAIN_WORDLIST = [
|
|
328
|
+
"www", "mail", "ftp", "localhost", "webmail", "smtp", "pop", "ns1", "ns2",
|
|
329
|
+
"ns3", "ns4", "dns", "dns1", "dns2", "api", "dev", "staging", "stg",
|
|
330
|
+
"test", "beta", "alpha", "demo", "app", "apps", "admin", "portal",
|
|
331
|
+
"blog", "shop", "store", "m", "mobile", "static", "assets", "cdn",
|
|
332
|
+
"media", "img", "images", "video", "vpn", "remote", "gateway", "gw",
|
|
333
|
+
"proxy", "cache", "web", "web1", "web2", "server", "server1", "server2",
|
|
334
|
+
"db", "database", "mysql", "postgres", "redis", "mongo", "elastic",
|
|
335
|
+
"search", "elasticsearch", "kibana", "grafana", "prometheus", "monitor",
|
|
336
|
+
"monitoring", "status", "health", "docs", "doc", "wiki", "help",
|
|
337
|
+
"support", "forum", "community", "git", "gitlab", "github", "bitbucket",
|
|
338
|
+
"ci", "cd", "jenkins", "travis", "drone", "auth", "login", "sso",
|
|
339
|
+
"oauth", "id", "identity", "accounts", "account", "dashboard", "panel",
|
|
340
|
+
"cp", "cpanel", "whm", "plesk", "cloud", "aws", "s3", "storage",
|
|
341
|
+
"backup", "bak", "old", "new", "v1", "v2", "api2", "rest", "graphql",
|
|
342
|
+
"ws", "wss", "socket", "realtime", "chat", "irc", "xmpp", "calendar",
|
|
343
|
+
"crm", "erp", "hr", "finance", "pay", "payment", "billing", "invoice",
|
|
344
|
+
"secure", "ssl", "tls", "https", "mx", "mx1", "mx2", "relay",
|
|
345
|
+
"outbound", "inbound", "internal", "private", "public", "ext",
|
|
346
|
+
"external", "partner", "client", "customer", "vendor", "corp",
|
|
347
|
+
"corporate", "office", "exchange", "autodiscover", "lyncdiscover",
|
|
348
|
+
"sip", "meet", "conference", "webex", "zoom", "teams", "slack",
|
|
349
|
+
"jira", "confluence", "notion", "trello", "asana", "redmine",
|
|
350
|
+
"bugzilla", "mantis", "nagios", "zabbix", "prtg", "splunk",
|
|
351
|
+
"siem", "log", "logs", "syslog", "audit", "analytics",
|
|
352
|
+
"tracking", "pixel", "ads", "ad", "marketing", "email",
|
|
353
|
+
"newsletter", "list", "lists", "subscribe", "unsubscribe",
|
|
354
|
+
"report", "reports", "data", "bigdata", "spark", "hadoop",
|
|
355
|
+
"kafka", "rabbit", "mq", "queue", "worker", "job", "jobs",
|
|
356
|
+
"cron", "scheduler", "task", "tasks", "sandbox", "lab",
|
|
357
|
+
"stage", "uat", "qa", "prod", "production", "live",
|
|
358
|
+
];
|
|
359
|
+
//# sourceMappingURL=dns-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns-client.js","sourceRoot":"","sources":["../../src/utils/dns-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AACA,qBAAa,WAAW;IAKV,OAAO,CAAC,UAAU;IAJ9B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,UAAU,CAAS;gBAEP,UAAU,EAAE,MAAM;IAEhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAOhB,YAAY;CAc3B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Queue-based rate limiter — ensures minimum delay between requests
|
|
2
|
+
export class RateLimiter {
|
|
3
|
+
minDelayMs;
|
|
4
|
+
lastRequest = 0;
|
|
5
|
+
queue = [];
|
|
6
|
+
processing = false;
|
|
7
|
+
constructor(minDelayMs) {
|
|
8
|
+
this.minDelayMs = minDelayMs;
|
|
9
|
+
}
|
|
10
|
+
async acquire() {
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
this.queue.push(resolve);
|
|
13
|
+
if (!this.processing)
|
|
14
|
+
this.processQueue();
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
async processQueue() {
|
|
18
|
+
this.processing = true;
|
|
19
|
+
while (this.queue.length > 0) {
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
const elapsed = now - this.lastRequest;
|
|
22
|
+
if (elapsed < this.minDelayMs) {
|
|
23
|
+
await sleep(this.minDelayMs - elapsed);
|
|
24
|
+
}
|
|
25
|
+
this.lastRequest = Date.now();
|
|
26
|
+
const resolve = this.queue.shift();
|
|
27
|
+
resolve?.();
|
|
28
|
+
}
|
|
29
|
+
this.processing = false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function sleep(ms) {
|
|
33
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=rate-limiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,OAAO,WAAW;IAKF;IAJZ,WAAW,GAAG,CAAC,CAAC;IAChB,KAAK,GAAmB,EAAE,CAAC;IAC3B,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAoB,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;YACvC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dns-security-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "DNS security intelligence MCP server — 104 tools for DNSSEC validation, hijacking detection, tunneling analysis, typosquatting, email security, certificate transparency, blocklist checking, infrastructure audit. 100% local, zero external API calls required.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dns-security-mcp": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"dev": "bun --watch run src/index.ts",
|
|
14
|
+
"build": "tsc -p tsconfig.build.json",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"model-context-protocol",
|
|
20
|
+
"dns",
|
|
21
|
+
"dns-security",
|
|
22
|
+
"dnssec",
|
|
23
|
+
"dns-hijacking",
|
|
24
|
+
"dns-tunneling",
|
|
25
|
+
"typosquatting",
|
|
26
|
+
"subdomain-takeover",
|
|
27
|
+
"email-security",
|
|
28
|
+
"spf",
|
|
29
|
+
"dkim",
|
|
30
|
+
"dmarc",
|
|
31
|
+
"certificate-transparency",
|
|
32
|
+
"blocklist",
|
|
33
|
+
"dnsbl",
|
|
34
|
+
"dns-privacy",
|
|
35
|
+
"doh",
|
|
36
|
+
"dot",
|
|
37
|
+
"threat-intelligence",
|
|
38
|
+
"cybersecurity",
|
|
39
|
+
"security",
|
|
40
|
+
"infosec",
|
|
41
|
+
"ai",
|
|
42
|
+
"ai-agent",
|
|
43
|
+
"claude",
|
|
44
|
+
"llm"
|
|
45
|
+
],
|
|
46
|
+
"author": "Orhan Yildirim <contact@orhanyildirim.us> (https://orhanyildirim.us)",
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/badchars/dns-security-mcp.git"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://www.npmjs.com/package/dns-security-mcp",
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
55
|
+
"dns-packet": "^5.6.1",
|
|
56
|
+
"zod": "^3.24.4"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/bun": "^1.3.10",
|
|
60
|
+
"@types/node": "^22.15.3",
|
|
61
|
+
"typescript": "^5.8.2"
|
|
62
|
+
}
|
|
63
|
+
}
|