ポートスキャンツール「Nmap」を使ったセキュリティチェック

Nmap

ポートスキャンで使用する方式を選択する

Nmapでは複数のポートスキャン方式が実装されており、目的や状況に応じてポートスキャン方式を選択できる。通常はデフォルトで利用されるTCP SYNスキャンもしくはTCP Connectスキャンで十分なのだが、対象のホストがIPS(侵入検知システム)やファイアウォールなどで守られている場合、それ以外のスキャン方式を選択することでこれらを回避できる可能性がある。自分が管理しているサーバーに対してこのような特殊なポートスキャン方式を利用することはあまりないだろうが、Nmapがどのようにポートスキャンを行っているかを理解する補助として、Nmapで利用できるポートスキャン方式のいくつかを簡単に説明しておこう。

TCP SYNスキャン(-sS)

もっとも基本的なポートスキャン方式が「TCP SYNスキャン」だ。「ステルススキャン」とも呼ばれている。このスキャン方式を利用するにはroot権限が必要だが、高速にポートスキャンを行えるのが特徴だ。root権限を持つユーザーがスキャン方式を指定しないでNmapを実行した場合、このスキャン方式が利用される。また、-sSオプションを指定して明示的にこのスキャン方式を選択することもできる。

TCP SYNスキャンでは、対象のホスト/ポートに対しTCPのSYNパケットを送信し、その結果からポートが利用可能かどうかをチェックする。サーバーはSYNパケットを受信した場合、そのポートが利用可能であればSYN/ACKパケットをクライアントに返送する。いっぽう、サーバーアプリケーションが稼働していないなどで接続を受け付けられない場合はサーバーはRSTパケットを返送する。また、パケットフィルタなどでそのポートへのアクセスがブロックされている場合、サーバーからパケットは返送されない。この違いによってTCP SYNスキャンではポートの状態を調査する。

なお、SYNスキャンでは対象のサーバー/ホストに対しSYNパケットを送信するだけで、実際の接続は確立させない。そのため、通常サーバー側にはそのログは残らない。ただし、ファイアウォールのログには記録される可能性がある。

TCP connectスキャン(-sT)

TCP Connectスキャンは、connectシステムコールを発行してターゲットとするホスト/ポートへの接続を確立させることでポートが利用可能かどうかをチェックする。この方式ではroot権限を必要としないが、SYNスキャンと比べると処理速度に劣る。また、ターゲットのホストにログが記録される可能性も高くなる。一般ユーザーでスキャン方式を指定しないでNmapを実行した場合、このスキャン方式が利用される。また、-sTオプションを指定することで明示的にこの方式を選択することも可能だ。

UDPスキャン(-sU)

NmapはデフォルトではTCPプロトコルを使ったスキャンを行うが、UDPを用いたスキャンも可能だ。UDPスキャンを行うには-sUオプションを指定する。UDPスキャンは空のUDPヘッダをターゲットとするホスト/ポートに送信することでスキャンを行う。ただし、UDPではポートが閉じられているのか、それともほかの要因でパケットが到達していないのかを判断することが難しいため、スキャン速度が遅くなる点に注意が必要だ。

TCP Nullスキャン(-sN)、FINスキャン(-sF)、Xmasスキャン(-sX)

-sNオプションではTCP Nullスキャンを、-sFオプションではFINスキャンを、-sXオプションではXmasスキャンを実行できる。TCP Nullスキャンはどのフラグも設定していないパケットを送信することでスキャンを行う。TCP/IPではこのようなパケットを受信した場合、ポートの状態が「closed」であればRSTフラグ付きのパケットを返送する。いっぽうポートで待ち受けが行われていれば、何もパケットを返送しない。つまり、パケットの返送があればそのポートは「closed」であり、返送が無ければ「open」もしくは「filtered」のどちらか(「open|filtered」)であると判断できる。

また、FINスキャンではTCPのFINフラグのみを設定したパケットを、XmasスキャンではFINおよびPSH、URGフラグを設定したパケットを利用する。これらのパケットについても、TCP Nullスキャンと同様の結果を得ることができる。

これらスキャン方式を利用するメリットは、特定のファイアウォールやパケットフィルタをすり抜けることが可能であるという点だ。ただし、ターゲットのOSやファイアウォール/ルーターによっては実際とは異なる検出結果が得られる可能性がある。また、ポートがclosedであることは判定できるが、openもしくはfilteredのどちらであるかは判定できない。つまり、検出結果は「closed」と「open|filtered」のどちらかとなる。

TCP ACKスキャン(-sA)

TCP ACKスキャンでは、ACKフラグだけを設定したパケットを使ってポートスキャンを行う。このスキャンでは、ポートに対しフィルタが適用されているかどうか(filteredかunfilteredか)のみを判定できる。

TCPウィンドウスキャン(-sW)

TCPウィンドウスキャンはACKスキャンと同じであるが、一部のシステムでは返送パケットのTCPウィンドウのフィールドが異なることを利用してポートがopenかclosedかどうかを判定する。ただし、この挙動をするのは一部のシステムのみであるため、信頼性は低い。

TCP Maimonスキャン(-sM)

TCP Maimonスキャンは、FINおよびACKフラグを設定したパケットを使ってポートスキャンを行う。通常このパケットを受け取るとホストはRSTパケットを返送するが、BSD由来の一部のシステムではポートが開いている場合にパケットが返送されないことを利用してポートの状態を判別する。

そのほか、指定した任意のフラグを設定したパケットを使用する--scanflagsオプションも用意されている。このオプションを利用することで、任意のフラグ付きパケットを対象ホストに送信できる。

>>次ページ:GUIフロントエンド「zenmap」を利用する

おしらせ