返回更新列表
新发布Aug 18, 2026

nmap-vulners v1.5

Nmap NSE 脚本,可查询 Vulners API,识别检测到的网络服务中的已知漏洞(CVE),通过自动 CVE 查找和 CVSS 评分增强标准端口扫描。

分享

nmap-vulners

将 nmap 服务扫描转换为 CVE、CVSS 分数和已知漏洞利用的列表。

三个 NSE 脚本,接收 nmap 已识别的软件,向 Vulners 数据库查询其已知信息,并在扫描报告中输出答案。

tests license nmap data stars

vulners.nse against scanme.nmap.org


三个脚本

脚本需要密钥功能
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>

vulners_enterprise.nse against scanme.nmap.org

企业端点会返回 CVSS v3 指标以及 Vulners 收集的漏洞利用引用,因此被利用的 CVE 会标记为 *HAS EXPLOIT*,并且漏洞利用本身会列在旁边。一个端口的所有 CPE 都在一个请求中发送。

http-vulners-regex——指纹识别 -sV 无法识别的软件

nmap -sV --script http-vulners-regex [--script-args paths={"/"}] <target>

http-vulners-regex.nse against scanme.nmap.org

178 个模式将 HTTP 标头和页面标记——ServerX-Powered-By、生成器标签、资源 URL——映射到 CPE:Web 服务器、CMS、框架、WordPress 插件、JavaScript 库。它发现的所有内容都会发布到端口上,因此 vulnersvulners_enterprise 会在同一次扫描中查询这些内容。

脚本参数

vulners

参数默认值含义
vulners.mincvss0隐藏分数低于此值的漏洞。未评分的公告和漏洞利用始终显示
vulners.api_hostvulners.comAPI 的主机名
vulners.api_port443api_host 上的端口

vulners_enterprise

参数默认值含义
vulners_enterprise.mincvss0同上
vulners_enterprise.api_key-API 令牌。建议使用环境变量,见下文
vulners_enterprise.api_key_file-文件的绝对路径,文件第一行为令牌
vulners_enterprise.api_hostvulners.comAPI 的主机名
vulners_enterprise.api_port443api_host 上的端口

http-vulners-regex

参数默认值含义
http-vulners-regex.pathshttp-vulners-paths.txt(125 个路径)Lua 路径列表,或一个字符串,指定一个每行一个路径的文件

整个路径列表在单个 HTTP 管道中传输。无法读取的文件会使脚本停止,而不是回退到随附的列表,因此文件名中的拼写错误不会把原本三个路径的扫描变成 125 个路径的扫描。

API 密钥存放位置

按优先级顺序:

  1. 环境变量 VULNERS_API_KEY
  2. --script-args vulners_enterprise.api_key_file=/absolute/path
  3. --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>

键为 idtypecvsscvss_typeis_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 密钥能用吗? 可以——vulnershttp-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 团队维护 <[email protected]>

#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners #security-tools #pentest #infosec #network-scanner #exploit-database #lua #vulnerability-detection #security-automation

分类