はじめに
Nmapの基本(ホスト発見・SYN/Connectなど)を踏まえ、フラグを変えた「高度」なTCPスキャンの種類とその解釈・活用法、さらに識別回避(デコイ/断片化/ゾンビ/偽装)のテクニックを整理する。ペネトレーション/防御検証どちらの視点でも役立つ実践ノート。
注意(重要):スキャンは対象ネットワークの所有者または明示的許可がある場面でのみ実行すること。無許可でやると法律違反・サービス妨害になるよ(=逮捕の可能性もあるのでヤメよう)。
基本の考え方
- TCPはフラグ(SYN, ACK, FIN, RST, PSH, URG)を使う。Nmapは送るフラグを変えて相手の応答を観察することで「開いている/閉じている/フィルタされている」を推測する。
- 大原則:Closed(閉じている)ポートは通常RSTで即答する。Open(開いている)ポートは送られたフラグにより挙動が異なる(SYNに対してSYN-ACKなど)。この差を利用する。
フラグ系スキャン(応答の読み方と用途)
Null Scan -sN
- 送るフラグ:無し(全ビット0)
- 期待される応答:閉じていればRSTを返す。返信が無ければ
open|filtered(開いている or フィルタ) - 使いどころ:ステートレスなファイアウォール越しに試すと有効な場合あり。
- コマンド例:
sudo nmap -sN <ターゲットIP>
...
Nmap scan report for x.x.x.x
Host is up (0.00066s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open|filtered ssh
25/tcp open|filtered smtp
80/tcp open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
FIN Scan -sF
- 送るフラグ:FIN
- 動作:Nullと同様、閉じていればRST。返信無しは
open|filtered - 使いどころ:古い/ステートレスなフィルタ回避に有効。ただしモダンな機器では無効なことが多い。
- コマンド例:
sudo nmap -sF <ターゲットIP>
...
Nmap scan report for x.x.x.x
Host is up (0.0018s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open|filtered ssh
25/tcp open|filtered smtp
80/tcp open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
Xmas Scan -sX
- 送るフラグ:FIN, PSH, URG(クリスマスツリー点灯)
- 挙動:閉じていればRST、応答無しは
open|filtered。 - 使いどころ:同上(ステートレスFWで効果あり)。
- コマンド例:
sudo nmap -sX <ターゲットIP>
...
Nmap scan report for x.x.x.x
Host is up (0.00087s latency).
Not shown: 994 closed ports
PORT STATE SERVICE
22/tcp open|filtered ssh
25/tcp open|filtered smtp
80/tcp open|filtered http
110/tcp open|filtered pop3
111/tcp open|filtered rpcbind
143/tcp open|filtered imap
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
Maimon Scan -sM
- 送るフラグ:FIN + ACK(古典的)
- 挙動:BSD派生OSでのみ特殊挙動を示すことがあったが、現代ではほとんど効果無し。
- コマンド例:
sudo nmap -sM <ターゲットIP>
Nmap scan report for ip-x-x-x-x.eu-west-1.compute.internal (x.x.x.x)
Host is up (0.00095s latency).
All 1000 scanned ports on ip-x-x-x-x.eu-west-1.compute.internal (x.x.x.x) are closed
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
ACK系 / ウィンドウ / カスタム(ファイアウォール調査向け)
ACK Scan -sA
- 送るフラグ:ACK
- 結果:RSTが返るため「ポートの開閉」は分からないが、フィルタ(ブロック)されているか否かが分かる(unfiltered や filtered)。
- 使いどころ:ファイアウォールのルール(どのポートを通すか)をマッピングする時に有用。
- 例:
sudo nmap -sA <ターゲットIP>
...
Nmap scan report for x.x.x.x
Host is up (0.0013s latency).
All 1000 scanned ports on x.x.x.x are unfiltered
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
...setting up the target VM `x.x.x.x `with a firewall
Nmap scan report for x.x.x.x
Host is up (0.00046s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp unfiltered ssh
25/tcp unfiltered smtp
80/tcp unfiltered http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)
Window Scan -sW
- 送るフラグ:ACK(Windowフィールドを観察)
- 動作:RSTは返るが、RSTのWindow値でOpen/Closedを判定できる場面がある(特定のOS依存)。
- 使いどころ:ACKで得られなかった微妙な差を突く時。
- 例:
sudo nmap -sW <ターゲットIP>
...
Nmap scan report for x.x.x.x
Host is up (0.0011s latency).
All 1000 scanned ports on ip-x-x-x-x.eu-west-1.compute.internal (x.x.x.x) are closed
MAC Address: 02:45:BF:8A:2D:6B (Unknown)
...
...setting up the target VM `x.x.x.x `with a firewall
...This is in contrast with the ACK scan that labelled the same three ports as unfiltered.
Nmap scan report for x.x.x.x
Host is up (0.00040s latency).
Not shown: 997 filtered ports
PORT STATE SERVICE
22/tcp closed ssh
25/tcp closed smtp
80/tcp closed http
MAC Address: 02:78:C0:D0:4E:E9 (Unknown)
Custom Scan --scanflags
- 任意のフラグ組合せを送れる。実験用・特殊検査に。
- 例(SYN+RST+FINを同時に送る):
sudo nmap --scanflags RSTSYNFIN <ターゲットIP>
- 注意:解釈が難しいので、送る前に期待挙動(Closed/Open時の応答)を整理しておくこと。
偽装・デコイ・断片化(検出回避テクニック)
IPソース偽装 -S SPOOFED_IP
- 概要:送信元IPを偽る。だが、応答は偽ったIPに帰るため、その応答を拾える位置(ブリッジ、同サブネットでパケットをモニタ可能)でないと無意味。
- 実行例:
sudo nmap -e eth0 -Pn -S 10.0.0.123 <ターゲットIP>
- 注意:多くのネットワークで非対称ルーティングや反射などで失敗する。
MAC偽装 --spoof-mac
- ローカルセグメント上でのみ有効(同イーサネット/同SSID)。
- 例:
sudo nmap --spoof-mac 00:11:22:33:44:55 <ターゲットIP>
デコイ -D
- 複数の送信元に見せかけてログをかき混ぜる。自分のIPは
MEで指定可。RNDでランダム。 - 例(2つの固定デコイ+自分):
nmap -D 10.10.0.1,10.10.0.2,ME <ターゲットIP>
- 注意:ログにノイズを増やすだけで成功を保証しないし、ネットワーク上の他ホストにも疑いを向ける可能性がある(倫理的・法的に注意)
断片化 -f / -ff
- IPペイロードを小片にして送ることで、単純なIDS/ファイアウォールのシグネチャを回避することができる(機種依存)
- 例:
sudo nmap -sS -p80 -f <ターゲットIP> # 8-byte fragments
sudo nmap -sS -p80 -ff <ターゲットIP> # 16-byte fragments
- 補足:
--mtuで細かく指定可能。--data-lengthでパケットにダミーデータ追加も可能。
Idle / Zombie Scan -sI(究極の偽装スキャン)
- 概念:他の「アイドルなホスト(ゾンビ)」を踏み台にしてスキャンする。攻撃者はその「ゾンビ」のIP IDの増え具合を見てターゲットの応答(SYN-ACK→RSTの有無)を判断する。
- 要件:
- ゾンビはTCP接続をほとんどしておらずIP IDが単調増加していること(idle)
- ゾンビに直接クエリを送り、IP IDを観測できること
- ターゲットとゾンビがターゲットからの応答をゾンビが受け取れるネットワーク位置関係であること
- 実行例:
sudo nmap -sI <ZOMBIE_IP> <TARGET_IP>
- 長所:よりステルス(本当の送信元はゾンビ)。短所:ゾンビが忙しいと誤差が出る・環境依存度が高い。
出力の詳細化(解析を助けるオプション)
-
--reason: Nmapが「なぜ」そう判断したかを表示(syn-ack, reset, arp-response 等) -
-v/-vv: 段階的な冗長出力(発見プロセスを逐次表示) -
-d/-dd: デバッグ(パケットのやり取りを詳細に見る) - 使い方例:
sudo nmap -sS --reason -vv <TARGET_IP>
速習チートシート(コマンド早見表)
| 目的 | コマンド |
|---|---|
| Null Scan | sudo nmap -sN IP |
| FIN Scan | sudo nmap -sF IP |
| Xmas Scan | sudo nmap -sX IP |
| Maimon Scan | sudo nmap -sM IP |
| ACK Scan(FW検査) | sudo nmap -sA IP |
| Window Scan | sudo nmap -sW IP |
| Custom Flags | sudo nmap --scanflags RSTSYNFIN IP |
| Spoof Source IP | sudo nmap -e eth0 -Pn -S SPOOF_IP IP |
| Spoof MAC | nmap --spoof-mac 00:11:22:33:44:55 IP |
| Decoy | nmap -D decoy1,decoy2,ME IP |
| Fragmented | sudo nmap -sS -p80 -f IP |
| Idle Scan | sudo nmap -sI ZOMBIE_IP IP |
| Reason + verbose | sudo nmap -sS --reason -vv IP |
実務上のヒント/落とし穴(現場の観点)
- ステートフルFW vs ステートレスFW:Null/FIN/XmasはステートレスFWを騙せる場面があるが、現代のステートフルな環境では効果が薄い。まずは環境(FW/IPSの種類)を想定してスキャン方法を選ぶ。
-
誤検知(False Positive)に注意:
open|filteredの判断は「応答がなかった」ことに基づく。つまり「フィルタで破棄された」可能性と「開いている」可能性が混ざる。後続のプローブ(サービス検出、バナー取得)で確証を得よう。 - ログのノイズ:デコイや断片化はログにノイズを残すだけで、管理者の調査を誘発する。目的とリスクを天秤にかけること。
- ゾンビの選定が命:Idle Scanはゾンビが本当に「idle」であることが鍵。候補ホストを事前に十分観察すること。
- 合法面の配慮:テストや社内検査なら事前承認を必ず。外部ターゲットは絶対ダメ。
まとめ
- Null/FIN/Xmas系は「返信が無い=open|filtered」を利用
- ACK/Window系は「RST」の微差を取り、ファイアウォール挙動を露呈
- カスタムフラグ、断片化、偽装、デコイ、Idle(ゾンビ)などは特殊環境で役に立つが条件依存が強い
- まずは
--reason-vvでNmapの推論過程を見て、仮説を立て、段階的に検証すること