-sS
(TCP SYNスキャン)
SYNスキャンは、デフォルトで最も人気のあるスキャンオプションであることには、それなりの理由がある。 ファイアウォールによって制限されていない高速ネットワーク上で、1秒間に数千のポートをスキャンし、すばやく実行することができる。 また、TCP接続を完了させることがないため、比較的控えめでステルス性に優れている。 SYNスキャンは、NmapのFIN/NULL/Xmas、Maimon、アイドルスキャンのように特定のプラットフォームの特質に依存するのではなく、準拠するあらゆるTCPスタックに対して機能する。 また、open
、closed
、filtered
の各状態を明確かつ確実に区別できる。
この手法は、完全なTCP接続を開かないため、ハーフオープン・スキャンと呼ばれることもある。 実際の接続を開くかのようにSYNパケットを送信し、応答を待ちます。 SYN/ACKはポートがリッスン中(オープン)であることを示し、RST(リセット)はリッスン中でないことを示す。 数回再送信しても応答がない場合、そのポートはフィルタリング済みとマークされます。 ICMP unreachableerror(タイプ3、コード0、1、2、3、9、10、13)を受信した場合も、ポートがフィルタリングされたとみなされる。 また、SYNパケット(ACKフラグなし)を応答として受信した場合、ポートはオープンとみなされます。
-sT
(TCP connect scan)
TCP connect scan は、SYN scan がオプションでない場合のデフォルトの TCP scan タイプである。 これは、ユーザーがraw packetprivilegesを持っていない場合である。 Nmapは、他のほとんどのスキャンタイプのように生パケットを書き込むのではなく、connect
システムコールを発行して、基盤となるオペレーティングシステムにターゲットマシンおよびポートとの接続を確立するよう要求する。 これは、Webブラウザ、P2Pクライアント、その他ほとんどのネットワーク対応アプリケーションが接続を確立するために使用するものと同じ高レベルのシステムコールであり、Berkeley SocketsAPIとして知られるプログラミングインターフェイスの一部である。 Nmapは、ワイヤから生のパケット応答を読み取るのではなく、このAPIを使用して、各接続試行に関するステータス情報を取得する。 Nmaphは、生のパケットよりも高レベルのconnect
呼び出しを制御しにくいため、効率が悪くなる。 システムコールは、SYNスキャンが行うハーフオープンリセットを実行するのではなく、開いているターゲットポートへの接続を完了させる。 この場合、同じ情報を得るのに時間がかかり、より多くのパケットを必要とするだけでなく、ターゲット・マシンが接続を記録する可能性が高くなる。 まともなIDSはどちらかをキャッチするが、ほとんどのマシンにはそのようなアラームシステムはない。 平均的なUnixシステムの多くのサービスは、Nmapが接続した後、データを送信せずに接続を終了すると、syslogにメモを追加し、時には不可解なエラーメッセージを追加する。 これが起きると、本当に哀れなサービスはクラッシュするが、それはまれなことである。
-sU
(UDPスキャン)
インターネット上のほとんどの人気サービスはTCPプロトコルで実行されるが、UDPサービスも広く展開されている。 DNS、SNMP、DHCP(登録ポート53、161/162、67/68)の3つは、最も一般的なものの1つです。 UDPのスキャンは、一般にTCPよりも遅く、困難であるため、セキュリティ監査人の中には、これらのポートを無視する人もいます。 これは間違いである。搾取可能なUDPサービスは極めて一般的であり、攻撃者もプロトコル全体を無視することはないだろうからだ。 幸い、NmapはUDPポートのインベントリを作成するのに役立つ。
UDP スキャンは、-sU
オプションで有効になる。 SYNスキャン(-sS
)などのTCPスキャンタイプと組み合わせて、同じ実行中に両方のプロトコルをチェックすることができる。
UDPスキャンは、UDPパケットをすべてのターゲットポートに送信することで機能する。 53や161など一部の共通ポートでは、応答速度を上げるためにプロトコル固有のペイロードが送信されるが、ほとんどのポートでは、--data
、--data-string
、--data-length
オプションが指定されない限りパケットに空白ができる。 その他のICMP到達不能エラー(タイプ3,コード0,1,2,9,10,13)は,ポートをfiltered
とマークします。 時折、aserviceはUDPパケットで応答し、open
であることを証明する。 再送しても応答がない場合、そのポートはopen|filtered
に分類されます。 これは、ポートが開いているか、パケットフィルターが通信をブロックしている可能性があることを意味します。 オープンポートやフィルタリングされたポートが応答を送ることはほとんどないため、Nmapはタイムアウトし、プローブや応答が失われた場合に備えて再送信を行うことになる。 閉じたポートは、通常、ICMPポート到達不能エラー(unreachable error)を送り返す。 しかし、閉じたTCPポートがSYNやconnectscanに応答して送信するRSTパケットとは異なり、多くのホストでは、デフォルトでICMP port unreachableメッセージをレート制限しています。 たとえば、Linux 2.4.20カーネルは、宛先到達不能メッセージを毎秒1個(net/ipv4/icmp.c
)に制限する。
Nmap はレート制限を検出し、ターゲットマシンがドロップする無駄なパケットでネットワークがあふれるのを避けるため、それに応じて速度を落とす。 残念ながら、Linuxスタイルの1秒に1パケットという制限では、65,536ポートのスキャンに18時間以上かかる。 UDPスキャンを高速化するアイデアとしては、より多くのホストを並行してスキャンする、最初に人気のあるポートだけをクイックスキャンする、ファイアウォールの後ろからスキャンする、遅いホストをスキップするために--host-timeout
を使用するなどがある。
-sY
(SCTP INIT scan)
SCTPはTCPおよびUDPプロトコルに代わる比較的新しいもので、TCPおよびUDPのほとんどの特性を組み合わせ、マルチホームおよびマルチストリーミングなどの新しい機能も追加した。 SCTP INITスキャンは、TCP SYNスキャンに相当するSCTPである。SYNスキャンと同様に、INITスキャンはSCTPアソシエーションを完了しないため、比較的控えめでステルスである。 また、open
、closed
、およびfiltered
の各状態を明確に、確実に区別できる。
この手法は、SCTPアソシエーションを完全にオープンしないため、ハーフオープンスキャンと呼ばれることもある。 実際のアソシエーションを開くかのようにINITchunkを送信し、応答を待つ。 INIT-ACKチャンクはポートがリッスン中(オープン)であることを示し、ABORTチャンクはリッスン中でないことを示す。 何度か再送しても応答がない場合、そのポートはフィルタリングされたものとしてマークされる。
-sN
;-sF
;-sX
(TCP NULL、FIN、Xmasスキャン)
これら3つのスキャンタイプ(次のセクションで述べる--scanflags
オプションでさらに可能)は、open
とclosed
ポートを区別するためにTCP RFCの微妙な抜け穴を利用したものである。 RFC 793の65ページには、「ポートの状態がCLOSEDの場合、RSTを含まない着信セグメントは、応答としてRSTを送信することになる」とある。 そして、次のページでは、SYN、RST、ACKビットを設定せずにオープンポートに送信されたパケットについて、次のように述べられています。 「このRFCの文章に準拠したシステムをスキャンする場合、SYN、RST、ACKビットを含まないパケットは、ポートが閉じていればRSTが返され、ポートが開いていれば全く応答がないことになる。 この3つのビットが含まれていない限り、他の3つのビット(FIN、PSH、URG)の組み合わせはどれでもOKである。 Nmapは、次の3つのスキャンタイプでこれを攻略する。
-sN
)
ビットを設定しない(TCPフラグヘッダは0)
FIN scan (-sF
)
TCPFINビットだけを設定する。
Xmas scan (-sX
)
FIN、PSH、URGフラグを設定し、クリスマスツリーのようにパケットを光らせる。
これら3種類のスキャンは、プローブパケットのTCPフラグの設定以外は全く同じ動作である。 RSTパケットを受信した場合、そのポートはclosed
とみなされ、応答がない場合はopen|filtered
とみなされる。 ICMP unreachableエラー(タイプ3、コード0、1、2、3、9、10、13)を受信すると、ポートはfiltered
とマークされる。
これらのスキャンタイプの主な利点は、特定の非ステートフルファイアウォールとパケットフィルタリングルーターをこっそり通過できることである。 もう1つの利点は、これらのスキャンタイプが、SYNスキャンよりも少し控えめであることである。 このtough-modern IDS製品は、それらを検出するように構成することができることを当てにしないでください。 bigdownsideは、すべてのシステムがRFC 793に忠実に従うわけではないことである。 システムの数は、ポートが開いているかどうかに関係なく、プローブにRST応答を送信します。 このため、すべてのポートにclosed
というラベルが貼られることになる。 このような動作をする主なOSは、Microsoft Windows、多くのCiscoデバイス、BSDI、IBM OS/400である。このスキャンは、ほとんどのUnixベースのシステムに対して機能するが。
-sA
(TCP ACKスキャン)
このスキャンは、open
ポート(あるいはopen|filtered
ポートも)を決定しない点で、これまで説明した他のスキャンとは異なっている。
ACKスキャンのプローブパケットには、ACKフラグだけが設定されている(--scanflags
を使用しない場合)。 フィルタリングされていないシステムをスキャンする場合、open
ポートとclosed
ポートは両方ともRSTパケットを返す。 Nmapは、それらをunfiltered
とラベル付けし、ACKパケットで到達可能であることを意味するが、それらがopen
かclosed
かは未確定である。 応答しないポートや、特定のICMPエラーメッセージ(タイプ3、コード0、1、2、3、9、10、13)を返したポートには、filtered
のラベルが付く。
-sW
(TCP Window scan)
ウィンドウスキャンは、ACKスキャンとまったく同じで、特定のシステムの実装を利用して、RSTが返ってきたときに常にunfiltered
と表示するのではなく、開いているポートか閉じているか区別して表示する点が異なる。 これは、返されたRSTパケットのTCP Windowフィールドを調べることによって行われる。 システムによっては、オープンポートが正のウィンドウサイズを使用し(RSTパケットに対しても)、クローズドポートがゼロのウィンドウサイズを持つことがある。 そのため、RSTを受信すると、常にポートをunfiltered
としてリストするのではなく、Window scanは、リセットのTCP Window値がそれぞれ正またはゼロである場合、ポートをopen
またはclosed
としてリストする。
このスキャンはインターネット上の少数のシステムの実装の詳細に依存しているので、常にそれを信頼できるとは限らない。 これをサポートしないシステムでは、通常、すべてのポートclosed
が返される。 もちろん、そのマシンに本当に開いているポートがない可能性もある。 スキャンされたポートのほとんどがclosed
で、いくつかの一般的なポート番号(22、25、53など)がfiltered
である場合、そのシステムは影響を受けやすい可能性が高い。 時には、システムが正反対の挙動を示すこともあります。
-sM
(TCP Maimonスキャン)
Maimonスキャンは、発見者のUriel Maimonにちなんで名付けられた。彼は、Phrack Magazine 49号(1996年11月)でこの手法を解説し、この手法を含むNmapは、その2号後にリリースされている。 RFC 793(TCP)によると、ポートが開いているか閉じているかにかかわらず、このようなプローブに応答してRSTパケットを生成する必要がある。 しかし、Urielは、多くのBSD由来のシステムが、ポートが開いている場合は単にパケットをドロップすることに気づいた。
--scanflags
(カスタムTCPスキャン)
本当に高度なNmapユーザーは、提供されるスキャンタイプに限定する必要はない。 ベンダーがNmapのマニュアルページに特定のルールを追加していくだけの侵入検知システムを回避しながら、創造力を発揮しよう!
--scanflags
引数には、9 (PSHおよびFIN)などの数値フラグを指定できるが、シンボリック名を使う方が簡単である。 URG
, ACK
, PSH
, RST
, SYN
, FIN
の任意の組み合わせをマッシュアップしてください。 例えば、--scanflagsURGACKPSHRSTSYNFIN
はすべてを設定するが、スキャンにはあまり役に立たない。
希望するフラグを指定するほかに、TCPスキャンタイプ(たとえば-sA
や-sF
)を指定することも可能である。 例えば、SYNスキャンでは、無応答がfiltered
ポートを示すと見なし、FINスキャンでは、同じものをopen|filtered
と見なす。 Nmapは、指定されたTCPフラグを代わりに使用する以外は、基本スキャンタイプと同じように動作する。
-sZ
(SCTP COOKIE ECHOスキャン)
SCTP COOKIE ECHOスキャンは、より高度なSCTPスキャンである。 このスキャンタイプの利点は、INITスキャンと比較して、ポートスキャンが目立たないことである。 また、INITチャンクはブロックするが、COOKIE ECHOチャンクはブロックしない、非ステートフルファイアウォールルールセットが存在する場合もある。 優れたIDSは、SCTP COOKIE ECHOスキャンも検出できる。欠点は、SCTP COOKIE ECHOスキャンがopen
とfiltered
ポートを区別できず、どちらの場合も状態open|filtered
のままになってしまうことである。
-sI
(アイドル スキャン)<zombie host>
この高度なスキャン方法では、ターゲットのブラインドTCPポート スキャンを実行できます(実際のIPアドレスからターゲットにパケットが送信されないという意味です)。 その代わり、独自のサイドチャネル攻撃により、ゾンビホスト上で予測可能なIPフラグメントIDシーケンス生成を悪用して、ターゲット上のオープンポートに関する情報を取得します。 IDSシステムは、指定したゾンビマシン(稼働中で、一定の基準を満たしている必要がある)からのスキャンであると表示する。 この魅力的なスキャンタイプの詳細は、「TCPアイドルスキャン(-sI
)」のセクションに記載されている。
このスキャンタイプは、(そのブラインド機能により)非常にステルス性が高いだけでなく、マシン間のIPベースの信頼関係をマッピングすることが可能です。 ポート一覧には、ゾンビホストの視点から、開いているポートが表示される。 したがって、(ルータ/パケットフィルタのルールにより)信頼できそうなさまざまなゾンビを使用して、ターゲットをスキャンしてみることができる。
IPIDの変更についてゾンビの特定のポートを調査したい場合、ゾンビホストにコロンの後にポート番号を追加することができる。 それ以外の場合、NmapはTCP Pingにデフォルトで使用されるポート(80)を使用する。
-sO
(IPプロトコルスキャン)
IPプロトコルスキャンにより、ターゲットマシンがどのIPプロトコル(TCP、ICMP、IGMPなど)をサポートしているか判断することができる。 これは、TCPまたはUDPポート番号ではなく、IPプロトコル番号を循環させるため、厳密にはポートスキャンではありません。 しかし、それでもスキャンしたプロトコル番号を選択するために-p
オプションを使用し、通常のポートテーブル形式で結果を報告し、さらに真のポートスキャン方法と同じ基礎となるスキャンエンジンを使用します。
それ自体が有用であることに加え、プロトコル スキャンは、オープン ソース ソフトウェアのパワーを実証しています。 基本的なアイデアは非常にシンプルですが、私はそれを追加することを考えませんでしたし、そのような機能に対するいかなるリクエストも受け取りませんでした。 そして2000年の夏、Gerhard Riegerがこのアイデアを思いつき、それを実装した素晴らしいパッチを書いて、announceメーリングリスト(当時はnmap-hackersと呼ばれていた)に送ってきた。私はそのパッチをNmapツリーに組み込み、翌日に新版をリリースしたのである。 商用ソフトウェアで、独自の改良を設計し、貢献するほど熱心なユーザーを持つものはほとんどない!
プロトコルスキャンは、UDPスキャンと同様の方法で動作する。 UDPパケットのポート番号フィールドを反復する代わりに、IPパケットヘッダーを送信し、8ビットIPプロトコルフィールドを反復する。ヘッダーは通常空で、データを含まず、主張したプロトコルの適切なヘッダーでさえない。 例外は、TCP、UDP、ICMP、SCTP、およびIGMPです。 これらのプロトコルのヘッダが含まれるのは、そうしないと送信しないシステムがあることと、Nmapがすでにヘッダを作成する機能を備えているためである。 プロトコルスキャンは、ICMP portunreachableメッセージを監視する代わりに、ICMPprotocol unreachableメッセージを監視する。 Nmapは、ターゲットホストからいずれかのプロトコルで応答を受信すると、そのプロトコルをopen
とマークする。 ICMPプロトコル到達不能エラー(タイプ3、コード2)は、プロトコルをclosed
とマークし、ポート到達不能(タイプ3、コード3)は、プロトコルをopen
とマークする。 その他のICMP unreachable error (type 3, code0, 1, 9, 10, 13)はプロトコルをfiltered
とマークする(同時にICMPがopen
であることを証明するが)。 再送後に応答がない場合、プロトコルはopen|filtered
-b
(FTP bounce scan)<FTP relay host>
FTPプロトコル(RFC 959)の興味深い機能は、いわゆるプロキシFTP接続を発行サポートしています。 これにより、ユーザーはある FTP サーバーに接続し、その後、ファイルをサードパーティのサーバーに送信するよう要求することができます。 このような機能は、多くのレベルで悪用のために熟しているので、ほとんどのサーバーは、それをサポートして停止している。 この機能が可能にする悪用の一つは、FTPサーバーが他のホストをポートスキャンすることです。 エラーメッセージには、そのポートが開いているかどうかが記載されます。 これは、ファイアウォールをバイパスする良い方法です。なぜなら、組織のFTPサーバーは、しばしば、古いインターネットホストよりも他の内部ホストにアクセスできる場所に配置されるからです。 Nmapは、-b
オプションでFTPバウンススキャンをサポートしています。 このオプションは、<username>
:<password>
@<server>
:<port>
という形式の引数を取る。<Server>
は、脆弱なFTPサーバの名前またはIPアドレスである。 通常の URL と同様、<username>
:<password>
を省略することもでき、その場合は匿名のログイン情報 (user:anonymous
password:-wwwuser@
) が使用される。 ポート番号(および直前のコロン)も省略可能で、その場合は<server>
上のデフォルトのFTPポート(21)が使用される。
この脆弱性はNmapがリリースされた1997年に広まったが、ほとんど修正されている。 この脆弱性は、Nmapがリリースされた1997年当時には広く存在していたが、現在はほとんど修正されている。 もし、ファイアウォールを迂回することが目的なら、ポート21(バージョン検出ですべてのポートをスキャンした場合は、すべてのFTPサービスも)に対してターゲットネットワークをスキャンし、ftp-bounce
NSEスクリプトを使用する。 Nmapは、そのホストが脆弱であるかどうかを教えてくれる。 自分の痕跡を消したいだけなら、ターゲットネットワーク上のホストに限定する必要はない(実際、そうすべきではない)。 脆弱な FTP サーバを探すために無作為にインターネットアドレスをスキャンする前に、管理者はあなたがこのように自分のサーバを悪用することを認めないかもしれないことを考慮してください
。