Nmap とは — ポートスキャン・サービス検出・OS 推測の定番ツール のサムネイル

Nmap とは — ポートスキャン・サービス検出・OS 推測の定番ツール

⏱ 約 13 分 view 334 like 0 LOG_DATE:2026-05-17
目次 / TOC

Nmap (Network Mapper) #

Nmap (Network Mapper) は、ネットワーク上のホストとサービスを発見するためのオープンソースのスキャンツールである。1997 年に Gordon Lyon (ハンドルネーム Fyodor) によって公開されて以来、ペネトレーションテスト・脆弱性診断・ネットワーク管理の現場で事実上の標準となっている。指定した IP レンジに対してパケットを送信し、応答パターンから「どのホストが生きているか」「どのポートが開いているか」「何のサービスがどのバージョンで動いているか」「OS は何か」を推測する。

1. Nmap でできること (4 つの中核機能) #

Nmap でできること (4 つの中核機能)

Nmap の機能は次の 4 つに整理できる。

  1. ホスト発見 (Host Discovery) — ICMP / ARP / TCP のパケットを組み合わせ、指定レンジ内で生きているホストを列挙する。-sn でポートスキャンを行わずホスト発見だけを実行できる。
  2. ポートスキャン (Port Scanning) — TCP / UDP の各ポートに探索パケットを送り、応答パターンから open / closed / filtered を判定する。
  3. サービス・バージョン検出 (Service / Version Detection) — 開いているポートに対し、内蔵の nmap-service-probes データベースからプローブを送り、レスポンス文字列を照合してサービス名とバージョンを推定する (-sV)。
  4. OS 推測 (OS Detection) — TCP/IP スタックの実装差 (TCP オプションの並び、TTL の既定値、Window Size、IP ID の挙動など) を指紋として、nmap-os-db から最も近い OS を確率付きで推定する (-O)。

これらに加えて NSE (Nmap Scripting Engine) を使うと、Lua スクリプトによって脆弱性検査・ブルートフォース・追加情報収集など独自のタスクを実行できる。--script vuln のようにカテゴリ指定で複数スクリプトを一括実行できる。

2. 法的・倫理的な注意 #

Nmap の法的・倫理的な注意

Nmap は強力なツールであるがゆえに、使い方を誤ると刑事責任を問われる可能性がある。日本の不正アクセス禁止法 (不正アクセス行為の禁止等に関する法律) や各国の同種の法律では、ポートスキャンそのものを直接禁じているわけではないが、許可を得ていないネットワークに対するスキャンは「攻撃の準備行為」として違法と解釈され得る。罰金・懲役・前科のリスクがある。

Nmap を使ってよい対象は次のいずれかに限る。

  • 自分が所有・管理しているネットワーク — 自宅 LAN、自分が契約している VPS、隔離した学習用ラボ環境。
  • 書面で明示的に許可を得た対象 — ペネトレーションテスト契約、脆弱性診断契約、レッドチーム演習など。スコープと期間が文書で定義されていること。
  • 正規の学習プラットフォーム — Hack The Box、TryHackMe、VulnHub、OverTheWire など、運営側がスキャンを許可している学習環境。

「軽い気持ちでちょっと試してみる」のが人生で一番高くつくミスになりうる。著名な逮捕事例や訴訟は国内外で複数あり、好奇心であっても他人のネットワークに対する無断スキャンは行ってはならない。

3. Nmap の歴史 #

3.1 Phrack 創刊号 (1997) #

1997 年 9 月、Gordon Lyon (Fyodor) は Phrack Magazine 51 号に「The Art of Port Scanning」を発表し、同時に Nmap の最初のバージョンを公開した。当時すでに strobe / netcat / queso などのスキャナーは存在していたが、Nmap は 複数のスキャン手法を 1 つのツールに統合 し、結果を高速かつ柔軟に整形できる点で群を抜いていた。

3.2 OS フィンガープリンティングの導入 (1998) #

1998 年、Nmap 2.0 で TCP/IP スタックフィンガープリンティングによる OS 推測機能が実装された。OS ベンダーごとに微妙に異なる TCP/IP 実装の挙動を指紋データベースと照合する手法で、これにより Nmap は単なるポートスキャナーから「ネットワークアセット調査ツール」へと進化した。

3.3 NSE の登場 (2006) #

2006 年、Nmap 4.21 で Lua インタプリタを内蔵し、ユーザがスクリプトで Nmap を拡張できる NSE (Nmap Scripting Engine) が導入された。これにより脆弱性検査・サービス固有の情報取得・ブルートフォースなど、本体に組み込むほど一般的ではないが頻繁に必要となる処理をエコシステムとして発展させられるようになった。

3.4 関連ツール群 #

Nmap プロジェクトは本体のほか、GUI の Zenmap、汎用ネットワーク I/O ツール Ncat (netcat 後継)、ポートテスト/パケット生成ツール Nping、結果比較ツール Ndiff を提供する。これらは Npcap / WinPcap (Windows) や libpcap (Unix 系) を共通基盤として実装され、まとめてインストールされることが多い。

4. ホスト発見 (Host Discovery) #

Nmap は指定されたターゲット (IP / CIDR / ホスト名) に対し、ポートスキャンの前にまず「そのホストは生きているか」を判定する。デフォルトでは ICMP Echo、TCP SYN to 443、TCP ACK to 80、ICMP Timestamp の組み合わせを送る。

主なオプション:

  • -sn — ポートスキャンを行わず、ホスト発見のみ行う (旧 -sP、Ping Scan)。生きているホスト一覧だけを取得したいときに使う。
  • -Pn — ホスト発見をスキップし、すべてのターゲットを「生きている」とみなしてポートスキャンを行う。ICMP がブロックされている環境で、生きていても応答しないホストを取りこぼさないために使う。
  • -PS<port> / -PA<port> — 指定ポートに TCP SYN / ACK を送って応答を確認する。ファイアウォール越しでも応答することがある。
  • -PE / -PP / -PM — ICMP Echo / Timestamp / Address Mask を送る。

ローカル LAN 内では Nmap は自動的に ARP を使う (ICMP より高速・確実)。-PR で明示することも可能。

5. ポートスキャンの方式 #

Nmap には複数のスキャン手法があり、TCP フラグの組み合わせやプロトコル選択が異なる。ステルス性・必要権限・速度・調査目的の違いによって使い分ける。

Nmap スキャン手法の比較

5.1 TCP SYN スキャン (-sS) #

ハーフオープンスキャン とも呼ばれる、Nmap の既定 (root 権限がある場合)。SYN パケットを送信し、SYN/ACK が返ってくれば open、RST なら closed、無応答 (もしくは ICMP Unreachable) なら filtered と判定する。3-way handshake を完成させない ためサーバ側のアプリケーションログには接続として記録されにくく、比較的目立たない。

実装上は raw socket を使うため Linux / macOS では root 権限が必要、Windows では Npcap 経由となる。

5.2 TCP Connect スキャン (-sT) #

OS の connect() システムコールを使い、3-way handshake を最後まで完成させてから RST で切断するスキャン。root 権限不要 のため一般ユーザでも実行できる。

トレードオフとして、(1) サーバ側のアプリケーションログに接続記録が残りやすい、(2) handshake 分のオーバーヘッドがあり遅い、という欠点がある。SYN スキャンが使えない環境のフォールバック。

5.3 UDP スキャン (-sU) #

UDP ポートにプロトコル固有のペイロード (DNS / SNMP / NTP など) を送り、応答パターンから状態を判定する。

UDP はコネクションレスのため判定が難しい。プロトコル応答が返ってくれば open、ICMP Port Unreachable が返れば closed、無応答は open|filtered と判定する。非常に遅い (各ポートで再送・タイムアウトを要する) ので、必要なときだけスコープを絞って使う。

DNS (53/udp)、SNMP (161/udp)、NTP (123/udp)、TFTP (69/udp) など、UDP でのみ提供されているサービスを発見したいときに必須となる。

5.4 ACK スキャン (-sA) #

SYN ではなく ACK パケットを送るスキャン。ステートフルファイアウォールが ACK パケットを「既存セッションの一部」と誤認して通過させることを利用する。

応答 (RST) が返ってくれば「unfiltered (ファイアウォールはこのポートをフィルタしていない)」、無応答もしくは ICMP unreachable は「filtered」と判定する。ポートが open か closed かは判定しない。ファイアウォールのルールセット推測に使う特殊スキャン。

5.5 NULL / FIN / Xmas スキャン (-sN / -sF / -sX) #

それぞれフラグなし / FIN のみ / FIN+PSH+URG をセットしたパケットを送る。RFC 793 では、open ポートはこれらの「無効な組み合わせ」のパケットを無視し、closed ポートは RST を返すと定められている。

  • 無応答 → open|filtered
  • RST → closed
  • ICMP Unreachable → filtered

Windows、Cisco、BSD の一部実装は RFC に従わないので結果が不正確になる。Linux / Solaris / UNIX 系には有効。古いステートレスファイアウォールをすり抜けるテクニックとして使われた。

5.6 Idle / Zombie スキャン (-sI) #

第三者ホスト (zombie) の IP ID 変化を観測してターゲットのポート状態を推測する高度なスキャン。自分の IP アドレスを直接ターゲットに送らない ため、IDS / ファイアウォールのログに自分の IP が一切残らないという特性がある。

要件: IP ID をグローバルに連番でインクリメントする古い実装の zombie ホストが必要。現代の OS はこの実装を採用していないため、適切な zombie を見つけるのが難しい。CTF / 学習用途で覚えておく価値はある。

5.7 スキャンタイプの選び方 #

Nmap スキャンタイプの選び方

実務上の指針:

  • 既定は -sS — root 権限があり、速度・ステルス性・互換性のバランスが最も良い。
  • root が無いときだけ -sT — ログに残るが手段がない時の代替。
  • UDP は必要なときに -sU を追加-sS -sU で TCP/UDP 両方を同時にスキャンできる。
  • 目的特化のときに -sA / -sN / -sF / -sX / -sI を使う — ファイアウォール挙動の調査、IDS 検証、痕跡を残さない高度な調査など、目的が明確な場合に選ぶ。

6. ポート状態の判定 #

Nmap は応答パターンから 6 つの状態を判定する。

状態 意味 典型的な応答
open サービスがアクティブにリッスンしている SYN/ACK が返る
closed ポートに到達できるがサービスは無い RST が返る
filtered パケットがフィルタされ判定できない 無応答 / ICMP Unreachable
unfiltered ポートに到達はできるが open か closed か不明 RST が返る (ACK スキャンの結果)
open|filtered open と filtered のどちらかと判定できない 無応答 (UDP / NULL / FIN / Xmas スキャン時)
closed|filtered closed と filtered のどちらかと判定できない Idle スキャン特有

特に filtered は「そのホスト自体が存在しないわけではなく、ファイアウォールやルータでパケットが落とされている」状態を意味する。攻撃者から見ると filtered は閉じているのと同じ意味で進めなくなり、防御側にとっては最も望ましい状態。

7. サービス・バージョン検出 (-sV) #

ポートが open と判定された後、-sV を付けると Nmap は実際にそのポートが「何のサービスのどのバージョンか」を推定する。

仕組み:

  1. ポートが TCP / UDP のどちらかを確認
  2. nmap-service-probes から、そのポート番号に対する優先プローブを順に送信
  3. 帰ってきたレスポンス (バナー、HTTP ヘッダ、独自プロトコルの応答など) を正規表現と照合
  4. 一致したパターンからサービス名・バージョン・追加情報 (product / version / extrainfo / ostype / hostname) を抽出

--version-intensity 0..9 で網羅度を変えられる (デフォルトは 7)。-A を付けると -sV -O --traceroute --script=default が一括で有効になる。

8. OS 推測 (-O) #

-O を付けると Nmap はターゲットの TCP/IP スタックの挙動を多面的にテストして OS を推定する。

主な観測点:

  • TCP ISN (Initial Sequence Number) の生成パターン (乱数性、周期性)
  • TCP オプションの順序と値 (MSS / SACK / Timestamp / Window Scale / NOP の並びは OS ごとに異なる)
  • TCP Window Size の初期値
  • IP ID の生成方式 (連番 / 乱数 / ゼロ固定)
  • ICMP メッセージの構造
  • TCP/IP のエッジケース挙動 (異常パケットへの応答)

これらを 16 種類の探索パケットで採取し、nmap-os-db と照合する。出力には「Linux 5.x (confidence 92%)」のように一致度が表示される。

9. NSE (Nmap Scripting Engine) #

NSE は Lua インタプリタを Nmap に組み込み、ユーザがスクリプトで機能を拡張できる仕組み。

スクリプトカテゴリ (--script で指定):

  • default (-sC と同等) — 安全で情報量の多い既定スクリプト群
  • discovery — ホスト・サービスの追加情報収集
  • version-sV の補助
  • vuln — 既知の脆弱性チェック (CVE 対応スクリプト多数)
  • exploit — 実際にエクスプロイトを試みる (注意)
  • auth — 認証関連 (匿名 FTP、デフォルトクレデンシャル等)
  • brute — ブルートフォース
  • intrusive — ターゲットに影響が出る可能性がある
  • safe — 影響なしと明示されたスクリプト
  • malware — マルウェア感染チェック
  • dos — DoS テスト

代表的なスクリプト例:

  • --script vuln — 既知 CVE の総当たりチェック
  • --script http-enum — HTTP サーバ上のディレクトリ列挙
  • --script smb-os-discovery — SMB 経由で OS 情報取得
  • --script ssl-enum-ciphers — SSL/TLS の暗号スイート列挙
  • --script ssh-hostkey — SSH ホスト鍵取得

NSE スクリプトは /usr/share/nmap/scripts/ (Linux) に格納され、ユーザが自作することもできる。

10. 検出回避と防御側の見え方 #

Nmap には IDS / IPS / ファイアウォールに見つからないための回避オプションが多数ある。いずれも合法な調査範囲内で使うこと

主なオプション:

  • -T0-T5 — タイミングテンプレート。-T0 (paranoid) は超低速で IDS の閾値に引っかかりにくい。-T4 (aggressive) が実務の既定値。
  • -D <decoy1>,<decoy2>,ME — おとり IP を混在させて自分の IP を埋もれさせる。
  • -f / --mtu — パケットを小さくフラグメント化してシグネチャ検査をかいくぐる。
  • --data-length — パディングを追加してパケットサイズを変える。
  • --source-port <port> — 送信元ポートを指定 (DNS の 53 や FTP の 20 など、ファイアウォールで例外的に許可されているポートを使う)。
  • --randomize-hosts — 複数ターゲットへのスキャン順序をシャッフルする。

防御側から見ると、Nmap スキャンはアクセスログに以下の特徴を残す。

  • 短時間に多数のポートへの接続試行 (1 つの IP から数百〜数千のポートへ)
  • TCP SYN だけ送って ACK を返さない (-sS の場合) → サーバ側のアプリケーションログには残らないが、ステートフルファイアウォールや IDS の SYN フラッディング判定に引っかかる
  • 異常な TCP フラグの組み合わせ (-sN / -sF / -sX)
  • 短時間の ICMP / ARP の大量送信 (ホスト発見)

Snort / Suricata / Zeek などの IDS には Nmap シグネチャが標準で組み込まれている。

11. 実践例 #

学習環境 (HTB / TryHackMe など) でよく使うコマンド例。

初期偵察 (どんなホストか何も知らない状態):

sudo nmap -sS -sV -O -A -T4 -p- <target>
  • -sS — SYN スキャン (既定だが明示)
  • -sV — サービス・バージョン検出
  • -O — OS 推測
  • -A-sV -O --traceroute --script=default 一括
  • -T4 — 速度優先
  • -p- — 全 65535 ポート

素早い概要を取りたいとき:

sudo nmap -sS --top-ports 1000 -T4 <target>

特定の脆弱性チェック:

sudo nmap --script vuln -p 80,443 <target>

UDP も含めて見たいとき:

sudo nmap -sS -sU -p T:80,443,U:53,161 <target>

結果を XML で保存して別ツールに連携:

sudo nmap -sS -sV -oA scan_results <target>

-oA は normal / XML / grepable の 3 形式を同時に保存する。XML は Metasploit の db_import 等から読み込める。

Nmap は単一のコマンドで終わらせず、目的に合わせてオプションを段階的に追加していくのが定石。最初は控えめに、必要に応じて詳細スキャンを重ねるのが「ターゲットを乱さず、効率よく情報を得る」鉄則となる。