
nmap-vulners v1.5
Скрипт NSE для Nmap, который запрашивает API Vulners для выявления известных уязвимостей (CVE) для обнаруженных сетевых служб, расширяя стандартное сканирование портов автоматизированным поиском CVE и оценкой CVSS.
nmap-vulners
Превращает сканирование сервисов nmap в список CVE, оценок CVSS и известных эксплойтов.
Три NSE-скрипта, которые берут программное обеспечение, уже идентифицированное nmap, спрашивают у базы данных Vulners, что о нём известно, и выводят ответ в отчёт о сканировании.

Три скрипта
| Скрипт | Нужен ключ | Что делает |
|---|---|---|
vulners.nse | нет | Отправляет каждый найденный nmap CPE в публичную конечную точку Vulners и выводит всё, что о нём известно, начиная с самого высокого CVSS |
vulners_enterprise.nse | да | Тот же поиск через API Vulners v4: оценки CVSS v3 и эксплойты, ссылающиеся на каждый CVE |
http-vulners-regex.nse | нет | Снимает отпечаток веб-программного обеспечения по HTTP-заголовкам и содержимому страниц, чтобы двум другим было что искать, даже когда -sV не может его назвать |
Они независимы. Запустите один или все три — regex-скрипт автоматически передаёт свои находки двум другим.
Установка
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 ./vulners.nseчерез собственнуюscript.dbи незаметно запускает копию, поставляемую с 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>
Каждый CPE, о котором сообщает nmap, проверяется; каждая уязвимость выводится с её оценкой, шкалой, на которой находится эта оценка, и ссылкой. Записи с известным эксплойтом помечаются *EXPLOIT* и показываются независимо от порога, потому что эксплуатируемая уязвимость низкой степени серьёзности всё равно означает, что вас взломали.
vulners_enterprise — ключ API Vulners
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: веб-серверы, 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 копирует свою командную строку в каждый отчёт, поэтому токен попадает в атрибут args вывода -oX и в историю вашей оболочки. Сам скрипт нигде не записывает токен, включая свой отладочный вывод — об этом говорит регрессионный тест.
Токены находятся в вашем аккаунте 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, который присутствует только в записях, у которых он есть. Таблицы результатов ключуются по 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 против локального веб-сервера и подставного API Vulners; контроль качества не пускает в дерево исходников секреты, вывод сканирования и мусор из редактора. python3 tests/e2e/run_e2e.py --live добавляет шесть проверок против реального сервиса. См. CONTRIBUTING.md.
FAQ
Эксплуатирует ли он что-нибудь? Нет. Скрипты читают баннеры и страницы и обращаются к базе данных. Они находятся в категории safe nmap.
Работает ли без ключа API? Да — vulners и http-vulners-regex не нуждаются в нём. vulners_enterprise — нуждается.
Почему у одной уязвимости cvss2.0, а у другой cvss3.1? Метка называет шкалу, на которой находится оценка. Vulners возвращает ту, которую опубликовал источник; оценка 9.3 по v2 — это не оценка 9.3 по v3.
Почему показывается запись с низкой оценкой, если я задал mincvss? Потому что для неё есть известный эксплойт или потому что источник никогда не присваивал ей оценку. Оба случая намеренны.
На хосте, который, как я знаю, уязвим, ничего не найдено. Запустите с -d2: скрипты записывают в журнал каждый CPE, о котором спрашивали. Обычно nmap называет сервис, но не его версию, а без версии нечего искать.
Лицензия
Скрипты лицензированы так же, как сам Nmap — см. LICENSE для Nmap Public Source 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