nmap について
nmapは、ネットワーク偵察とポートスキャンを支援するスキルです。スキャン方法の選択、結果分析、出力管理を案内し、許可された対象に対してポート発見後にサービスを調べる手順を標準とします。
主な機能
- 01ポート発見とサービス検出の二段階手順
- 02各種スキャン方式とパラメーターの案内
- 03ポート、サービス、スクリプト結果の分析支援
- 04三種類の形式での結果保存
- 05範囲、タイミング、許可事項の説明
活用シーン
- 01許可されたホストやネットワーク範囲の偵察
- 02オープンポートの発見とサービス版の特定
- 03IoT機器のネットワークサービスの調査
- 04後続分析に向けたスキャン結果の整理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ brownfinesecurity/ iothackbot --skill nmapインストール後、Claude Code で/nmapを入力して読み込まれたか確認します。
詳細
Nmap スキャン - プロフェッショナルなネットワーク偵察
nmap を使用したプロフェッショナルなネットワーク偵察とポートスキャンをユーザーが実施できるよう支援します。このスキルでは、さまざまなスキャンの種類、出力形式、結果の分析方法を説明します。
出力ディレクトリ
ディレクトリ構成
nmap-output/
├── nmap-portscan.nmap # Initial fast port discovery
├── nmap-portscan.xml
├── nmap-portscan.gnmap
├── nmap-services.nmap # Detailed service detection on open ports
├── nmap-services.xml
└── nmap-services.gnmap
重要:nmap の出力は、常に整理されたディレクトリ構成に保存してください。デフォルトでは ./nmap-output/ を使用するか、カスタムディレクトリを指定します。
デフォルトのスキャン戦略
重要:ユーザーが別のスキャンの種類を明示的に要求しない限り、必ず次の2段階の手法を使用してください。
フェーズ 1:高速ポート検出(root による SYN スキャン)
sudo nmap -p- <target> -oA <output-dir>/nmap-portscan
- sudo を使う理由:root で実行すると高速な SYN スキャンが可能になります(-sS は暗黙的に使用されます)
- -p- を使う理由:全 65535 ポートをすばやくスキャンします
- 所要時間:通常、SYN スキャンで 1~3 分です
- 出力:開いているポートの一覧
ホストがダウンしている場合の検出: スキャン出力に "Note: Host seems down" が含まれている場合は、次のオプションを使用して自動的に再試行します。
sudo nmap -p- -Pn <target> -oA <output-dir>/nmap-portscan
-Pn:ホスト検出をスキップし、ホストをオンラインとして扱います- ファイアウォールが ping プローブをブロックしている場合に使用します
フェーズ 2:対象を絞ったサービス検出
フェーズ 1 の完了後、開いているポートを解析し、次を実行します。
nmap -p <OPEN_PORT_LIST> -sV -sC <target> -oA <output-dir>/nmap-services
-p <OPEN_PORT_LIST>:開いていることが確認されたポートのみをスキャンします(例:-p 23,80,443,554,8000)-sV:サービスのバージョンを検出します-sC:追加の列挙のため、デフォルトの NSE スクリプトを実行します- 所要時間:既知の開いているポートのみをスキャンするため、通常は 1~3 分です
この戦略を使う理由
- 速度:高速な SYN スキャンで、開いているポートをすべて 1~3 分で検出します
- 網羅性:上位 1000 ポートだけでなく、全 65535 ポートを対象にします
- 効率性:サービス検出は、開いていることが確認されたポートのみで実行します
- 正確性:2段階の手法により、偽陰性を減らします
開いているポートの解析
フェーズ 1 の後、次を使って開いているポートを抽出します。
# Extract open ports from .gnmap file
grep "Ports:" <output-dir>/nmap-portscan.gnmap | sed 's/.*Ports: //' | tr ',' '\n' | grep '/open/' | cut -d'/' -f1 | tr -d ' ' | tr '\n' ',' | sed 's/,$//'
または .nmap ファイルから解析します(STATE 列と完全に一致するため、open|filtered ポートは除外されます)。
awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' <output-dir>/nmap-portscan.nmap
実装ワークフロー
nmap-scan スキルが呼び出された場合:
-
出力ディレクトリを作成
OUTPUT_DIR="./nmap-output" mkdir -p "$OUTPUT_DIR" -
フェーズ 1 を実行:高速ポート検出
sudo nmap -p- <target> -oA "$OUTPUT_DIR/nmap-portscan" -
「Host seems down」エラーを確認
if grep -q "Host seems down" "$OUTPUT_DIR/nmap-portscan.nmap"; then echo "Host appears down, retrying with -Pn flag..." sudo nmap -p- -Pn <target> -oA "$OUTPUT_DIR/nmap-portscan" fi -
結果から開いているポートを解析
OPEN_PORTS=$(awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' "$OUTPUT_DIR/nmap-portscan.nmap") -
フェーズ 2 を実行:開いているポートのサービス検出
if [ -n "$OPEN_PORTS" ]; then nmap -p "$OPEN_PORTS" -sV -sC <target> -oA "$OUTPUT_DIR/nmap-services" else echo "No open ports found, skipping service detection." fi -
結果の保存先を報告
echo "Scan complete. Results saved to: $OUTPUT_DIR"
スキャンの種類
クイックスキャン(上位 1000 ポート)
初期偵察や時間が限られている場合、またはユーザーがデフォルトの2段階の戦略ではなくクイック/高速スキャンを明示的に要求した場合に使用します。
nmap -sV -sC <target> -oA <output-prefix>
-sV:サービスのバージョンを検出します-sC:デフォルトの NSE スクリプトを実行します-oA:すべての形式(通常、XML、grepable)で出力します- よく使われる上位 1000 ポートをスキャンします
- 標準的な所要時間:1~3 分
- 制限:標準以外のポートで稼働するサービスを見逃す可能性があります
包括的なスキャン(全ポート)
すべてのポートを確認する必要がある場合に、徹底的な評価を行うために使用します。
nmap -sV -sC -p- <target> -oA <output-prefix>
-p-:全 65535 ポートをスキャンします- 所要時間が大幅に長くなります(対象に応じて 5~30 分以上)
- 網羅的な確認が必要な場合にのみ使用します
ステルス SYN スキャン
検出を避けたい場合に使用します(root/sudo が必要です)。
sudo nmap -sS -sV -sC <target> -oA <output-prefix>
-sS:SYN ステルススキャン(TCP ハンドシェイクを完了しません)- 対象によってログに記録される可能性が低くなります
- root 権限が必要です
UDP スキャン
UDP サービスを列挙する必要がある場合に使用します。
sudo nmap -sU --top-ports 100 <target> -oA <output-prefix>
-sU:UDP スキャン--top-ports 100:上位 100 の UDP ポートをスキャンします(UDP スキャンは低速です)- 一般的な UDP サービス:DNS(53)、SNMP(161)、DHCP(67/68)
- 非常に低速なため、対象範囲を絞るために top-ports を使用します
アグレッシブスキャン
最大限の情報を収集する場合に使用します(検出されやすくなります)。
nmap -A -T4 <target> -oA <output-prefix>
-A:OS 検出、バージョン検出、スクリプトスキャン、traceroute を有効にします-T4:アグレッシブなタイミングテンプレート(高速になりますが、検出されやすくなります)- 非常に検出されやすく、IDS/IPS に検知されます
- 許可を得ている場合にのみ使用します
脆弱性スキャン
既知の脆弱性を確認する場合に使用します。
nmap -sV --script vuln <target> -oA <output-prefix>
--script vuln:NSE の脆弱性検出スクリプトを実行します- 一般的な CVE や設定ミスを確認します
- 検出されやすく、アラートが発生する場合があります
OS 検出
オペレーティングシステムの識別に使用します。
sudo nmap -O <target> -oA <output-prefix>
-O:OS 検出を有効にします- root 権限が必要です
- TCP/IP スタックのフィンガープリンティングを使用します
スキャンのワークフロー
デフォルトのワークフロー(二段階の戦略)
上記の「デフォルトのスキャン戦略」と「実装ワークフロー」の各セクションに従って、フェーズ 1(ポート検出)とフェーズ 2(サービス検出)を実行します。その後、分析します。
フェーズ 3:分析
- サービス検出の結果を確認して、以下を特定します。
- 実行中のサービスは何ですか?
- 検出されたバージョンは何ですか?
- 注目すべきサービス(Web、SSH、データベース、IoT プロトコル)はありますか?
- NSE スクリプトによって問題が明らかになっていますか?
追加の対象を絞ったスキャン(任意)
サービス検出の結果に基づいて、専用のスキャンを実行します。
Web サービスが見つかった場合(80、443、8080 など):
nmap -p 80,443,8080,8443 --script http-* <target> -oA <output-dir>/nmap-web
SSH が見つかった場合:
nmap -p 22 --script ssh-* <target> -oA <output-dir>/nmap-ssh
RTSP が見つかった場合(554):
nmap -p 554 --script rtsp-* <target> -oA <output-dir>/nmap-rtsp
ONVIF/カメラが疑われる場合:
nmap -p 80,554,8000,8080 --script http-methods,http-headers <target> -oA <output-dir>/nmap-onvif
出力の管理
出力形式
3 種類の形式すべてを生成するため、常に -oA <prefix> を使用します。
.nmap- 人が読みやすい通常形式.xml- ツールでの解析/インポート用の XML 形式.gnmap- コマンドライン処理用の grep 可能な形式
タイミングとパフォーマンス
タイミングテンプレート
スキャン速度を制御するには -T<0-5> を使用します。
-T0(Paranoid):非常に低速で、IDS の回避向けです-T1(Sneaky):かなり低速で、IDS の回避向けです-T2(Polite):低速で、帯域幅への負荷を抑えます-T3(Normal):デフォルトで、速度のバランスが取れています-T4(Aggressive):高速で、最新のネットワークに推奨されます-T5(Insane):非常に高速ですが、結果を見逃す可能性があります
デフォルト:-T3 を使用するか、省略します(デフォルトは T3 です)
高速スキャン:速度が重要で、ネットワークが処理できる場合は -T4 を使用します
ステルス性:回避には -T1 または -T2 を使用します
タイムアウトに関する考慮事項
- フェーズ 1 のポート検出(sudo nmap -p-):タイムアウトは 180~300 秒(3~5 分)
- フェーズ 2 のサービス検出(nmap -p -sV -sC):タイムアウトは 120~180 秒(2~3 分)
- UDP スキャン:タイムアウトは 600 秒以上(非常に低速)
ネットワーク範囲
単一ホスト
nmap <ip-address>
CIDR 表記
nmap 192.168.1.0/24
IP 範囲
nmap 192.168.1.1-254
複数のホスト
nmap 192.168.1.1 192.168.1.10 192.168.1.100
除外するホスト
nmap 192.168.1.0/24 --exclude 192.168.1.1,192.168.1.254
NSE スクリプト
一般的なスクリプトカテゴリ
# Authentication scripts
nmap --script auth <target>
# Brute force scripts
nmap --script brute <target>
# Default safe scripts
nmap -sC <target> # equivalent to --script default
# Discovery scripts
nmap --script discovery <target>
# Vulnerability scripts
nmap --script vuln <target>
# All HTTP scripts
nmap --script "http-*" <target>
IoT 専用スクリプト
# RTSP enumeration
nmap -p 554 --script rtsp-methods,rtsp-url-brute <target>
# UPnP discovery
nmap -p 1900 --script upnp-info <target>
# MQTT discovery
nmap -p 1883,8883 --script mqtt-subscribe <target>
# Modbus enumeration
nmap -p 502 --script modbus-discover <target>
結果の分析
抽出する重要な情報
-
開いているポートとサービス
- どのポートが開いていますか?
- 実行中のサービスは何ですか?
- 検出されたバージョンは何ですか?
-
サービスのフィンガープリント
- バージョン検出によって、古いソフトウェアが明らかになっていますか?
- 検出されたバージョンに既知の脆弱性はありますか?
-
NSE スクリプトの結果
- 認証の問題はありますか?
- 情報漏えいはありますか?
- 設定ミスはありますか?
-
オペレーティングシステム
- 実行中の OS は何ですか?
- OS のバージョンは何ですか?
Nmap 出力の解析
開いているポートを抽出する:
grep "^[0-9]" nmap-output.nmap | grep "open"
サービスのバージョンを抽出する:
grep -E "^[0-9]+/tcp.*open" nmap-output.nmap
NSE の出力で脆弱性を確認する:
grep -i "vuln\|cve\|exploit" nmap-output.nmap
IoT でよく使われるサービスのポート
IoT デバイスをスキャンする際は、特に次のポートに注意してください。
| ポート | サービス | 説明 |
|---|---|---|
| 21 | FTP | ファイル転送(設定ミスが多い) |
| 22 | SSH | リモート管理 |
| 23 | Telnet | 安全でないリモートアクセス |
| 80 | HTTP | Web インターフェース |
| 443 | HTTPS | セキュアな Web インターフェース |
| 554 | RTSP | 動画ストリーミング |
| 1883 | MQTT | IoT メッセージングプロトコル |
| 3702 | WS-Discovery | ONVIF デバイス検出 |
| 5000 | UPnP | ユニバーサルプラグアンドプレイ |
| 8000 | HTTP Alt | 代替 HTTP ポート |
| 8080 | HTTP Proxy | 代替 HTTP ポート |
| 8883 | MQTT/TLS | セキュアな MQTT |
ベストプラクティス
1. 出力を必ず保存する
出力を保存せずに nmap を実行しないでください。
# GOOD
nmap -p <ports> -sV -sC <target> -oA output/nmap-services
# BAD
nmap -sV -sC <target>
2. 常に二段階の戦略を使用する
ユーザーから別のスキャン種別を明示的に指定されない限り、デフォルトの二段階の戦略(「デフォルトのスキャン戦略」セクションを参照)を使用します。
3. 適切なタイミングを使用する
必要に応じてタイミングを調整します。
# Pentest with authorization: Fast
nmap -sV -sC -T4 <target>
# Red team/stealth: Slow
nmap -sV -sC -T2 <target>
4. スキャンパラメーターを記録する
次の項目を必ず記録します。
- 使用したスキャン種別は何ですか?
- スキャンを実行した日時はいつですか?
- スキャン結果はどうでしたか?
- 異常やエラーはありましたか?
5. 認可を尊重する
- スキャンする権限のあるシステムのみをスキャンしてください
- スコープの制限を遵守してください
- 本番システムへのスキャンの影響に注意してください
- DoSを避けるため、適切なタイミングで実行してください
IoTテストワークフローとの統合
IoTペネトレーションテストの場合
- デフォルトの2フェーズスキャン(ポート検出+サービス検出)を実行します
- 開いているポートからONVIFが疑われる場合は、wsdiscoveryを実行します
- カメラでポート80/554が開いている場合は、onvifscanを実行します
- Webインターフェイスが見つかった場合は、対象を絞ったHTTPスクリプトを実行します
出力ディレクトリの使用方法
常に整理された出力ディレクトリ(デフォルトは ./nmap-output/)に保存してください。コマンドの全手順については、「実装ワークフロー」セクションを参照してください。
トラブルシューティング
スキャンに時間がかかりすぎる
- スキャンを高速化するには
-T4を使用します -p-の代わりに-p 1-1000を指定してポート範囲を制限します- すべてのポートの代わりに
--top-ports 100を使用します
結果がない/ファイアウォールでブロックされている
- 別のスキャンタイプを試します:
-sS、-sT、-sA -Pnを使用してホスト検出をスキップします- フラグメント化パケットには
-fを試します --source-port 53またはその他の信頼されたポートの使用を検討します
root/sudoが必要
以下のスキャンタイプにはroot権限が必要です:
-sS(SYNスキャン)-sU(UDPスキャン)-O(OS検出)- Rawパケット機能
権限拒否エラー
「Permission denied」または「Operation not permitted」と表示された場合:
# Run with sudo
sudo nmap <options> <target>
ワークフローの例
ワークフロー1:標準的な単一ターゲットのスキャン(デフォルト)
TARGET="192.168.1.100"
OUTPUT_DIR="./nmap-output"
mkdir -p "$OUTPUT_DIR"
# Phase 1: Fast port discovery
sudo nmap -p- $TARGET -oA "$OUTPUT_DIR/nmap-portscan"
# Check for "Host seems down"
if grep -q "Host seems down" "$OUTPUT_DIR/nmap-portscan.nmap"; then
sudo nmap -p- -Pn $TARGET -oA "$OUTPUT_DIR/nmap-portscan"
fi
# Parse open ports
OPEN_PORTS=$(awk '$2=="open"{split($1,p,"/"); ports=ports sep p[1]; sep=","} END{print ports}' "$OUTPUT_DIR/nmap-portscan.nmap")
# Phase 2: Service detection
if [ -n "$OPEN_PORTS" ]; then
nmap -p "$OPEN_PORTS" -sV -sC $TARGET -oA "$OUTPUT_DIR/nmap-services"
fi
ワークフロー2:IoTカメラのテスト
ワークフロー1のデフォルトの2フェーズスキャンを実行してから、カメラ固有のチェックを追加します:
TARGET="192.168.1.100"
OUTPUT_DIR="./nmap-output"
# If ONVIF camera detected, check HTTP methods
nmap -p 80 --script http-methods $TARGET -oA "$OUTPUT_DIR/nmap-http"
# Check RTSP service
nmap -p 554 --script rtsp-methods $TARGET -oA "$OUTPUT_DIR/nmap-rtsp"
ワークフロー3:追加のUDP/OS検出
OUTPUT_DIR="./nmap-output"
# After completing default two-phase scan, optionally add:
# UDP scan (top ports)
sudo nmap -sU --top-ports 100 <target> -oA "$OUTPUT_DIR/nmap-udp"
# OS detection
sudo nmap -O <target> -oA "$OUTPUT_DIR/nmap-os"
# Vulnerability scan
nmap -sV --script vuln <target> -oA "$OUTPUT_DIR/nmap-vuln"
ユーザーに確認する項目
スキャンを開始する前に、次の点を確認してください:
- ターゲット:IPアドレスまたはネットワーク範囲は何ですか?
- スコープ:単一ホストですか、それともネットワーク範囲ですか?
- スキャンタイプ:デフォルトの2フェーズ方式を使用しますか、それとも特定の要件がありますか?
- 認可:このターゲットをスキャンする権限がありますか?
- 特別な関心事項:初回スキャン後に重点的に確認したいサービスやポートはありますか?
注:出力はデフォルトで ./nmap-output/ に保存されます。
成功基準
nmapスキャンが成功したと見なされる条件:
- フェーズ1のポート検出がエラーなく完了している
- すべての開いているポートに対するフェーズ2のサービス検出が完了している
- すべての形式(-oA)の結果が出力ディレクトリに保存されている
- サービスのバージョンとともに開いているポートが特定されている
- NSEスクリプトが正常に実行されている
- 結果が記録され、分析できる状態になっている
- 以下を示す明確な概要が提供されている:
- 見つかった開いているポートの数
- 検出された主なサービス
- 出力ファイルの保存場所