
nmap-vulners v1.5
Nmap NSE 脚本,可查询 Vulners API,识别检测到的网络服务中的已知漏洞(CVE),通过自动 CVE 查找和 CVSS 评分增强标准端口扫描。
nmap-vulners
将 nmap 服务扫描转换为 CVE、CVSS 分数和已知漏洞利用的列表。
三个 NSE 脚本,接收 nmap 已识别的软件,向 Vulners 数据库查询其已知信息,并在扫描报告中输出答案。

三个脚本
| 脚本 | 需要密钥 | 功能 |
|---|---|---|
vulners.nse | 否 | 将 nmap 发现的每个 CPE 发送到公共 Vulners 端点,并输出已知信息,CVSS 最高的排在前面 |
vulners_enterprise.nse | 是 | 通过 Vulners API v4 执行相同的查询:CVSS v3 分数以及引用每个 CVE 的漏洞利用 |
http-vulners-regex.nse | 否 | 从 HTTP 标头和页面内容中对 Web 软件进行指纹识别,这样即使 -sV 无法识别软件名称,另外两个脚本也有可查询的内容 |
这三个脚本相互独立。可以运行其中一个,也可以全部运行——正则脚本会自动将其发现交给另外两个脚本。
安装
macOS、Linux、Kali、WSL——一行命令,无需参数:
curl -fsSL https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.sh | sh
Windows——以管理员身份运行 PowerShell:
irm https://raw.githubusercontent.com/vulnersCom/nmap-vulners/master/install.ps1 | iex
安装程序会询问 nmap 其数据存放位置,将脚本及其数据文件复制到该处,重建脚本数据库,然后检查 --script vulners 是否确实解析到刚安装的内容——nmap 自带一个 vulners.nse,本工具会替换它。
无需 root 及其他选项
# 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 v1.5
# remove everything it installed
./install.sh --uninstall
PowerShell 支持相同的选项:-User、-Prefix、-Ref、-Uninstall。
从检出目录安装
git clone https://github.com/vulnersCom/nmap-vulners
cd nmap-vulners
./install.sh
安装程序使用其旁边的文件,因此安装的正是你克隆的内容。直接从检出目录运行脚本也可以:
nmap -sV --script "$PWD/vulners.nse" <target>
从检出目录运行时请使用绝对路径。nmap 会先相对于自身的
script.db解析相对路径的--script ./vulners.nse,并静默运行 nmap 自带的副本,而不是你的副本。
手动安装
五个文件,两个目录:
| 文件 | 目标位置 |
|---|---|
vulners.nse, vulners_enterprise.nse, http-vulners-regex.nse | <nmap data dir>/scripts/ |
http-vulners-regex.json, http-vulners-paths.txt | <nmap data dir>/nselib/data/ |
然后执行 sudo nmap --script-updatedb。
nmap 数据目录通常是 /usr/share/nmap(Debian、Ubuntu、Kali)、/usr/local/share/nmap(从源码构建)、/opt/homebrew/share/nmap(Homebrew)或 C:\Program Files (x86)\Nmap(Windows)。要确定具体位置,可以询问 nmap:
nmap -d2 --script-help probe 2>&1 | grep nse_main.lua
包含 nse_main.lua 的目录就是当前这个 nmap 所使用的目录。
使用方法
vulners——无需密钥
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
nmap 报告的每个 CPE 都会被查询;每个漏洞都会输出其分数、该分数所在的评分体系以及一个链接。已知存在漏洞利用的条目会标记为 *EXPLOIT*,并且无论阈值是多少都会显示,因为一个被利用的低严重性漏洞同样会让你被攻陷。
vulners_enterprise——Vulners API 密钥
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

企业端点会返回 CVSS v3 指标以及 Vulners 收集的漏洞利用引用,因此被利用的 CVE 会标记为 *HAS EXPLOIT*,并且漏洞利用本身会列在旁边。一个端口的所有 CPE 都在一个请求中发送。
http-vulners-regex——指纹识别 -sV 无法识别的软件
nmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

178 个模式将 HTTP 标头和页面标记——Server、X-Powered-By、生成器标签、资源 URL——映射到 CPE:Web 服务器、CMS、框架、WordPress 插件、JavaScript 库。它发现的所有内容都会发布到端口上,因此 vulners 和 vulners_enterprise 会在同一次扫描中查询这些内容。
脚本参数
vulners
| 参数 | 默认值 | 含义 |
|---|---|---|
vulners.mincvss | 0 | 隐藏分数低于此值的漏洞。未评分的公告和漏洞利用始终显示 |
vulners.api_host | vulners.com | API 的主机名 |
vulners.api_port | 443 | api_host 上的端口 |
vulners_enterprise
| 参数 | 默认值 | 含义 |
|---|---|---|
vulners_enterprise.mincvss | 0 | 同上 |
vulners_enterprise.api_key | - | API 令牌。建议使用环境变量,见下文 |
vulners_enterprise.api_key_file | - | 文件的绝对路径,文件第一行为令牌 |
vulners_enterprise.api_host | vulners.com | API 的主机名 |
vulners_enterprise.api_port | 443 | api_host 上的端口 |
http-vulners-regex
| 参数 | 默认值 | 含义 |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt(125 个路径) | Lua 路径列表,或一个字符串,指定一个每行一个路径的文件 |
整个路径列表在单个 HTTP 管道中传输。无法读取的文件会使脚本停止,而不是回退到随附的列表,因此文件名中的拼写错误不会把原本三个路径的扫描变成 125 个路径的扫描。
API 密钥存放位置
按优先级顺序:
- 环境变量
VULNERS_API_KEY --script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>
第三种方式方便但会泄露:nmap 会将其自身的命令行复制到每份报告中,因此令牌最终会出现在 -oX 输出的 args 属性中以及你的 shell 历史记录里。脚本本身不会在任何地方写入令牌,包括其调试输出——有回归测试可以证明这一点。
令牌位于你的 vulners.com 账户中。没有令牌时,vulners_enterprise 会保持静默,不发送任何内容。
三者如何协同工作
nmap -sV
|
+-- service fingerprint --> port.version.cpe ------------+
| |
+-- http-vulners-regex.nse |
requests the path list in one pipeline |
matches headers and bodies against 178 patterns |
publishes the CPEs it found for that port ---------+
|
v
vulners.nse / vulners_enterprise.nse
one batched request per port
answers cached for the whole scan
sorted by CVSS, exploits marked
机器可读输出
脚本输出的所有内容也都是结构化的,因此无需处理人类可读的文本即可解析 -oX 输出:
<script id="vulners_enterprise">
<table key="cpe:/a:apache:http_server:2.4.7">
<table>
<elem key="id">CVE-2021-44790</elem>
<elem key="type">cve</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
</table>
<table>
<elem key="id">EDB-ID:51193</elem>
<elem key="type">exploitdb</elem>
<elem key="cvss">9.8</elem>
<elem key="cvss_type">cvss3.1</elem>
<elem key="is_exploit">true</elem>
</table>
</table>
</script>
键为 id、type、cvss、cvss_type 和 is_exploit,其中 is_exploit 仅存在于具有漏洞利用的条目上。结果表以找到它们的 CPE 作为键。未评分的公告既不包含 cvss 也不包含 cvss_type。
礼貌地扫描
对网络的扫描对 API 的请求远比你看到的要少:
- 一个端口的每个 CPE 都合并到一个批量请求中
- 整个扫描期间缓存答案,因此一百台相同的服务器只需一次查询,而不是一百次
- 已在进行的查询会被等待而非重复发起
- 125 路径的扫描在 5 个 TCP 连接上运行,而不是 126 个,并且在服务器支持的情况下请求压缩页面
- 速率限制或服务中断会停止扫描的请求,而不是按主机重试
开发
测试、卫生门禁和 CONTRIBUTING.md 仅在 git 仓库中;发布归档只包含脚本及其数据。三道门禁,除注明外均为离线运行:
nmap -sn -Pn --script ./tests/run.nse --script-args testdir=tests,root=. 127.0.0.1
python3 tests/e2e/run_e2e.py
python3 tools/check.py
110 个单元测试用例在 nmap 内部针对真实的 NSE 库运行;33 个端到端用例驱动真实的 nmap 二进制文件,针对本地 Web 服务器和模拟 Vulners API 运行;卫生门禁防止密钥、扫描输出和编辑器杂项文件进入仓库。python3 tests/e2e/run_e2e.py --live 会额外针对真实服务执行六项检查。参见 CONTRIBUTING.md。
常见问题
它会利用漏洞吗? 不会。这些脚本只是读取横幅和页面并查询数据库。它们属于 nmap 的 safe 类别。
没有 API 密钥能用吗? 可以——vulners 和 http-vulners-regex 不需要密钥。vulners_enterprise 需要。
为什么一个漏洞显示 cvss2.0 而另一个显示 cvss3.1? 标签标明分数所在的评分体系。Vulners 返回的是来源发布的版本;9.3 的 v2 分数并不等于 9.3 的 v3 分数。
我设置了 mincvss 后,为什么还会显示低分条目? 因为它有已知的漏洞利用,或者因为来源从未对其评分。这两种情况都是有意为之。
在我已知存在漏洞的主机上,它什么都没发现。 使用 -d2 运行:脚本会记录它们查询过的每个 CPE。通常 nmap 识别出了服务名称但没有识别出版本,因此没有版本可供查询。
许可证
这些脚本的许可证与 Nmap 本身相同——Nmap Public Source License 请参见 LICENSE,其含义请参见 nmap.org/npsl。
漏洞数据来自 Vulners,并受其条款约束。
相关项目
- vulners.com ——这些脚本背后的数据库
- vulnersCom/api ——Python 客户端
- vulnersCom/burp-vulners-scanner ——Burp Suite 中的同一数据
- nmap.org/book/nse.html ——NSE 脚本的工作原理
由 Vulners 团队维护 <[email protected]>
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation