
Nmap NSEスクリプト。Vulners APIに問い合わせ、検出されたネットワークサービスの既知の脆弱性(CVE)を特定し、標準のポートスキャンを自動CVEルックアップとCVSSスコアリングで強化します。
nmapのサービススキャンを、CVE・エクスプロイト・実際に攻撃されているもののランキングリストに変換します。
nmapがすでに特定したソフトウェアを取得し、Vulnersデータベースにその既知情報を問い合わせ、その回答をスキャンレポート内に出力する単一のNSEスクリプトです。実際に悪用可能なものから順に、深刻度の高い順で表示します。
スキャン用に公開されたホストの実際のスキャン結果。キーなし、次にキーあり、そしてWebポート: nmapの-sVがCoyoteバナーを報告し、スイープがその背後にあるTomcatとjQueryを特定します。
開いているすべてのポートについて、nmapが特定したソフトウェア(-sVが生成したCPE)を検索し、Vulnersがそのソフトウェアについて知っている情報を出力します。スコアのみではなく、実際に悪用されているものから順に深刻度の高い順で表示し、各行はその背後にあるページへのリンクになります。
HTTPポートでは、Webスタック自体のフィンガープリントも取得します。これにより、-sVでは見えないソフトウェア(アプリケーションフレームワーク、CMS、リバースプロキシの背後にあるPHPバージョンなど)を特定します。721のルールが、バージョンを保持するレスポンスの各部分(Serverヘッダー、X-Powered-By、Cookie、ページタイトル、<meta>タグ、<script src>ファイル名、本文)を読み取ります。これらの識別情報も検索され、ポート上に公開されるため、スキャンの残りの部分で使用できます。
スイープ以外に2つのことを行います:
-sVがサービスを特定できなかった場合、生のバナーをFTP、SMTP、SSH、MySQL、DNS、NTP、LDAPなどのルールと照合します。これには追加のリクエストは不要で、ポートがまったく何も報告しないケースをカバーします。/CHANGELOG.txt、Joomlaの場合は/administrator/manifests/files/joomla.xml)に1回のリクエストを送信します。6つの調査対象製品のいずれも実行していないホストには、追加のリクエストは送信されません。```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 |
| **キーあり、1クレジット** | 無料経路ではまったく名前を特定できなかったソフトウェアが、生のバナーから識別される。ここでコストがかかるのはこれだけであり、しかもCPEを持たないサービスに対してのみである |
すでにCPEが付与されているポートがクレジットを消費することは決してない:4つの製品にわたって測定したところ、無料の検索はCPEに対して有料のものと**同じCVE**を返す。クレジットが購入するのは識別であり、より多くの脆弱性ではない。
無料キーは[vulners.com/userinfo](https://vulners.com/userinfo)にある。
## インストール
**macOS、Linux、Kali、WSL** - 引数なしの1行で:```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。
ファイルは1つだけです。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 リスト、1 行に 1 パスを記述したファイルを指定する文字列、またはスイープを無効にする `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` - は 1 リリースの間受け入れられ、非推奨の
通知が表示されます。
## API キーの保存場所
優先順位の高い順に:
1. `~/.nmap/vulners.key`、1 行、モード 600 - インストーラーが書き込みを提案します
2. 環境変数の `VULNERS_API_KEY`
3. `--script-args vulners.api_key_file=/absolute/path`
4. `--script-args vulners.api_key=<token>`
最後の方法は便利ですが漏洩に注意してください: nmap は自身のコマンドラインをすべてのレポートにコピーするため、トークンは `-oX` 出力の `args` 属性とシェル履歴に残ります。スクリプト自体は、デバッグ出力を含め、トークンをどこにも書き込みません - それを保証する回帰テストがあります。
明示的に指定したキーファイルが読み取れない場合は、静かにフォールバックするのではなく、実行が停止します - ファイルを指定したオペレーターはそのファイルを意図しているためです - そして、レポートにはどのファイルであったかが示されます。パスの入力ミスが、クリーンなスキャンのように見えることはありません。
## フィンガープリントの入手元
スクリプトはそれらを保持していません。スキャンごとに、最初のホストに触れる前に、3 つの辞書を 1 回ダウンロードします:```
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
これはスキャンごとに4つのリクエストです。ホストごとでもポートごとでもなく、ファイルごとに1つです。250 KBのJSONのうち40 KBを圧縮して、nmapの事前スキャン段階で送信します。公開ブランチに対して測定されています。したがって、インストール済みのスクリプトは更新されなくても新しいフィンガープリントを取得します。
ファイルシステムには何も書き込みません。 辞書はスキャンの間だけ保持され、破棄されます。これはnmapが同梱するすべてのスクリプトの動作と同じです。611個のうち26個が書き込み用にファイルを開きますが、そのすべてがスクリプト引数で指定された場所にのみ書き込みます。キャッシュを保持するものはなく、このスクリプトも同様です。
ダウンロードできなくても、スキャンは引き続き実行されます。 辞書はWebフィンガープリンティングにのみ供給され、それ以外には使用されないため、GitHubへの経路がないマシンはその機能だけを失い、他のすべては保持します。nmap自体が特定したソフトウェアは引き続き照会され、レポートはどの機能が欠落していたかを示すため、空の結果をクリーンなネットワークとして読む必要はありません。
| 引数 | 機能 |
|---|---|
vulners.catalog_url=<url> | 代わりにミラーから取得します。エアギャップネットワーク用です。ホスト名または角括弧で囲んだIPv6アドレス、http://[fd00::1]/catalog/ |
vulners.catalog=none | まったく取得しません。nmapが命名したものだけを照会します |
HTTPポートでは、スクリプトはカタログが公開するすべてのパス(939パス)をリクエストし、すべての回答に対して721個すべてのルールを照合します。パスはWhatWeb、nuclei、FingerprintHubから取得されます。つまり、推測ではなく、製品が認識される場所です。実行していないソフトウェアに属するパスでもリクエストする価値があります。なぜなら、回答には依然としてServer、X-Powered-By、Cookie、タイトルが含まれており、ルールはそれらから前面にあるスタックを見つけるからです。
その速度はあなたの-T次第であり、私たちの設定ではありません。 リストは決して縮小しません。速度が変わるだけです。
6つすべてを1回の実行で同じローカルサーバーに対して測定しました。これに対する-sV単独では6.1秒なので、スイープはデフォルトで1.5秒かかります。遅い2行は-T0と-T1がその役割を果たしていることになります。188バッチと94バッチで、それぞれの間に意図的な待機があります。
リクエストは34〜48接続にわたってパイプライン処理され、同時に開くのは最大4つです。これはnselibのpipeline_goであり、nmap自身のhttp-enumが使用するのと同じ仕組みで、サーバーのKeep-Alive: max=と--script-args http.max-pipeline=Nを尊重します。
--script-args vulners.paths=noneはスイープを完全に無効にします。
nmap -sV | +-- service fingerprint --> port.version.cpe --------------+ | | +-- vulners.nse | reads nmap's banner for services -sV could not name | on an HTTP port: requests the path list in one | pipeline, matches 721 rules against the header, the | title, the meta tags, the scripts and the body | probes for a version when a product hid it | publishes everything it recognised ------------------+ | v GET /api/v3/burp/software/ per identity free, no key, CDN-cached | POST /api/v3/search/id/ per 100 findings free, needs a key: enrichment | POST /api/v4/audit/smart only for a service with no CPE: 1 credit | ranked, filtered, printed
Answers are cached for the whole scan, keyed per identity, so a hundred
identical servers cost one lookup. Enrichment is cached per finding id, so two
web ports running overlapping software fetch each document once.
## Machine-readable output
Everything printed is also structured, so `-oX` can be parsed without touching
the human text. The script id, the two table levels and the five original
element keys are unchanged from 1.x, which is what DefectDojo, Faraday,
nmap2csv and raven read:```xml
<script id="vulners">
<elem key="schema">2.0</elem>
<elem key="mode">keyed</elem>
<table key="cpe:/a:apache:http_server:2.4.7">
<table>
<elem key="id">CVE-2021-40438</elem>
<elem key="type">cve</elem>
<elem key="severity">CRITICAL</elem>
<elem key="cvss">9.0</elem>
<elem key="cvss_type">cvss3.1</elem>
<elem key="is_exploit">false</elem>
<elem key="exploit_known">true</elem>
<elem key="kev">true</elem>
<elem key="epss">0.99612</elem>
<elem key="exploitation">active</elem>
<elem key="title">Apache HTTP Server SSRF in mod_proxy</elem>
<elem key="href">https://vulners.com/cve/CVE-2021-40438</elem>
<elem key="source_href">https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-40438</elem>
</table>
</table>
</script>
2.0での新機能: schema、mode、severity、exploit_known、kev、epss、
epss_percentile、exploitation、ai_score、title、published、href、
source_href、found_on。これらはすべて存在するか欠落しているかのどちらかで、空になることはありません。以前より深いネストはありません。なぜなら、3番目のテーブルレベルは調査したすべてのインポーターに不可視だからです。
href は常に、両モードにおいて、検出結果のvulners.comページを指します。エンドポイント自身の href は上流のアドレスです(CVEの場合はnvd.nist.gov、スクレイピングされたエクスプロイトの場合はgithub.com)。これは別途 source_href として運ばれるため、どちらのフィールドの意味も、どのモードが生成したかに依存しません。
構造化出力は常に mincvss を通過したすべての検出結果を運びます。たとえ詳細度ラダーがテキストから隠すものであってもです。つまり、-v を渡さないことで自動化が検出結果を失うことはありません。
レンダリングされたテキストは区切りです。 *EXPLOIT* と *HAS EXPLOIT* トークン、およびタブ区切りのレイアウトは廃止され、上記の整列テーブルに置き換えられました。行ごとのvulners.comリンクは残っています。それは最後の列であり、レイアウトが短縮しない唯一のセルです。なぜなら、URLの半分はURLではないからです。テキストスクレイピングを行う利用者は更新が必要です。-oX の利用者は更新不要です。
ネットワークのスキャンは、見た目よりもはるかに少ないAPIリクエストしか行いません:
テスト、衛生ゲート、CONTRIBUTING.md はgitリポジトリのみにあります。リリースアーカイブにはスクリプトとそのデータが同梱されます。8つのゲートがあり、すべて注記がある場合を除きオフラインで、CIはこれらを正確に実行します:```sh
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
python3 tools/catalog.py --check
python3 tools/xml_contract.py --selftest
python3 tools/fingerprints/selftest.py
python3 tools/catalog_diff.py --selftest
python3 tools/nmap_style.py
270 件のユニットケースが、実際の NSE ライブラリに対して nmap 内で実行されます。64 件のエンドツーエンドケースは、実際の nmap バイナリをローカル Web サーバーと、実際の API が強制することを強制する Vulners API の代役に対して駆動します。衛生ゲートは、シークレット、スキャン出力、エディタの散らかりをツリーから排除し、NSE が失われた結果に変えるグローバル読み取りを拒否します。最後の 4 つは、それを公開するデータとツールを保持します。カタログの形状、すべてのインポーターが読み取る XML 契約、パターントランスレータ、再構築の公開が安全かを判断するゲートです。最後の 1 つは、リポジトリ全体を [Nmap 自身のコード標準](https://secwiki.org/w/Nmap/Code_Standards) に保持します。`HACKING` は、nmap のツリーに住みたいスクリプトの権威としてこれを挙げています。タブなし、末尾の空白なし、80 列未満の行、セミコロンなし、`--;` で始まるプライベート NSEdoc、Python には PEP 8。
`python3 tests/e2e/run_e2e.py --live` は、実際のサービスに対するチェックを追加します。
[CONTRIBUTING.md](https://github.com/vulnerscom/nmap-vulners/blob/master/CONTRIBUTING.md) を参照してください。
## FAQ
**何かを悪用しますか?** いいえ。バナーとページを読み取り、データベースに問い合わせます。ペイロードを送信せず、認証情報を試しません。`safe` ではなく `discovery, intrusive, vuln, external` に分類される理由は 1 つだけです。パススイープが Web ポートの 939 パスを要求し、nmap の `safe` の定義は、大量の帯域幅を使用するスクリプトを除外するためです。nmap 自身の `http-enum` は 2,204 を要求し、同じラベルを持ちます。`-T` はそれらが送信される速度を設定し、数を設定することはありません。`--script-args vulners.paths=none` はスイープを完全にオフにします。
**API キーなしで動作しますか?** はい、完全に動作します。キーがない場合、無料のエンドポイントを使用します。これは、CPE に対して有料版と同じ脆弱性を返します。キーは、検出結果ごとに詳細を追加し、無料パスでは指定できないソフトウェアを指定できます。
**なぜ `-sC` が Web ソフトウェアを見つけなくなったのですか?** `vulners` が nmap の `default` カテゴリに含まれなくなり、`http-vulners-regex.nse` にあったフィンガープリントスイープも同様です。ターゲットのソフトウェアの識別情報を第三者に送信することは、あなたが要求したものであるべきです。`--script vulners` を実行してください。
**なぜある脆弱性は `cvss2.0` を表示し、別の脆弱性は `cvss3.1` を表示するのですか?** ラベルは、スコアが乗っているスケールを指定します。Vulners は、ソースが公開した方を返します。v2 スコアの 9.3 は、v3 スコアの 9.3 ではありません。
**`mincvss` を設定したのに、なぜ低スコアのエントリが表示されるのですか?** 既知のエクスプロイトがあるか、ソースがスコアを付けなかったためです。どちらも意図的です。
**レポートにカタログをダウンロードできなかったと表示されます。** その場合、Web フィンガープリンティングは実行されず、他のすべては実行されました。nmap 自身が指定したソフトウェアは引き続き検索されました。そのため、これは明確に述べられています。実行されなかった機能は、何も見つからなかった機能として読み取られます。2 つの原因には別々の表現があります。「ダウンロードできませんでした」はネットワークであり、「応答したが、辞書の 1 つを読み取れませんでした」は、あなたが指定したミラーです。
**脆弱だとわかっているホストで何も見つかりませんでした。** `-d2` で実行してください。問い合わせたすべての識別情報をログに記録します。通常、nmap はサービスを指定しましたが、そのバージョンは指定せず、検索するバージョンがありません。
## ライセンス
スクリプトは Nmap 自体と同じライセンスです。Nmap Public Source License については [LICENSE](https://github.com/vulnerscom/nmap-vulners/blob/master/LICENSE) を、その意味については [nmap.org/npsl](https://nmap.org/npsl/) を参照してください。
脆弱性データは [Vulners](https://vulners.com) から提供され、その利用規約に従います。
## 関連
* [vulners.com](https://vulners.com) - これらのスクリプトの背後にあるデータベース
* [vulnersCom/api](https://github.com/vulnersCom/api) - Python クライアント
* [vulnersCom/burp-vulners-scanner](https://github.com/vulnersCom/burp-vulners-scanner) - Burp Suite 内の同じデータ
* [nmap.org/book/nse.html](https://nmap.org/book/nse.html) - NSE スクリプトの仕組み
---
<div align="center">
Vulners チーム <[email protected]> によって保守されています
`#nmap` `#nse` `#vulnerability-scanner` `#cve` `#cvss` `#cpe` `#vulners`
`#security-tools` `#pentest` `#infosec` `#network-scanner` `#exploit-database`
`#lua` `#vulnerability-detection` `#security-automation`
</div>
| バッチ数 | バッチ間の待機 | 測定値(Webポート1つ) |
|---|
-T0 paranoid | 188 x 5 | 2 秒 | 11 分 22 秒 |
-T1 sneaky | 94 x 10 | 1 秒 | 1 分 56 秒 |
-T2 polite | 38 x 25 | 0.5 秒 | 26.2 秒 |
-T3 normal | 10 x 100 | 0.1 秒 | 7.6 秒 |
-T4 aggressive | 4 x 250 | なし | 6.7 秒 |
-T5 insane | 1 | なし | 6.6 秒 |