fingerprint-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 +663 -0
- package/README.ar.md +767 -0
- package/README.bn.md +767 -0
- package/README.bs.md +767 -0
- package/README.da.md +767 -0
- package/README.de.md +770 -0
- package/README.el.md +767 -0
- package/README.es.md +769 -0
- package/README.fr.md +769 -0
- package/README.hi.md +767 -0
- package/README.it.md +767 -0
- package/README.ja.md +767 -0
- package/README.ko.md +772 -0
- package/README.md +767 -0
- package/README.no.md +767 -0
- package/README.pl.md +767 -0
- package/README.pt-BR.md +767 -0
- package/README.ru.md +767 -0
- package/README.th.md +767 -0
- package/README.tr.md +767 -0
- package/README.uk.md +767 -0
- package/README.vi.md +767 -0
- package/README.zh-TW.md +768 -0
- package/README.zh.md +768 -0
- package/dist/app/index.d.ts +3 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +614 -0
- package/dist/app/index.js.map +1 -0
- package/dist/composite/analyze.d.ts +3 -0
- package/dist/composite/analyze.d.ts.map +1 -0
- package/dist/composite/analyze.js +59 -0
- package/dist/composite/analyze.js.map +1 -0
- package/dist/composite/correlate.d.ts +3 -0
- package/dist/composite/correlate.d.ts.map +1 -0
- package/dist/composite/correlate.js +184 -0
- package/dist/composite/correlate.js.map +1 -0
- package/dist/composite/enumerate.d.ts +3 -0
- package/dist/composite/enumerate.d.ts.map +1 -0
- package/dist/composite/enumerate.js +94 -0
- package/dist/composite/enumerate.js.map +1 -0
- package/dist/composite/helpers.d.ts +22 -0
- package/dist/composite/helpers.d.ts.map +1 -0
- package/dist/composite/helpers.js +111 -0
- package/dist/composite/helpers.js.map +1 -0
- package/dist/composite/index.d.ts +3 -0
- package/dist/composite/index.d.ts.map +1 -0
- package/dist/composite/index.js +29 -0
- package/dist/composite/index.js.map +1 -0
- package/dist/composite/meta.d.ts +3 -0
- package/dist/composite/meta.d.ts.map +1 -0
- package/dist/composite/meta.js +23 -0
- package/dist/composite/meta.js.map +1 -0
- package/dist/composite/osint.d.ts +3 -0
- package/dist/composite/osint.d.ts.map +1 -0
- package/dist/composite/osint.js +40 -0
- package/dist/composite/osint.js.map +1 -0
- package/dist/composite/recon.d.ts +3 -0
- package/dist/composite/recon.d.ts.map +1 -0
- package/dist/composite/recon.js +131 -0
- package/dist/composite/recon.js.map +1 -0
- package/dist/composite/scan-dns.d.ts +3 -0
- package/dist/composite/scan-dns.d.ts.map +1 -0
- package/dist/composite/scan-dns.js +44 -0
- package/dist/composite/scan-dns.js.map +1 -0
- package/dist/composite/scan-http.d.ts +3 -0
- package/dist/composite/scan-http.d.ts.map +1 -0
- package/dist/composite/scan-http.js +68 -0
- package/dist/composite/scan-http.js.map +1 -0
- package/dist/composite/scan-paths.d.ts +3 -0
- package/dist/composite/scan-paths.d.ts.map +1 -0
- package/dist/composite/scan-paths.js +32 -0
- package/dist/composite/scan-paths.js.map +1 -0
- package/dist/composite/scan-ports.d.ts +3 -0
- package/dist/composite/scan-ports.d.ts.map +1 -0
- package/dist/composite/scan-ports.js +79 -0
- package/dist/composite/scan-ports.js.map +1 -0
- package/dist/composite/scan-services.d.ts +3 -0
- package/dist/composite/scan-services.d.ts.map +1 -0
- package/dist/composite/scan-services.js +111 -0
- package/dist/composite/scan-services.js.map +1 -0
- package/dist/composite/scan-tls.d.ts +3 -0
- package/dist/composite/scan-tls.d.ts.map +1 -0
- package/dist/composite/scan-tls.js +32 -0
- package/dist/composite/scan-tls.js.map +1 -0
- package/dist/composite/scan-waf.d.ts +3 -0
- package/dist/composite/scan-waf.d.ts.map +1 -0
- package/dist/composite/scan-waf.js +35 -0
- package/dist/composite/scan-waf.js.map +1 -0
- package/dist/correlation/index.d.ts +3 -0
- package/dist/correlation/index.d.ts.map +1 -0
- package/dist/correlation/index.js +1044 -0
- package/dist/correlation/index.js.map +1 -0
- package/dist/data/analytics-patterns.d.ts +21 -0
- package/dist/data/analytics-patterns.d.ts.map +1 -0
- package/dist/data/analytics-patterns.js +449 -0
- package/dist/data/analytics-patterns.js.map +1 -0
- package/dist/data/app-signatures.d.ts +52 -0
- package/dist/data/app-signatures.d.ts.map +1 -0
- package/dist/data/app-signatures.js +1143 -0
- package/dist/data/app-signatures.js.map +1 -0
- package/dist/data/c2-signatures.d.ts +54 -0
- package/dist/data/c2-signatures.d.ts.map +1 -0
- package/dist/data/c2-signatures.js +256 -0
- package/dist/data/c2-signatures.js.map +1 -0
- package/dist/data/cloud-ranges.d.ts +34 -0
- package/dist/data/cloud-ranges.d.ts.map +1 -0
- package/dist/data/cloud-ranges.js +628 -0
- package/dist/data/cloud-ranges.js.map +1 -0
- package/dist/data/cookie-patterns.d.ts +28 -0
- package/dist/data/cookie-patterns.d.ts.map +1 -0
- package/dist/data/cookie-patterns.js +225 -0
- package/dist/data/cookie-patterns.js.map +1 -0
- package/dist/data/error-signatures.d.ts +19 -0
- package/dist/data/error-signatures.d.ts.map +1 -0
- package/dist/data/error-signatures.js +321 -0
- package/dist/data/error-signatures.js.map +1 -0
- package/dist/data/favicon-hashes.d.ts +25 -0
- package/dist/data/favicon-hashes.d.ts.map +1 -0
- package/dist/data/favicon-hashes.js +249 -0
- package/dist/data/favicon-hashes.js.map +1 -0
- package/dist/data/h2-signatures.d.ts +50 -0
- package/dist/data/h2-signatures.d.ts.map +1 -0
- package/dist/data/h2-signatures.js +211 -0
- package/dist/data/h2-signatures.js.map +1 -0
- package/dist/data/header-order.d.ts +38 -0
- package/dist/data/header-order.d.ts.map +1 -0
- package/dist/data/header-order.js +185 -0
- package/dist/data/header-order.js.map +1 -0
- package/dist/data/jarm-signatures.d.ts +25 -0
- package/dist/data/jarm-signatures.d.ts.map +1 -0
- package/dist/data/jarm-signatures.js +213 -0
- package/dist/data/jarm-signatures.js.map +1 -0
- package/dist/data/saas-patterns.d.ts +23 -0
- package/dist/data/saas-patterns.d.ts.map +1 -0
- package/dist/data/saas-patterns.js +139 -0
- package/dist/data/saas-patterns.js.map +1 -0
- package/dist/data/sensitive-paths.d.ts +12 -0
- package/dist/data/sensitive-paths.d.ts.map +1 -0
- package/dist/data/sensitive-paths.js +1539 -0
- package/dist/data/sensitive-paths.js.map +1 -0
- package/dist/data/service-banners.d.ts +59 -0
- package/dist/data/service-banners.d.ts.map +1 -0
- package/dist/data/service-banners.js +323 -0
- package/dist/data/service-banners.js.map +1 -0
- package/dist/data/smtp-signatures.d.ts +12 -0
- package/dist/data/smtp-signatures.d.ts.map +1 -0
- package/dist/data/smtp-signatures.js +350 -0
- package/dist/data/smtp-signatures.js.map +1 -0
- package/dist/data/takeover-patterns.d.ts +37 -0
- package/dist/data/takeover-patterns.d.ts.map +1 -0
- package/dist/data/takeover-patterns.js +249 -0
- package/dist/data/takeover-patterns.js.map +1 -0
- package/dist/data/tech-patterns.d.ts +44 -0
- package/dist/data/tech-patterns.d.ts.map +1 -0
- package/dist/data/tech-patterns.js +690 -0
- package/dist/data/tech-patterns.js.map +1 -0
- package/dist/data/waf-signatures.d.ts +21 -0
- package/dist/data/waf-signatures.d.ts.map +1 -0
- package/dist/data/waf-signatures.js +318 -0
- package/dist/data/waf-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 +1067 -0
- package/dist/dns/index.js.map +1 -0
- package/dist/enum/index.d.ts +3 -0
- package/dist/enum/index.d.ts.map +1 -0
- package/dist/enum/index.js +818 -0
- package/dist/enum/index.js.map +1 -0
- package/dist/h2/index.d.ts +3 -0
- package/dist/h2/index.d.ts.map +1 -0
- package/dist/h2/index.js +414 -0
- package/dist/h2/index.js.map +1 -0
- package/dist/http/index.d.ts +3 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +2444 -0
- package/dist/http/index.js.map +1 -0
- package/dist/identify/index.d.ts +3 -0
- package/dist/identify/index.d.ts.map +1 -0
- package/dist/identify/index.js +447 -0
- package/dist/identify/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +165 -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 +989 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/iot/index.d.ts +3 -0
- package/dist/iot/index.d.ts.map +1 -0
- package/dist/iot/index.js +610 -0
- package/dist/iot/index.js.map +1 -0
- package/dist/meta/index.d.ts +3 -0
- package/dist/meta/index.d.ts.map +1 -0
- package/dist/meta/index.js +442 -0
- package/dist/meta/index.js.map +1 -0
- package/dist/osint/index.d.ts +3 -0
- package/dist/osint/index.d.ts.map +1 -0
- package/dist/osint/index.js +687 -0
- package/dist/osint/index.js.map +1 -0
- package/dist/passive/index.d.ts +3 -0
- package/dist/passive/index.d.ts.map +1 -0
- package/dist/passive/index.js +944 -0
- package/dist/passive/index.js.map +1 -0
- package/dist/path/index.d.ts +3 -0
- package/dist/path/index.d.ts.map +1 -0
- package/dist/path/index.js +878 -0
- package/dist/path/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 +5 -0
- package/dist/protocol/tools.js.map +1 -0
- package/dist/service/index.d.ts +3 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/index.js +1053 -0
- package/dist/service/index.js.map +1 -0
- package/dist/smtp/index.d.ts +3 -0
- package/dist/smtp/index.d.ts.map +1 -0
- package/dist/smtp/index.js +437 -0
- package/dist/smtp/index.js.map +1 -0
- package/dist/ssh/index.d.ts +3 -0
- package/dist/ssh/index.d.ts.map +1 -0
- package/dist/ssh/index.js +676 -0
- package/dist/ssh/index.js.map +1 -0
- package/dist/tcp/index.d.ts +3 -0
- package/dist/tcp/index.d.ts.map +1 -0
- package/dist/tcp/index.js +369 -0
- package/dist/tcp/index.js.map +1 -0
- package/dist/timing/index.d.ts +3 -0
- package/dist/timing/index.d.ts.map +1 -0
- package/dist/timing/index.js +425 -0
- package/dist/timing/index.js.map +1 -0
- package/dist/tls/index.d.ts +3 -0
- package/dist/tls/index.d.ts.map +1 -0
- package/dist/tls/index.js +1332 -0
- package/dist/tls/index.js.map +1 -0
- package/dist/types/index.d.ts +26 -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/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/murmurhash3.d.ts +3 -0
- package/dist/utils/murmurhash3.d.ts.map +1 -0
- package/dist/utils/murmurhash3.js +57 -0
- package/dist/utils/murmurhash3.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/dist/utils/require-key.d.ts +2 -0
- package/dist/utils/require-key.d.ts.map +1 -0
- package/dist/utils/require-key.js +8 -0
- package/dist/utils/require-key.js.map +1 -0
- package/dist/waf/index.d.ts +3 -0
- package/dist/waf/index.d.ts.map +1 -0
- package/dist/waf/index.js +767 -0
- package/dist/waf/index.js.map +1 -0
- package/dist/web/index.d.ts +3 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +1366 -0
- package/dist/web/index.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,610 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as dgram from "node:dgram";
|
|
3
|
+
import * as net from "node:net";
|
|
4
|
+
import { json } from "../types/index.js";
|
|
5
|
+
import { RateLimiter } from "../utils/rate-limiter.js";
|
|
6
|
+
// ─── Rate Limiter ───
|
|
7
|
+
const limiter = new RateLimiter(500);
|
|
8
|
+
// ─── Constants ───
|
|
9
|
+
const UDP_TIMEOUT = 4_000; // 4 seconds for UDP operations
|
|
10
|
+
const TCP_TIMEOUT = 5_000; // 5 seconds for TCP connections
|
|
11
|
+
const SSDP_MULTICAST_ADDR = "239.255.255.250";
|
|
12
|
+
const SSDP_PORT = 1900;
|
|
13
|
+
const SSDP_MSEARCH = [
|
|
14
|
+
"M-SEARCH * HTTP/1.1",
|
|
15
|
+
`HOST: ${SSDP_MULTICAST_ADDR}:${SSDP_PORT}`,
|
|
16
|
+
'MAN: "ssdp:discover"',
|
|
17
|
+
"MX: 3",
|
|
18
|
+
"ST: ssdp:all",
|
|
19
|
+
"",
|
|
20
|
+
"",
|
|
21
|
+
].join("\r\n");
|
|
22
|
+
// SNMP GET request for sysDescr.0 (OID 1.3.6.1.2.1.1.1.0) using "public" community
|
|
23
|
+
// Minimal SNMPv1 GET-Request packet
|
|
24
|
+
const SNMP_PORT = 161;
|
|
25
|
+
// Common IoT probe paths
|
|
26
|
+
const IOT_PROBE_PATHS = [
|
|
27
|
+
{ path: "/", label: "Root" },
|
|
28
|
+
{ path: "/cgi-bin/", label: "CGI-BIN (routers/cameras)" },
|
|
29
|
+
{ path: "/HNAP1/", label: "HNAP1 (D-Link routers)" },
|
|
30
|
+
{ path: "/api/system", label: "Generic IoT API" },
|
|
31
|
+
{ path: "/login.htm", label: "Login page (routers)" },
|
|
32
|
+
{ path: "/index.asp", label: "ASP index (IP cameras)" },
|
|
33
|
+
{ path: "/doc/page/login.asp", label: "Hikvision login" },
|
|
34
|
+
{ path: "/login.cgi", label: "CGI login (cameras)" },
|
|
35
|
+
{ path: "/System/configurationFile?auth=YWRtaW46YTFCMKM0NTY=", label: "Default config (Dahua)" },
|
|
36
|
+
{ path: "/goform/homepage", label: "Goform (Tenda/TP-Link)" },
|
|
37
|
+
];
|
|
38
|
+
const IOT_MANAGEMENT_PORTS = [80, 443, 8080, 8443, 8888, 4443, 8000];
|
|
39
|
+
// IPMI port
|
|
40
|
+
const IPMI_PORT = 623;
|
|
41
|
+
// ─── Helpers ───
|
|
42
|
+
/**
|
|
43
|
+
* Send a UDP packet and wait for responses within a timeout.
|
|
44
|
+
*/
|
|
45
|
+
function udpProbe(host, port, payload, timeoutMs = UDP_TIMEOUT) {
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
const responses = [];
|
|
48
|
+
const socket = dgram.createSocket("udp4");
|
|
49
|
+
const timer = setTimeout(() => {
|
|
50
|
+
socket.close();
|
|
51
|
+
resolve({ responses });
|
|
52
|
+
}, timeoutMs);
|
|
53
|
+
socket.on("message", (msg, rinfo) => {
|
|
54
|
+
responses.push({ data: msg, rinfo });
|
|
55
|
+
});
|
|
56
|
+
socket.on("error", () => {
|
|
57
|
+
clearTimeout(timer);
|
|
58
|
+
try {
|
|
59
|
+
socket.close();
|
|
60
|
+
}
|
|
61
|
+
catch { /* ignore */ }
|
|
62
|
+
resolve({ responses });
|
|
63
|
+
});
|
|
64
|
+
socket.send(payload, 0, payload.length, port, host, (err) => {
|
|
65
|
+
if (err) {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
try {
|
|
68
|
+
socket.close();
|
|
69
|
+
}
|
|
70
|
+
catch { /* ignore */ }
|
|
71
|
+
resolve({ responses });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Check if a TCP port is open.
|
|
78
|
+
*/
|
|
79
|
+
function tcpCheck(host, port, timeoutMs = TCP_TIMEOUT) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
const socket = new net.Socket();
|
|
82
|
+
let banner = "";
|
|
83
|
+
const timer = setTimeout(() => {
|
|
84
|
+
socket.destroy();
|
|
85
|
+
resolve({ open: false, banner: "" });
|
|
86
|
+
}, timeoutMs);
|
|
87
|
+
socket.on("connect", () => {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
// Try to read a banner
|
|
90
|
+
const bannerTimer = setTimeout(() => {
|
|
91
|
+
socket.destroy();
|
|
92
|
+
resolve({ open: true, banner });
|
|
93
|
+
}, 2_000);
|
|
94
|
+
socket.on("data", (data) => {
|
|
95
|
+
banner += data.toString("utf-8").slice(0, 512);
|
|
96
|
+
clearTimeout(bannerTimer);
|
|
97
|
+
socket.destroy();
|
|
98
|
+
resolve({ open: true, banner });
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
socket.on("error", () => {
|
|
102
|
+
clearTimeout(timer);
|
|
103
|
+
socket.destroy();
|
|
104
|
+
resolve({ open: false, banner: "" });
|
|
105
|
+
});
|
|
106
|
+
socket.connect(port, host);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* HTTP probe a specific path on a host.
|
|
111
|
+
*/
|
|
112
|
+
async function httpProbe(host, port, path) {
|
|
113
|
+
try {
|
|
114
|
+
const protocol = port === 443 || port === 8443 || port === 4443 ? "https" : "http";
|
|
115
|
+
const controller = new AbortController();
|
|
116
|
+
const timeout = setTimeout(() => controller.abort(), TCP_TIMEOUT);
|
|
117
|
+
const res = await fetch(`${protocol}://${host}:${port}${path}`, {
|
|
118
|
+
signal: controller.signal,
|
|
119
|
+
redirect: "manual",
|
|
120
|
+
headers: {
|
|
121
|
+
"User-Agent": "Mozilla/5.0 (compatible; IoTProbe/1.0)",
|
|
122
|
+
Accept: "*/*",
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
clearTimeout(timeout);
|
|
126
|
+
const body = await res.text().catch(() => "");
|
|
127
|
+
const titleMatch = body.match(/<title[^>]*>([^<]*)<\/title>/i);
|
|
128
|
+
return {
|
|
129
|
+
status: res.status,
|
|
130
|
+
server: res.headers.get("server") ?? "",
|
|
131
|
+
title: titleMatch?.[1]?.trim() ?? "",
|
|
132
|
+
powered_by: res.headers.get("x-powered-by") ?? "",
|
|
133
|
+
content_length: body.length,
|
|
134
|
+
redirects_to: res.headers.get("location") ?? "",
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Build a minimal SNMPv1 GET-Request for sysDescr.0 (1.3.6.1.2.1.1.1.0).
|
|
143
|
+
*/
|
|
144
|
+
function buildSnmpGetRequest(community) {
|
|
145
|
+
// SNMPv1 GET-Request PDU for OID 1.3.6.1.2.1.1.1.0 (sysDescr.0)
|
|
146
|
+
const communityBuf = Buffer.from(community, "ascii");
|
|
147
|
+
// OID 1.3.6.1.2.1.1.1.0 encoded as BER
|
|
148
|
+
const oid = Buffer.from([
|
|
149
|
+
0x06, 0x08, // OBJECT IDENTIFIER, length 8
|
|
150
|
+
0x2b, 0x06, 0x01, 0x02, 0x01, 0x01, 0x01, 0x00, // 1.3.6.1.2.1.1.1.0
|
|
151
|
+
]);
|
|
152
|
+
// VarBind: SEQUENCE { oid, NULL }
|
|
153
|
+
const nullValue = Buffer.from([0x05, 0x00]); // NULL
|
|
154
|
+
const varBind = Buffer.concat([
|
|
155
|
+
Buffer.from([0x30, oid.length + nullValue.length]), // SEQUENCE
|
|
156
|
+
oid,
|
|
157
|
+
nullValue,
|
|
158
|
+
]);
|
|
159
|
+
// VarBindList: SEQUENCE { varBind }
|
|
160
|
+
const varBindList = Buffer.concat([
|
|
161
|
+
Buffer.from([0x30, varBind.length]), // SEQUENCE
|
|
162
|
+
varBind,
|
|
163
|
+
]);
|
|
164
|
+
// Request ID (4 bytes)
|
|
165
|
+
const requestId = Buffer.from([
|
|
166
|
+
0x02, 0x04, // INTEGER, length 4
|
|
167
|
+
0x00, 0x00, 0x00, 0x01, // request-id = 1
|
|
168
|
+
]);
|
|
169
|
+
// Error status and error index (both 0)
|
|
170
|
+
const errorStatus = Buffer.from([0x02, 0x01, 0x00]); // INTEGER 0
|
|
171
|
+
const errorIndex = Buffer.from([0x02, 0x01, 0x00]); // INTEGER 0
|
|
172
|
+
// GET-Request PDU
|
|
173
|
+
const pduContent = Buffer.concat([requestId, errorStatus, errorIndex, varBindList]);
|
|
174
|
+
const pdu = Buffer.concat([
|
|
175
|
+
Buffer.from([0xa0, pduContent.length]), // GetRequest-PDU tag (0xa0)
|
|
176
|
+
pduContent,
|
|
177
|
+
]);
|
|
178
|
+
// SNMP Message: SEQUENCE { version, community, pdu }
|
|
179
|
+
const version = Buffer.from([0x02, 0x01, 0x00]); // INTEGER 0 (SNMPv1)
|
|
180
|
+
const communityTlv = Buffer.concat([
|
|
181
|
+
Buffer.from([0x04, communityBuf.length]), // OCTET STRING
|
|
182
|
+
communityBuf,
|
|
183
|
+
]);
|
|
184
|
+
const messageContent = Buffer.concat([version, communityTlv, pdu]);
|
|
185
|
+
const message = Buffer.concat([
|
|
186
|
+
Buffer.from([0x30, messageContent.length]), // SEQUENCE
|
|
187
|
+
messageContent,
|
|
188
|
+
]);
|
|
189
|
+
return message;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Parse a basic SNMP response to extract sysDescr string.
|
|
193
|
+
*/
|
|
194
|
+
function parseSnmpResponse(data) {
|
|
195
|
+
try {
|
|
196
|
+
// Simple extraction: look for OCTET STRING values after the OID
|
|
197
|
+
// The response contains the sysDescr as an OCTET STRING
|
|
198
|
+
// Walk through the buffer looking for 0x04 (OCTET STRING) tags
|
|
199
|
+
// that contain printable ASCII text
|
|
200
|
+
const str = data.toString("ascii");
|
|
201
|
+
// Find the last substantial OCTET STRING in the response
|
|
202
|
+
let bestMatch = "";
|
|
203
|
+
for (let i = 0; i < data.length - 2; i++) {
|
|
204
|
+
if (data[i] === 0x04) {
|
|
205
|
+
const len = data[i + 1];
|
|
206
|
+
if (len > 5 && len < 200 && i + 2 + len <= data.length) {
|
|
207
|
+
const candidate = data.subarray(i + 2, i + 2 + len).toString("utf-8");
|
|
208
|
+
// Check if it's mostly printable ASCII
|
|
209
|
+
const printable = candidate.replace(/[^\x20-\x7e]/g, "");
|
|
210
|
+
if (printable.length > candidate.length * 0.8 && candidate.length > bestMatch.length) {
|
|
211
|
+
bestMatch = candidate;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return bestMatch || null;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Parse SSDP response headers.
|
|
224
|
+
*/
|
|
225
|
+
function parseSsdpResponse(data) {
|
|
226
|
+
const headers = {};
|
|
227
|
+
const lines = data.split("\r\n");
|
|
228
|
+
for (const line of lines) {
|
|
229
|
+
const colonIdx = line.indexOf(":");
|
|
230
|
+
if (colonIdx > 0) {
|
|
231
|
+
const key = line.substring(0, colonIdx).trim().toLowerCase();
|
|
232
|
+
const value = line.substring(colonIdx + 1).trim();
|
|
233
|
+
headers[key] = value;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return headers;
|
|
237
|
+
}
|
|
238
|
+
// ─── Tool 1: iot_probe ───
|
|
239
|
+
const iotProbe = {
|
|
240
|
+
name: "iot_probe",
|
|
241
|
+
description: "Detect IoT and embedded devices on a target host. Performs UPnP/SSDP discovery (UDP multicast M-SEARCH on 239.255.255.250:1900), " +
|
|
242
|
+
"probes common IoT ports and web management paths (/cgi-bin/, /HNAP1/, /api/system), " +
|
|
243
|
+
"SNMP community string probing (port 161 UDP with 'public' and 'private' communities to extract sysDescr), " +
|
|
244
|
+
"and IPMI detection on port 623 UDP. Identifies device type, manufacturer, model, and firmware where possible.",
|
|
245
|
+
schema: {
|
|
246
|
+
host: z.string().describe("Target host IP for IoT device detection"),
|
|
247
|
+
ports: z
|
|
248
|
+
.array(z.number())
|
|
249
|
+
.optional()
|
|
250
|
+
.describe("Additional ports to probe"),
|
|
251
|
+
},
|
|
252
|
+
async execute(args) {
|
|
253
|
+
const host = args.host;
|
|
254
|
+
const extraPorts = args.ports ?? [];
|
|
255
|
+
await limiter.acquire();
|
|
256
|
+
const results = {
|
|
257
|
+
ssdp: { discovered: false, devices: [] },
|
|
258
|
+
web_management: [],
|
|
259
|
+
snmp: { port_open: false, community_found: null, sys_descr: null },
|
|
260
|
+
ipmi: { port_open: false },
|
|
261
|
+
device_hints: [],
|
|
262
|
+
};
|
|
263
|
+
// 1. SSDP/UPnP Discovery (only useful for local network targets)
|
|
264
|
+
const isLocalTarget = host.startsWith("192.168.") ||
|
|
265
|
+
host.startsWith("10.") ||
|
|
266
|
+
/^172\.(1[6-9]|2\d|3[01])\./.test(host) ||
|
|
267
|
+
host === "127.0.0.1" ||
|
|
268
|
+
host === "localhost";
|
|
269
|
+
if (isLocalTarget) {
|
|
270
|
+
try {
|
|
271
|
+
const ssdpPayload = Buffer.from(SSDP_MSEARCH, "ascii");
|
|
272
|
+
const { responses } = await udpProbe(SSDP_MULTICAST_ADDR, SSDP_PORT, ssdpPayload, UDP_TIMEOUT);
|
|
273
|
+
for (const { data } of responses) {
|
|
274
|
+
const responseText = data.toString("utf-8");
|
|
275
|
+
const headers = parseSsdpResponse(responseText);
|
|
276
|
+
results.ssdp.devices.push({
|
|
277
|
+
location: headers["location"] ?? "",
|
|
278
|
+
server: headers["server"] ?? "",
|
|
279
|
+
st: headers["st"] ?? "",
|
|
280
|
+
usn: headers["usn"] ?? "",
|
|
281
|
+
headers,
|
|
282
|
+
});
|
|
283
|
+
if (headers["server"]) {
|
|
284
|
+
results.device_hints.push(`SSDP server: ${headers["server"]}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
results.ssdp.discovered = results.ssdp.devices.length > 0;
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
// SSDP may not be available
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// 2. Web management probing on common IoT ports
|
|
294
|
+
const portsToProbe = [...new Set([...IOT_MANAGEMENT_PORTS, ...extraPorts])];
|
|
295
|
+
for (const port of portsToProbe) {
|
|
296
|
+
await limiter.acquire();
|
|
297
|
+
const portCheck = await tcpCheck(host, port, TCP_TIMEOUT);
|
|
298
|
+
if (!portCheck.open)
|
|
299
|
+
continue;
|
|
300
|
+
const portResult = {
|
|
301
|
+
port,
|
|
302
|
+
open: true,
|
|
303
|
+
paths: [],
|
|
304
|
+
};
|
|
305
|
+
if (portCheck.banner) {
|
|
306
|
+
results.device_hints.push(`Banner on port ${port}: ${portCheck.banner.trim().slice(0, 200)}`);
|
|
307
|
+
}
|
|
308
|
+
// Probe IoT-specific paths
|
|
309
|
+
for (const { path, label } of IOT_PROBE_PATHS) {
|
|
310
|
+
const probeResult = await httpProbe(host, port, path);
|
|
311
|
+
if (probeResult && probeResult.status !== 0) {
|
|
312
|
+
portResult.paths.push({
|
|
313
|
+
path,
|
|
314
|
+
label,
|
|
315
|
+
status: probeResult.status,
|
|
316
|
+
server: probeResult.server,
|
|
317
|
+
title: probeResult.title,
|
|
318
|
+
powered_by: probeResult.powered_by,
|
|
319
|
+
});
|
|
320
|
+
// Extract device hints from server header and page title
|
|
321
|
+
if (probeResult.server) {
|
|
322
|
+
results.device_hints.push(`Server (${port}${path}): ${probeResult.server}`);
|
|
323
|
+
}
|
|
324
|
+
if (probeResult.title) {
|
|
325
|
+
results.device_hints.push(`Title (${port}${path}): ${probeResult.title}`);
|
|
326
|
+
}
|
|
327
|
+
// Detect specific IoT device patterns
|
|
328
|
+
const combined = `${probeResult.server} ${probeResult.title} ${probeResult.powered_by}`.toLowerCase();
|
|
329
|
+
if (/hikvision/i.test(combined))
|
|
330
|
+
results.device_hints.push("Device: Hikvision (IP camera/NVR)");
|
|
331
|
+
if (/dahua/i.test(combined))
|
|
332
|
+
results.device_hints.push("Device: Dahua (IP camera/NVR)");
|
|
333
|
+
if (/d-link/i.test(combined))
|
|
334
|
+
results.device_hints.push("Device: D-Link (router/camera)");
|
|
335
|
+
if (/tp-link|tplink/i.test(combined))
|
|
336
|
+
results.device_hints.push("Device: TP-Link (router/AP)");
|
|
337
|
+
if (/netgear/i.test(combined))
|
|
338
|
+
results.device_hints.push("Device: Netgear (router)");
|
|
339
|
+
if (/linksys/i.test(combined))
|
|
340
|
+
results.device_hints.push("Device: Linksys (router)");
|
|
341
|
+
if (/mikrotik|routeros/i.test(combined))
|
|
342
|
+
results.device_hints.push("Device: MikroTik (RouterOS)");
|
|
343
|
+
if (/ubiquiti|unifi/i.test(combined))
|
|
344
|
+
results.device_hints.push("Device: Ubiquiti (UniFi/EdgeOS)");
|
|
345
|
+
if (/synology/i.test(combined))
|
|
346
|
+
results.device_hints.push("Device: Synology (NAS)");
|
|
347
|
+
if (/qnap/i.test(combined))
|
|
348
|
+
results.device_hints.push("Device: QNAP (NAS)");
|
|
349
|
+
if (/boa\/|mini_httpd|lighttpd|goahead/i.test(combined))
|
|
350
|
+
results.device_hints.push("Embedded web server detected");
|
|
351
|
+
}
|
|
352
|
+
await limiter.acquire();
|
|
353
|
+
}
|
|
354
|
+
if (portResult.paths.length > 0) {
|
|
355
|
+
results.web_management.push(portResult);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// 3. SNMP community string probing
|
|
359
|
+
const snmpCommunities = ["public", "private"];
|
|
360
|
+
for (const community of snmpCommunities) {
|
|
361
|
+
try {
|
|
362
|
+
const snmpPacket = buildSnmpGetRequest(community);
|
|
363
|
+
const { responses } = await udpProbe(host, SNMP_PORT, snmpPacket, UDP_TIMEOUT);
|
|
364
|
+
if (responses.length > 0) {
|
|
365
|
+
results.snmp.port_open = true;
|
|
366
|
+
results.snmp.community_found = community;
|
|
367
|
+
const sysDescr = parseSnmpResponse(responses[0].data);
|
|
368
|
+
if (sysDescr) {
|
|
369
|
+
results.snmp.sys_descr = sysDescr;
|
|
370
|
+
results.device_hints.push(`SNMP sysDescr (community '${community}'): ${sysDescr}`);
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
results.device_hints.push(`SNMP responds to community '${community}' but sysDescr could not be parsed`);
|
|
374
|
+
}
|
|
375
|
+
break; // Found a working community, stop trying
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// SNMP probe may fail
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// 4. IPMI detection (port 623 UDP)
|
|
383
|
+
try {
|
|
384
|
+
// IPMI RMCP ping: version 0x06, reserved 0x00, sequence 0xFF, class 0x06 (ASF)
|
|
385
|
+
// ASF presence ping
|
|
386
|
+
const ipmiPing = Buffer.from([
|
|
387
|
+
0x06, 0x00, 0xff, 0x06, // RMCP header
|
|
388
|
+
0x00, 0x00, 0x11, 0xbe, // ASF IANA
|
|
389
|
+
0x80, // ASF message type (presence ping)
|
|
390
|
+
0x00, // message tag
|
|
391
|
+
0x00, // reserved
|
|
392
|
+
0x00, // data length
|
|
393
|
+
]);
|
|
394
|
+
const { responses } = await udpProbe(host, IPMI_PORT, ipmiPing, UDP_TIMEOUT);
|
|
395
|
+
if (responses.length > 0) {
|
|
396
|
+
results.ipmi.port_open = true;
|
|
397
|
+
results.device_hints.push("IPMI/BMC detected on port 623 (server hardware with out-of-band management)");
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
// IPMI probe may fail
|
|
402
|
+
}
|
|
403
|
+
// Deduplicate device hints
|
|
404
|
+
results.device_hints = [...new Set(results.device_hints)];
|
|
405
|
+
return json({
|
|
406
|
+
host,
|
|
407
|
+
is_local_target: isLocalTarget,
|
|
408
|
+
...results,
|
|
409
|
+
});
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
// ─── Tool 2: iot_mac_lookup ───
|
|
413
|
+
// OUI prefix database (~50 common entries)
|
|
414
|
+
const OUI_DATABASE = {
|
|
415
|
+
"005056": "VMware",
|
|
416
|
+
"000C29": "VMware",
|
|
417
|
+
"001C14": "VMware",
|
|
418
|
+
"0050C2": "IEEE Registration Authority",
|
|
419
|
+
"00163E": "Xen (virtual)",
|
|
420
|
+
"080027": "Oracle VirtualBox",
|
|
421
|
+
"0A0027": "Oracle VirtualBox",
|
|
422
|
+
"B827EB": "Raspberry Pi Foundation",
|
|
423
|
+
"DCA632": "Raspberry Pi Foundation",
|
|
424
|
+
"E45F01": "Raspberry Pi Foundation",
|
|
425
|
+
"D83ADD": "Raspberry Pi Foundation",
|
|
426
|
+
"001B44": "Dell",
|
|
427
|
+
"001A2B": "Cisco Systems",
|
|
428
|
+
"00259C": "Cisco Systems",
|
|
429
|
+
"001839": "Cisco Systems",
|
|
430
|
+
"0025B5": "Hewlett Packard",
|
|
431
|
+
"3C4A92": "Hewlett Packard",
|
|
432
|
+
"001E67": "Intel Corporate",
|
|
433
|
+
"001CC0": "Intel Corporate",
|
|
434
|
+
"A4BADB": "Intel Corporate",
|
|
435
|
+
"001AA0": "Dell",
|
|
436
|
+
"F0DEF1": "Google",
|
|
437
|
+
"3C5AB4": "Google",
|
|
438
|
+
"A47733": "Google",
|
|
439
|
+
"3C22FB": "Apple",
|
|
440
|
+
"A483E7": "Apple",
|
|
441
|
+
"F0D1A9": "Apple",
|
|
442
|
+
"6C709F": "Apple",
|
|
443
|
+
"AC87A3": "Apple",
|
|
444
|
+
"D0817A": "Apple",
|
|
445
|
+
"000DB9": "PC Engines (APU)",
|
|
446
|
+
"001C42": "Parallels",
|
|
447
|
+
"00155D": "Microsoft Hyper-V",
|
|
448
|
+
"B4FBE4": "Ubiquiti Networks",
|
|
449
|
+
"18E829": "Ubiquiti Networks",
|
|
450
|
+
"788A20": "Ubiquiti Networks",
|
|
451
|
+
"68D79A": "Ubiquiti Networks",
|
|
452
|
+
"0024A5": "Synology",
|
|
453
|
+
"001132": "Synology",
|
|
454
|
+
"443839": "Cumulus Networks",
|
|
455
|
+
"000F66": "MikroTik",
|
|
456
|
+
"D4CA6D": "MikroTik",
|
|
457
|
+
"6C3B6B": "MikroTik",
|
|
458
|
+
"E48D8C": "MikroTik",
|
|
459
|
+
"C4AD34": "Routerboard (MikroTik)",
|
|
460
|
+
"001E58": "D-Link",
|
|
461
|
+
"1CBDB9": "D-Link",
|
|
462
|
+
"28107B": "D-Link",
|
|
463
|
+
"C0A0BB": "D-Link",
|
|
464
|
+
"5C497D": "TP-Link",
|
|
465
|
+
"E894F6": "TP-Link",
|
|
466
|
+
"6466B3": "TP-Link",
|
|
467
|
+
"E8DE27": "TP-Link",
|
|
468
|
+
"28EE52": "Netgear",
|
|
469
|
+
"C43DC7": "Netgear",
|
|
470
|
+
"A040A0": "Netgear",
|
|
471
|
+
"001AA1": "Cisco Linksys (Belkin)",
|
|
472
|
+
"20AA4B": "Cisco Linksys (Belkin)",
|
|
473
|
+
"58EF68": "Aruba Networks",
|
|
474
|
+
"000B86": "Aruba Networks",
|
|
475
|
+
"D8C7C8": "Aruba Networks",
|
|
476
|
+
"485B39": "Hewlett Packard Enterprise",
|
|
477
|
+
"2CF0A2": "Asus",
|
|
478
|
+
"10C37B": "Asus",
|
|
479
|
+
"60A44C": "Asus",
|
|
480
|
+
"0090A9": "Western Digital",
|
|
481
|
+
"001673": "Zyxel (ZyXEL Communications)",
|
|
482
|
+
"C86C87": "Zyxel (ZyXEL Communications)",
|
|
483
|
+
"001D09": "Dell (iDRAC)",
|
|
484
|
+
"005054": "QEMU/KVM (virtual)",
|
|
485
|
+
"525400": "QEMU/KVM (virtual)",
|
|
486
|
+
"000569": "VMware (ESXi vSwitch)",
|
|
487
|
+
"00249B": "Amazon (AWS)",
|
|
488
|
+
"0A5871": "Amazon (AWS ENI)",
|
|
489
|
+
"06B946": "Amazon (AWS ENI)",
|
|
490
|
+
"0CD0F8": "Samsung",
|
|
491
|
+
"A0CBFD": "Samsung",
|
|
492
|
+
"000AEB": "TP-Link",
|
|
493
|
+
"001EE5": "Cisco Meraki",
|
|
494
|
+
"0018A5": "Hikvision",
|
|
495
|
+
"38AF29": "Hikvision",
|
|
496
|
+
"C0563A": "Hikvision",
|
|
497
|
+
"E05FB9": "Hikvision",
|
|
498
|
+
"34A846": "Dahua",
|
|
499
|
+
"A063A1": "Dahua",
|
|
500
|
+
"B0C5CA": "Dahua",
|
|
501
|
+
};
|
|
502
|
+
/**
|
|
503
|
+
* Normalize a MAC address to uppercase hex without separators.
|
|
504
|
+
*/
|
|
505
|
+
function normalizeMac(mac) {
|
|
506
|
+
return mac.replace(/[:\-\.]/g, "").toUpperCase();
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Format a MAC address in standard colon-separated notation.
|
|
510
|
+
*/
|
|
511
|
+
function formatMac(normalized) {
|
|
512
|
+
return normalized.match(/.{1,2}/g)?.join(":") ?? normalized;
|
|
513
|
+
}
|
|
514
|
+
const iotMacLookup = {
|
|
515
|
+
name: "iot_mac_lookup",
|
|
516
|
+
description: "Look up the manufacturer/vendor of a network device by its MAC address using OUI (Organizationally Unique Identifier) prefix matching. " +
|
|
517
|
+
"Supports any MAC format: XX:XX:XX:XX:XX:XX, XX-XX-XX-XX-XX-XX, or XXXXXXXXXXXX. " +
|
|
518
|
+
"Includes ~80 common OUI prefixes covering VMware, Cisco, Apple, Raspberry Pi, Ubiquiti, MikroTik, Hikvision, Dahua, and more.",
|
|
519
|
+
schema: {
|
|
520
|
+
mac: z
|
|
521
|
+
.string()
|
|
522
|
+
.describe("MAC address (any format: XX:XX:XX:XX:XX:XX, XX-XX-XX-XX-XX-XX, or XXXXXXXXXXXX)"),
|
|
523
|
+
},
|
|
524
|
+
async execute(args) {
|
|
525
|
+
const rawMac = args.mac;
|
|
526
|
+
const normalized = normalizeMac(rawMac);
|
|
527
|
+
// Validate MAC format
|
|
528
|
+
if (!/^[0-9A-F]{12}$/.test(normalized)) {
|
|
529
|
+
return json({
|
|
530
|
+
error: "Invalid MAC address format",
|
|
531
|
+
input: rawMac,
|
|
532
|
+
expected_formats: [
|
|
533
|
+
"XX:XX:XX:XX:XX:XX",
|
|
534
|
+
"XX-XX-XX-XX-XX-XX",
|
|
535
|
+
"XXXXXXXXXXXX",
|
|
536
|
+
],
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
const oui = normalized.substring(0, 6);
|
|
540
|
+
const manufacturer = OUI_DATABASE[oui] ?? null;
|
|
541
|
+
// Determine device category based on manufacturer
|
|
542
|
+
let category = "Unknown";
|
|
543
|
+
if (manufacturer) {
|
|
544
|
+
const mfgLower = manufacturer.toLowerCase();
|
|
545
|
+
if (/vmware|virtualbox|hyper-v|parallels|xen|qemu|kvm|virtual/i.test(manufacturer)) {
|
|
546
|
+
category = "Virtual Machine / Hypervisor";
|
|
547
|
+
}
|
|
548
|
+
else if (/raspberry pi/i.test(manufacturer)) {
|
|
549
|
+
category = "Single-Board Computer (SBC)";
|
|
550
|
+
}
|
|
551
|
+
else if (/cisco|mikrotik|routerboard|tp-link|netgear|linksys|d-link|asus|zyxel|aruba/i.test(manufacturer)) {
|
|
552
|
+
category = "Network Equipment (Router/Switch/AP)";
|
|
553
|
+
}
|
|
554
|
+
else if (/ubiquiti/i.test(manufacturer)) {
|
|
555
|
+
category = "Network Equipment (Ubiquiti)";
|
|
556
|
+
}
|
|
557
|
+
else if (/hikvision|dahua/i.test(manufacturer)) {
|
|
558
|
+
category = "IP Camera / NVR / DVR";
|
|
559
|
+
}
|
|
560
|
+
else if (/synology|qnap|western digital/i.test(manufacturer)) {
|
|
561
|
+
category = "Network Attached Storage (NAS)";
|
|
562
|
+
}
|
|
563
|
+
else if (/apple/i.test(manufacturer)) {
|
|
564
|
+
category = "Apple Device";
|
|
565
|
+
}
|
|
566
|
+
else if (/google/i.test(manufacturer)) {
|
|
567
|
+
category = "Google Device";
|
|
568
|
+
}
|
|
569
|
+
else if (/samsung/i.test(manufacturer)) {
|
|
570
|
+
category = "Samsung Device";
|
|
571
|
+
}
|
|
572
|
+
else if (/dell|hewlett|intel|pc engines/i.test(manufacturer)) {
|
|
573
|
+
category = "Server / Workstation";
|
|
574
|
+
}
|
|
575
|
+
else if (/amazon|aws/i.test(manufacturer)) {
|
|
576
|
+
category = "Cloud Instance (AWS)";
|
|
577
|
+
}
|
|
578
|
+
else if (/cisco meraki/i.test(manufacturer)) {
|
|
579
|
+
category = "Cloud-Managed Network (Meraki)";
|
|
580
|
+
}
|
|
581
|
+
else if (/idrac/i.test(mfgLower)) {
|
|
582
|
+
category = "Out-of-Band Management (iDRAC)";
|
|
583
|
+
}
|
|
584
|
+
else if (/cumulus/i.test(manufacturer)) {
|
|
585
|
+
category = "Network Operating System (Cumulus Linux)";
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
// Check if it's a locally administered address (bit 1 of first octet)
|
|
589
|
+
const firstByte = parseInt(normalized.substring(0, 2), 16);
|
|
590
|
+
const isLocallyAdministered = (firstByte & 0x02) !== 0;
|
|
591
|
+
const isMulticast = (firstByte & 0x01) !== 0;
|
|
592
|
+
return json({
|
|
593
|
+
mac: formatMac(normalized),
|
|
594
|
+
mac_normalized: normalized,
|
|
595
|
+
oui_prefix: formatMac(oui + "000000").substring(0, 8),
|
|
596
|
+
manufacturer: manufacturer ?? "Unknown (OUI not in local database)",
|
|
597
|
+
category,
|
|
598
|
+
is_locally_administered: isLocallyAdministered,
|
|
599
|
+
is_multicast: isMulticast,
|
|
600
|
+
note: isLocallyAdministered
|
|
601
|
+
? "This is a locally administered address (LAA) — may be randomized (iOS/Android privacy feature) or virtual"
|
|
602
|
+
: manufacturer
|
|
603
|
+
? undefined
|
|
604
|
+
: "OUI prefix not found in local database. For comprehensive lookup, use IEEE OUI database at https://standards-oui.ieee.org/",
|
|
605
|
+
});
|
|
606
|
+
},
|
|
607
|
+
};
|
|
608
|
+
// ─── Export All IoT Tools ───
|
|
609
|
+
export const iotTools = [iotProbe, iotMacLookup];
|
|
610
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/iot/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/meta/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAsd9D,eAAO,MAAM,SAAS,EAAE,OAAO,EAG9B,CAAC"}
|