Nmap ポートスキャン
単純化すると
開いているポートは、そのポートでリッスンしているサービスがあることを示す
閉じたポートは、そのポートでリッスンしているサービスがないことを示す
実際の状況では、ファイアウォールの影響を考慮する必要があります。たとえば、ポートは開いているが、ファイアウォールがパケットをブロックしている場合があります。そのため、Nmap は次の 6 つの状態を考慮する
Open(開放)
指定されたポートでサービスが稼働している状態であることを示します。
Closed(閉鎖)
ポートにアクセス可能ですが、そのポートでサービスが稼働していない状態
「アクセス可能」とは、ファイアウォールやその他のセキュリティ機器/プログラムによってブロックされておらず、到達可能であること
ペンテスターとして発見するのに最も興味深い状態
Filtered(フィルタリング)
ポートが到達不可能なため、Nmapがポートの開放・閉鎖状態を判断できないことを示します。この状態は通常、ファイアウォールがそのポートへのNmapのアクセスを防いでいることが原因です。Nmapのパケットがポートに到達できないか、あるいは応答がNmapホストに戻ってこない可能性があります。
Unfiltered(フィルタリングなし)
ポートにアクセス可能ですが、Nmapがポートの開放・閉鎖状態を判断できないことを示します。この状態はACKスキャン(-sA)を使用した際に確認されます。
Open|Filtered(開放またはフィルタリング)
Nmapがポートが開放状態なのか、フィルタリング状態なのかを判断できないことを示します。
Closed|Filtered(閉鎖またはフィルタリング)
Nmapがポートが閉鎖状態なのか、フィルタリング状態なのかを判断できないことを示します。
NmapはさまざまなTCPポートスキャンをサポートしているけど、理解するにはTCP ヘッダーを確認する必要がある。
TCP ヘッダーは、TCP セグメントの最初の 24 バイトです。次の図は、RFC 793で定義されている TCP ヘッダーを示している
https://scrapbox.io/files/67283faf1c66598a4fe9d8e2.png
Nmap が設定または設定解除できるフラグに注目する必要があります。TCP フラグは赤で強調表示されています。フラグビットを設定すると、その値が 1 に設定される。TCP ヘッダー フラグは、左から右に次のようになる
URG(緊急):緊急ポインタフィールドが重要であることを示します。緊急ポインタは、入力データが緊急であることを示し、URGフラグが設定されたTCPセグメントは、以前に送信されたTCPセグメントの待機を考慮せずに、直ちに処理されます。
ACK(確認応答):確認応答番号が重要であることを示すフラグです。TCPセグメントの受信を確認するために使用されます。
PSH(プッシュ):TCPにデータを即座にアプリケーションに渡すように要求するフラグです。
RST(リセット):接続をリセットするために使用されるフラグです。ファイアウォールなどのデバイスがTCP接続を強制的に切断する際に送信することがあります。また、データがホストに送信されたが、受信側に応答するサービスが存在しない場合にも使用されます。
SYN(同期):TCP 3ウェイハンドシェイクを開始し、相手ホストとシーケンス番号を同期するために使用されるフラグです。シーケンス番号は、TCP接続確立時にランダムに設定される必要があります。
FIN(終了):送信者がこれ以上送信するデータを持っていないことを示します。
TCP 3way Hand Shakeを利用したポートスキャン
興味があるのは、TCPポートが開いているかどうかであり、TCP接続を確立しているかどうかではない
SYN,ACKが帰ってきたらACKとRST,ACKを送って切断を終了する
https://scrapbox.io/files/672843fdab48d4feba15e25c.png
-sTを使用することで実行
デフォルトでは、Nmap は最も一般的な 1000 個のポートに接続しようとする。
閉じたTCPポートは、SYN パケットに対して RST/ACK で応答し、開いていないことを示す
TCP SYNスキャン
TCP接続を確立しないため、スキャンがログに記録される可能性が低くなる
TCP 3way hand shakeの最後のACKを返さないでRSTを送りつける
https://scrapbox.io/files/672844e25d7c01c3cfb128a5.png
-sSオプションをつけることで実行
UDPでのポートスキャン
UDPでは接続の確立は行わないため、空いているポートにUDPパケットを送りつけても何も返さない
逆に空いていないポートにUDPパケットを送ると、下の図のようにICMPパケットが送りつけられてくる
これを利用して空いているポートと空いていないポートを見分けられる
空いていないポートにパケットを送りつけるとICMP "Destnation unreachab (Port Unreachable)"が帰ってくる
-sUオプションを利用する
https://scrapbox.io/files/6728464da9a2ce69605f14bf.png
注意点
-sSとかに比べて-sUではポートスキャンに時間がかかる
多くのOSではICMP応答レートを制限しているため、遅い
なぜ遅いのか詳細:
開いているUDPポートは応答を返さない
そのため、Nmapはポートが開いているのか、パケットが単に削除されたのかを判断するために待機する必要がある
この待ち時間が全体のスキャン時間を大幅に増加させる
TCPスキャンと比べた徳のUDPスキャンのメリット
ステルス性:
多くのファイアウォールやIDSはTCPトラフィックを重点的に監視
UDPスキャンは相対的に監視が緩い場合がある
特に従来型のIDSはUDPスキャンの検知が不得意なことも
サービスの脆弱性:
UDPサービスは設定ミスが見つかりやすい
DNSゾーン転送の設定ミス
SNMPのデフォルトコミュニティ文字列
パッチ適用が見落とされがちなサービスを発見できる
意外な発見
管理者が意識していないUDPサービスが動いていることがある
バックドアやマルウェアがUDPポートを使用していることも
内部ネットワークの構造を推測できる情報が得られる可能性
防御回避
UDPスキャンはパケットフィルタリングを迂回できる場合がある
ログが詳細に残りにくい
異常検知の閾値が高めに設定されていることも
スコープとパフォーマンスの微調整
デフォルトの 1000 ポートの代わりに、スキャンするポートを指定できる
ポート リスト
-p22,80 : 443ポート 22、80、443 をスキャン
ポート範囲
-p1-1023 : 1 から 1023 までのすべてのポートをスキャン
-p20-25 : 20 から 25 までのポートをスキャン
-p-は全ポート(65535ポート)をスキャン
よく使用されるポートのスキャン
-F: 上位100ポートをスキャン
--top-ports 10: 上位10ポートをスキャン
【タイミング制御(-T)】
-T0 (paranoid)
最も遅い
1ポートずつスキャン
プローブ間で5分待機
IDS回避に有効
-T1 (sneaky)
実際の侵入テストでよく使用
ステルス性重視
-T2 (polite)
控えめな速度
-T3 (normal)
デフォルト設定
-T4 (aggressive)
CTFや練習環境でよく使用
高速だが精度は低下する可能性
-T5 (insane)
最速
パケットロスの可能性が高い
結果の正確性に影響
【詳細な速度制御】
パケットレート制御
--min-rate <数値>: 最小パケットレート指定
--max-rate <数値>: 最大パケットレート指定
例:--max-rate 10で1秒あたり最大10パケット
並列処理制御
いくつものポートを同時に確認
--min-parallelism <数値>: 最小並列プローブ数
--max-parallelism <数値>: 最大並列プローブ数
例:--min-parallelism=512で最低512の並列プローブを維持
メリット
スキャン時間の短縮
応答タイムアウトの効率的な処理
デメリット
ネットワーク負荷の増加
IDS/IPSに検知されやすい
パケットロスのリスク上昇
実践的なヒント
内部ネットワークスキャン → 高い並列数OK
外部からのスキャン → 低い並列数を推奨
IDSがある環境 → 並列数を制限する