はじめに
端的に言うと:「開いてるポートを見つけたら、何が動いてるか(-sV)、どんなOSか(-O)、どこを通って来たか(--traceroute)、スクリプトで深掘り(--script)、結果は必ず保存(-oA)。これで“ポートスキャンのその先”が完成です。」
チートシート
| やりたいこと | コマンド例 | メモ |
|---|---|---|
| サービス/バージョン検出 | nmap -sV 10.0.0.1 |
強度は --version-intensity 0..9(2=light, 9=all) |
| OS 検出 | sudo nmap -O 10.0.0.1 |
開放/閉鎖ポートの両方があると精度UP |
| トレースルート | nmap --traceroute 10.0.0.1 |
Nmap版は高TTLから下げていく方式 |
| デフォルトNSE | nmap -sC 10.0.0.1 |
--script=default と同じ |
| 任意NSE | nmap --script "http-date" |
パターン指定 --script "ftp*" もOK |
| “全部のせ” | sudo nmap -A 10.0.0.1 |
= -sV -O -sC --traceroute
|
| 出力保存(全部) | nmap ... -oA target_scan |
.nmap(通常).gnmap(grepable).xml
|
余談:
-sS(SYN)と-sVは併用できます。ただし-sVのバナー取りは実接続を発生させるため、完全ステルスにはなりません。そこだけ大人の事情。
1. Service Detection(サービス/バージョン検出)
使い方
sudo nmap -sV [--version-intensity 0..9] TARGET
# 例:軽め
sudo nmap -sV --version-light TARGET # (= intensity 2)
# 例:ガッツリ
sudo nmap -sV --version-all TARGET # (= intensity 9)
ポイント
- 列“service”は推測も含むが、“version”は実接続で取得(バナー/応答解析)。
-
sudoが必要なオプションが多い。環境によってはmass_dns警告が出る(/etc/resolv.conf未設定等)。スキャン自体は継続可能。
実例(抜粋)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
80/tcp open http nginx 1.22.1
...
2. OS Detection(OS特定)
使い方
sudo nmap -sS -O TARGET
ポイント
- 少なくとも開放ポート1つ+閉鎖ポート1つがあると精度が上がる。
- 仮想化/ミドル機器/カーネル設定で指紋がブレることは普通にある。カーネルのマイナーバージョンは外すことも多いので眉に唾。
- 特定できない場合は “No exact OS matches” と指紋(fingerprint)を出してくれる。
実例(抜粋)
Host is up (0.00095s latency).
Not shown: 992 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
110/tcp open pop3
111/tcp open rpcbind
143/tcp open imap
993/tcp open imaps
995/tcp open pop3s
MAC Address: 16:FF:C9:2F:D9:19 (Unknown)
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.80%E=4%D=10/22%OT=22%CT=1%CU=35021%PV=Y%DS=1%DC=D%G=Y%M=16FFC9%
OS:TM=68F8F767%P=x86_64-pc-linux-gnu)SEQ(SP=F1%GCD=1%ISR=10D%TI=Z%CI=Z%II=I
OS:%TS=A)OPS(O1=M2301ST11NW7%O2=M2301ST11NW7%O3=M2301NNT11NW7%O4=M2301ST11N
OS:W7%O5=M2301ST11NW7%O6=M2301ST11)WIN(W1=F4B3%W2=F4B3%W3=F4B3%W4=F4B3%W5=F
OS:4B3%W6=F4B3)ECN(R=Y%DF=Y%T=40%W=F507%O=M2301NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T
OS:=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R
OS:%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=
OS:40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0
OS:%Q=)U1(R=Y%DF=N%T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R
OS:=Y%DFI=N%T=40%CD=S)
3. Traceroute(経路確認)
使い方
nmap -sS --traceroute TARGET
ポイント
- Nmap の traceroute は高TTLから減らす方式(一般的 traceroute と逆アプローチ)。
- ルータ側で ICMP TTL Exceeded を返さない設定だと経路が見えないことも多い。
実例(抜粋)
Host is up (0.0044s latency).
Not shown: 992 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
80/tcp open http
110/tcp open pop3
111/tcp open rpcbind
143/tcp open imap
993/tcp open imaps
995/tcp open pop3s
MAC Address: 16:FF:C9:2F:D9:19 (Unknown)
TRACEROUTE
HOP RTT ADDRESS
1 4.45 ms 10.201.124.178
4. Nmap Scripting Engine(NSE)
どこにある?
- だいたい
/usr/share/nmap/scripts/にズラッとある(数百本)。 - 名前規則がゆるく便利:
http-*,ftp-*,ssh-*など。
実行方法
# デフォルトカテゴリ
nmap -sS -sC TARGET
# 個別/パターン指定
nmap -sS --script "http-date" TARGET
nmap -sS --script "ftp*" TARGET
よく使うカテゴリ(抜粋)
-
default:-sC相当 -
version:バージョン関連 -
vuln:脆弱性チェック -
auth/brute/intrusive:要注意(本番環境で不用意に撃たない)
ミニFAQ(今回の設問に直結)
-
Q:
http-robots.txtは何をチェック?
A: Disallow(非公開化)指定など robots.txt の“禁止エントリ”(= disallowed entries) を確認します。 -
Q: MS15-034(CVE-2015-1635)をチェックするスクリプト名は?
A:http-vuln-cve2015-1635
便利サンプル
# SSHのアルゴリズム一覧(今回ログより)
sudo nmap -sS -n --script "ssh2-enum-algos" x.x.x.x
Nmap scan report for x.x.x.x
Host is up (0.0052s latency).
Not shown: 991 closed ports
PORT STATE SERVICE
22/tcp open ssh
| ssh2-enum-algos:
| kex_algorithms: (11)
| sntrup761x25519-sha512@openssh.com
| curve25519-sha256
| curve25519-sha256@libssh.org
| ecdh-sha2-nistp256
| ecdh-sha2-nistp384
| ecdh-sha2-nistp521
| diffie-hellman-group-exchange-sha256
| diffie-hellman-group16-sha512
| diffie-hellman-group18-sha512
| diffie-hellman-group14-sha256
| kex-strict-s-v00@openssh.com
| server_host_key_algorithms: (4)
| rsa-sha2-512
| rsa-sha2-256
| ecdsa-sha2-nistp256
| ssh-ed25519
| encryption_algorithms: (6)
| chacha20-poly1305@openssh.com
| aes128-ctr
| aes192-ctr
| aes256-ctr
| aes128-gcm@openssh.com
| aes256-gcm@openssh.com
| mac_algorithms: (10)
| umac-64-etm@openssh.com
| umac-128-etm@openssh.com
| hmac-sha2-256-etm@openssh.com
| hmac-sha2-512-etm@openssh.com
| hmac-sha1-etm@openssh.com
| umac-64@openssh.com
| umac-128@openssh.com
| hmac-sha2-256
| hmac-sha2-512
| hmac-sha1
| compression_algorithms: (2)
| none
|_ zlib@openssh.com
25/tcp open smtp
53/tcp open domain
80/tcp open http
110/tcp open pop3
111/tcp open rpcbind
143/tcp open imap
993/tcp open imaps
995/tcp open pop3s
MAC Address: 16:FF:F9:C3:FF:7F (Unknown)
5. 保存フォーマット(※超大事)
3兄弟(推奨)
-
Normal:
-oN file.nmap(人間が読みやすい) -
Grepable:
-oG file.gnmap(grepしやすい1行完結) -
XML:
-oX file.xml(ツール連携しやすい)
→ 全部まとめて:-oA base で base.nmap / base.gnmap / base.xml を一括出力。
grepable の威力(例)
# https で絞る
grep https scan_172_17_network.gnmap
# → 3ホスト該当(HTTPS開放)
# 172.17.0.215 / 172.17.19.249 / 172.17.23.240
6. 実践ログからの“即答”集(あなたの出力に基づく)
-
http-robots.txtは何を見る?
→ disallowed entries -
MS15-034(CVE-2015-1635)用スクリプト名は?
→http-vuln-cve2015-1635 -
10.201.0.131の 53/tcp の完全版(-sC の出力)
→bind.version: 9.18.28-1~deb12u2-Debian -
ssh2-enum-algos(10.201.0.131)で SHA2-512 を使うサーバ鍵アルゴリズム名
→rsa-sha2-512 -
添付 gnmap で「HTTPS が開いているホスト数」
→ 3 -
port 8089 を開けている IP
→172.17.20.147
7. 実務のコツ(from 現場)
-
明確な命名規則:
{date}_{scope}_{host|cidr}_{flags}など。迷子にならない。 -
軽量→重厚の段階戦略:
-sS -T4で概要 → 気になるホストだけ-A。 -
NSEは“安全カテゴリ”から:
default/safe/versionで足場固め。vulnやbruteは権限確認の上。 -
環境ノイズ対策:
mass_dns警告時は--system-dnsや--dns-servers、/etc/resolv.confを整備。 -
証跡は資産:
-oAは常用。後でgrep/jq/xsltproc等で再活用できる。
8. 代表コマンド集(コピペ用)
# ① まずは早見
sudo nmap -sS -T4 -oA quick_10.0.0.0_24 10.0.0.0/24
# ② 気になる1台を深掘り
sudo nmap -A --version-all -oA deep_10.0.0.5 10.0.0.5
# ③ NSE(デフォルト)
sudo nmap -sS -sC -oA sC_10.0.0.5 10.0.0.5
# ④ HTTP 関連スクリプト例
sudo nmap -sS --script "http-date,http-headers,http-security-headers" -p80,443 -oA http_10.0.0.5 10.0.0.5
# ⑤ SSH アルゴ列挙
sudo nmap -sS -n --script "ssh2-enum-algos" -p22 -oA ssh_algos_10.0.0.5 10.0.0.5
# ⑥ 結果の抽出
grep http *.gnmap
grep -E "443/open|https" *.gnmap
まとめ
- -sV で「何が動いているか」を確実に掴む。
- -O で OS の“あたり”を付ける(過信しない)。
- --traceroute で経路のイメージを持つ。
- NSE は “default→safe→version→vuln” と段階的に。
- -oA で必ず保存、あとから“掘れるログ”にする。
小さく当てて、大きく外さない。Nmap の後処理を制した人が、次の一手(脆弱性確認・侵入経路選定)を素早く打てます。