-
-f (パケットをフラグメント化する);
--mtu (指定したMTUを用いる)
-fオプションを指定すると、要求されたスキャン(pingスキャンを含む)は小さく断片化されたIPパケットを利用するようになる。これを行う目的は、TCPヘッダを複数のパケットに分割することで、パケットフィルタや侵入検知システム(IDS)などの厄介なセキュリティ策にスキャンを検知されにくくすることである。ただし、以下の点には注意が必要だ。すなわち、プログラムのなかには、このような小さなパケットの処理によって問題を生じるものがあることだ。旧式のスニファ「Sniffit」は、最初のフラグメントを受信した瞬間にセグメンテーション障害を起こした。このオプションを一度指定すると、NmapはIPヘッダを8バイトかそれ以下の大きさのパケットに分割する。つまり、20バイトのTCPヘッダは3つのパケットに分割されることになる。8バイトのパケットが2つと、残りの1つが4バイトになる。もちろん、各フラグメントにもIPヘッダがある。-fを再度指定すると、フラグメントあたり16バイトが使われる(フラグメントの数は減る)。あるいは、--mtuオプションで、ユーザ独自の分割サイズを指定することもできる。--mtuを使う場合は、同時に-fは指定しないこと。分割サイズは8の倍数にする必要がある。断片化されたパケットは、すべてのIPフラグメントを待ち行列に入れるパケットフィルタやファイアウォール(例えば、LinuxカーネルのCONFIG_IP_ALWAYS_DEFRAGオプションなど)を通り抜けることはできないが、ネットワークによっては、この断片化によって生じるパフォーマンスの低下に耐えきれないために、これを無効にしているところがある。またそれ以外にも、各フラグメントがそれぞれ異なる経路を通ってネットワークに至る可能性があるために、この機能を有効にできないところもある。一部の発信元システムでは、カーネルで発信パケットのフラグメント化を解消するものもある。コネクション追跡モジュールの「iptables」を備えるLinuxなどがこれにあたる。送信パケットがきちんとフラグメント化されていることを確認するために、Etherealなどのスニファを実行しながら、スキャンを行うようにすること。自身のホストのOSが原因で問題が生じる場合は、IP層を回避して「生」イーサネット フレームを送るために、--send-ethを試してみるとよい。
-
-D <decoy1 [,decoy2][,ME],...>
(おとりを使ってスキャンを隠蔽する)
おとり(囮)スキャンを実行する。おとりスキャンとは、実際のスキャンの他に、おとりとして指定したホスト(複数可)もターゲットネットワークをスキャンしているようにリモートホストに見せかけるためのものである。この結果、対象ホストのIDSは、それぞれ異なる複数のIPアドレスから、5から10のポートスキャンが実行されたことを報告する場合もあるが、実際にどのIPがスキャンを実行していたもので、どれが無実のおとりだったのかを知られることはない。このおとりスキャンは、ルータの経路追跡、応答の破棄、その他の動的メカニズムによって阻止される可能性があるが、通常は攻撃元のIPアドレスを隠蔽する技法として非常に効果的である。
各おとりホストはコンマで区切る。おとりの1つとしてME(自分)オプションを用いて、ユーザの本物のIPアドレスをその位置に表示することもできる。MEをおとりホストの6番目以降に置くと、(Solar Designerの優れたscanlogdなどの)よく使われる一部のポートスキャン検出ツールが、ユーザのIPアドレスを明らかにすることはほぼ不可能である。MEオプションを使わない場合、ユーザはNmapが無作為に選んだ位置に置かれる。
注意すべき点は、おとりとして使用するホストが稼動中でないと、ターゲットに誤ってSYN flood攻撃を仕掛けることになる。また、ネットワーク上で実際に稼動しているホストが1つしかない場合は、どのホストがスキャンを実行しているかを容易に特定されてしまう。また、ホスト名よりもIPアドレスを使った方がよいだろう(おとりネットワークのネームサーバのログに記録されないようにするため)。
おとりは、初期段階に行うpingスキャン(ICMP、SYN、ACK、その他利用できるものなら何でも)と、実際のポートスキャンの実行段階の両方で使用される。また、リモートOS検出(-O)を行う際にも使われる。だが、バージョン検出やTCP connect()スキャンとは連携しない。
おとりを多く使いすぎると、スキャンの速度が低下するだけでなく、精度も下がるおそれがあることに注意する。また、一部のISPは偽装パケットをフィルタで除外しているが、偽装したIPパケットを制限しているところは少ない。
-
-S <IP_Address> (ソースアドレスを偽装する)
一部の環境では、Nmapがユーザのソースアドレスを特定できない場合がある(その場合はかならず、Nmapからユーザに通知がある)。こうした状況では、-Sオプションを使って、パケットの送信に利用したいインターフェースのIPアドレスを指定すること。
このフラグの他の利用方法として考えられるのは、スキャンを偽装して、第三者(誰か別の人間)がスキャンを実行しているとターゲットに思い込ませることだ。企業が、ライバル企業から繰り返しポートスキャンを受けたとしたらどうなるだろうか。この種の用途に用いるには、たいていの場合-eオプションが必要になるだろう。また通常は-P0も使った方が望ましい。
-
-e <interface> (特定のインターフェースを使用する)
パケットを送受信する際に、どのインターフェースを利用するかをNmapに伝えるためのオプション。Nmapは、インターフェースを自動的に検知できるようになっているが、検知できない場合はその旨がユーザに通知される。
-
--source-port <portnumber>;
-g <portnumber> (ソースポート番号を偽装する)
よく見かける設定ミスの1つは、ソースポート番号だけを基準にして、トラフィックを信頼していることである。これがどのようにして起きるかを理解するのは簡単である。管理者が真新しいファイアウォールをセットアップすると必ず、恩知らずのユーザから、アプリケーションが機能しなくなったという苦情が殺到することになるものだ。特に、外部サーバからのUDP DNS応答がネットワークに入れなくなることが原因で、DNSが動かなくなる場合がある。この他に、FTPもよく見られる例である。アクティブFTP転送が行われる際に、リモートサーバは、要求されたファイルを転送するために、再びクライアントへのコネクションを確立しようとする。
これらの問題に対するセキュアなソリューションは、多くの場合、アプリケーションレベルのプロキシや、プロトコル解析型ファイアウォールモジュールの形で存在する。だが残念ながら、もっと簡単で、安全性の低いソリューションもあるのだ。多くの管理者は、DNS応答は53番ポートから、アクティブftpは20番ポートから来ることに注目し、これらのポートからの内向きトラフィックを無条件に許可してしまうという罠に陥る。こうしたファイアウォールの抜け穴の存在に気付いて悪用するような攻撃者がいるとは思ってもいない場合が多い。また別のケースでは、管理者がこうした処置を、より安全性の高いソリューションを実装するまでの短期間の応急処置と見なしている場合もある。そして結局、セキュリティを向上させることなどすっかり忘れてしまうわけだ。
こうした罠に陥るのは何も、多忙なネットワーク管理者だけではない。この種の安全性の低いルールが標準で装備されてくる製品は膨大な数にのぼる。マイクロソフト社にも、責任の一端はある。Windows 2000 や Windows XPに標準装備されているIPsecフィルタには、88番ポート(Kerberos)からのTCP や UDPのトラフィックをすべて許可するという暗黙のルールが含まれている。この他に有名なケースでは、Zone Alarm社製パーソナルファイアウォールの2.1.25以下のバーションでは、ソースポートが53番(DNS)と67番(DHCP)の内向きUDPパケットをすべて許可するようになっていた。
Nmapには、この種の弱点を突くためのオプションとして、-g や--source-port(これらは同等のもの)が用意されている。単ポート番号を指定すると、可能な場合であれば、Nmapはそのポートからパケットを送信する。特定のOS検出検査が正しく機能するようにするために、Nmapは様々なポート番号を使用する必要がある。NmapはDNS要求の処理にシステムのライブラリを用いているので、この--source-portフラグを指定していても、DNS要求には無視されることになる。SYNスキャンを含む大部分のTCPスキャン、およびUDPスキャンは、このオプションに完全に対応している。
-
--data-length <number> (送信パケットにランダムデータを付加する)
通常、Nmapはヘッダのみを含む最小限のパケットを送信する。従って、TCPパケットは通常40バイト、ICMPエコー要求パケットは28バイト程度の大きさしかない。このオプションは、Nmapが送信するほとんどのパケットに、指定したバイト数のランダムデータを付加するようにする。OS検出(-O)パケットにはデータは付加されないが、ほとんどのping およびポートスキャンのパケットには付加される。これにより、処理速度は低下するが、スキャンを幾分でも目立たなくすることができる。
-
--ttl <value> (IPのTTLフィールド値を設定する)
送信パケットのIPv4生存時間(TTL:Time-to-Live)フィールドを指定した値に設定する。
-
--randomize-hosts (ターゲットホストの順番を無作為化する)
このオプションは、Nmapがスキャンを実行する前に、各グループあたり最大8096のホストをランダムに並び替えるようにする。これにより、特にスキャン速度を遅く設定するタイミングオプションと併用する場合は、各種ネットワーク監視システムにスキャンが検知される可能性を小さくすることができる。より大規模なグループを無作為化したい場合は、nmap.hのPING_GROUP_SZを増やして再コンパイルする。別の手段としては、リストスキャンでターゲットIPリストを作成し(-sL -n -oN
<filename>)、これをPerlスクリプトで無作為化して、-iLでリストをそのままNmapに渡す。
-
--spoof-mac <mac address, prefix, or vendor
name> (MACアドレスを偽装する)
Nmapが送信するすべての生イーサネット フレームに、指定したMACアドレスを使うようにする。このオプションは、Nmapが実際にイーサネットレベルのパケットを送信するように、--send-ethが必要条件になる。MACアドレスは、さまざまな形式で指定できる。文字列の“0”だけが指定された場合は、NmapはセッションのMACアドレスを完全に無作為に選ぶ。指定した文字列が偶数の16進数(一組ずつ状況に応じてコロンで区切る)の場合は、NmapはこれをMACアドレスとして使用する。12桁未満の16進数が指定された場合は、Nmapは残りの6バイトにランダムな値を補充する。引数が0や16進文字列ではない場合は、Nmapはnmap-mac-prefixes を調べて、指定した文字列を含むベンダ名を見つける(大文字と小文字は区別されない)。一致するものがあった場合、そのベンダのOUI(Organizationally Unique Identifier:3バイトのベンダコード)を使用し、残りの3バイトにはランダムに記入する。有効な--spoof-mac引数は、Apple、0、01:02:03:04:05:06、deadbeefcafe、0020F2、Ciscoなどになる。