
Nmap NSEスクリプト。Vulners APIに問い合わせ、検出されたネットワークサービスの既知の脆弱性(CVE)を特定し、標準のポートスキャンを自動CVEルックアップとCVSSスコアリングで強化します。
nmapのサービススキャンを、CVE、CVSSスコア、既知のエクスプロイトの一覧に変換します。
nmapがすでに特定したソフトウェアを受け取り、Vulnersデータベースにその既知情報を問い合わせ、スキャンレポート内に回答を出力する3つのNSEスクリプトです。

| スクリプト | キーの要否 | 機能 |
|---|---|---|
vulners.nse | 不要 | nmapが見つけたすべてのCPEを公開Vulnersエンドポイントに送信し、既知情報をCVSSの高い順に出力します |
vulners_enterprise.nse | 必要 | Vulners API v4経由で同じ検索を実行: CVSS v3スコアと各CVEを参照するエクスプロイト |
http-vulners-regex.nse | 不要 | HTTPヘッダーとページコンテンツからWebソフトウェアを特定し、-sVが名前を特定できない場合でも他の2つが検索対象を持てるようにします |
これらは独立しています。1つだけ実行しても、3つすべて実行しても構いません。regexスクリプトは見つけた結果を自動的に他の2つに引き渡します。
macOS、Linux、Kali、WSL - 1行で、引数なし:
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が同梱されており、これがそれを置き換えます。
# 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に同梱されたコピーを静かに実行します。
5つのファイル、2つのディレクトリ:
| ファイル | 配置先 |
|---|---|
vulners.nse、vulners_enterprise.nse、http-vulners-regex.nse | <nmap data dir>/scripts/ |
nmap -sV --script vulners [--script-args mincvss=<score>] <target>
nmapが報告するすべてのCPEが検索され、各脆弱性はスコア、そのスコアの基準、リンクとともに出力されます。既知のエクスプロイトがあるエントリは*EXPLOIT*とマークされ、しきい値に関係なく表示されます。悪用される低重要度のバグでも、あなたは侵害されるからです。
export VULNERS_API_KEY=<token>
nmap -sV --script vulners_enterprise [--script-args mincvss=<score>] <target>

エンタープライズエンドポイントは、CVSS v3メトリクスとVulnersが収集したエクスプロイトの参照情報を返します。そのため、悪用されたCVEは*HAS EXPLOIT*とマークされ、エクスプロイト自体がその隣にリストされます。1つのポートのすべてのCPEは1つのリクエストで送信されます。
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は同じスキャン内でそれを検索します。
| 引数 | デフォルト | 意味 |
|---|---|---|
http-vulners-regex.paths | http-vulners-paths.txt (125パス) | パスのLuaリスト、または1行に1パスを記述したファイル名を指定する1つの文字列 |
パスリスト全体が単一のHTTPパイプラインで送信されます。読み取れないファイルがあると、同梱リストにフォールバックするのではなくスクリプトが停止します。そのため、ファイル名のタイポによって3パスのスキャンが125パスのスキャンになることはありません。
優先順位の高い順:
VULNERS_API_KEY--script-args vulners_enterprise.api_key_file=/absolute/path--script-args vulners_enterprise.api_key=<token>3番目は便利ですが、情報漏洩のリスクがあります。nmapは自身のコマンドラインをすべてのレポートにコピーするため、トークンは-oX出力のargs属性とシェル履歴に残ります。スクリプト自体はデバッグ出力を含め、トークンをどこにも書き込みません。それを保証するリグレッションテストがあります。
トークンは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に問い合わせません:
テスト、ハイジーンゲート、CONTRIBUTING.mdはgitリポジトリにのみ存在します。リリースアーカイブにはスクリプトとそのデータが同梱されます。3つのゲートは、特記のない限りすべてオフラインで動作します:
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のユニットテストケースが実際のNSEライブラリに対してnmap内で実行され、33のエンドツーエンドケースが実際のnmapバイナリをローカルWebサーバーと模擬Vulners APIに対して実行します。ハイジーンゲートは、シークレット、スキャン出力、エディタの作業ファイルをツリーから排除します。python3 tests/e2e/run_e2e.py --liveは実際のサービスに対する6つのチェックを追加します。CONTRIBUTING.mdを参照してください。
何かをエクスプロイトしますか? いいえ。スクリプトはバナーとページを読み取り、データベースに問い合わせるだけです。nmapのsafeカテゴリに属しています。
APIキーなしで動作しますか? はい。vulnersとhttp-vulners-regexはキーを必要としません。vulners_enterpriseは必要です。
ある脆弱性がcvss2.0を表示し、別の脆弱性がcvss3.1を表示するのはなぜですか? そのラベルはスコアの基準を示しています。Vulnersはソースが公開した基準を返します。v2の9.3はv3の9.3と同じではありません。
mincvssを設定したのに、低スコアのエントリが表示されるのはなぜですか? 既知のエクスプロイトがあるか、ソースがスコアを付けていないためです。どちらも意図的な動作です。
脆弱性があると分かっているホストで何も見つかりません。 -d2を付けて実行してください。スクリプトは問い合わせたすべてのCPEをログに記録します。通常、nmapがサービス名は特定してもバージョンは特定できておらず、検索するバージョンがない状態です。
スクリプトはNmap自体と同じライセンスです。Nmap Public Source LicenseについてはLICENSE、その意味についてはnmap.org/npslを参照してください。
脆弱性データはVulnersから提供され、その利用規約に従います。
Vulners Team <[email protected]> によってメンテナンスされています
#nmap #nse #vulnerability-scanner #cve #cvss #cpe #vulners
#security-tools #pentest #infosec #network-scanner #exploit-database
#lua #vulnerability-detection #security-automation
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.mincvss | 0 | この値を下回るスコアの脆弱性を非表示にします。スコアなしのセキュリティ情報とエクスプロイトは常に表示されます |
vulners.api_host | vulners.com | APIのホスト名 |
vulners.api_port | 443 | api_host上のポート |
| 引数 | デフォルト | 意味 |
|---|
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上のポート |