Nmap とは
Nmap(Network Mapper) は、ネットワーク探索とセキュリティ監査のためのオープンソースツールだ。1997年のリリース以来、ネットワーク管理者・セキュリティ専門家の標準ツールとして使われ続けている。実際のペネトレーションテストでも、偵察フェーズで最初に手を伸ばすのが Nmap というケースは多い。
主な用途:
- ネットワーク上のホスト探索(どのマシンが動いているか)
- オープンポートの確認とフィルタリング状況の把握
- 動作しているサービスのバージョン特定
- OS情報の推測
- NSEスクリプトによる脆弱性の事前調査
このレッスンで紹介するコマンドは、前のレッスンで構築した隔離された演習環境(Metasploitable 2)のみで実行すること。許可なく他のシステムをスキャンすることは不正アクセス禁止法に違反する。スキャン先は必ず 192.168.56.101(Metasploitable 2)であることを確認してほしい。
フェーズ1: ホスト探索
まずネットワーク上に存在するホストを把握する。スキャンの前に「何が動いているか」を確認するのが偵察の第一歩だ。
Ping スキャン(-sn)
# 単一ホストの生存確認
nmap -sn 192.168.56.101
# 出力例:
# Starting Nmap 7.94 ( https://nmap.org ) at 2026-03-29 10:00 JST
# Nmap scan report for 192.168.56.101
# Host is up (0.00042s latency).
# MAC Address: 08:00:27:A1:B2:C3 (Oracle VirtualBox virtual NIC)
# Nmap done: 1 IP address (1 host up) scanned in 0.12 seconds
# サブネット全体のホスト探索(全256アドレスを確認)
nmap -sn 192.168.56.0/24
# 出力例:
# Nmap scan report for 192.168.56.1
# Host is up (0.00012s latency).
# Nmap scan report for 192.168.56.101
# Host is up (0.00035s latency).
# Nmap scan report for 192.168.56.102
# Host is up (0.00021s latency).
# Nmap done: 256 IP addresses (3 hosts up) scanned in 2.41 seconds
nmap -sn 192.168.56.0/24 の結果でMACアドレスに「VirtualBox」と表示されているホストが Metasploitable 2 だ。以降の例では 192.168.56.101 を使う。
フェーズ2: ポートスキャン
ホストが見つかったら、次はどのポートが開いているかを調べる。開いているポートはそれぞれ動作しているサービスに対応しており、攻撃の入口になりうる。
デフォルトスキャン(上位1000ポート)
# デフォルトスキャン(よく使われる上位1000ポートを対象)
nmap 192.168.56.101
# 出力例:
# Starting Nmap 7.94 at 2026-03-29 10:05 JST
# Nmap scan report for 192.168.56.101
# Host is up (0.00038s latency).
# Not shown: 977 closed tcp ports (reset)
# PORT STATE SERVICE
# 21/tcp open ftp
# 22/tcp open ssh
# 23/tcp open telnet
# 25/tcp open smtp
# 53/tcp open domain
# 80/tcp open http
# 111/tcp open rpcbind
# 139/tcp open netbios-ssn
# 445/tcp open microsoft-ds
# 512/tcp open exec
# 513/tcp open login
# 514/tcp open shell
# 1099/tcp open rmiregistry
# 1524/tcp open ingreslock
# 2049/tcp open nfs
# 2121/tcp open ccproxy-ftp
# 3306/tcp open mysql
# 5432/tcp open postgresql
# 5900/tcp open vnc
# 6000/tcp open X11
# 6667/tcp open irc
# 8009/tcp open ajp13
# 8180/tcp open unknown
# Nmap done: 1 IP address (1 host up) scanned in 1.23 seconds
全ポートスキャン(65535ポート)
# 全65535ポートをスキャン(上位1000だけでは見落とすポートがある)
nmap -p- 192.168.56.101
# —min-rate で最低送信レートを指定して高速化できる
nmap -p- —min-rate 5000 192.168.56.101
# 特定のポートのみ指定する場合
nmap -p 21,22,80,3306,5432 192.168.56.101
スキャン技法の比較
| フラグ | スキャン種類 | 特徴 |
|---|---|---|
-sS | SYN スキャン(ステルス) | 最速・最一般的。TCPハンドシェイクを完了しない。要root |
-sT | TCP Connect スキャン | 完全な接続を確立。ログに残りやすい |
-sU | UDP スキャン | UDPサービス検出。低速だが見落とせない |
-sA | ACK スキャン | ファイアウォールルールのマッピングに使う |
# SYNスキャン(root権限が必要)
sudo nmap -sS 192.168.56.101
# デフォルトスキャンと同じ結果だが、完全な接続を確立しないぶん高速だ
# PORT STATE SERVICE
# 21/tcp open ftp
# 22/tcp open ssh
# 80/tcp open http
# …(省略)
フェーズ3: サービス・バージョン・OS 検出
ポートが開いているだけでは不十分だ。そのポートで何のバージョンのサービスが動いているかを特定することで、既知の脆弱性と照合できる。
サービスバージョン検出(-sV)
# サービスバージョン検出
nmap -sV 192.168.56.101
# 出力例(重要部分):
# PORT STATE SERVICE VERSION
# 21/tcp open ftp vsftpd 2.3.4
# 22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
# 23/tcp open telnet Linux telnetd
# 25/tcp open smtp Postfix smtpd
# 53/tcp open domain ISC BIND 9.4.2
# 80/tcp open http Apache httpd 2.2.8 ((Ubuntu) DAV/2)
# 139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
# 3306/tcp open mysql MySQL 5.0.51a-3ubuntu5
# 5432/tcp open postgresql PostgreSQL DB 8.3.0 - 8.3.7
# 8180/tcp open http Apache Tomcat/Coyote JSP engine 1.1
OS検出(-O)
# OS検出(root権限が必要)
sudo nmap -O 192.168.56.101
# 出力例(OS推測部分):
# Device type: general purpose
# Running: Linux 2.6.X
# OS CPE: cpe:/o:linux:linux_kernel:2.6
# OS details: Linux 2.6.9 - 2.6.33
# Network Distance: 1 hop
# サービス + OS + デフォルトスクリプトを一度に実行する総合スキャン
sudo nmap -sV -O -sC 192.168.56.101
# このコマンドで得られる情報:
# -sV : サービスバージョン
# -O : OS推測
# -sC : デフォルトNSEスクリプト(安全なもの)
フェーズ4: NSE(Nmap Scripting Engine)実践
NSE を使うと、特定のサービスの詳細情報や既知の脆弱性の有無を自動で調査できる。Lua 言語で書かれたスクリプトが 600 本以上同梱されており、用途に合わせて選択する。
基本的なNSEスクリプト
# HTTPのタイトルとヘッダー情報を取得
nmap —script=http-title,http-headers 192.168.56.101 -p 80
# 出力例:
# PORT STATE SERVICE
# 80/tcp open http
# | http-title: Metasploitable2 - Linux
# |_Requested resource was http://192.168.56.101/twiki/
# | http-headers:
# | Date: Sat, 29 Mar 2026 01:00:00 GMT
# | Server: Apache/2.2.8 (Ubuntu) DAV/2
# |_ Content-Type: text/html; charset=UTF-8
# FTP匿名ログインの確認(認証なしで入れるか)
nmap —script=ftp-anon 192.168.56.101 -p 21
# 出力例(匿名ログイン可能な場合):
# | ftp-anon: Anonymous FTP login allowed (FTP code 230)
# |_drwxr-xr-x 2 0 0 4096 Mar 29 2026 pub
# SSHのホストキーとサポートするアルゴリズムの確認
nmap —script=ssh-hostkey —script-args ssh_hostkey=full 192.168.56.101 -p 22
SMB・Samba の脆弱性スキャン
# SMBを通じたOS・ドメイン情報の収集
nmap —script=smb-os-discovery 192.168.56.101 -p 445
# 出力例:
# | smb-os-discovery:
# | OS: Unix (Samba 3.0.20-Debian)
# | Computer name: metasploitable
# | NetBIOS computer name: METASPLOITABLE
# | Workgroup: WORKGROUP
# |_ System time: 2026-03-29T01:00:00+00:00
# Samba のユーザー列挙(MS-RPC経由)
nmap —script=smb-enum-users 192.168.56.101 -p 445
# 出力例:
# | smb-enum-users:
# | METASPLOITABLE\backup (RID: 1068)
# | METASPLOITABLE\msfadmin (RID: 3000)
# | METASPLOITABLE\postgres (RID: 3001)
# | METASPLOITABLE\root (RID: 1000)
# EternalBlue(MS17-010)脆弱性チェック
# ※ Metasploitable 2 はLinuxなので該当しないが、Windows環境での確認手順として
nmap —script=smb-vuln-ms17-010 192.168.56.101 -p 445
# Windowsが対象の場合の出力例:
# | smb-vuln-ms17-010:
# | VULNERABLE:
# | Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
# | State: VULNERABLE
# | Risk factor: HIGH
# | CVE: CVE-2017-0143
smb-vuln-* などの脆弱性検出スクリプトは、対象サービスに負荷をかけたりクラッシュさせる可能性がある。本番環境では絶対に使用せず、必ず許可を得た演習環境のみで実行すること。
HTTP の脆弱性スキャン
# HTTPサーバーのディレクトリリスティング確認
nmap —script=http-ls 192.168.56.101 -p 80
# サーバーが許可しているHTTPメソッドの確認(PUT が許可されている場合は要注意)
nmap —script=http-methods 192.168.56.101 -p 80
# 出力例:
# | http-methods:
# | Supported Methods: GET HEAD POST OPTIONS
# |_ Potentially risky methods: none
# Webサーバー上のデフォルトファイル・管理ページの確認
nmap —script=http-default-accounts 192.168.56.101 -p 80
# Tomcat のデフォルト認証情報確認(tomcat:tomcat が残っていないか)
nmap —script=http-default-accounts 192.168.56.101 -p 8180
# 出力例(デフォルト認証情報がある場合):
# | http-default-accounts:
# | [Apache Tomcat] credentials found:
# |_ tomcat:tomcat - /manager/html
MySQL・PostgreSQL の調査
# MySQLの基本情報収集
nmap —script=mysql-info 192.168.56.101 -p 3306
# 出力例:
# | mysql-info:
# | Protocol: 10
# | Version: 5.0.51a-3ubuntu5
# | Thread ID: 10
# | Capabilities flags: 43564
# | Server Status: Autocommit
# |_ Salt: xxxxxxxxxxxxxxxxxxxxxxxx
# MySQL の root 空パスワードチェック(致命的な設定ミス)
nmap —script=mysql-empty-password 192.168.56.101 -p 3306
# 出力例(root の空パスワードが許可されている場合):
# | mysql-empty-password:
# |_ root account has empty password
# PostgreSQLのブルートフォース(よく使われるアカウント名リストで試行)
nmap —script=pgsql-brute —script-args userdb=/usr/share/nmap/nselib/data/usernames.lst
192.168.56.101 -p 5432
フェーズ5: スキャン結果の保存と整理
実際のペネトレーションテストでは、スキャン結果を証跡として保存し、後の報告書作成にも活用する。
# 通常テキスト出力(人間が読みやすい形式)
nmap -sV -O -sC 192.168.56.101 -oN metasploitable_scan.txt
# XML形式(MetasploitやBurp Suiteなど他ツールへのインポートに使える)
nmap -sV 192.168.56.101 -oX metasploitable_scan.xml
# すべての形式で同時保存(.nmap .xml .gnmap の3ファイルが生成される)
sudo nmap -sV -O -sC -p- 192.168.56.101 -oA metasploitable_full
# grepで特定情報を抽出
grep “open” metasploitable_scan.txt grep “VERSION” metasploitable_scan.txt
スキャンの検知と防御
スキャンは攻撃者だけが行うものではない。防御側も「自分のネットワークが外からどう見えるか」を定期的にスキャンして確認する。そして攻撃者のスキャンをいかに素早く検知するかも重要なスキルだ。
スキャンの検知方法:
- Snort/Suricata のIDSシグネチャ(短時間での多ポートへの SYN パケット)
- ファイアウォールのログ分析(同一IPから多数のポートへのアクセス)
- ハニーポットの活用(本来アクセスされないはずのホストへの接触をアラート)
- SIEM でのベースライン逸脱検知(通常とは異なるトラフィックパターン)
Nmapの回避技術(教育目的):
-T0/-T1: スキャン速度を大幅に落とし、閾値ベースの検知を回避する-f: パケットを断片化して一部のIDSの検査を回避しようとする--scan-delay 1000ms: パケット間に遅延を挿入してレート制限を回避する
演習チャレンジ: Metasploitable 2 完全偵察
以下の手順で Metasploitable 2 に対する偵察フェーズを完全に実施してみよう。
ミッション1: ホスト確認
Kali Linux から nmap -sn 192.168.56.0/24 を実行し、Metasploitable 2 のIPアドレスを特定する。
ミッション2: 全ポートスキャン
sudo nmap -sS -p- 192.168.56.101 を実行し、開いているポートをすべて書き出す。いくつのポートが開いているか確認してほしい。
ミッション3: バージョン情報の取得
nmap -sV 192.168.56.101 を実行し、以下のサービスのバージョンを記録する:
- FTP(21番)のバージョン
- SSH(22番)のバージョン
- HTTP(80番)のバージョン
- MySQL(3306番)のバージョン
ミッション4: 脆弱性調査
取得したバージョン情報をもとに、NVD(https://nvd.nist.gov/) で各サービスのCVEを検索し、最も深刻な脆弱性を1つ見つける。
ミッション5: NSEスクリプト実践
以下のスクリプトを実行し、結果を確認する:
nmap --script=ftp-anon 192.168.56.101 -p 21→ 匿名FTPログインは可能か?nmap --script=mysql-empty-password 192.168.56.101 -p 3306→ MySQLのrootパスワードは空か?nmap --script=http-title 192.168.56.101 -p 80,8180→ Webページのタイトルは何か?
ミッション4で vsftpd 2.3.4 のCVEを調べると、悪名高いバックドア(CVE-2011-2523)が見つかる。このバックドアはソースコードに意図的に埋め込まれたもので、ユーザー名にニコニコマーク(:))を含めるとポート6200でシェルが開くという仕掛けだ。これがなぜ「サプライチェーン攻撃」と呼ばれるかを考えてみてほしい。
トラブルシューティング
nmap が「root privileges required」と表示される
SYNスキャン(-sS)やOS検出(-O)にはroot権限が必要だ。コマンドの先頭に sudo を付けること。
スキャンが極端に遅い(-p- で1時間以上かかる)
--min-rate 1000 オプションで最低送信レートを指定すると速くなる。ただしノイジーになるため、実際の侵入テストでは検知リスクが上がることに注意が必要だ。
sudo nmap -sS -p- —min-rate 5000 -T4 192.168.56.101
# -T4: 積極的なタイミングテンプレート(T0=最遅〜T5=最速)
「Host seems down」と表示される
Metasploitable 2 が ping に応答しない設定になっている場合がある。-Pn オプションで ping 確認をスキップしてスキャンを続行できる。
nmap -Pn 192.168.56.101
Nmap の `-sS` フラグが「ステルス」スキャンと呼ばれる理由はどれですか?