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`。)
### 键盘与鼠标
在仪表板中:s 立即扫描 · e 导出 ·
/ 跳转到网络输入框 · ? 快捷键帮助 ·
Esc 关闭。**右键点击任何设备** 可复制 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 工具包的一部分。*
标签:Groq, Python, 云存储安全, 占用监测, 可视化面板, 多模态安全, 局域网发现, 插件系统, 无后门, 物联网识别, 网络扫描, 资产管理, 逆向工具