将 nmap 服务扫描转化为按风险排序的 CVE、漏洞利用及野外攻击目标列表。
一个 NSE 脚本,它获取 nmap 已识别的软件信息,向 Vulners 数据库查询已知情报,并将结果打印在扫描报告中——按实际可利用性从高到低排列。
对公开可扫描主机的真实扫描。先无密钥,再有密钥,最后是 Web 端口:nmap 的 -sV 报告了 Coyote 横幅,扫描识别出其背后的 Tomcat 和 jQuery。
对于每个开放端口,它会查询 nmap 识别的软件信息——即 -sV 生成的 CPE——并打印 Vulners 已知的相关情报:按实际被利用情况而非仅按评分从高到低排列,每一行都链接到对应的详情页面。
在 HTTP 端口上,它还会对 Web 技术栈本身进行指纹识别,从而识别出 -sV 无法看到的软件——例如应用框架、CMS、反向代理背后的 PHP 版本。721 条规则会读取响应中携带版本信息的各个部分:Server 头、X-Powered-By、Cookie、页面标题、<meta> 标签、<script src> 文件名以及响应正文。这些识别出的身份信息也会被查询,并发布到该端口上,供扫描的其他部分使用。
除扫描之外,它还有两项额外功能:
-sV 无法识别服务时,原始横幅会与针对 FTP、SMTP、SSH、MySQL、DNS、NTP、LDAP 等的规则进行匹配。这不会产生额外的请求开销,而且这正是端口在其他情况下将一无所获的场景。/CHANGELOG.txt、Joomla 的 /administrator/manifests/files/joomla.xml。如果主机未运行这六种被探测的产品中的任何一种,则不会发送任何额外请求。```sh
nmap -sV --script vulners 这就是整个界面。它无需 API 密钥即可工作;有了密钥,它会告诉你更多信息。这里没有模式切换。```
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.7 ((Ubuntu))
| vulners: cpe:/a:apache:http_server:2.4.7 272 findings, 56 exploitable
| SEVERITY CVSS AI FLAGS LINK
| ======== ==== ==== ======= ==============================================================
| CRITICAL 10.0 8.8 EXP https://vulners.com/gitee/3E6BA608-776F-5B1F-9BA5-589CD2A5A351
| CRITICAL 9.8 9.9 EXP https://vulners.com/zdt/1337DAY-ID-39214
| CRITICAL 9.8 9.6 EXP https://vulners.com/packetstorm/PACKETSTORM:171631
| CRITICAL 9.8 9.9 https://vulners.com/cve/CVE-2021-44790
| CRITICAL 9.8 9.8 https://vulners.com/cve/CVE-2023-25690
|_ 262 more not shown; -v shows all, -vv adds where each was found
使用密钥时,对同一主机的相同扫描会给出不同答案——KEV 表示
CISA 已将该漏洞记录为已在野外被利用,而 EPSS 是
其将被利用的已发布概率:```
| vulners: cpe:/a:apache:http_server:2.4.7 272 findings, 78 exploitable
| SEVERITY CVSS EPSS FLAGS LINK
| ======== ==== ==== ======= ==============================================================
| CRITICAL 9.1 >99% KEV EXP https://vulners.com/cve/CVE-2024-38475
| CRITICAL 9.0 >99% KEV EXP https://vulners.com/cve/CVE-2021-40438
| CRITICAL 9.1 >99% KEV https://vulners.com/cnvd/CNVD-2024-36387
| CRITICAL 10.0 71% EXP https://vulners.com/gitee/3E6BA608-776F-5B1F-9BA5-589CD2A5A351
| CRITICAL 9.8 97% EXP https://vulners.com/cve/CVE-2021-44790
|_ 262 more not shown; -v shows all, -vv adds where each was found
同样的 272 项发现,顺序不同,顶行不同——而且其中 22 项已知可被利用,因为每个漏洞利用都通过一个键关联到它所利用的 CVE。这两个都是来自 vulners.com 的真实答案,是针对展示该横幅的本地服务器捕获的。
## 排序
事实优先于预测。发现按以下顺序排列:
1. **CISA KEV** —— 记录为已在野外被利用
2. **SSVC `active`** —— 协调方判断利用正在发生
3. **存在漏洞利用** —— 代码已发布,针对此漏洞或其命名的 CVE
4. **高 EPSS** —— 模型预期会被利用
5. 其他所有情况
CVSS 仅在带内打破平局,而非跨带:一个已被利用的 7.5 比一个未被利用的 9.8 问题更严重,而这个顺序正是表达这一点的。
列跟随数据。答案未携带的信号会失去其列,而不是显示空单元格,因为空白的 EPSS 读起来像“安静”,而这是缺失字段无法支持的断言。
## API 密钥带来的差异
| | |
|---|---|
| **无密钥** | nmap 发现的每个 CPE 都会在免费端点上查询。发现、评分、漏洞利用标志以及 Vulners 自身的 AI 评分。无需积分,无需账户 |
| **有密钥,无积分** | 每项发现都会获得 id 端点所知的额外信息:标题、日期、上游公告或漏洞利用页面、漏洞利用到 CVE 的关联、CISA KEV,以及——取决于许可证——EPSS 和 SSVC |
| **有密钥,一个积分** | 免费路径完全无法命名的软件会从其原始横幅中被识别出来。这是这里唯一需要花费任何费用的部分,且仅针对没有 CPE 的服务 |
已带有 CPE 的端口永远不会消耗积分:跨四个产品测量,免费查询对某个 CPE 返回的 **CVE 列表** 与付费查询相同。积分购买的是识别能力,而非更多漏洞。
免费密钥位于 [vulners.com/userinfo](https://vulners.com/userinfo)。
## 安装
**macOS、Linux、Kali、WSL** —— 一行命令,无需参数:```sh
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows - 以管理员身份运行 PowerShell:```powershell irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
安装程序会询问 nmap 其数据存放位置,将脚本及其数据文件复制到那里,重建脚本数据库,然后检查 `--script vulners` 是否确实解析到刚刚安装的内容——nmap 自带一个 `vulners.nse`,此操作会将其替换。
<details>
<summary><b>无 root 权限及其他选项</b></summary>```sh
# into ~/.nmap, no sudo; the installer prints the NMAPDIR line to add to your profile
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh -s -- --user
# a specific directory
./install.sh --prefix /usr/local/share/nmap
# a specific release
./install.sh --ref v2.0
# remove everything it installed
./install.sh --uninstall
PowerShell 采用相同的选项:-User、-Prefix、-Ref、-Uninstall。
单个文件:将 vulners.nse 复制到 <nmap data dir>/scripts/ 并运行
sudo nmap --script-updatedb。无需放置其他内容——该脚本会在扫描时下载其字典,且不会向磁盘写入任何内容——因此也不会遗漏任何东西,而遗漏曾会导致脚本运行后一无所获,却对原因只字不提。
如果你是从 1.x 升级,请同时删除该目录下的 vulners_enterprise.nse 和
http-vulners-regex.nse。残留的 http-vulners-regex.nse 仍带有 default 类别,并会在普通的 -sC 下持续扫描目标。安装程序会为你完成此操作。
nmap 数据目录通常是 /usr/share/nmap(Debian、Ubuntu、Kali)、
/usr/local/share/nmap(从源码构建)、/opt/homebrew/share/nmap
(Homebrew)或 C:\Program Files (x86)\Nmap(Windows)。要确定具体位置,请询问 nmap:```sh
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
存放 `nse_main.lua` 的目录就是此 nmap 所使用的目录。
</details>
## 脚本参数
| 参数 | 默认值 | 含义 |
|---|---|---|
| `vulners.mincvss` | `0` | 隐藏评分低于此值的发现结果。无评分的公告以及任何已知漏洞利用的内容,无论阈值如何都会显示 |
| `vulners.paths` | 已发布的 939 条路径 | Web 扫描的路径:一个 Lua 列表、一个字符串(指向每行一条路径的文件),或 `none` 以关闭扫描。您指定的文件若无法读取,会停止扫描并说明原因,而不是回退到已发布的列表 |
| `vulners.width` | `80` | 表格布局所针对的终端宽度 |
| `vulners.max_items` | `32` | 整个扫描计费项目的上限 |
| `vulners.api_key` | - | API 令牌。有泄露风险:nmap 会将其自身命令行复制到 `-oX` 中 |
| `vulners.api_key_file` | - | 文件的绝对路径,其第一行为令牌 |
| `vulners.api_host` | `vulners.com` | API 的主机名 |
| `vulners.api_port` | `443` | `api_host` 上的端口 |
裸名称同样有效,因此 `--script-args mincvss=7` 就足够了。
1.x 版本的参数前缀——`vulners_enterprise.*` 和
`http-vulners-regex.paths`——在一个版本内仍被接受,并会打印
弃用通知。
## API 密钥存放位置
按优先级顺序:
1. `~/.nmap/vulners.key`,单行,权限 600——安装程序会提供写入选项
2. 环境变量中的 `VULNERS_API_KEY`
3. `--script-args vulners.api_key_file=/absolute/path`
4. `--script-args vulners.api_key=<token>`
最后一种方式方便但有泄露风险:nmap 会将其自身命令行复制到每份
报告中,因此令牌会出现在 `-oX` 输出的 `args` 属性中以及您的
shell 历史记录里。脚本本身绝不会将令牌写入任何位置,包括其
调试输出——有一项回归测试对此进行了验证。
您明确指定的密钥文件若无法读取,会停止运行而不是静默
回退——操作员指定了文件就意味着要用该文件——并且报告会
说明是哪个文件。拼写错误的路径不会看起来像一次干净的扫描。
## 指纹来源
脚本本身不携带指纹。每次扫描时,它会在接触第一台主机之前
下载三份字典:```
https://raw.githubusercontent.com/vulnersCom/nmap-vulners/catalog/
index.json what exists, at which serial
fingerprints.json 721 product and version rules
paths.json 939 paths the sweep requests
probes.json targeted version probes
每次扫描会发出四个请求——每个文件一个,而不是每个主机或每个端口——在 nmap 的预扫描阶段,从 250 KB 的 JSON 中压缩出 40 KB。这是针对已发布分支进行测量的。因此,已安装的脚本无需更新即可获取新的指纹。
它不会向你的文件系统写入任何内容。 字典仅在扫描期间保留,随后即被丢弃,这与 nmap 随附的所有脚本行为一致:在 611 个脚本中,有 26 个会打开文件进行写入,且每个都只写入脚本参数指定的位置。没有脚本保留缓存,本脚本也不例外。