NoCoderRandom/sunsetscan
GitHub: NoCoderRandom/sunsetscan
一款面向普通用户和运维人员的局域网安全审计工具,基于 nmap 驱动,提供设备发现、漏洞检测、生命周期检查和可视化 HTML 报告生成。
Stars: 3 | Forks: 0
# SunsetScan
**为普通人打造的网络安全审计工具 — 由 nmap 强力驱动,为人人而生。**
[]
[](https://www.python.org/downloads/)
[](https://github.com)
[](LICENSE)
[](data/hardware_eol/LICENSE.md)
[](https://nmap.org)
[](https://osv.dev)
Website: [sunsetscan.com](http://www.sunsetscan.com/)
SunsetScan 是一款局域网安全审计工具,专为**家庭网络用户和 IT 运维人员**设计。它提供了 nmap 的深度扫描能力,且无需学习 nmap 语法。只需将其指向您的网络,它就能发现每一台活跃设备、提取运行软件的指纹、与已知漏洞库和生命周期终止 (EOL) 记录进行比对、探测 Web 界面的常见弱点,并可选择执行防锁定的出厂默认密码审计,最终生成一份整洁的 HTML 报告,其中包含**通俗易懂的英文解释**和解决每个问题的编号步骤。它是**完全只读且非破坏性的** — 绝不会修改您网络中的任何内容。
## 平台支持
| 平台 | 支持级别 | 备注 |
|---|---|---|
| **Linux** (Debian, Ubuntu, Fedora, Arch 等) | 完全支持 | 最佳体验 — 所有功能均可原生运行 |
| **WSL2** (Windows Subsystem for Linux) | 完全支持 | 在 Windows 机器上运行的推荐方式 |
| **macOS** | 部分支持 | 核心扫描功能正常;部分功能(ARP、被动捕获)可能需要额外设置 |
| **Windows** (原生 CMD/PowerShell) | 不支持 | 缺少原始套接字、`os.geteuid()`、`/proc`、`ip route` 和 `termios` — 请改用 WSL2 |
## 安装说明
SunsetScan 附带了一个安装程序,它会自动处理系统工具(`nmap`、`masscan`、`git`、`python3-venv`)、创建项目本地的 Python 虚拟环境,并在其中安装所有 Python 依赖项。**系统绝不会要求您以 root 身份执行 `pip install`** — 这在现代 Debian/Pi OS 上非常重要,详情请参阅下方的[为什么使用 venv?](#why-a-venv)。
### 一级平台(完全测试)
Debian、Ubuntu、Raspberry Pi OS (Bookworm 及更新版本)、Linux Mint、Pop!_OS。
### 二级平台(尽力支持,相同脚本)
Fedora、RHEL、CentOS、Rocky、Alma、Arch、Manjaro、openSUSE、macOS。
### 三种安装方式 — 任选其一
#### 1. 一键引导安装(推荐新用户使用)
将仓库克隆到 `~/sunsetscan` 并运行安装程序:
```
curl -fsSL https://raw.githubusercontent.com/NoCoderRandom/sunsetscan/main/bootstrap.sh | bash
```
想安装到其他位置?请设置 `INSTALL_DIR`:
```
INSTALL_DIR=/opt/sunsetscan curl -fsSL https://raw.githubusercontent.com/NoCoderRandom/sunsetscan/main/bootstrap.sh | bash
```
#### 2. 克隆并安装
```
git clone https://github.com/NoCoderRandom/sunsetscan.git
cd sunsetscan
./install.sh
```
#### 3. 手动安装(完全控制,四条命令)
```
sudo apt install -y nmap masscan git python3 python3-venv python3-pip libpcap-dev build-essential avahi-utils
git clone https://github.com/NoCoderRandom/sunsetscan.git && cd sunsetscan
python3 -m venv venv && ./venv/bin/pip install -r requirements.txt
./sunsetscan --version
```
(请将 `apt` 替换为您发行版的包管理器 — 如 `dnf`、`pacman`、`zypper` 或 `brew`。avahi 包在 Fedora/RHEL 上名为 `avahi-tools`,在 Arch 上名为 `avahi`,在 openSUSE 上名为 `avahi-utils`,而在 macOS 上不需要。)
### 安装后 — 首次运行
```
./sunsetscan --setup # download EOL/CVE/credential databases (once)
sudo ./sunsetscan --instant # ARP-only inventory of your local subnet
sudo ./sunsetscan --full-assessment --target 192.168.1.0/24
```
`./sunsetscan` 启动器会自动激活 venv — 您永远不需要执行 `source venv/bin/activate`。对于需要原始套接字的扫描,请使用 `sudo`,但请以普通用户身份运行 `--setup`、`--download` 和 `--update-cache`,以便 TUI 仍能写入缓存文件。
### 安装程序标志
| 标志 | 作用 |
|---|---|
| (无标志) | 默认安装:系统软件包 + venv + Python 依赖项 + 自检 |
| `--force` | 删除并从零开始重建 venv(在升级 Python 后使用) |
| `--symlink` | 同时安装 `/usr/local/bin/sunsetscan`,以便您可以在任何地方运行 `sunsetscan` |
| `--no-system` | 跳过 apt/dnf 等步骤(如果您的系统工具已安装,请使用此项) |
| `--help` | 显示所有选项 |
重复运行 `./install.sh` 是安全且幂等的 — 它会检测现有组件并重新利用它们。
### 为什么使用 venv?
现代基于 Debian 的发行版(Debian Bookworm、Raspberry Pi OS Bookworm、Ubuntu 23.04+)自带 [PEP 668](https://peps.python.org/pep-0668/) 强制实施机制。这会导致以 root 身份针对系统 Python 运行 `pip install` **失败**:
```
error: externally-managed-environment
× This environment is externally managed
```
SunsetScan 的两个依赖项(特别是 `pysnmp` v6)需要的版本比 apt 仓库提供的要新,因此无法进行纯 apt 安装。安装程序的解决方案是标准做法:通过 apt 安装系统工具(nmap、masscan、libpcap、avahi-utils),并将 SunsetScan 的 Python 依赖项放入项目本地的 `./venv` 目录中。不会触及任何系统全局设置,因此 PEP 668 不适用,卸载 SunsetScan 只需执行 `rm -rf ~/sunsetscan`。
### 可选:保持 SunsetScan 在后台运行
在 Raspberry Pi 上对 /24 子网进行全面评估可能需要 10-30 分钟。请使用 `tmux` 或 `screen`,以便在 SSH 断开连接时扫描仍能继续:
```
sudo apt install -y tmux
tmux new -s sunsetscan
sudo ./sunsetscan --full-assessment --target 192.168.1.0/24
# Ctrl+B 然后按 D 键分离。之后使用 "tmux attach -t sunsetscan" 重新连接。
```
### 更新 SunsetScan
```
cd ~/sunsetscan
git pull
./install.sh # idempotent — picks up any new dependencies
```
### 卸载
```
rm -rf ~/sunsetscan
sudo rm -f /usr/local/bin/sunsetscan # only if you used --symlink
```
### Windows 上的 WSL2
Windows 不受直接支持(SunsetScan 需要原始套接字、`/proc` 和 `os.geteuid`),但 WSL2 可以正常运行:
```
wsl --install -d Ubuntu # in PowerShell, as Administrator
```
重启后,从“开始”菜单打开 **Ubuntu**,然后按照上面的标准安装说明进行操作。WSL2 使用虚拟网络适配器 — 如果自动检测选错了子网,请使用 `--target` 传入您的真实子网。
## 系统要求
| 要求 | 最低版本 | 备注 |
|---|---|---|
| **Python** | 3.9+ | 推荐 3.12 |
| **nmap** | 任何近期版本 | 必须在系统 PATH 中 |
| **操作系统** | Linux (原生或 WSL2) | 请参阅 [平台支持](#platform-support) |
| **masscan** | 任何版本 | 可选 — 更快的端口发现 |
| **avahi-utils** | 任何版本 | 可选 — 提供 `avahi-browse`,用于可靠地发现 Apple / Bonjour / Sleep-Proxy 设备的 mDNS。如果缺失,将回退到 python 的 `zeroconf`。 |
| **git** | 任何版本 | 可选 — 用于 `--setup` 和 `--update` |
| **权限** | 普通用户 | FULL、STEALTH、SMB 配置文件,ARP 检测和被动捕获需要 root/sudo 权限 |
## 快速入门
```
# 交互模式(推荐首次使用)
sudo python3 sunsetscan.py -i
# 包含 HTML 报告的全面安全评估
sudo python3 sunsetscan.py --full-assessment --target 192.168.1.0/24
# 快速扫描你的网络
python3 sunsetscan.py --target 192.168.1.0/24
# IoT 设备扫描(摄像头、路由器、智能设备)
python3 sunsetscan.py --target 192.168.1.0/24 --profile IOT
# 快速设备清单(无安全检查)
python3 sunsetscan.py --identify --target 192.168.1.0/24
# 下载所有数据模块以进行扩展检测
python3 sunsetscan.py --download all
```
## 功能特性
### 网络发现
- 通过快速 ping 扫描发现所有活跃主机
- 解析主机名并检测 MAC 地址,同时查找供应商/制造商
- 灵活的目标输入:CIDR、通配符、IP 范围、逗号分隔列表或主机名
- 可选的 masscan 集成,用于在大型网络上更快地发现端口
- 混合扫描:结合主动扫描与被动后台捕获 (mDNS/SSDP/DHCP)
### 端口和服务扫描
- 六种扫描配置:QUICK、FULL、STEALTH、PING、IOT、SMB
- 全面评估会先发现活跃主机,然后仅对这些发现的主机进行服务扫描,
而不是盲目扫描目标 CIDR 中的每个地址
- 跨所有开放端口的并发 banner 抓取(50 个线程池)
- 带有置信度百分比的操作系统指纹识别
- NSE (Nmap Scripting Engine) 集成,用于增强设备检测
- HTTP 指纹识别,用于识别路由器、摄像头、NAS 设备、打印机和 IoT
- 自动 root 权限回退:FULL/STEALTH 配置文件在没有 sudo 的情况下运行时会优雅降级
- 针对低功耗主机、Wi-Fi、WSL/NAT 和验证运行的安全模式:限制 worker 数量,
跳过广泛的全端口 masscan 扫描,限制 nmap 端口集,
并应用每个命令的扫描超时设置
- 并行安全分析 — 所有针对主机的检查(SSL、SSH、FTP、SMB、SNMP、Web)使用线程池在主机之间和每个主机内部并发运行
- 阶段 7 的安全分析在 10 秒内完成,不受网络规模影响
- 扫描前就绪检查 — 如果缺少 nmap、CVE/EOL 数据库为空或默认模块未安装,则发出警告。在每次扫描前运行,不会阻塞扫描。
### 安全检查
SunsetScan 在全面评估期间会运行 12 个安全检查器模块:
| 检查器 | 发现内容 |
|---|---|
| **SSL/TLS** | 过期/自签名证书、弱密码套件、TLS 1.0/1.1、SSL 2.0/3.0、小型 RSA 密钥 |
| **SSH** | 弱密钥交换、弱密码/MAC、SSHv1、小型主机密钥、原始 KEXINIT 分析 |
| **SMB** | SMBv1、EternalBlue (MS17-010)、匿名共享、SMB 签名已禁用、NTLM 泄露 |
| **FTP** | 匿名登录、明文凭据、缺少 STARTTLS |
| **SNMP** | 默认 community strings (public/private)、SNMPv1、sysDescr 提取 |
| **Web** | 缺少安全标头、通过 HTTP 传输的登录表单、目录列表、暴露的管理面板 |
| **DNS** | DNS 劫持检测(与 Cloudflare 1.1.1.1 对比) |
| **UPnP** | SSDP 发现、路由器上的 WAN 端口映射暴露 |
| **mDNS** | Zeroconf/Bonjour 设备发现,发现逃避端口扫描的主机 |
| **ARP** | ARP 欺骗检测、MAC 地址更改跟踪(需要 root 权限) |
| **默认凭据** | 选择性加入的出厂默认审计,使用精确的设备/型号匹配、限制尝试次数和延迟 |
| **不安全协议** | 按严重程度标记 Telnet、FTP、TFTP、rsh、rlogin、rexec |
### 漏洞情报
- **CVE 关联** — 使用 OSV.dev 将检测到的服务版本映射到已知 CVE
- **软件 EOL 检查** — 150 多种软件产品的本地缓存生命周期数据
- **硬件生命周期检查** — 可下载的 SunsetScan 硬件 EOL 数据库,
标记具有确认的不受支持状态或需要审查的供应商生命周期信号的路由器、交换机、NAS、摄像头、打印机和接入点
- **JA3S TLS 指纹识别** — 从 TLS 握手签名中识别服务器软件
- 扫描期间完全离线 — 扫描期间不进行任何外部 API 调用。软件 EOL、CVE 和 GitHub 模块源仅由 `--setup`、`--update-cache` 和 `--download` 联系。只要缓存已填充,即使没有互联网连接也可以进行扫描。
- 每周 CVE 刷新,每月 EOL 刷新 — 由您控制
### 设备识别
- **14 个证据提取器** 融合 MAC OUI、nmap OS、HTTP 指纹识别、
TLS 证书、SSH banner、UPnP、SNMP sysDescr、Wappalyzer、mDNS、
JA3S TLS 指纹、FTP banner、端口启发式和 nmap 服务字段,
为每个主机提供统一的设备身份
- 识别供应商、型号、固件版本和设备类型,并提供
置信度评分(当多个来源确认时提供一致性奖励)
- 支持 130 多个别名供应商进行名称规范化
- 结果显示在终端表格和 HTML 报告的设备清单中
- 快速资产盘点模式:`--identify` 标志跳过安全检查
- 跨扫描的持久化 MAC 到身份映射
### 模块化数据系统
SunsetScan 包含 9 个可下载的数据模块,可扩展检测能力:
| 模块 | | 添加内容 |
|---|---|---|
| `credentials-mini` | danielmiessler/SecLists | 前 50 个默认凭据(可下载参考数据;除非在设置中明确启用,否则安全审计不使用) |
| `credentials-full` | ihebski/DefaultCreds-cheat-sheet | 2860+ 特定供应商凭据(可下载参考数据;除非在设置中明确启用,否则安全审计不使用) |
| `wappalyzer-mini` | enthec/webappanalyzer | 前 500 种 Web 技术(默认) |
| `wappalyzer-full` | enthec/webappanalyzer | 所有 7515 种 Web 技术 |
| `ja3-signatures` | salesforce/ja3 | TLS 指纹数据库 |
| `snmp-community` | danielmiessler/SecLists | 扩展的 SNMP community strings |
| `camera-credentials` | many-passwords/many-passwords | IP 摄像头/DVR/NVR 默认凭据(可下载参考数据;除非在设置中明确启用,否则安全审计不使用) |
| `mac-oui` | IEEE Standards Association | MAC 前缀供应商数据库(默认) |
| `hardware-eol` | NoCoderRandom/sunsetscan | 硬件生命周期/EOL 数据库(默认;数据库许可:CC BY-NC 4.0) |
```
sunsetscan --modules # Show module status
sunsetscan --download all # Download everything
sunsetscan --download ja3-signatures # Download one module
```
### 非法设备检测
- 将网络快照保存为受信任的基线
- 未来的扫描会自动标记不在基线中的未知 MAC 地址
- 检测位于意外 IP 地址的已知设备
### 风险评分
每台设备都会根据发现结果的严重程度和数量获得一个风险评分 (0-100):
| 评分 | 等级 |
|---|---|
| 0-10 | 极低风险 |
| 11-30 | 低风险 |
| 31-60 | 中等风险 |
| 61-80 | 高风险 |
| 81-100 | 严重风险 |
### 报告生成
- **专业 HTML 报告** — 严重度仪表板、按主机划分的章节、带有通俗易懂英文解释的发现卡片、优先建议
- **JSON 导出** — 机器可读的结构化输出
- 报告完全自包含 — 一个 HTML 文件,无外部依赖
- 窄范围配置(如 SMB)仍会在报告中保留已发现的主机,
即使没有匹配的服务端口开放
- DNS、UPnP 和扫描运行时注释等网络级检查与
每个设备的发现结果分开展示;设备风险评分仅针对实际主机显示
- 所有发现均采用颜色编码:严重、高、中、低、信息
### 扫描历史与差异对比
- 每次扫描都会自动保存为 gzip 压缩的 JSON 快照
- 使用 `--history` 查看过去的扫描
- 使用 `--diff` 比较任意两次扫描,以查看新主机、已关闭端口、新增/已解决发现
- 使用 `--diff --since N` 与 N 天前的扫描进行比较
- 历史记录默认保留 90 天
### 用户界面
- 引导式**交互模式** (`-i`) — 用于扫描、分析、导出、模块的多级菜单
- **传统菜单** — 在不带参数运行时启动
- 直接 CLI 模式 — 支持脚本化,便于自动化操作
- 丰富的彩色终端输出,带有进度条、加载动画和摘要面板
## 所有 CLI 标志
| 标志 | 描述 | 需要 Root |
|---|---|---|
| `--target TARGET` | 要扫描的 IP、CIDR 范围、主机名或 IP 范围 | 否 |
| `--profile PROFILE` | 扫描配置:QUICK、FULL、STEALTH、PING、IOT、SMB(默认:QUICK) | 视情况而定 |
| `-i`, `--interactive` | 启动引导式交互模式 | 否 |
| `--full-assessment` | 完整评估 + 自动 HTML 导出;凭据审计仍为选择加入 | 否 |
| `--identify` | 仅运行设备识别(跳过安全检查) | 否 |
| `--nse` | 启用 Nmap 脚本引擎以增强检测 | 否 |
| `--check-defaults` | 选择加入防锁定的出厂默认凭据审计(仅限自有设备) | 否 |
| `--save-baseline` | 将扫描保存为用于非法检测的受信任设备基线 | 否 |
| `--setup` | 首次设置向导(依赖项 + 缓存下载) | 否 |
| `--update-cache` | 手动刷新 CVE 和 EOL 数据缓存 | 否 |
| `--cache-status` | 显示缓存时效和条目数量,然后退出 | 否 |
| `--modules` | 显示所有可下载数据模块的状态 | 否 |
| `--download MODULE` | 下载数据模块(或 "all") | 否 |
| `--db SIZE` | `--setup` 的 EOL 数据库大小:mini、normal、large(默认:normal) | 否 |
| `--history` | 显示扫描历史表格并退出 | 否 |
| `--diff` | 对比最近两次保存的扫描并退出 | 否 |
| `--since DAYS` | 与 `--diff` 搭配使用:与至少 N 天前的扫描进行对比 | 否 |
| `--check-version` | 检查 GitHub 上是否有更新的 SunsetScan 版本 | 否 |
| `--update` | 从 GitHub 拉取最新代码并重新安装依赖项 | 否 |
| `--verbose` | 启用调试日志记录 | 否 |
| `--no-color` | 禁用彩色输出(适用于日志文件) | 否 |
| `--quiet` | 隐藏进度条(仍显示发现结果) | 否 |
| `--safe-mode` | 强制使用更温和的扫描:限制 nmap 范围、降低 masscan 使用率、减少 worker 数量、跳过重型探测 | 否 |
| `--no-safe-mode` | 禁用自动安全模式 | 否 |
| `--version` | 显示版本号并退出 | 否 |
## 扫描配置
| 配置 | nmap 标志 | 速度 | 需要 Root | 最适合 |
|---|---|---|---|---|
| **PING** | `-sn` | ~30秒 | 否 | 快速查找活跃设备 |
| **QUICK** | `-T4 -F -sV --version-intensity 2` | 1-3 分钟 | 否 | 网络初步排查(带轻度版本检测) |
| **FULL** | `-T4 -A -sV -O --osscan-guess` | 5-15 分钟 | 是 | 对特定主机的深入分析 |
| **STEALTH** | `-sS -T2 -sV` | 10-30 分钟 | 是 | 低噪声扫描 |
| **IOT** | `-T4 -sV -p 23,80,443,8080,8443,554,1900,5000,5001,7547,49152 --open` | 1-3 分钟 | 否 | 摄像头、路由器、智能设备 |
| **SMB** | `-T4 -sV -p 135,139,445,137,138 --script smb-security-mode,smb2-security-mode,smb-vuln-ms17-010 --open` | 1-3 分钟 | 是 | Windows 共享、EternalBlue 检测 |
### 默认密码审计安全性
默认密码测试绝不会自动启用。在 CLI 模式下,请添加 `--check-defaults`;在引导式 `-i` 模式下,请在出现提示时选择默认密码审计。SunsetScan 随后会应用保守策略:
- 默认不进行通用用户名/密码喷洒
- 仅测试与检测到的供应商和型号/系列匹配的凭据
- 跳过具有唯一标签/PIN 默认值的设备,例如许多 HP 打印机
- 默认限制每台主机最多 2 次尝试,每个服务最多 1 次尝试
- 在包含凭据的尝试之间等待 2 秒
- 如果设备返回锁定或速率限制信号,则立即停止
内置数据库有意保持精简且有来源支持。下载的大型凭据模块仅作为参考数据保留,但除非开发者明确启用 `Settings.auth_allow_module_credentials`,否则安全审计不会使用它们。
### 安全模式与验证运行
安全模式会在低功耗主机、看起来像 Pi-hole/网关设备的主机以及 Wi-Fi 出口处自动推荐使用。也可以通过以下命令强制开启:
```
python3 sunsetscan.py --full-assessment --target 192.168.1.0/24 --safe-mode
```
在安全模式下,SunsetScan 会:
- 首先发现活跃主机,然后在全面评估期间仅扫描这些主机
- 应用来自 CLI、传统菜单和引导式 `-i` 模式的相同安全扫描器行为
- 从广泛扫描中移除操作系统指纹识别
- 使用快速/顶级端口限制保持广泛的 STEALTH/FULL 扫描界限
- 跳过广泛配置的全端口 masscan 扫描
- 降低 worker 数量并跳过重型 TLS 探测
- 应用每次 nmap 的超时设置,这样一个配置文件就不会无限期停滞
对于跨所有模式的 root 辅助回归测试,请使用验证收集器:
```
sudo bash scripts/sudo_network_validation.sh
```
默认情况下,它会在 PING、QUICK、SMB、STEALTH 和 FULL 模式下测试 `192.168.1.0/24`,将生成的 HTML 报告复制到验证目录,并在 `reports/` 下写入一个压缩存档。报告、日志、pcap 和存档会被 git 忽略,不应被提交。
有用的覆盖选项:
```
sudo SUNSETSCAN_TARGETS="192.168.1.0/24" bash scripts/sudo_network_validation.sh
sudo SUNSETSCAN_PROFILES="PING QUICK FULL" bash scripts/sudo_network_validation.sh
sudo SUNSETSCAN_COMMAND_TIMEOUT=1200 bash scripts/sudo_network_validation.sh
```
## 缓存管理
SunsetScan 在扫描期间绝不调用外部 API。所有数据均从 `data/cache/` 中的本地缓存文件读取。
| 文件 | 内容 | 刷新间隔 |
|---|---|---|
| `data/cache/cve_cache.json` | 以 product:version 为键的 CVE 数据 | 每 7 天 |
| `data/cache/*.json` | 150 多种产品的 EOL 日期,按产品存储 | 每 30 天 |
| `data/cache/hardware_eol/sunsetscan_hardware_eol_index.json` 以及 `records/*.json` | 硬件生命周期/EOL 数据库 | 每 30 天 |
| `data/cache/cache_meta.json` | 上次更新的时间戳 | 自动 |
```
sunsetscan --cache-status # See current cache state
sunsetscan --update-cache # Refresh stale caches
```
扫描在缓存过期或缺失的情况下仍能正常运行 — 只是您可能拥有过时的 CVE 数据。
## 非法设备检测
```
# 步骤 1:在所有已知设备均在线时保存基线
sudo python3 sunsetscan.py --target 192.168.1.0/24 --save-baseline
# 步骤 2:未来的扫描会自动与基线进行比较
sudo python3 sunsetscan.py --target 192.168.1.0/24
```
| 发现结果 | 严重程度 | 含义 |
|---|---|---|
| 发现未知设备 | 中等 | MAC 不在基线中 — 新设备或未经授权的设备 |
| 设备 IP 已更改 | 低 | 已知 MAC 使用了不同的 IP(通常是正常的 DHCP 行为) |
| 以前出现过的设备已离线 | 信息 | 基线设备未响应 |
## HTML 报告
每次 `--full-assessment` 都会生成一份自包含的 HTML 报告,包含:
- **严重度仪表板** — 徽章计数(严重/高/中/低/信息)、颜色条、摘要统计
- **风险评分** — 每台设备的 0-100 评分及风险等级标签
- **所有发现表格** — 跨所有主机的每个发现,按严重程度排序
- **按主机划分的章节** — 每台设备可折叠的章节,包含发现卡片、开放端口表格、EOL 状态
- **发现卡片** — 严重度徽章、标题、“发现了什么”、“这意味着什么”(通俗英文解释)、“该怎么做”(编号步骤)、证据、CVE ID
- **建议** — 优先行动列表
报告可在任何浏览器中打开,无需网络连接。
## 设备识别
SunsetScan 通过结合来自 14 个不同来源的证据来自动识别网络设备。每个来源都会提供一个供应商、型号、版本或设备类型及其置信度评分。融合算法会对一致的来源求和(对多源一致性给予额外奖励),并对冲突的证据进行惩罚。
### 快速资产盘点
要在不运行安全检查的情况下查看网络中的设备:
```
python3 sunsetscan.py --identify --target 192.168.1.0/24
```
这将运行带有 banner 抓取的端口扫描,并打印设备识别表格。无安全分析,无报告 — 只是快速的盘点。
### 证据来源
| 来源 | 读取内容 | 置信度 |
|--------|--------------|------------|
| MAC OUI | 来自 MAC 地址的 IEEE 供应商前缀 | 0.40-0.45 |
| nmap OS | 操作系统指纹猜测 | 不定 |
| HTTP 指纹 | 来自 Web UI 的设备类型、型号、固件 | 0.50+ |
| HTTP 标头 | Server、X-Powered-By 响应标头 | 0.20-0.50 |
| TLS 证书 | CN、颁发者、组织字段 | 0.35 |
| SSH banner | SSH 守护程序识别字符串 | 0.10-0.70 |
| UPnP | SSDP 制造商、型号、设备类型 | 0.75 |
| sysDescr | 来自 SNMP MIB 的系统描述 | 0.85 |
| Wappalyzer | CPE 字符串和技术类别 | 0.30-0.45 |
| mDNS/Zeroconf | 服务类型播发 | 0.55 |
| JA3S | TLS 握手指纹数据库 | 0.50 |
| FTP banner | FTP 服务器软件识别 | 0.25-0.35 |
| 端口启发式 | 开放端口组合模式 | 0.10-0.70 |
| nmap 服务 | 服务产品和版本字段 | 0.45 |
识别结果显示于:
- 终端设备盘点表格(在扫描期间和通过 `--identify`)
- HTML 报告拓扑卡片和设备清单章节
- JSON 导出的 `device_identities` 章节
- 交互模式菜单选项 [8] Device Inventory
## 严重程度级别
| 级别 | 颜色 | CVSS 范围 | 含义 | 何时采取行动 |
|---|---|---|---|---|
| **严重 (CRITICAL)** | 红色 | >= 9.0 | 默认凭据、可利用的 CVE、SSL 2.0 | 今天 |
| **高 (HIGH)** | 橙色 | 7.0-8.9 | Telnet/FTP 开放、证书过期、TLS 1.0、EOL 软件 | 本周 |
| **中 (MEDIUM)** | 黄色 | 4.0-6.9 | 自签名证书、UPnP 暴露、非法设备、缺少 HSTS | 计划修复 |
| **低 (LOW)** | 蓝色 | < 4.0 | 即将 EOL、缺少 X-Frame-Options、设备 IP 已更改 | 记录并计划 |
| **信息 (INFO)** | 灰色 | - | 设备已识别、证书详情、DNS 检查通过 | 无需行动 |
## 项目结构
```
sunsetscan/
├── sunsetscan.py # Entry point — CLI, scan pipeline, setup wizard
├── requirements.txt # Python dependencies
├── install.sh # Automated installer for Linux/macOS
├── install.bat # Automated installer for Windows (basic)
├── README.md # This file
│
├── config/
│ └── settings.py # All constants, timeouts, scan profiles, menu options
│
├── core/
│ ├── scanner.py # nmap wrapper (ScanResult, HostInfo, PortInfo)
│ ├── port_scanner.py # Masscan pipeline + PortScanOrchestrator
│ ├── banner_grabber.py # Concurrent raw socket banner grabbing
│ ├── http_fingerprinter.py # HTTP device/firmware fingerprinting
│ ├── nse_scanner.py # Nmap Scripting Engine integration
│ ├── auth_tester.py # Default credential testing (HTTP, device-specific)
│ ├── input_parser.py # Flexible target format parsing
│ ├── network_utils.py # Subnet detection, IP helpers, WSL detection
│ ├── findings.py # Finding dataclass, Severity enum, FindingRegistry
│ ├── risk_scorer.py # Per-device risk scoring (0-100)
│ ├── cache_manager.py # Unified CVE + EOL cache (data/cache/)
│ ├── cve_checker.py # CVE lookup + CVECacheBuilder (OSV.dev)
│ ├── ssl_checker.py # TLS certificate, cipher suite, JA3S fingerprinting
│ ├── ssh_checker.py # SSH version, algorithms, KEXINIT analysis
│ ├── smb_checker.py # SMBv1, EternalBlue, shares, NTLM disclosure
│ ├── ftp_checker.py # Anonymous FTP, STARTTLS
│ ├── snmp_checker.py # SNMP community strings, sysDescr (pysnmp v4+v7)
│ ├── web_checker.py # HTTP headers, admin panels, Wappalyzer
│ ├── dns_checker.py # DNS hijack and rebinding detection
│ ├── upnp_checker.py # SSDP discovery, UPnP risk assessment
│ ├── mdns_checker.py # mDNS/Zeroconf device discovery
│ ├── arp_checker.py # ARP spoofing detection
│ ├── device_identifier.py # 14-source device identification engine
│ ├── identity_fusion.py # Multi-source identity fusion and scoring
│ ├── oui_lookup.py # IEEE OUI MAC vendor resolution
│ ├── device_map.py # Persistent MAC→identity mapping
│ ├── passive_sniffer.py # Background mDNS/SSDP/DHCP packet capture
│ ├── packet_parsers.py # Protocol-specific packet parsing
│ ├── instant_scan.py # ARP sweep + passive capture quick scan
│ ├── hybrid_scanner.py # Passive+active scan orchestrator
│ ├── baseline.py # Rogue device baseline comparison
│ ├── hardware_eol.py # Downloaded hardware lifecycle database lookup
│ ├── scan_history.py # Scan snapshot persistence and diffing
│ ├── module_manager.py # Downloadable data module system
│ └── update_manager.py # Version check and self-update
│
├── eol/
│ ├── checker.py # EOL API queries and version comparison
│ ├── cache.py # Per-product JSON cache
│ └── product_map.py # 150+ software name -> lifecycle cache slug mappings
│
├── ui/
│ ├── menu.py # Old-style numbered menu (no-args mode)
│ ├── display.py # Rich terminal tables, progress bars, banners
│ ├── export.py # JSON and HTML report generation
│ ├── interactive_controller.py # Interactive mode (-i) with multi-level menus
│ └── templates/
│ └── report.html.j2 # Jinja2 HTML report template
│
└── data/
├── default_credentials.json # Factory-default credentials database
├── device_map.json # Persistent MAC→identity map
├── baseline.json # Saved device baseline (--save-baseline)
├── cache/
│ ├── cve_cache.json # CVE data keyed by product:version
│ ├── .json # EOL data keyed by product slug
│ ├── hardware_eol/ # Downloaded hardware lifecycle database
│ └── cache_meta.json # Cache update timestamps
├── history/ # Gzip scan snapshots (auto-saved)
└── modules/ # Downloaded data modules
```
## 故障排除
**找不到 nmap**
```
# Debian/Ubuntu
sudo apt install nmap
# Fedora
sudo dnf install nmap
# Arch
sudo pacman -S nmap
# macOS
brew install nmap
```
**权限被拒绝 / 操作系统检测不工作**
FULL、STEALTH 和 SMB 配置需要提升的权限。在没有 root 权限的情况下,这些配置会自动回退到非 root 标志(操作系统检测和 SYN 扫描被禁用,但端口/版本扫描仍然有效)。
```
# 获取完整功能:
sudo python3 sunsetscan.py --target 192.168.1.0/24 --profile FULL
```
**WSL2 建议了错误的网络 (172.x.x.x)**
在 WSL2 上,SunsetScan 会检测虚拟适配器并回退到 `192.168.1.0/24`。如果您的家庭网络使用不同的子网,请使用 `--target` 指定:
```
python3 sunsetscan.py --target 192.168.0.0/24
```
**扫描开始时的缓存警告**
```
WARNING: CVE data is 12 days old — run: python sunsetscan.py --update-cache
```
扫描在数据过期的情况下仍能正常运行。运行 `--update-cache` 进行刷新。
**下载模块时权限被拒绝**
如果模块下载失败并显示 `Permission denied: .../data/cache/...`,则缓存可能是由 `sudo` 创建的。修复一次所有权,然后以普通用户身份运行设置和模块下载:
```
cd ~/sunsetscan
sudo chown -R "$USER:$USER" data/cache
./sunsetscan --download all
```
**SNMP 检查不工作**
SunsetScan 同时支持 pysnmp v4(同步)和 v7(异步)。如果您看到导入错误,请更新 pysnmp:
```
pip install --upgrade pysnmp
```
## 免责声明 — 仅限授权使用
对您不拥有或未获授权测试的系统运行网络扫描,无论意图如何,都可能是**违法的**。作者对滥用行为不承担任何责任。
SunsetScan 是**完全非破坏性和只读的**。它不利用漏洞、不发送 payload,也不修改任何被扫描设备上的任何配置。`--check-defaults` 凭据测试是选择加入的、受限的、有延迟的、针对确切型号的,并且会在遇到锁定/限速信号时停止;它不是暴力破解功能。
## 许可证
SunsetScan 仓库和应用程序代码在 MIT 许可证下授权 — 版权所有 2024 SunsetScan 贡献者。
只有 `data/hardware_eol/` 下的 SunsetScan 硬件 EOL 数据库工件采用单独授权:本数据库在知识共享署名-非商业性使用 4.0 国际许可协议 (CC BY-NC 4.0) 下授权。详情请参阅 [data/hardware_eol/LICENSE.md](data/hardware_eol/LICENSE.md)。
## 致谢
- [nmap](https://nmap.org) — 扫描引擎
- [python-nmap](https://pypi.org/project/python-nmap/) — Python nmap 接口
- [OSV.dev](https://osv.dev) — 漏洞数据库
- [Rich](https://rich.readthedocs.io) — 终端格式化
- [Jinja2](https://jinja.palletsprojects.com) — HTML 报告模板
- [cryptography](https://cryptography.io) — TLS 证书检查
- [scapy](https://scapy.net) — 原始数据包捕获和 ARP 扫描
- [danielmiessler/SecLists](https://github.com/danielmiessler/SecLists) — 凭据和 SNMP 列表
- [ihebski/DefaultCreds-cheat-sheet](https://github.com/ihebski/DefaultCreds-cheat-sheet) — 供应商凭据
- [enthec/webappanalyzer](https://github.com/AliasIO/wappalyzer) — Web 技术检测
- [salesforce/ja3](https://github.com/salesforce/ja3) — TLS 指纹识别
- [many-passwords](https://github.com/many-passwords/many-passwords) — 摄像头/DVR 凭据
标签:Claude, CVE检测, HTML报告生成, IT运维, Maven构建, Nmap, Python, Snort++, Socks5代理, SunsetScan, WSL2, 只读扫描, 安全合规, 安全检测工具, 家用网络安全, 局域网安全审计, 插件系统, 数据统计, 无后门, 无线安全, 生命周期管理(EOL), 端口扫描, 网络代理, 网络发现, 网络安全, 网络安全评估, 网络资产扫描, 虚拟驱动器, 被动扫描, 设备指纹识别, 逆向工具, 隐私保护, 默认密码审计