nyfeblade/K-9

GitHub: nyfeblade/K-9

一款零依赖的纯 Python 局域网扫描器,能发现并标记网络中的所有设备,识别摄像头、隐藏主机及暴露服务,并提供安全审计与报告功能。

Stars: 0 | Forks: 0

# ⬡ K-9 **了解你所连接的网络上的每一个设备 —— 以及哪些设备需要多加留意。** K-9 会扫描本地网络,识别每个设备的供应商和可能 的类型,并 **标记出那些重要的设备**:摄像头、监控 DVR、常开的 语音助手、对 ping 隐身的隐藏主机、暴露的管理面板,以及 任何它完全无法识别的设备。走进任何咖啡馆、办公室、Airbnb 或酒店, 运行一条命令,看看网络上还有什么在和您一起运行。 ``` git clone https://github.com/nyfeblade/K-9 cd K-9 && python3 k9.py # live dashboard → http://localhost:8731 ``` 它是 **纯 Python 编写的,仅依赖标准库。** 无需 `pip install`,无需 scapy,无需 root 权限。 ### 平台支持 K-9 是 **Linux 优先** 的 —— 这是它的构建和测试平台,也是 所有功能都能正常运行的地方。 | 操作系统 | 状态 | |---|---| | **Linux** | ✅ 完全支持 — 所有功能 | | **macOS** | ⚠️ 部分支持 — 核心扫描、Web 面板和审计运行;如果未安装 nmap 的 OUI 数据库,供应商 ID 会回退到内置品牌映射;**Wi-Fi 定位器无法使用**(它需要 Linux 的 `AF_PACKET` + 监听模式) | | **Windows** | ❌ 暂不支持 — 发现机制依赖 Linux 网络工具(`ip`, `iw`)和 `/proc`;需要移植。欢迎提交 PR | **Wi-Fi RF 定位器**(`--locate`)在设计上是 **仅限 Linux** 的 — 它使用原始的 `AF_PACKET` 监听模式 socket。其他所有功能原则上都是可移植的; 只是 Linux 相关的假设尚未针对 macOS/Windows 进行抽象。 ## 它的功能 | 阶段 | 原理 | |---|---| | **发现主机** | 多线程 ICMP ping 扫描填充内核 ARP 缓存,然后将其读回以获取 IP↔MAC。能够捕获 *忽略* ping 但仍响应 ARP 的设备(并将其标记为隐藏)。可选的 TCP-knock 作为应对极其顽固设备的后备方案。 | | **识别供应商** | 使用系统上已有的 OUI 数据库(nmap 的 42k 条目表、Wireshark 的 `manuf` 或 IEEE `oui.txt`)进行离线 MAC→供应商查询,外加内置的摄像头/IoT 品牌映射,确保与安全相关的供应商 *始终* 能被识别。 | | **指纹识别** | 对摄像头/DVR/IoT/管理端口进行 TCP connect 扫描,获取 HTTP `Server`/`` + RTSP 横幅(摄像头会泄露其型号),外加 **SSDP、mDNS/Bonjour 和 NetBIOS** 名称发现,以获取友好名称和型号。 | | **标记** | 透明的规则引擎会对摄像头、DVR/NVR、麦克风、隐藏主机、未知设备、telnet/暴露的/远程控制服务进行标记 —— 每个标记都附带简明的英文理由。 | | **记忆** | 记录它在 *每个网络* 上见过的设备(以网关 MAC 为键,因此家庭网络 ≠ 咖啡馆网络)。新的 MAC 会获得一个 `NEW` 标记 —— 这样“刚刚出现了什么?”一次扫描即可知晓。 | ### 标记列表 | 标记 | 含义 | |---|---| | `CAMERA` / `CAMERA?` | 网络摄像头(RTSP/ONVIF 端口、摄像头供应商或型号横幅) | | `SURVEILLANCE` | DVR / NVR / 多摄像头录像机 | | `MIC` | 始终在监听的语音助手(Echo、Nest、HomePod…) | | `HIDDEN` | 响应 ARP 但忽略 ICMP —— 未对外宣告自身存在 | | `UNKNOWN` | 完全无法识别 —— 值得手动查看 | | `INSECURE` | Telnet / 已知脆弱的服务被暴露 | | `EXPOSED` | 可访问的 Web/管理登录面板 | | `REMOTE` | RDP / VNC / ADB 远程控制服务开启 | | `RANDOM-MAC` | 随机化/本地管理的 MAC(出于隐私保护 —— 或是伪造) | | `NEW` | 首次在此网络中检测到 | | `ROUTER` | 网关本身 | ## 用法 **一条命令 —— 一切尽在仪表板中。** 只需运行: ``` python3 k9.py # or just `k9` if you ran pipx install . ``` 它会在 **http://localhost:8731** 启动实时 Web 应用(并自动打开您的 浏览器)。在页面上,您可以控制每种模式,无需触碰命令 行: - **扫描模式** — `Quick` / `Deep` / `Unhide`(切换后会立即重新扫描) - **网络** — 输入任何 CIDR(例如 `10.0.0.0/24`)并点击 *Scan*,或留空以扫描当前的局域网 - **自动** — 重新扫描间隔(15秒 … 每小时) - **立即扫描** — 强制立即重新扫描 - **过滤器** — 全部 / 已标记 / 摄像头 / 麦克风 / 未知 / 新增 ### 点击设备进行调查 点击任意卡片可打开 **“关于此设备”** 面板。在后台,K-9 会: 1. **查找其 Web/管理面板** — 探测 HTTP+HTTPS 上的每个 Web 端口,进行排名, 并 **在新的浏览器标签页中自动打开最佳的一个**,以便您可以登录 并查看。(能够检测出在每个路径上都返回 `200` 的单页应用,从而 避免您得到错误结果。) 2. **运行深度探测** — nmap 服务/版本(如果使用 `sudo` 启动则包括 OS), 外加对常见管理路径的检查。 3. **检查出厂密码** — 针对设备的供应商,它会尝试通过 HTTP Basic auth 使用一小部分已知的默认登录凭据。如果其中某个仍然有效,该 设备将获得一个红色的 **`DEFAULT-CREDS`** 标记,准确告诉您是哪个 `用户 / 密码` 打开了它 —— 方便您去修改它。 ### 单设备安全审计 点击设备还会运行 **安全审计**,并为其提供一个 **风险评分** (0–100)。它分为两个级别,因此动静较大的操作是可选的: **静默级别 — 自动运行,占用资源低:** - **TLS 证书** 检查(自签名 / 已过期) - 来自精选离线设备→CVE 映射表的 **已知 CVE 提示**(例如,标记带有已知身份验证绕过 CVE 的 Hikvision/Dahua 摄像头类别,以便检查固件) - **明文管理** 检测(通过纯 HTTP 提供的登录页面) - **互联网暴露** — 通过 **UPnP** 查询您的路由器以获取 WAN 端口转发, 并标记任何可从 **公共互联网** 访问的设备 - 将 K-9 自身的标记(telnet、远程控制等)转化为调查结果 **深度级别 — “🔍 Deep audit” 按钮(动静较大,但不猜测密码):** - **nmap** 服务/版本(以及以 root 身份运行的 OS) - **RTSP 开放流检查** — 确认摄像头的视频是否可以在 **无需密码** 的 情况下观看,并为您提供 `ffplay rtsp://…` 命令以供验证 - **匿名 FTP** **凭据级别 — 独立的“🔑 Test factory passwords”按钮 + 确认提示:** - 通过 HTTP **Basic 和 Digest** 进行 **默认凭据检查**,使用针对供应商定制的出厂密码列表(命中一次即停止)。 - **弱密码审计**(可选复选框)— 还会尝试约 30 个最常见的 弱密码。**有上限**(最多尝试 60 次)且 **具备锁定感知**(设备开始拦截时会立即停止)。这是一次密码强度 *审计*,刻意 **不是** 无限制的字典爆破工具 —— 真正的 暴力破解器会让您被锁定或导致您自己的设备变砖。 - **锁定 / 速率限制检测** — 发送几次错误的登录尝试,以查看 设备是否抵御暴力破解。如果设备接受无限制的猜测 且没有节流机制,设备本身将被标记(它会被暴力破解)。 - 与 Deep audit 完全分开,因为它会发送设备日志中记录的 **真实登录 尝试** —— 除非您点击此按钮并确认“我拥有 / 已获授权测试此设备”对话框,否则不会猜测任何密码。 **🛡 加固清单** — 每次审计都会附带一份具体的、针对特定设备的“如何 加固此设备”清单(在 VLAN 上隔离 IoT、设置唯一密码、启用 锁定/2FA、移除互联网暴露、禁用 Telnet、更新固件…)。它 显示在设备弹窗和导出的安全报告中。 每项发现都包含严重程度、说明和修复建议;红色 标记(`DEFAULT-CREDS`、`OPEN-CAM`、`INTERNET`、`OPEN-FTP`)会被固定在 设备卡片上。 ## 操作员 / 红队功能 K-9 是为 **授权** 评估而构建的,并具有相应的约束机制来 保持这一点: - **🛡 授权范围** — 您声明获准测试的 CIDR。 静默级别可以在任何地方运行(它仅仅是识别),但 **主动 级别拒绝针对授权范围之外的任何 IP 运行** — 仪表板会拦截它们并提供“授权此网络”按钮。这正是 通过设计确保公开发布的版本保持白帽属性的原因。 - **📄 网络安全报告** — 一键生成可打印的、自包含的 HTML 报告(`/api/report`),按风险评分对每台设备进行排名,包含 所有发现、CVE 链接和建议。打印为 PDF 作为交付物。 - **🔔 持续监控 + 警报** — 每次重新扫描都会与上次进行比对; 新设备、新打开的端口,或设备变得 **互联网暴露** 都会 触发警报(带有可选的浏览器通知)。 - **🕑 历史与时间线** — 每个设备都会在其弹窗中获得重建的时间线(首次 发现、端口开放历史、在线/离线时间窗口:*“3天前首次发现, 昨夜离线8小时,现已重新上线”*),并且 **历史** 面板会显示整个网络中的异常情况 — *“摄像头凌晨2点离线”*、 *“新的管理/远程服务开启”*、*“设备一夜之间出现”*、*“变为 互联网暴露”*。一键 **导出历史 (JSON)** 以供合规追踪。 - **🗒 操作日志** — 每个主动操作(深度审计、密码测试、范围 更改、报告)都会带有时间戳记录到 `~/.k9/engagement.jsonl` 中,作为 审计追踪。 状态保存在 `~/.k9/` 下:`scope.json`、`engagement.jsonl`、 `events.jsonl`、`known_devices.json`、`dashboard.json`。没有任何数据会离开 操作员的机器。 ## 设备情报与深度 - **重命名、标记和信任设备** — 点击设备为其指定自定义名称 (“Michael的 Wyze 摄像头”),添加标记、备注,并将其标记为受信任/不受信任。所有这些 **在重新扫描和重启后依然保留**,并且仪表板会记住您的 扫描模式 / 网络 / 间隔。 - **DHCP 租约主机名** — 如果 K-9 运行在 DHCP 服务器(Pi-hole / dnsmasq / 路由器)上,它会读取租约文件以获取权威名称, 将 `UNKNOWN` 设备转换为具名设备。 - **端口时间线** — 每个设备都会跟踪每个端口首次开启的时间(“开启 于 …”),以便您区分长期存在的服务和新服务。 - **原生 TLS 状态** — 通过 Python 自身的 `ssl` 进行协议 + 加密算法 + 证书 + HSTS 检查(标记 TLS ≤ 1.1、弱加密、过期/自签名证书) — 无需 外部 `openssl`。 - **真正的 UDP 扫描** — 针对 DNS、NTP、TFTP、SNMP 和 CoAP 的特定协议探测,这是 TCP 扫描无法看到的,外加针对速率受限设备的自适应重试。 - **IoT 暴露检查** — 开放的 MQTT broker、开放的 CoAP endpoint,以及 非破坏性的 **SNMP-write** 测试(通过 SNMP 可重新配置)。 - **JSON 导出** — ⬇ 导出可从 仪表板下载完整的设备清单(与 CLI 的 `--json` 功能对等)。 - **活动状态 — “它现在在做什么?”** — 点击设备 → 📈 检查活动: 存活状态(在线 / 延迟 / 抖动 / 丢包)、此时哪些服务正在 运行、摄像头的视频流是否确实已开启、支持 SNMP 设备的 **真实吞吐量**(实时 ↓/↑ 每秒比特数 + 运行时间),以及它的角色 (AirPlay 接收器、RTSP 源、DNS 解析器、打印机、MQTT broker…)。 - **📡 定位 — Wi-Fi 冷热搜寻器** — 选择一个设备并物理追踪它: 随着您的靠近,实时信号强度计会上升(🔥 变热 / ❄ 变冷)。这是寻找隐藏摄像头/追踪器的真正有效方法。纯 Python 的 802.11 捕获(radiotap RSSI,无需 scapy)。 sudo python3 k9.py --locate 192.168.1.50 # 实时终端信号计 **在仪表板中一键操作:** 使用 sudo 运行仪表板 (`sudo python3 k9.py --web`),点击设备 → **🛰 查找此设备**。 它会 **自动检测** 具备监听能力的适配器(优先使用第二个适配器,以保持您的主 连接不中断),将其切换到监听模式,**自动 ping 设备以使其保持 唤醒/传输状态**,捕获 RSSI,并显示实时仪表盘 — 然后 **停止** 会恢复适配器。无需终端,无需手动使用 `iw`/`nmcli`。 如果没有 sudo,它会说明如何启用它(并且 CLI 命令仍然 有效)。 ### 更喜欢终端? 一切仍然可以使用 `--cli` 编写脚本(或任何输出标志,这隐含了该功能): ``` k9 --cli # one-shot flagged report in the terminal k9 --cli --deep # full port list — slower, more thorough k9 --cli --unhide # squeeze identity out of quiet/HIDDEN hosts k9 --cli --alerts-only # only the flagged devices k9 --watch 30 # rescan every 30s, announce what changed k9 --json out.json # machine-readable output k9 --net 10.0.0.0/24 # (web) open the dashboard pre-pointed at a subnet ``` ### “揪出”安静的设备 `HIDDEN` 标记仅表示设备响应了 **ARP**(所以我们知道它在那里, 并且我们拥有它的 MAC + 供应商),但忽略了我们的 **ICMP ping** — 几乎总是 因为防火墙/隐私设置,而不是什么恶意的举动。它不是隐形的,只是安静。 要识别安静设备到底 *是* 什么,请运行 `--unhide`。在 常规扫描的基础上,它会针对每台主机添加: - 一次 **全端口扫描**(隐含 `--deep`), - 一次 **SNMP** `sysDescr`/`sysName` 探测(UDP/161) — 仅此一项通常就能准确命名 打印机、路由器、交换机、摄像头和 IoT 的确切品牌/型号/固件, - 针对每台主机的 **NetBIOS** 名称查询(不仅仅是那些通告 SMB 的主机),以及 - 对于 *仍然* 完全毫无响应的主机,会执行一次 **nmap** 服务/版本探测 (如果您使用 `sudo` 运行,还会进行 OS 检测)。 ``` k9 --unhide # deep-identify everything sudo k9 --unhide # adds nmap OS detection + a true ARP sweep k9 --unhide --no-nmap # skip the (slower) nmap step ``` 注意:`--unhide` 因为包含 SNMP/NetBIOS/nmap 探测所以速度较慢,并且如果设备的 防火墙开启且没有运行任何服务,它可能 *仍然* 会返回为 `UNKNOWN` — 此时它的 MAC 供应商是您最好的线索。`HIDDEN` 标记本身会保留 (它真实描述了主机的 ping 行为);改变的是该 设备通常会获得真实的名称和类型,而不是 `UNKNOWN`。 无需安装任何东西,直接运行: ``` python3 k9.py # from inside the K-9/ folder # 或 ./k9-run.sh --web ``` ### 安装(可选 — 用于在您的 PATH 中加入 `k9` 命令) K-9 不安装也能完美运行(见上文)。如果您想从任何 地方直接输入 `k9`,请安装它 — 它仍然只使用标准库,安装只是在您的 `PATH` 中放入一个启动器: ``` pipx install . # recommended (isolated); from inside K-9/ # 或 pip install --user . k9 # now works anywhere → same as python3 k9.py ``` ### Docker ``` docker compose up # dashboard → http://localhost:8731 # 或 docker build -t k9 . docker run --rm -it --net host k9 # dashboard docker run --rm -it --net host k9 --cli # one-shot terminal report ``` `--net host` 是 **必需的** — K-9 通过主机 LAN 上的 ARP/ping 来发现设备,这是桥接 容器无法看到的。在 `/data` 上挂载一个数据卷 (`-v k9-data:/data`)以在多次运行之间持久化范围/已知设备/配置。 ### Prometheus 指标 仪表板以 Prometheus 文本格式暴露了一个 `/metrics` endpoint — 设备计数、在线/新增/标记总数、开启端口数、按标记和 按类别分类的仪表盘,以及扫描耗时。将 Prometheus 指向它并在 Grafana 中绘制您的网络图表: ``` scrape_configs: - job_name: k9 static_configs: [{ targets: ["localhost:8731"] }] ``` (`/metrics` 仅为只读计数 — 没有设备详细信息。它服务于您 绑定的任何地址;除非您的抓取 主机需要,否则请将仪表板保持在回环地址上,然后在受信任的网络上使用 `--bind 0.0.0.0`。) ### 键盘与鼠标 在仪表板中:<kbd>s</kbd> 立即扫描 · <kbd>e</kbd> 导出 · <kbd>/</kbd> 跳转到网络输入框 · <kbd>?</kbd> 快捷键帮助 · <kbd>Esc</kbd> 关闭。**右键点击任何设备** 可复制 IP / MAC / 供应商以及 一键查询 OUI。 ### 可选:更敏锐的发现 - 以 **root** 身份运行并安装了 `scapy`,K-9 会添加真正的 ARP 广播 扫描(能抓到最后几个顽固设备)。两者都不是必需的 — 无需 root 的路径 已经能找到所有响应 ARP 的设备。 - `--deep` 扫描完整的约 60 个端口列表,而不是快速的默认集合。 ## 这合法 / 安全吗? K-9 仅查看您 **已经连接到** 的网络 — 就像您的 笔记本电脑的“查看此网络上的设备”功能一样,只是更加深入 且更具安全意识。它偏向被动(ping、读取 ARP、轻量级的 TCP 连接、标准的发现组播)。**仅扫描您拥有或被授权 评估的网络。** 对您无法控制的网络进行端口扫描可能会违反 它们的可接受使用政策或当地法律。 一切都保留在您的机器上:设备记忆保存在 `~/.k9/known_devices.json` 中,不会向任何地方发送任何内容。 ## 它是如何保持零依赖的 - **发现:** 系统的 `ping` + `ip neigh`(或 `/proc/net/arp`) - **供应商:** 解析系统上已经存在的 OUI 数据库 - **指纹识别:** 原始 `socket` TCP 连接 + 手工编写的 SSDP/mDNS/NetBIOS - **仪表板:** 使用标准库 `http.server` 提供一个自包含的 HTML 页面 没有第三方包。需要 Python 3.9+。 *Nyfe 工具包的一部分。*</div><div><strong>标签:</strong>Groq, Python, 云存储安全, 占用监测, 可视化面板, 多模态安全, 局域网发现, 插件系统, 无后门, 物联网识别, 网络扫描, 资产管理, 逆向工具</div></article></div> <!-- 人机验证 --> <script> (function () { var base = (document.querySelector('base') && document.querySelector('base').getAttribute('href')) || ''; var path = base.replace(/\/?$/, '') + '/cap-wasm/cap_wasm.min.js'; window.CAP_CUSTOM_WASM_URL = new URL(path, window.location.href).href; })(); </script> </body> </html>