Provided by: nmap_7.94+git20230807.3be01efb1+dfsg-3build2_amd64 

名前
nmap - ネットワーク調査ツールおよびセキュリティ/ポート スキャナ
概要
nmap [スキャンタイプ...] [オプション] {ターゲットの指定}
ツール説明
Nmap (「Network Mapper」)は、ネットワーク調査およびセキュリティ監査を行うためのオープンソースのツールであ る。大規模ネットワークを高速でスキャンするように設計されているが、単一のホストに対してもまったく問題なく 機能する。Nmapは生の(raw)IPパケットを用いて、ネットワーク上でどのようなホストか利用可能になっているか、こ れらのホストが提供しているサービス(アプリケーション名とバージョン)は何か、ホストが実行しているOS(OS名と バージョン)は何か、どのような種類のパケットフィルタ/ファイアウォールが使用されているかなど、その他数多く の特徴を斬新な方法で判別する。Nmapは、セキュリティ監査用に広く利用されているばかりでなく、ネットワーク・ インベントリ(資産情報収集)、サービスのアップグレード予定管理、ホストやサービスのアップタイム(利用可能時 間)の監視等の日常業務にNmapを役立てているシステム管理者やネットワーク管理者も多い。 Nmapは、スキャン調査対象の一覧を、使用したオプションに応じた補足情報とともに出力する。このなかで最も重要 な情報は、「interesting ports table」(興味深いポートの一覧表)である。この一覧表には、ポート番号、プロトコ ル、サービス名、状態が記載されている。状態は、open、filtered、closed、またはunfilteredのいずれかにな る。open(開いた)ポートは、調査対象マシン上のアプリケーションがそのポート上で接続/パケットを待ち受けている 状態であることを示す。 Filtered(フィルタあり)は、ファイアウォールやフィルタなどのネットワーク上の障壁で ポートが遮られている状態にあり、ポートが開いているか閉じているかをNmapが判断できないことを意味す る。Closed(閉じた)ポートには、待ち受け状態のアプリケーションは何もないが、これらはいつでも開放することが 可能である。ポートがNmapのプローブには応答するが、開いているか閉じているかをNmapが判別できない場合には unfilteredに分類される。ポートの状態がopen|filteredやclosed|filteredのように、2つの状態の組み合わせで報告 されるのは、そのどちらがポートの状態を表しているかをNmapが判断できない場合である。またこのポート一覧表に は、バージョンの検出が求められた場合には、ソフトウェアのバージョン情報も記載される。IPプロトコルスキャ ン(-sO)が要求された場合には、ポートを一覧表示するのではなく、対応可能なIPプロトコルに関する情報が提供され る。 Nmapは、このポート一覧表以外にも、逆引きDNS名、OSの推測、デバイスの種類、MACアドレスなどの、調査対象に関 するさらに詳細な情報を提供できる。 典型的なNmapスキャンの例を、以下の 例1「Nmapスキャンの典型的な例」に示した。この例で使用されているNmapの 引数は、OSとそのバージョンの検出を可能にする-Aと、処理を高速に実行するための-T4、および2つのターゲットホ スト名だけである。 例1 Nmapスキャンの典型的な例 # nmap -A -T4 scanme.nmap.org Nmap scan report for scanme.nmap.org (74.207.244.221) Host is up (0.029s latency). rDNS record for 74.207.244.221: li86-221.members.linode.com Not shown: 995 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.3p1 Debian 3ubuntu7 (protocol 2.0) | ssh-hostkey: 1024 8d:60:f1:7c:ca:b7:3d:0a:d6:67:54:9d:69:d9:b9:dd (DSA) |_2048 79:f8:09:ac:d4:e2:32:42:10:49:d3:bd:20:82:85:ec (RSA) 80/tcp open http Apache httpd 2.2.14 ((Ubuntu)) |_http-title: Go ahead and ScanMe! 646/tcp filtered ldp 1720/tcp filtered H.323/Q.931 9929/tcp open nping-echo Nping echo Device type: general purpose Running: Linux 2.6.X OS CPE: cpe:/o:linux:linux_kernel:2.6.39 OS details: Linux 2.6.39 Network Distance: 11 hops Service Info: OS: Linux; CPE: cpe:/o:linux:kernel TRACEROUTE (using port 53/tcp) HOP RTT ADDRESS [Cut first 10 hops for brevity] 11 17.65 ms li86-221.members.linode.com (74.207.244.221) Nmap done: 1 IP address (1 host up) scanned in 14.40 seconds Nmapの最新バージョンは、https://nmap.orgから入手できる。また、本マニュアルページの最新版は、‐ https://nmap.org/book/man.htmlで参照できる。
オプション概要
このオプション概要は、Nmapを引数なしで実行すると表示される。最新版は‐ https://nmap.org/data/nmap.usage.txtで参照できる。これを見ると、比較的利用機会の多いオプションについての 概要を確認できるが、本マニュアルの以下に掲載する詳細な解説に代わるものではない。使用頻度の低いオプション には、ここに含まれていないものもある。 Nmap 7.94 ( https://nmap.org ) Usage: nmap [Scan Type(s)] [Options] {target specification} TARGET SPECIFICATION: Can pass hostnames, IP addresses, networks, etc. Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254 -iL <inputfilename>: Input from list of hosts/networks -iR <num hosts>: Choose random targets --exclude <host1[,host2][,host3],...>: Exclude hosts/networks --excludefile <exclude_file>: Exclude list from file HOST DISCOVERY: -sL: List Scan - simply list targets to scan -sn: Ping Scan - disable port scan -Pn: Treat all hosts as online -- skip host discovery -PS/PA/PU/PY[portlist]: TCP SYN/ACK, UDP or SCTP discovery to given ports -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes -PO[protocol list]: IP Protocol Ping -n/-R: Never do DNS resolution/Always resolve [default: sometimes] --dns-servers <serv1[,serv2],...>: Specify custom DNS servers --system-dns: Use OS's DNS resolver --traceroute: Trace hop path to each host SCAN TECHNIQUES: -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans -sU: UDP Scan -sN/sF/sX: TCP Null, FIN, and Xmas scans --scanflags <flags>: Customize TCP scan flags -sI <zombie host[:probeport]>: Idle scan -sY/sZ: SCTP INIT/COOKIE-ECHO scans -sO: IP protocol scan -b <FTP relay host>: FTP bounce scan PORT SPECIFICATION AND SCAN ORDER: -p <port ranges>: Only scan specified ports Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080,S:9 --exclude-ports <port ranges>: Exclude the specified ports from scanning -F: Fast mode - Scan fewer ports than the default scan -r: Scan ports sequentially - don't randomize --top-ports <number>: Scan <number> most common ports --port-ratio <ratio>: Scan ports more common than <ratio> SERVICE/VERSION DETECTION: -sV: Probe open ports to determine service/version info --version-intensity <level>: Set from 0 (light) to 9 (try all probes) --version-light: Limit to most likely probes (intensity 2) --version-all: Try every single probe (intensity 9) --version-trace: Show detailed version scan activity (for debugging) SCRIPT SCAN: -sC: equivalent to --script=default --script=<Lua scripts>: <Lua scripts> is a comma separated list of directories, script-files or script-categories --script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts --script-args-file=filename: provide NSE script args in a file --script-trace: Show all data sent and received --script-updatedb: Update the script database. --script-help=<Lua scripts>: Show help about scripts. <Lua scripts> is a comma-separated list of script-files or script-categories. OS DETECTION: -O: Enable OS detection --osscan-limit: Limit OS detection to promising targets --osscan-guess: Guess OS more aggressively TIMING AND PERFORMANCE: Options which take <time> are in seconds, or append 'ms' (milliseconds), 's' (seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m). -T<0-5>: Set timing template (higher is faster) --min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes --min-parallelism/max-parallelism <numprobes>: Probe parallelization --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies probe round trip time. --max-retries <tries>: Caps number of port scan probe retransmissions. --host-timeout <time>: Give up on target after this long --scan-delay/--max-scan-delay <time>: Adjust delay between probes --min-rate <number>: Send packets no slower than <number> per second --max-rate <number>: Send packets no faster than <number> per second FIREWALL/IDS EVASION AND SPOOFING: -f; --mtu <val>: fragment packets (optionally w/given MTU) -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys -S <IP_Address>: Spoof source address -e <iface>: Use specified interface -g/--source-port <portnum>: Use given port number --proxies <url1,[url2],...>: Relay connections through HTTP/SOCKS4 proxies --data <hex string>: Append a custom payload to sent packets --data-string <string>: Append a custom ASCII string to sent packets --data-length <num>: Append random data to sent packets --ip-options <options>: Send packets with specified ip options --ttl <val>: Set IP time-to-live field --spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address --badsum: Send packets with a bogus TCP/UDP/SCTP checksum OUTPUT: -oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3, and Grepable format, respectively, to the given filename. -oA <basename>: Output in the three major formats at once -v: Increase verbosity level (use -vv or more for greater effect) -d: Increase debugging level (use -dd or more for greater effect) --reason: Display the reason a port is in a particular state --open: Only show open (or possibly open) ports --packet-trace: Show all packets sent and received --iflist: Print host interfaces and routes (for debugging) --append-output: Append to rather than clobber specified output files --resume <filename>: Resume an aborted scan --noninteractive: Disable runtime interactions via keyboard --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML --webxml: Reference stylesheet from Nmap.Org for more portable XML --no-stylesheet: Prevent associating of XSL stylesheet w/XML output MISC: -6: Enable IPv6 scanning -A: Enable OS detection, version detection, script scanning, and traceroute --datadir <dirname>: Specify custom Nmap data file location --send-eth/--send-ip: Send using raw ethernet frames or IP packets --privileged: Assume that the user is fully privileged --unprivileged: Assume the user lacks raw socket privileges -V: Print version number -h: Print this help summary page. EXAMPLES: nmap -v -A scanme.nmap.org nmap -v -sn 192.168.0.0/16 10.0.0.0/8 nmap -v -iR 10000 -Pn -p 80 SEE THE MAN PAGE (https://nmap.org/book/man.html) FOR MORE OPTIONS AND EXAMPLES
ターゲットの指定
Nmapのコマンドラインで、オプション(もしくはオプションの引数)でないものはすべて、ターゲットホストの指定と して扱われる。最も簡単な例は、スキャンを行うターゲットのIPアドレスやホスト名の指定である。 隣接した複数のホストから成るネットワーク全体をスキャン対象としたい場合は、CIDR表記のアドレス指定を利用で きる。IPアドレスやホスト名の末尾にbit数を付加すると、Nmapは、アドレスの上位から指定したbit数までが参照す るIPアドレスや特定のホスト名と同じアドレスをすべてスキャンする。例えば、192.168.10.0/24を指定すると 192.168.10.0 (2進表示: 11000000 10101000 00001010 00000000)から192.168.10.255 (2進表示: 11000000 10101000 00001010 11111111)までの256のホストがスキャンされる。192.168.10.40/24を指定しても、まったく同 じ結果になる。ホスト scanme.nmap.orgのIPアドレスが205.217.153.62であるとすると、scanme.nmap.org/16という 指定では、205.217.0.0 から 205.217.255.255 までの65,536個のIPアドレスをスキャンすることになる。指定可能な 最小値は/1であり、これはインターネットの半分をスキャンすることになる。最大値は/32で、すべてのアドレスビッ トが固定されるので、指定したホストやIPアドレスだけがスキャンされる。 CIDR表記は簡潔であるが、必ずしも十分な柔軟性があるわけではない。例えば、192.168.0.0/16をスキャンする際 に、.0や.255で終わるアドレスは、通常はブロードキャストアドレスなのですべて対象から除外したい場合があるだ ろう。Nmapではこのケースには、オクテット(octet=8bit)範囲のアドレス指定によって対応する。通常のIPアドレス を指定する代わりに、コンマ区切りの数のリストや各オクテット(8bit)の範囲を指定できる。例え ば、192.168.0-255.1-254と指定すると、.0と.255で終わる範囲のアドレスはすべて省かれる。この範囲は最後のオク テットだけに限る必要はない。すなわち、0-255.0-255.13.37と指定すると、13.37で終わるすべてのIPアドレスをイ ンターネット全体でスキャンする。このような広範囲からのサンプリングは、インターネットの調査や研究を行う場 合に役立つ。 IPv6アドレスは、完全修飾形(省略なし)のIPv6アドレスやホスト名でしか指定できない。IPv6では、CIDRやオクテッ ト範囲は使い道がほとんどないため、サポートされない。 Nmapはコマンドラインでの複数のホスト指定方法に対応しており、すべて同じ形式にしなくてもよい。nmap scanme.nmap.org 192.168.0.0/8 10.0.0,1,3-7.0-255というコマンドを実行しても、期待通りの結果になる。 ターゲットは通常、コマンドライン上で指定されるが、以下のオプションもまた、ターゲットの選択を制御するため に利用できる。 -iL inputfilename (リストから入力) 入力ファイル名から、ターゲットの指定を読み込む。コマンドラインで非常に巨大なホストリストを渡すのは不 適切である場合が多いが、それが望まれるのもよくあるケースである。例えば、スキャンの対象にしたいと考え ている目下の割り当てアドレスの10000個のリストが、DHCPサーバからエクスポートされる可能性もある。あるい は、不正な固定IPアドレスを使用しているホストの位置を示すアドレスを除いたすべてのIPアドレスをスキャン したいと思う場合もあるかもしれない。とにかく、スキャンするべきホストのリストを作成し、そのファイル名 を-iLオプションの引数としてNmapに渡せばよい。入力の形式は、Nmapがコマンドラインで対応しているも の(IPアドレス、ホスト名、CIDR、IPv6、オクテット範囲)なら何でもよいが、各入力は、1つ以上のスペース、タ ブ、改行文字で区切る必要がある。実際のファイルではなくて標準入力から、Nmapにホストを読み込ませたい場 合は、ファイル名としてハイフン(-)を指定するとよい。 -iR num hosts (ターゲットを無作為に選ぶ) インターネット全域に対する調査や研究を行う場合、ターゲットを無作為に選びたい場合もあるだろう。ホスト 数の引数は、IPをいくつ生成するべきかをNmapに伝える。プライベート、マルチキャスト、未割り当てなどのア ドレス範囲のような望ましくないIPは、自動的に飛ばして進むようになっている。引数に0(ゼロ)を指定する と、スキャンが無限に続けられる。ただし、ネットワーク管理者のなかには、自身の管理するネットワークを不 正にスキャンされたことに腹を立ててクレームをつける場合もあることに注意しておこう。このオプション は、自己責任で使用すること! 雨の日の午後、退屈しのぎに拾い見るためのWebサーバを無作為に見つけたい場 合は、nmap -sS -PS80 -iR 0 -p 80というコマンドを試してみるとよい。 --exclude host1[,host2[,...]] (ホスト/ネットワークを除外する) ターゲットのコンマ区切りリストを指定し、それらが指定した全ネットワーク範囲の一部であっても、スキャン 対象から除外されるようにする。引数として渡すリストでは通常のNmap構文が用いられるので、ホスト 名、CIDR表記のネットブロック、オクテット範囲などを含めることもできる。このオプションが役に立つの は、スキャンしたいネットワークに、ポートスキャンによって悪影響が及ぶことがわかっている、触れてはなら ないミッションクリティカルなサーバやシステムや、他人が管理しているサブネットワークが含まれる場合であ る。 --excludefile exclude_file (ファイルからリストを除外する) --excludeオプションとほぼ同じ機能を提供するが、異なる点は、除外されるターゲットが、コマンドラインでは なく、改行文字、スペース、タブなどで区切った除外ファイルで渡されることである。
ホストの発見
ネットワーク偵察ミッションの第一段階に行うべきことの1つは、一連の(非常に広範な場合もある)IP範囲を限定し て、アクティブな状態であるか、関心のあるホストのリストを作成することである。各IPアドレスのポートを1つ1つ スキャンするのは、時間はかかるもののなかなか進まない、通常は無駄な作業である。もちろん、あるホストに興味 を引かれる要因は、スキャンの目的に大きく左右される。ネットワーク管理者なら、特定のサービスを実行している ホストにしか興味を示さないかもしれないし、セキュリティ監査人なら、IPアドレスを持つデバイス1つ1つに関心を 引かれる場合もあるだろう。内部ネットワーク管理者なら、自分が管理するネットワーク上のホストの位置を確認す るためにICMP pingを使えるだけで満足かもしれないし、外部のペネトレーションテストの実施担当者なら、ファイア ウォールの制限をすり抜けようとして、多種多様な調査手法を使う場合もあるだろう。 このように、ホスト発見のニーズは多岐にわたるので、Nmapには、使用する技法をカスタマイズするための幅広い種 類のオプションが備わっている。ホスト探索はpingスキャンと呼ばれることもあるが、一般的なpingツールによる単 純なICMPエコー要求パケットよりもはるかに優れている。ユーザは、リストスキャン(-sL)を用いるか、pingを無効に して(-Pn)、このping段階を完全に省略するか、もしくはネットワークに対してマルチポートのTCP SYN/ACK、UDP、ICMPなどのプローブを任意に組み合わせて行うことができる。これらのプローブの目的は、IPアドレ スが実際にアクティブな状態(ホストやネットワークデバイスによって使用中)であることを示す応答を誘い出すこと である。多くのネットワークでは、いつでもアクティブなIPアドレスは全体のほんのわずかしかない。RFC1918で定め られたプライベートアドレス空間(例:10.0.0.0/8)では特にそうなっている。このネットワークには、1600万個 のIPアドレスがあるが、これが1000台足らずのマシンしかない企業で使われているのを見たことがある。ホスト発見 を実行すると、こうした広大なIPアドレスの海の中から、まばらにIPアドレスを割り振られたマシンを探し出すこと ができる。 ホスト発見のオプションが何も指定されない場合、Nmapはポート80宛てのTCP ACKパケットと、ICMPエコー要求クエ リを各ターゲットマシンに送信する。この例外は、ローカル イーサネット ネットワーク上にあるターゲットに対し て、ARPスキャンが用いられている場合である。高い権限のないUNIXシェルユーザでは、connect()システムコールを 使って、ACKの代わりにSYNパケットが送られる。これらのデフォルトは、-PA -PE オプションに相当する。このホス ト発見機能は、ローカルネットワークをスキャンする場合は十分だが、より包括的な一連の発見調査は、セキュリ ティ監査に任せた方がよい。 -P*オプション(pingの種類を選ぶ)を組み合わせることもできる。様々なTCPポート/フラグやICMPコードを用いた多種 多様なプローブを送ることで、制限の厳しいファイアウォールをすり抜ける確率を上げることができる。さらに留意 すべき点は、ローカル イーサネット ネットワーク上のターゲットに対しては、その他の-P*オプションを指定してい る場合でも、ARP探索(-PR)がデフォルトで行われることである。これはほとんどの場合、他よりも高速で効果的に実 施できるからである。 ホスト発見を制御するオプションを以下に挙げる。 -sL (リストスキャン) ホスト発見の縮小版で、単に指定されたネットワークの全ホストを一覧するだけであり、ターゲットホストには 何もパケットを送らない。デフォルトでは、Nmapはホスト名を知るために、ホスト上でDNSの逆引き解決も行 う。単なるホスト名とはいえ、意外なほど有用な情報をもたらしてくれることも多い。例え ばfw.chi.playboy.comは、プレイボーイ社(Playboy Enterprises)のシカゴ(Chicago)支社のファイアウォールで ある。また最終的には、IPアドレスの総数についての報告もある。リストスキャンは、自分のターゲットに対し て正しいIPアドレスが得られていることを確認するための有効な健全性検査になる。ターゲットのホストが見覚 えのないドメイン名を示している場合は、間違って別の会社のネットワークをスキャンしてしまわないよう に、さらに詳しく調査するだけの価値はある。 リストスキャンの狙いは、単にターゲットホストのリストを出力するだけなので、ポートスキャン、OS検 出、pingスキャンなどのより高度なレベルの機能を実現するためのオプションは、これと組み合わせることはで きない。これらのハイレベルの機能を実行する際に、pingスキャンを無効にしたい場合は、-Pnオプションの項を 参照のこと。 -sn (Ping スキャン) このオプションを使うと、Nmapはpingスキャン(ホスト発見)のみを実行し、応答した利用可能なホストの一覧を 出力する。それ以上の調査(ポートスキャンやOS検出など)は行わない。リストスキャンよりも一歩立ち入った調 査になるが、同じ目的で使用される場合が多い。ターゲットネットワークの予備調査を、あまり注意を引かずに 軽く実行できる。攻撃者にとっては、IPおよびホスト名を1つ1つリストスキャンして得られるリストよりも、ア クティブなホストがいくつあるかを知ることのほうが価値がある。 またこのオプションは、システム管理者の役に立つ場合も多く、ネットワーク上の利用可能なマシンの数を数え たり、サーバの可用性を監視したりするために容易に利用できる。pingスウィープと呼ばれることも多く、ブ ロードキャストのクエリには応答しないホストが多いために、ブロードキャストアドレスにpingを打つよりも信 頼性が高い。 -snオプションはデフォルトで、ICMPエコー要求と80番ポート宛てのTCPパケットを送信する。高い権限がない ユーザが実行する場合は、SYNパケットが(connect()コールを使って)ターゲットの80番ポートに送られる。高い 権限を持つユーザが、ローカル イーサネット ネットワーク上のターゲットのスキャンを試みる場合 は、--send-ipが指定されていない限り、ARP要求(-PR)が用いられる。-snオプションを、発見プローブタイ プ(-Pnを除く-P*タイプ)のオプションと組み合わせると、さらに柔軟に対応できる。このプローブタイプのどれ かとポート番号のオプションを使うと、デフォルトのプローブ(ACKやエコー要求)よりも優先される。Nmapを実行 している発信元ホストとターゲットネットワークの間に、制限の厳しいファイアウォールが設置してある場合 は、これらの高度なテクニックを用いるべきである。さもないと、ファイアウォールでプローブパケットやホス トの応答パケットが破棄された場合に、ホストを検出し損ねる可能性がある。 -Pn (ping なし) このオプションを指定すると、Nmapが実行するホスト発見の段階が完全に省略される。Nmapは通常この検出段階 で、さらに立ち入ったスキャンを行うためのアクティブなマシンを割り出す。Nmapはデフォルトでは、ポートス キャン、バージョン検出、OS検出などの立ち入ったプローブは、作動していることが判明したホストに対してし か実行しないようになっている。-Pnを使ってホスト発見を無効にすると、Nmapはターゲットに指定されたIPアド レスすべてに対して、要求されたスキャン機能を実行しようとする。つまり、クラスBのサイズのアドレス空 間(/16)を、コマンドラインでターゲットに指定した場合、65,536個のIPアドレスすべてがスキャンされ る。-Pnの2番目の文字は数字のゼロであり、英字のオーではない。リストスキャンの場合と同様に、本来行うべ きホスト発見の段階は省略されるが、Nmapはそこで停止してターゲットのリストを出力するのではなくて、各 ターゲットIPがアクティブであるかのように、要求された機能を実行し続ける。 -PS portlist (TCP SYN Ping) このオプションによって、SYNフラグ付きの空のTCPパケットが送信される。デフォルトの送信先ポートは80番(こ の設定は、nmap.hのDEFAULT_TCP_PROBE_PORTを書き換えてコンパイルすると変更できる)だが、代わりのポートを パラメタとして指定できる。また、コンマ区切りのポート番号リスト(例:-PS22,23,25,80,113,1050,35000)を指 定することも可能である。この場合、各ポートに対するプローブは同時並行で試みられる。 SYNフラグによって、こちら側がコネクションの確立を試みていることをリモートのシステムに知らせる。通常は 送信先ポートが閉じており、RST(リセット)パケットが送り返される。このポートがたまたま開いていた場合 は、ターゲットはSYN/ACK TCPパケットで応答し、TCPの3ウェイハンドシェイクの第二段階に進む。続い て、Nmapを実行しているマシンが、ACKパケットを送って3ウェイハンドシェイクを完了すれば、完全なコネク ションが確立されるが、その代わりにRSTで応答することで、生成途中のコネクションを切断する。このRSTパ ケットは、Nmap自身ではなくて、Nmapを実行しているマシンのカーネルが、予期せぬSYN/ACKに応答して送るもの である。 Nmapでは、対象のポートが開いているか閉じているかは問題にしない。対象のホストがアクセス可能で、反応が あることをNmapに告げるのは、上で述べたRSTかSYN/ACKの応答である。 UNIXマシンでは通常、生のTCPパケットを送受信できるのはroot権限を持つユーザに限られる。こうした権限のな いユーザの場合は、次善策が自動的に採用され、各ターゲットポートに対してconnect()システムコールが起動さ れる。これにより、SYNパケットをターゲットホストに送信し、コネクションの確立を試みる。connect()の戻り 値としてすみやかに成功か失敗(ECONNREFUSED)が得られた場合、下位のTCPスタックではSYN/ACKかRSTパケットを 受信したことになり、ターゲットホストはアクセス可能と見なされる。このコネクションの試みが未確立のまま でタイムアウトに達した場合は、ホストはダウンしていると見なされる。Nmapは生のIPv6パケットの生成にはま だ対応していないので、この次善策はIPv6による接続にも用いられる。 -PA portlist (TCP ACK Ping) TCP ACK pingは、すぐ上で述べたSYN pingのケースに酷似している。異なる点は、想像される通り、SYNフラグの 代わりにTCP ACKフラグが付けられることである。こうしたACKパケットは、確立されたTCPコネクション上のデー タを承認していると称しているが、そのようなコネクションは存在しないのである。そのため、リモートホスト は常にRSTパケットで応答しなければならなくなり、この過程で自らの存在を明らかにすることになる。 -PAオプションは、SYNプローブと同じデフォルトポート(80)を使用し、同じ形式の目的ポートリストを得ること ができる。権限のないユーザがこれを試みる場合や、IPv6ターゲットが指定された場合は、上で述べ たconnect()の次善策が用いられる。ただし実際には、connect()はACKではなくてSYNパケットを送るので、この 次善策は完全とは言えない。 SYNおよびACKの両方の pingが使えるようになっている理由は、ファイアウォールをすり抜ける可能性を最大限高 くするためである。多くの管理者は、内向きのSYNパケットに関しては、企業のWebサイトやメールサーバなどの 共用サービス宛てのもの以外はすべてブロックするように、ルータや簡易ファイアウォールを設定している。こ れにより、組織へのその他の内向きコネクションは阻止されるものの、ユーザが利用するインターネットへの外 向きコネクションは、何にも妨げられずに許可されている。このようなステートフル(処理状態を把握して動的に 対処する)でないアプローチは、ファイアウォール/ルータ上でリソースをほとんど消費せず、ハードウェアおよ びソフトウェアフィルタで広くサポートされている。Linux用ファイアウォールソフトウェア 「Netfilter/iptables」には、こうしたステートレスなアプローチを実装するための「--syn」という便利なオプ ションが用意されている。このようなステートレスなファイアウォールルールが設定されている場合、SYN pingプローブ(-PS)を閉じたターゲットポートに送ってもブロックされる可能性が高い。そうした場合は、ACKプ ローブが効力を発揮し、このルールを突破する。 またよく使われるファイアウォールで、別の種類のものには、想定外のパケットは破棄するというステートフル ルールが採用されている。当初こうした機能はハイエンドのファイアウォールでしか見られなかったが、ここ数 年の間に一般に広く普及してきている。LinuxのNetfilter/iptablesシステムは、--stateオプションでこの機能 をサポートしており、コネクションの状態に応じてパケットを分類する。このようなシステムでは、想定外 のACKパケットは通常、偽物と認識されて破棄されるので、SYNプローブのほうが有効である可能性が高い。この 難題に対する解決策の1つは、-PS および -PAを指定して、SYN および ACKの両方のプローブを送ることである。 -PU portlist (UDP Ping) これもホスト発見用オプションで、空の(--data-lengthが指定されている場合を除き)UDPパケットを特定のポー トに送信する。ポートリストは、上で述べた-PS や -PAのオプションの場合と同じ形式にする。特にポートが指 定されていない場合、デフォルトでは31338番になる。このデフォルト値を設定するに は、nmap.hのDEFAULT_UDP_PROBE_PORTを書き換えてコンパイルする。ほとんど使われることがないポートがデ フォルトで使用されている理由は、開放ポートへの送信が、このスキャンタイプでは特に望ましくない場合が多 いからである。 UDPプローブがターゲットマシンで閉じたポートに行き着いた場合は、ICMPポート到達不能パケットが返送される はずである。Nmapはこれにより、ターゲットマシンが稼動中でアクセス可能であることを知ることにな る。ICMPにはこの他にも、ホスト/ネットワーク到達不能やTTL超過などの、ホストがダウンしているか到達不能 であることを示す多様なエラーメッセージがある。応答がないのも、これと同様に解釈される。空のパケットが 開放ポートに到達した場合、ほとんどのサービスはこれを無視して、何の応答も返さない。デフォルトのプロー ブポートが、ほぼ使用中ではない31338番になっているのは、このためである。「chargen」などのサービスに は、空のUDPパケットに応答するものがいくつかあり、マシンが利用可能であることをNmapに知らせることにな る。 この種類のスキャンの主なメリットは、TCPしかふるいに掛けないファイアウォールやフィルタをすり抜けること である。例えば、筆者が以前持っていたLinksys社の無線ブロードバンドルータ、BEFW11S4の外部インターフェー スは、デフォルトですべてのTCPポートにフィルタ処理するようになっていたが、UDPプローブを使うと、ポート 到達不能メッセージを引き出し、デバイスの正体を明らかにすることができた。 -PE; -PP; -PM (ICMP Ping タイプ) Nmapは、上で述べたようなTCP や UDPによるホスト発見の特異なタイプに加えて、どこにでもあるpingプログラ ムによって送信される標準的なパケットを送ることもできる。Nmapは、ICMPタイプ8(エコー要求)パケットをター ゲットのIPアドレスに送信し、利用可能なホストからタイプ0(エコー応答)が返されるのを待ち受ける。ネット ワーク調査を行う者にとっては残念なことに、最近のホストやファイアウォールは、RFC1122[1]の要件通り応答 を返すよりは、これらのパケットをブロックするものが多い。そのため、インターネット上の未知のターゲット に対しては、ICMPスキャンだけでは十分な信頼性が得られない。だが、内部ネットワークを監視しているシステ ム管理者にとっては、実用的で効率的なアプローチになる場合もある。このエコー要求動作を有効にするに は、-PEオプションを使用すること。 エコー要求は標準的なICMP pingクエリであるが、Nmapはそれだけにとどまらない。ICMP規格(RFC792[2])に は、タイムスタンプ要求、情報要求、アドレスマスク要求などのパケットが、それぞれコード13、15、17として 指定されている。これらのクエリの表向きの目的は、アドレスマスクや現在の時刻などの情報を知ることだ が、ホスト発見にも容易に利用できる。応答を返すシステムはすなわち、稼動中で利用可能なのである。情報要 求パケットは、それほど広くサポートされているわけではないので、今のところNmapには実装されていない。RFC 1122では「ホストにはこの種のメッセージを実装するべきではありません」と提唱されている。タイムスタンプ とアドレスマスクに関するクエリは、それぞれ-PPと-PMのオプションを付けることで送信できる。タイムスタン プ応答(ICMP コード14)やアドレスマスク応答(コード18)によって、ホストが利用可能であることが明らかにな る。これら2つのクエリは、管理者がエコー要求パケットを限定してブロックしているが、他のICMPクエリが同じ 目的で用いられる可能性があることを見落としている場合に有効である。 -PR (ARP Ping) Nmapの最も一般的な使用法の1つは、イーサネットLANのスキャンである。たいていのLAN、特にRFC1918提唱のプ ライベートアドレス範囲が用いられているLANでは、IPアドレスの大部分は常に未使用のままになってい る。NmapがICMPエコー要求のような生のIPパケットを送信する場合、OSはイーサネットフレームのアドレスを正 しく指定できるように、ターゲットIPに対応する送信先ハードウェア(ARP)のアドレスを決める必要がある。だが この処理は遅く、不確実である場合が多い。なぜなら、OSは、利用できないホストに対して何百万という数 のARP要求を短時間で行わなければならないことを想定して作られているわけではないからである。 NmapのARPスキャンでは、ARP要求の処理を行うのに、そのために最適化したアルゴリズムを用いている。応答が 返された場合、Nmapはすでにそのホストが稼動中であることがわかるので、IPベースのpingパケット処理の心配 はしなくてよくなる。これにより、ARPスキャンはIPベースのスキャンよりもずっと高速で信頼性の高い処理を行 うことができる。そのため、Nmapがローカル イーサネット ネットワーク上で検出したイーサネット ホストをス キャンする場合は、デフォルトでARPスキャンが行われるようになっている。別のpingタイプ(-PEや-PSなど)が指 定されている場合でも、同一のLAN上にあるターゲットに対しては、Nmapはそれらの代わりにARPを用いる。あく までもARPスキャンを行いたくない場合は、--send-ipを指定すること。 -n (DNS解決を行わない) Nmapが発見したアクティブなIPアドレスに対して逆引きのDNS解決を行わないように指定する。DNSは処理が遅い ことが多いので、これによって進行を速めることができる。 -R (全ターゲットにDNS解決を行う) ターゲットのIPアドレスに対して常に逆引きDNS解決を常に行うように指定する。この指定は通常、対象のマシン が稼動していることが判明している場合にのみ行われる。 --system-dns (システムのDNSリゾルバを使う) Nmapはデフォルトでは、ホスト上に構成されたネームサーバに直接クエリを送り、応答を待ち受けること で、IPアドレスを解決する。パフォーマンスを上げるために、数多くの要求(数十件に及ぶことも多い)が並行処 理される。代わりに自分のシステムのリゾルバを使いたい(getnameinfo()コールを介して1回に1個のIPを処理す る)場合は、このオプションを指定すること。だがこれは低速でほとんど使い物にならない。ただ し、NmapのDNSコードにバグがある場合はこの限りではない--その場合は連絡していただきたい。IPv6スキャン では常に、システムのリゾルバが使われる。
ポートスキャンの基本
Nmapはここ数年で、機能面でいろいろと拡充されてきたが、もとは効率的なポートスキャナとして開発されたもので あり、ポートスキャンは今でもNmapの中核を成す機能である。nmap targetというシンプルなコマンドで、ターゲット ホスト上の1660個あまりのTCPポートをスキャンできる。多くのポートスキャナでは従来、すべてのポートは一括し てopen」(開いている)かclosed(閉じている)のどちらかの状態にあるものとして扱われてきたが、Nmapではさらにき め細かく取り扱われる。すなわち、ポートは以下の6つの状態に分類され る: open、closed、filtered、unfiltered、open|filtered、またはclosed|filtered。 これらの状態は、ポート自体に固有の特性ではなくて、Nmapがポートをどのように認識しているかを表している。例 えば、Nmapがターゲットと同じネットワークからスキャンを行うと、135番/tcpポートはopen状態にあるように見える が、同時刻に同じオプションでこのスキャンをインターネット上から行った場合、同ポートはfilteredと見えるだろ う。 Nmapに認識されるポートの6つの状態 open このポートでは、アプリケーションがTCPコネクションやUDPパケットをアクティブに受け入れている。多くの場 合、ポートスキャンの第一の目的は、この種のポートを見つけることである。セキュリティを重視する人な ら、openポートが攻撃者の通り道になることをご存知だろう。攻撃者やペンテスト実施者は、このopenポートの 弱点を突こうとする一方で、管理者は正規ユーザの利用を妨げることなく、これらのポートをファイアウォール で閉じたり防御したりしようとする。また、Openポートを見ると、ネットワーク上で利用可能なサービスが何か わかるので、セキュリティスキャン以外でも興味を引かれるポートである。 closed closed(閉じた)ポートは、アクセス可能(Nmapのプローブパケットを受信したり応答したりする)だが、そこで受 信待機しているアプリケーションはない。この種のポートは、あるIPアドレスでホストが稼動中であることを確 認する場合(ホスト発見やpingスキャン)や、OS検出の一環として役に立つ場合もある。closedポートは到達可能 なので、後にその一部が開放された場合は、スキャンの対象になる可能性がある。管理者がこの種のポートも ファイアウォールでブロックすることを検討する場合もあるだろう。そうなると、これらは次で述べ るfiltered(フィルタあり)状態として見えるようになる。 filtered Nmapは、このポートが開いているかどうかを判別できない。なぜなら、パケットフィルタのせいで、プローブが ポートまで到達できないからである。このフィルタ処理は、ファイアウォール専用機器、ルータのルール、ホス トベースのファイアウォールソフトなどで実行できる。これらのポートからは情報がほとんど得られないの で、攻撃者の企てを阻むことになる。場合によっては、タイプ3コード13(destination unreachable(宛先到達不 能):通信が管理上の理由で禁止されている)などのICMPエラーメッセージを返すこともあるが、応答しないでプ ローブを破棄するだけのフィルタのほうがはるかに多く使われるようになっている。この場合、Nmapは、プロー ブが破棄されたのはフィルタリングではなくてネットワークの混雑のせいと見なして、再試行を数回行わざるを 得なくなるので、スキャンの進行速度が格段に落ちる。 unfiltered unfiltered状態とは、ポートにはアクセス可能だが、そのポートが開いているか閉じているかをNmapでは判別で きないことを意味する。ポートをこの状態に分類できるのは、ファイアウォールルールを解読するのに使われ るACKスキャンだけである。unfilteredポートのスキャンをその他のスキャンタイプ、例えばWindowスキャ ン、SYNスキャン、FINスキャンなどで行うと、ポートが開いているかどうかを決めるのに役立つ場合もある。 open|filtered Nmapがポートをこの状態に分類するのは、対象のポートが開いているかフィルタ処理されているかを判別できな い場合である。openポートからの応答がないタイプのスキャンには、こうしたケースが発生する。また、応答が ないことは、プローブやそれが引き出した応答をパケットフィルタが破棄したことを意味する場合もある。その ためNmapは、対象のポートがopenなのかfilteredなのかを確実に見分けることができない。UDP、IP プロトコ ル、FIN、Null、Xmasなどのスキャンは、ポートをこの状態に分類する。 closed|filtered この状態は、ポートが閉じているかフィルタ処理されているかを、Nmapが判断できない場合に用いられる。IPID Idleスキャンにのみ使用される。
ポートスキャンのテクニック
自動車修理に関して全くの初心者である筆者が修理を行う場合、原始的な工具(ハンマー、ダクトテープ、レンチな ど)を次々と取り出し、目の前の作業を行うのに適した工具を探してあれでもないこれでもないと何時間も悪戦苦闘す る様が想像できる。結局うまく行かず、ポンコツ車を本物の修理工のところまで引っ張っていくと、彼はいつも巨大 な工具箱をごそごそ漁って、最適な小道具を引っ張り出し、いとも簡単に作業を終わらせてしまう。ポートスキャン の技術も、これに似ている。専門家は数多くのスキャンテクニックを熟知しており、与えられた作業を行うのに最適 のテクニック(あるいは組み合わせ)を選択する。一方、経験の乏しいユーザやスクリプトキディたちは、あらゆる問 題をデフォルトのSYNスキャンだけで解決しようとする。Nmapは無料なので、ポートスキャン技術に精通するか否かの 分かれ目は、知識だけなのだ。その点については、自動車業界よりましなのは間違いない。なにしろ自動車業界で は、ストラット スプリングコンプレッサーが必要と判断するには卓越したスキルが必要であるばかりか、それを手に 入れるために数千ドルを支払わなければならないからだ。 ほとんどのスキャンタイプを利用できるのは、高い権限を持つユーザに限られる。こうしたスキャンでは生パケット が送受信されるが、これを行うのにUNIXシステムではrootアクセス権が必要だからである。Windowsでは管理者アカウ ントの使用が推奨されるが、このプラットフォームでは、WinPcapがすでにOSにロードされている場合には、Nmapが高 い権限を持たないユーザにも役に立つ場合がある。Nmapがリリースされた1997年当時は、共用のシェルアカウントし か使えないユーザが多かったので、root権限が必要という条件は重大な制約になった。だが今や、世の中は変わっ た。コンピュータはますます安くなり、常時接続のインターネットアクセスを利用するユーザは激増し、デスクトッ プのUNIXシステム(Linux や MAC OS Xなど)も広く普及している。WindowsバージョンのNmapも利用可能になり、さら に多くのデスクトップでNmapを実行できるようになっている。これらの理由により、ユーザが制限のある共用シェル アカウントからNmapを実行する必要性が少なくなってきている。これは好都合なことである。高い権限を必要とする オプションを利用できれば、Nmapははるかに大きな効果と柔軟性を発揮するからだ。ほとんどのスキャンタイプを利 用できるのは、高い権限を持つユーザに限られる。こうしたスキャンでは生パケットが送受信されるが、これを行う のにUNIXシステムではrootアクセス権が必要だからである。Windowsでは管理者アカウントの使用が推奨されるが、こ のプラットフォームでは、WinPcapがすでにOSにロードされている場合には、Nmapが高い権限を持たないユーザにも役 に立つ場合がある。Nmapがリリースされた1997年当時は、共用のシェルアカウントしか使えないユーザが多かったの で、root権限が必要という条件は重大な制約になった。だが今や、世の中は変わった。コンピュータはますます安く なり、常時接続のインターネットアクセスを利用するユーザは激増し、デスクトップのUNIXシステム(Linux や MAC OS Xなど)も広く普及している。WindowsバージョンのNmapも利用可能になり、さらに多くのデスクトップでNmapを実 行できるようになっている。これらの理由により、ユーザが制限のある共用シェルアカウントからNmapを実行する必 要性が少なくなってきている。これは好都合なことである。高い権限を必要とするオプションを利用できれ ば、Nmapははるかに大きな効果と柔軟性を発揮するからだ。 Nmapは正確な結果を出そうと試みるが、その洞察はすべて、ターゲットマシン(もしくは前面のファイアウォール)か ら送り返されるパケットに基づいて得られたものであるという点に留意する必要がある。RFCに準拠していないホスト がますます広く使われるようになっているが、これらのホストからは、Nmapのプローブに対して、当然想定される応 答は返ってこない。FIN、Null、Xmasスキャンなどは特に、この問題の影響を受けやすい。これらは特定のスキャンタ イプに固有の問題なので、個々のスキャンタイプの項で述べることにする。 本節では、Nmapがサポートする10個あまりのスキャンテクニックについて述べる。この手法は一度に1つしか使えない が、UDPスキャン(-sU)だけは例外で、TCPスキャンタイプのいずれか1つと組み合わせて用いることができる。ポート スキャンタイプのオプションは、覚えやすいように-sCの形式になっている。ここでCは、スキャン名のなかの目立つ 文字で、通常は頭文字になる。この規則の例外の1つは、廃止予定のFTPバウンススキャン(-b)である。デフォルトで は、NmapはSYNスキャンを実行するが、ユーザが生パケットを送信するための然るべき権限(UNIX上ではrootアクセス 権が必要)を持っていない場合や、IPv6のターゲットが指定された場合は、代わりにConnect()スキャンが用いられ る。ここで一覧したスキャンのなかで、高い権限を持たないユーザが実行できるのは、connect()スキャンと ftpバウ ンススキャンだけである。 -sS (TCP SYN スキャン) SYNスキャンはデフォルトであり、正当な理由で最もよく使用されるスキャンオプションである。強制的なファイ アウォールによる妨害のない、高速なネットワーク上では、数千ポート毎秒という高速なスキャンを実行でき る。SYNスキャンは、TCPコネクションを確立しないため、比較的秘匿性が高い。ま た、NmapのFin/Null/Xmas、Maimon、Idleスキャンのように特定のプラットフォームの特質に左右されることはな く、規格準拠のTCPスタックなら何に対しても機能する。さらには、open、closed、およびfilteredというポート の状態を明確かつ確実に区別することができる。 この技法は、完全なTCPコネクションを開くわけではないので、 ハーフオープン(half-open)スキャンと呼ばれる ことも多い。あたかも実際にコネクションを開くつもりがあるかのように、SYNパケットを送信し、応答を待 つ。SYN/ACKの応答は、ポートが待ち受け状態(open)であることを示し、またRST(reset)は、待ち受け状態にない ことを示している。数回再送信しても何の応答もない場合、ポートはfilteredと見なされる。また、ICMP到達不 能エラー(タイプ 3、コード 1、2、3、9、10、13)が送り返された場合も、ポートはfilteredと見なされる。 -sT (TCP connect() スキャン) TCP Connect()スキャンは、SYNスキャンを選択できない場合のデフォルトのTCPスキャンタイプである。ユーザ が生パケットの権限を持たないか、IPv6ネットワークをスキャンする場合がこれにあてはまる。Nmapは、他のほ とんどのスキャンタイプのように生パケットに書き込むのではなく、connect()システムコールを発行して、ター ゲットのマシンやポートにとのコネクションを確立するよう下位OSに要求する。これは、Webブラウザ、P2Pクラ イアント、その他ほとんどのネットワーク対応アプリケーションがコネクションを確立するために使用するのと 同じ高レベルのシステムコールである。これは、「BerkeleyソケットAPI」というプログラミングインターフェー スの一部である。Nmapは、生パケットの応答を回線から読み込むのではなく、このAPIを使って、接続を試みるた びにステータス情報を入手する。 SYNスキャンが利用できる場合は通常、そちらを使用した方がよい。Nmapは生パケットよりも、高レベルのシステ ムコールであるconnect()に対するほうが制御の自由度が低いので、処理効率も悪くなるからだ。connect()シス テムコールは、SYNスキャンが行うようにハーフオープン接続をリセットするのではなく、ターゲットのopenポー トとのコネクションを確立する。この処理は、同じ情報を得るのにさらに多くの時間とパケットを必要とするだ けでなく、ターゲットマシンのログに接続が記録される可能性も高くなる。まともなIDSならどちらも検知するは ずだが、たいがいのマシンにはそのような警告システムは備わっていない。平均的なUNIXシステムで実行されて いるサービスの多くは、Nmapが接続を確立し、その後データ送信を行わずに接続を閉じた場合、syslogに簡単な 記録や時には不可解なエラーメッセージを追加する。真にお粗末なサービスは、これが起きた場合に停止してし まうが、まずめったにないことだ。管理者は、特定のシステムからの接続試行がかなりの回数にわたってログに 記録されているのを発見したら、このconnect()スキャンのターゲットになっていると見なすべきである。 -sU (UDP スキャン) インターネット上で最も広く利用されているサービスの大部分は、TCPプロトコルで実行されているが、UDP[3]サー ビスも広く導入されている。DNS、SNMP、DHCP(それぞれ登録ポートは 53、161/162、67/68)の3つは、最もよく利 用されているUDPサービスである。UDPスキャンは通常、TCPよりも処理に時間がかかり難易度も高いので、セキュ リティ監査人のなかにはこれらのポートを無視する人もいる。だがこれは誤りである。悪用可能なUDPサービスは 極めてよくあるものであり、攻撃者がこうしたプロトコルを見過ごすわけはないからだ。好都合なこと に、NmapはUDPポートの一覧表を作成するのに役立てることができる。 UDPスキャンを作動させるには、-sUオプションを指定する。SYN スキャン(-sS)などのTCPスキャンタイプと組み 合わせて用いて、同じ実行時間中に両方のプロトコルをチェックできる。 UDPスキャンは、空の(データなし)UDPヘッダを各ターゲットポートに送ることで機能する。ICMPポート到達不能 エラー(タイプ3、コード 1、2、9、10、13)が返された場合、ポートはclosed(閉じている)状態にある。その他 のICMPポート到達不能エラー(タイプ3、コード3)が返された場合、ポートはfiltered(フィルタあり)と見なさ れる。まれにサービスがUDPパケットで応答することがあるが、その場合はポートがopenであることがわかる。数 回の再試行の後も応答がない場合、ポートはopen|filteredに分類される。これは、ポートが開いているか、もし くはパケットフィルタが通信を阻んでいることを意味する。バージョンスキャン(-sV)を用いて、実際に開いてい るポートとフィルタ処理されたポートを識別することもできる。 UDPスキャンに関する大きな課題は、処理の高速化である。Openポートやfilteredポートから応答が送り返される ことはほとんどないため、Nmapはそのままタイムアウトし、プローブや応答が行方不明になった場合に備えて再 試行を行うことになる。閉じたポートは、さらに大きな問題になる場合が多い。閉じたポートからは通 常、ICMPポート到達不能エラーが返されるが、閉じたTCPポートがSYNやConnectスキャンに応答してRSTパケット を送る場合とは異なり、多くのホストでは、ICMPポート到達不能メッセージがデフォルトでレート制限されてい る。Linux や Solarisは、この点に関して特に厳しい。例えば、Linux 2.4.20カーネルは、宛先到達不能メッ セージを毎秒1個(net/ipv4/icmp.cで指定)に制限している。 Nmapはレート制限を検出し、それに応じて処理速度を下げて、ターゲットマシンで落とされるような無用なパ ケットでネットワークを溢れさせないようにする。残念ながら、Linux方式で毎秒1パケットに制限される と、65,536個のポートをスキャンするのに18時間あまりかかる。UDPスキャンの速度を上げるためのアイデアに は、次のようなものがある。同時並行でスキャンするホストの数を増やす、よく使われるポートだけを先に重点 的にスキャンする、ファイアウォールの背後からスキャンする、--host-timeoutオプションを使って低速なホス トをスキップする。 -sN; -sF; -sX (TCP Null、FIN、およびXmasスキャン) これら3つのスキャンタイプ(次の節で述べる--scanflagsオプションを併用するとさらにいろいろなことができ る)は、TCP RFC[4]の巧妙な抜け穴を突いて、openポートとclosedポートを識別するためのものである。TCP RFCの65ページには、「宛先ポートの状態が CLOSEDならば... RSTを含まない入力セグメントは、その応答とし てRSTを送信する」とある。次のページでは、SYN、RST、ACKなどのビットセットを含まない、openポート宛てパ ケットについて述べてあり、「ここに至ることはなさそうであるが、もし至ったらセグメントを破棄してリター ンする」とある。 このRFC文書に準拠しているシステムをスキャンすると、SYN、RST、ACKなどのフラグビットを含まないパケット に対しては、ポートが閉じている場合はRSTが返され、ポートが開いている場合は何の応答も返されないことにな る。これら3つのフラグビットが含まれない限り、他の3つ(FIN、PSH、URG)をどのように組み合わせてもよ い。Nmapは以下の3つのスキャンタイプでこの弱点を突く。 Null スキャン (-sN) 何のビットも設定しない(tcpヘッダのフラグは0) FIN スキャン (-sF) TCP FINビットだけを設定する Xmas スキャン (-sX) FIN、PSH、URGのフラグをすべて設定し、クリスマスツリーのようにパケットをライトアップする これら3つのスキャンタイプは、プローブパケットに設定されるTCPフラグの違いを除けば、まったく同じ動作を 示す。RSTが返された場合、ターゲットポートはclosedと見なされ、何の応答もない場合はopen|filteredにな る。ポートがfilteredに分類されるのは、ICMP到達不能エラー(タイプ 3、コード 1、2、3、9、10、13)が返され た場合である。 これらのスキャンの最大の利点は、特定のステートレスなファイアウォールやパケットフィルタリング・ルータ をすり抜けることができる点である。さらには、SYNスキャンよりもやや秘匿性が高いことも利点として挙げられ る。しかし、あまり当てにしないように。最近のIDS製品はほとんど、これらを検知するように設定できるから だ。不利な点は、すべてのシステムがRFC 793に忠実に準拠しているわけではないことだ。ポートが開いているか 否かに関係なく、プローブに対してRST応答を送信するシステムは数多くある。これにより、すべてのポート はclosedに分類されることになる。メジャーなOSでこれを行うのは、マイクロソフトWindows、多くのシスコ製デ バイス、BSDI、IBM OS/400などが挙げられる。それでもこのスキャンは、ほとんどのUNIXベースのシステムに対 しては有効である。またもう1つ不利な点は、openポートと特定のfilteredポートを区別できないので、応答 がopen|filteredに分類されることである。 -sA (TCP ACK スキャン) このACKスキャンは、openポート(open|filteredも)を判別しないという点で、これまで述べてきたスキャンとは 異なっている。ファイアウォールのルールセットを明らかにするために用いられ、ファイアウォールがステート フルか否か、どのポートがフィルタされているかなどを決定する。 ACKスキャンのプローブパケットは、ACKフラグだけが設定されている(--scanflagsを用いている場合を除 く)。フィルタなしのシステムをスキャンする場合は、openポートとclosedポートの両方からRSTパケットが返さ れる。Nmapはこれらをunfilteredとして分類する。すなわち、ポートはACKパケットで到達可能だ が、openかclosedかは判別できないことを意味する。応答を返さないポートや、特定のICMPエラーメッセージ(タ イプ 3、コード 1、2、3、9、10、13)を返すポートはfilteredに分類される。 -sW (TCP ウィンドウスキャン) ウィンドウスキャンは、以下の点を除いては、ACKスキャンとまったく同じものである。すなわち、RSTが返され たら常にunfilteredと分類するのではなく、特定のシステムの実装に関する情報を用いて、openポート とclosedポートを識別する点である。これは、返されるRSTパケットのTCPウィンドウのフィールドを調査して判 断する。一部のシステムでは、openポートで正の値のウィンドウサイズ(RSTパケットに対しても)が使わ れ、closedポートではゼロになる。これにより、ウィンドウスキャンは、RSTが返された場合は常にポート をunfilteredに分類するのではなく、RSTパケット内のTCPウィンドウサイズの値が正であるかゼロであるかに よって、それぞれopenポートかclosedポートかに分類する。 このスキャンは、インターネット上では少数派のシステムの実装に関する情報に基づいているので、必ずしも信 用できるとは限らない。通常、この実装をサポートしていないシステムは、すべてのポートがclosedという応答 を返す。もちろん、対象マシンに開ポートが本当に1つもない場合もあり得る。スキャンしたポートのほとんど がclosedでも、よく使われるポート番号(22、25、53など)がいくつかfilteredである場合、このシステムは影響 を受ける可能性が最も高い。またまれに、システムがまさに正反対の挙動を示す場合もある。スキャンの結 果、開ポートが1000個で、closed や filteredが3個あることがわかった場合、この3個のポートこそが、本当 はopenポートである可能性はかなり高い。 -sM (TCP Maimon スキャン) Maimonスキャンは、発見者であるUriel Maimon氏の名前にちなんで名付けられた。この技法に関する同氏の論文 は、「Phrack」誌の第49号(1996年11月発行)に掲載された。この技法を搭載したNmapは、これの2号後の第51号で 公開された。Maimonスキャンは、プローブがFIN/ACKであるという点以外は、Null、FIN、Xmasスキャンとまった く同じものである。RFC 793 (TCP)によると、この種のプローブの応答としては、ポートがopenか closedかに関 係なく、RSTパケットが生成されることになっている。だがMaimon氏は、BSD由来のシステムの多くで、ポートが 開いている場合には、単にパケットが破棄されるだけになるという現象を見出した。 --scanflags (カスタム TCP スキャン) 本物のNmap上級ユーザなら、あらかじめ用意されたスキャンタイプを使うだけで満足している必要はない。こ の--scanflagsオプションを使うと、任意のTCPフラグを指定することで、ユーザ独自のスキャンを設計すること ができる。さあ、創造力を全開にして、Nmapのmanページをただ流し読みして具体的なルールを追加しているよう なメーカーのIDSの裏をかいてやろう。 --scanflagsの引数は、例えば9(PSH と FIN)などの数字のフラグ値で指定することもできるが、記号名を使った 方が簡単である。URG、ACK、PSH、RST、SYN、FINをごちゃまぜに組み合わせればよいだけだ。例えば--scanflags URGACKPSHRSTSYNFINで全部指定できるわけだが、もっともこれは、実際のスキャンには使えない。引数を指定す る順序は不同である。 またここでは、使いたいフラグだけでなく、TCPスキャンタイプ(-sA や -sFなど)も指定できる。この基本タイプ によって、応答を解釈する方法をNmapに伝える。例えば、SYNスキャンであれば、応答なしはfilteredポートであ ることと見なし、FINスキャンであれば、同じ応答なしをopen|filteredと解釈するわけだ。Nmapは、この基本の スキャンタイプと同じ動作をするが、異なる点は、ユーザが指定するTCPフラグを代わりに使うことである。基本 のスキャンタイプが指定されない場合は、SYNスキャンが使用される。 -sI zombie host[:probeport] (Idle スキャン) この高度なスキャン手法を使用すると、対象ホストに対して完全に匿名でTCPポートスキャンを実行できる(スキャンする側の実IPアドレスからは、対象ホストにパケットが送信されない)。それだけではなく、ゾンビホスト上で連続的に生成されるIPフラグメントID(識別子)が予測可能であることを巧妙に利用した独自のサイドチャネル攻撃を実行して、対象ホスト上のopenポートに関する情報を収集することもできる。IDSシステムでは、このスキャンはこちらで指定したゾンビマシン(稼動中でかつ特定の条件を満たす必要がある)から行われているものとして表示される。この非常に興味深いスキャンタイプは複雑すぎて本稿ではとても全容を説明しきれないので、完全な詳細を掲載した非公式の論文を以下に投稿しておくことにする:‐ https://nmap.org/book/idlescan.html このスキャンタイプは、(その匿名性のために)格別に秘匿性が高いことに加え、マシン間のIPベースの信頼関係 を明らかにすることができる。ポートリストには、指定したゾンビホストから見たopenポートが表示され る。よって、(ルータ/パケットフィルタのルールから)信頼関係にあると思われる様々なゾンビマシンを使って ターゲットをスキャンしてみることもできる。 IPIDの変化について、ゾンビホストの特定のポートを調査したい場合は、コロンの後にポート番号を付けたもの をゾンビホストに追加して指定できる(ゾンビホスト:プローブポート)。ここでポートを指定しない場 合、NmapはTCP Ping用にデフォルトで使用するポート(80)を用いる。 -sO (IP プロトコル スキャン) IPプロトコルスキャンを使うと、ターゲットマシン上でどのIPプロトコル(TCP、ICMP、IGMPなど)がサポートされ ているかを特定できる。繰り返し表示されるのは、TCP や UDPのポート番号ではなくて、IPプロトコル番号なの で、厳密にはポートスキャンとは言えない。とはいえ、スキャンするプロトコル番号を選定するのに-pオプショ ンを使い、結果は標準的なポートテーブル形式でレポートし、実際のポートスキャン手法と同じスキャンエンジ ンを基礎に用いている。そのため、ポートスキャンに十分近いものとして、ここに含めた。 プロトコルスキャンは機能として有用であるだけでなく、オープンソースソフトウェアとしての強力さを示すも のでもある。この機能については、基本となるアイデアは極めて単純だが、筆者自身追加しようと思ったことも なかったし、周りからそうした要望が寄せられることもなかった。そして2000年の夏、Gerhard Rieger氏がアイ デアを考案し、素晴らしい実装パッチを作成して、「nmap-hackers」メーリングリストに投稿してくれた。筆者 はこのパッチをNmapのツリーに組み込んで、その翌日に新バージョンとして公開した。市販のソフトウェア で、その機能向上のために設計段階から寄与するほど熱心なユーザを持つソフトはほとんどない プロトコルスキャンは、UDPスキャンと同様の仕組みで機能する。すなわち、UDPパケットのポート番号フィール ドをすべて繰り返し試行する代わりに、IPパケットヘッダを送信して、8bitのIPプロトコル番号フィールドをす べて繰り返し試行する。このヘッダは通常は空で、何のデータも、求められるプロトコルに適したヘッダすら含 まれていない。これには例外が3つあり、TCP、UDP、ICMPである。これらのプロトコルについては、適切なプロト コルヘッダが含まれる。そうしないとヘッダを送信しないシステムがあるからで、Nmapはすでにこれらを作成す る機能を備えている。プロトコルスキャンは、ICMPポート到達不能メッセージではなくて、ICMPprotocol到達不 能メッセージが返されるのを待つ。Nmapはターゲットホストから何らかの応答を何らかのプロトコルで受信した 場合、そのプロトコルをopenとして分類する。ICMPプロトコル到達不能エラー(タイプ 3、 コード 2)が返された ら、プロトコルはclosedと分類される。その他のICMP到達不能エラー(タイプ 3、 コード 1、3、9、10、13)が返 されたら、プロトコルはfilteredとマークされる(またこれにより、ICMPがopenであることも同時に明らかにな る)。数回再送しても何の応答もない場合、プロトコルはopen|filteredとして分類される。 -b ftp relay host (FTP バウンス スキャン) FTPプロトコル(RFC 959[5])の興味深い特徴の1つは、いわゆるプロキシFTP接続に対応していることである。これ により、ユーザは一台のFTPサーバに接続し、そのファイルを第三者サーバに送るように要求できる。これ は、様々なレベルの悪用にうってつけの機能なので、たいていのサーバでは、サポートするのを止めている。例 えば、この機能を悪用して、FTPサーバに他のホストをポートスキャンさせることも可能である。単に、ターゲッ トホストの興味あるポートに順にファイルを送信するよう、そのFTPサーバに要求するだけでよい。エラーメッ セージには、ポートが開いているか否かが記述される。これは、ファイアウォールをすり抜けるための有効な手 段になる。組織のFTPサーバは、どんなインターネットホストよりも、他の内部ホストにアクセスしやすい場所に 設置されている場合が多いからだ。Nmapは、-bオプションでftpバウンススキャンを実行できる。引数 はusername:password@server:portのような形式になる。Serverは、この脆弱性の影響を受けるFTPサーバの名前 かIPアドレスを指定する。通常のURLの場合と同様に、匿名ログインの認証情報(user: anonymous password:-wwwuser@)が使われる場合は、username:passwordの部分は省略できる。serverのデフォルトのFTPポー ト(21)を用いる場合は、ポート番号(と前のコロン)も省略可能である。 この脆弱性は、Nmapがリリースされた1997年に大きく広まったが、今ではほとんど修正されている。それで も、脆弱なサーバは、いまだにあちらこちらにあるので、その他の方法がすべて失敗した場合は、試してみるだ けの価値はある。ファイアウォールの回避が目的なら、ターゲットネットワークをスキャンして開いている21番 ポート(もしくはバージョン検出ですべてのポートをスキャンする場合はftpサービスなら何でもよい)を探し出 し、それぞれのポートを用いてバウンススキャンを試してみることだ。Nmapを使うと、対象のホストが脆弱か否 かを見分けることができる。単に自分の行動の形跡を隠そうとしているだけであれば、ターゲットネットワーク 上のホストだけに対象を限定する必要はない(し、むしろそうするべきではない)。脆弱なFTPサーバを求めてイン ターネットアドレスを無作為にスキャンする場合は、始める前に、システム管理者はこのような方法で自分の サーバを不正に使用されることを迷惑がる場合もあることを頭に入れておく必要がある。
ポートの指定とスキャンの順序
Nmapには、これまでに述べたすべてのスキャン手法に加えて、どのポートをスキャンするかや、スキャンの順序をラ ンダムにするか順序通りにするかなどを指定するためのオプションが用意されている。デフォルトで は、Nmapは、1024番(を含む)までの全ポートと、1025番以降のポートはスキャン対象のプロトコルに応じ てnmap-servicesファイルに記載されたポートをスキャンする。 -p port ranges (指定されたポートのみスキャン) このオプションで、スキャンしたいポートを指定できる。この指定は、デフォルトより優先される。ポート番号 は個別に指定しても、ハイフン区切りの範囲(例:1-1023)で指定してもよい。範囲の先頭や終端の値は省略でき る場合があり、この場合は範囲の先頭に1、終端に65535がそれぞれ使われる。したがって、-p-と指定する と、1番から65535番までのポートをスキャンできる。ゼロ番ポートのスキャンは、明示的に指定することで実行 できる。IPプロトコルスキャン(-sO)を行うには、このオプションでスキャンしたいプロトコル番号を指定す る(0-255)。 TCPポートとUDPポート両方のスキャンを実行する場合は、ポート番号の前にT:やU:という限定子を付けること で、特定のプロトコルを指定できる。この限定子は、次に別の限定子が指定されるまで有効になる。例えば、-p U:53,111,137,T:21-25,80,139,8080 という引数を指定すると、UDPポートの53番、111番、137番と、列挙し たTCPポートのスキャンが実行される。UDPとTCPポート両方のスキャンを実行するためには、-sUおよび最低1つ のTCPスキャンタイプ(-sS、-sF、-sTなど)を指定する必要があるので注意すること。プロトコル限定子が特に指 定されていない場合、指定したこれらのポート番号はすべてのプロトコルリストに追加される。 -F (高速 (限定したポートだけ) スキャン) Nmapに同梱されているnmap-servicesファイル(-sOでは「protocols」ファイル)に列挙されているポートだけをス キャンするように指定する。こうすることで、ホスト上の全65535ポートをスキャンするよりもはるかに高速にな る。このリストには非常に多く(1200以上)のTCPポートが含まれているので、デフォルトのTCPスキャ ン(約1650ポート)との速度差はそれほど大きくはない。--datadirオプションを使って、自分で独自に作成した小 さなnmap-servicesファイルを指定すると、この速度差をかなり大きくすることができる。 -r (ポートの順番を無作為にしない) デフォルトでは、Nmapはスキャンするポートの順番を無作為に選ぶようになっている(効率化のために特定のよく 使われるポートを最初のほうに移動した場合を除く)。このような無作為化は通常であれば望ましいが、代わりに 番号順にポートスキャンを行いたい場合はこの-rオプションを指定する。
サービスとバージョンの検出
リモートマシンをターゲットにしてNmapを実行した結果、25/tcp、80/tcp、53/udpの各ポートが開いていることが判 明したとしよう。Nmapは、約2200個のよく知られたサービスから成るnmap-servicesのデータベースを用いて、これら のポートがそれぞれメールサーバ(SMTP)、Webサーバ(HTTP)、ネームサーバ(DNS)に相当するとレポートする。通 常、この検索結果は正確である。すなわち、TCPポート25番で待ち受けするデーモンの大部分は、実際にメールサーバ である。だが、これをすべて鵜呑みにしてはいけない。通常とは異なるポートでサービスが実行されるケースも実際 にあり得る。 たとえNmapが正しくて、上で仮定したサーバがそれぞれSMTP、HTTP、DNSサーバを実行している場合でも、これは多く の情報にはならない。自社やクライアントの脆弱性調査(簡単なインベントリ調査の場合でも)を実施する際には、ど のメールサーバやDNSサーバが動作中であるかを知りたいはずである。正確なバージョン番号を入手することは、サー バがどのような攻撃に対して脆弱であるかを判断するのに大いに役に立つ。バージョン検出はこうした情報を入手す るのに役立つ手法である。 別のスキャン手法を用いてTCPポートや UDPポートを発見したら、そこで何が実行されているかについての詳細を明ら かにするために、これらのポートをバージョン検出によってさらに綿密に調査する。nmap-service-probesデータベー スには、様々なサービスの問い合わせを行うためのプローブや、応答を識別して解析するための照合表現が含まれて いる。Nmapは以下の情報の特定を試みる:サービスプロトコル(例:ftp、ssh、telnet、http)、アプリケーション 名(例:ISC Bind、Apache httpd、Solaris telnetd)、バージョン番号、ホスト名、デバイスタイプ(例:プリン タ、ルータ)、OSファミリ(例:Windows、 Linux) さらには、Xサーバが接続に対してopen状態にあるかどうか や、SSHプロトコルのバージョン、KaZaAのユーザ名などのその他様々な詳細情報の特定が試みられる場合もある。も ちろんたいていのサービスは、これらの情報をすべて提供できるわけではない。NmapにOpenSSLのサポート機能が組み 困れている場合は、SSLサーバに接続して、この暗号化層の背後で待ち受けしているサービスを推定する。RPC(Remote Procedure Call)サービスが発見された場合は、RPCプログラムとバージョン番号を特定するためにNmapのRPCグラインダー(-sR)が自動的に使用される。UDPポートスキャンを実行しても、「open」か「filtered」かを判定できなかった一部のポートは、open|filtered状態として保留される。バージョン検出は、これらのポートから応答を導き出して、可能な場合はその状態を「open」に変更しようと試みる。open|filteredのTCPポートも同様に取り扱われる。ここで注目すべき点は、バージョン検出がNmapの-Aオプションで有効になる機能の1つに含まれることである。バージョン検出のメカニズム、使用法、カスタマイズ方法に関する論文は、以下で入手できる:‐ https://nmap.org/vscan/ Nmapがサービスからの応答を受信しても、データベースに一致するものが見つからなかった場合は、特別なフィン ガープリントとURLが出力される。このURLは、ポートで何が動作しているかが確実に分かっている場合に、フィン ガープリントを投稿していただくためのものだ。あなたの発見がいろいろな人のためになるよう、2、3分もかからな いのでぜひ投稿していただきたい。こうした投稿のおかげで、Nmapは、smtp, ftp, httpなどの350以上のプロトコル に対する約3000件のパターン照合例を備えるまでになっている。 バージョン検出は、以下のオプションで実行および制御が可能である: -sV (バージョン検出) 上で述べたようなバージョン検出を実行する。またもう1つの方法として、-Aオプションを使うと、OS検出とバー ジョン検出の両方を実行できる。 --allports (バージョン検出の対象からすべてのポートを除外しない) デフォルトでは、Nmapのバージョン検出は、TCPポート9100番をスキップするようになっている。一部のプリンタ はこのポートに送られたものは何でも出力するので、HTTP GETリクエストやバイナリ形式のSSLセッションリクエ ストなどのページが何十枚も印刷されることになるからだ。この動作を変更するには、nmap-service-probesの当 該の「除外」(Exclude)ディレクティブを変更あるいは削除するか、もしくは--allportsを指定する と、Excludeディレクティブに関係なくすべてのポートがスキャンされるようにできる。 --version-intensity intensity (バージョンスキャンの強度を設定) Nmapは、バージョンスキャン(-sV)を実行する際に、1から9までの「希少」(rarity)値が割り振られた一連のプ ローブを送信する。この希少値が小さいプローブほど、よく用いられる各種サービスに対して有効であり、この 希少値が大きいプローブほど、用途が限られることになる。強度レベルは、どのプローブを適用するべきかを指 定するオプションである。この数字が大きいほど、サービスが正しく特定される確率は高くなる。だが、強度が 高いスキャンは、それだけ時間がかかる。強度は0から9の間で指定する必要があり、デフォルトは7であ る。nmap-service-probesのportsディレクティブによって、ターゲットポートにプローブを登録すると、このプ ローブは強度レベルに関係なく試行される。これにより、DNSプローブは常に開ポート53番に対して試行さ れ、SSLプローブはポート443番に対して実行されるようにすることなどができる。 --version-light (ライトモードを有効にする) これは、--version-intensity 2の場合に便利なエイリアスである。このライトモードを使うと、スキャンを通常 よりずっと高速に行うことができるが、サービスを特定できる確率はやや低くなる。 --version-all (プローブを1つずつ試行する) --version-intensity 9の場合に有用なエイリアスで、各ポートに対してプローブが1つずつ試行されるようにす る。 --version-trace (バージョンスキャンの動作状況を追跡する) これにより、Nmapは、どのようなバージョンスキャンが実行されているかに関する広範なデバッグ情報を出力す る。この情報は、--packet-traceによって得られるものの一部である。 -sR (RPC スキャン) この手法は、Nmapの他の様々なポートスキャン手法と連携して機能する。「open」状態であることが確認された すべてのTCP/UDPポートに対して、SunRPCプログラムのNullコマンドを大量に送信し、ポートがRPCポートである かどうかを判定し、そうである場合は、そこで実行されているプログラム名とバージョン番号の特定を試み る。従って、ターゲットのポートマッパーがファイアウォールの背後にある(あるいはTCPラッパーで保護されて いる)場合でも、rpcinfo -pの結果と同じ情報を効率的に取得することができる。現時点では、囮(おと り)は、RPCスキャンとは連携して機能しない。要求があれば、バージョンスキャン(-sV)の一部として自動的に有 効になる。すでにバージョン検出に含まれており、そちらのほうがずっと包括的なので、-sRが必要になることは めったにない。
OS 検出
Nmapの最も有名な機能の1つは、TCP/IPスタック・フィンガープリンティングを用いた、リモートからのOS検出機能で ある。Nmapは、一連のTCPやUDPのパケットをリモートホストに送り、その応答をほぼ全面的に調査する。TCP ISN(イ ニシャルシーケンス番号)サンプリング、TCPオプションのサポートや順序の調査、IPIDサンプリング、TCP初期ウィン ドウサイズ調査などの数多くのテストを実施した後、Nmapはこれらの結果を、既知のOSフィンガープリントが1500件 以上データベース化されたnmap-os-fingerprintsと照合し、一致するものがあった場合はそのOSに関する詳細情報を 出力する。各フィンガープリントには、フリーテキスト形式のOSの解説、ベンダ名を与える分類(例:Sun)、下位 のOS(例:Solaris)、OSの世代(例:10)、デバイスの種類(汎用、ルータ、スイッチ、ゲーム機など)が含まれる。 条件(例えば少なくともopenポート1つとclosedポート1つの存在がわかっているなど)は整っているが、Nmapがター ゲットマシンのOSを推測できない場合は、フィンガープリント投稿用URLがNmapから提供される。対象のマシンで動作 しているOSが何か(確実に)わかっている場合は、当該のフィンガープリントをこのURLを使って投稿できる。こうした 投稿が行われることで、Nmapが認識できるOSのデータベースに新たなデータが蓄積され、あらゆるユーザがさらに精 度の高い調査を行えるようになる。 OS検出を行うことで、そのプロセスのなかで収集される情報を利用した別のテストをいくつか行うこともできる。例 えば、アップタイムの測定がその1つで、TCPのタイムスタンプオプション(RFC 1323)を用いて、マシンが最後に再起 動されたのはいつかを推定する。これは、その情報を返したマシンに関してのみ報告される。もう一つのテスト は、TCPシーケンス番号の予測可能性の分類である。これにより、リモートホストに対して偽造したTCP接続を確立す るのがどの程度困難であるかがおおよそ判定できる。これは、発信元IPベースの信頼関係(rlogin、ファイアウォー ル、フィルタなど)の弱点を悪用したり、攻撃の出所を隠蔽したりする場合に役立つ。この種のスプーフィングはもは やめったに行われないが、これに対して脆弱なマシンがいまだに数多くある。難易度を表す実際の数値は、統計的な サンプリングに基づいているために上下する可能性がある。通常は「worthy challenge(価値ある挑戦)」や 「trivial joke(つまらないジョーク)」などの言葉の表現による分類を利用する方がよい。これは、冗長(-v)モー ドの標準出力にのみレポートされる。-Oオプションとともに冗長モードが有効になっている場合、IPIDシーケンス番 号の生成に関する情報もレポートされる。ほとんどのマシンは、「インクリメンタル(incremental)」に分類され る。これは、送信するパケットごとに、IPヘッダのIDフィールドの値を1ずつ増加させることを意味する。この仕組み のせいで、これらのマシンは高度な情報収集攻撃やスプーフィング攻撃に対して脆弱になっている。 OS検出のメカニズム、使用法、カスタマイズ方法について述べた論文は、以下で入手できる(十数ヶ国語の翻訳版あ り): https://nmap.org/osdetect/ OS検出は、以下のオプションで実行および制御できる: -O (OS検出を実行) 上で述べたOS検出を実行する。また別な方法として-Aオプションを使うと、OS検出とバージョン検出の両方を実 行できる。 --osscan-limit (OS検出を有望なターゲットに絞る) 少なくとも1つのopenおよびclosedのTCPポートが見つかれば、OS検出の効率はかなり上がる。このオプションを 設定すると、Nmapは上の基準に満たないホストにはOS検出を試行しないようになる。これにより、かなりの時間 が節約できる。多くのホストに対して-Pnスキャンを行う場合は特にそうである。-O あるいは -Aで、OS検出の実 行をいつ要求するかだけが重要になる。 --osscan-guess; --fuzzy (OS検出の結果を推測) Nmapが完全に一致するOSを検出できない場合、それに近似するものを候補として挙げる場合がある。Nmapがこれ をデフォルトで行うためには、近似はかなり近いものでなければならない。上のどちらか(同等)のオプションを 指定すると、Nmapはより大まかな近似をアグレッシブに行うようになる。
タイミングとパフォーマンス
Nmapの開発を行ううえで、常に優先事項の1つとして念頭に置いているのが「パフォーマンス」である。筆者のローカ ルネットワーク上のホストにデフォルトスキャン(nmap hostname)を実行するのにかかる時間は、5分の1秒である。瞬 き1回程度の時間だが、何万、いや何十万というホストをスキャンする場合は、この時間も積算されるわけだ。さらに は、UDPスキャンやバージョン検出などの特定のスキャンオプションによって、スキャン時間が大幅に増加する可能性 がある。特定のファイアウォール設定、特に応答レート制限の場合も同様である。Nmapには、スキャン速度を上げる ための並行処理や高度なアルゴリズムが使用されているが、Nmapをどのように実行するかを最終的に決めるのはユー ザである。熟練したユーザは、自分たちの時間的制約を満たしつつ、関心のある情報だけを取得するように、Nmapコ マンドに入念な細工を施すものだ。 スキャン時間を改善するテクニックとしては、重要でないテストの省略や、Nmapを最新版にアップグレードする(パ フォーマンスの強化は頻繁に行われている)などが挙げられる。タイミング(時間調節)パラメタを最適化すると、かな りの違いが生じる場合もある。この種のオプションを、以下に列挙する。 --min-hostgroup size; --max-hostgroup size (並列スキャンのグループサイズを調節する) Nmapには、複数のホストを並行してポートスキャンやバージョンスキャンする能力がある。これは、ターゲット のIP空間をいくつかのグループに分割し、一度に1グループずつスキャンすることで行われる。一般に、グループ の規模を大きくするほど、効率がよくなる。デメリットは、グループ全体のスキャンが終了してからでない と、ホストの結果が得られないことである。そのため、グループサイズが50から始めた場合、ユーザがレポート を受け取るのは、(冗長モードで最新情報が提供される場合を除く)最初の50台のホストが完了してからになる。 デフォルトでは、Nmapはこうした競合問題に対して、妥協的なアプローチを採る。すなわち、最初の結果がすぐ に得られるように、5程度の小さなグループサイズから始めて、それから1024くらいにまで増やすようにする。初 めに設定する数値は、指定するオプションによって決まる。効率上の理由で、Nmapは、UDPスキャンやポート数の 少ないTCPスキャンに対しては比較的大きなグループサイズを用いる。 グループサイズの最大値が--max-hostgroupで指定されている場合、Nmapがこのサイズを超過することは決してな い。グループサイズの最小値を--min-hostgroupで指定すると、Nmapはグループサイズがこの値よりも小さくなら ないようにしようとする。Nmapは、オプションで指定された最小値の条件を満たすのに十分な数のターゲットホ ストが、所定のインターフェース上に残っていない場合は、指定より小さいグループサイズを使わざるを得なく なる場合もある。グループサイズを特定の範囲内に収めるために、最大値と最小値の両方を設定する場合もある が、これが必要になるケースはめったにない。 このオプションの主な使用法は、スキャンをより高速に完了できるように、グループサイズの最小値に大きな値 を指定することである。クラスC規模のネットワークをスキャンするには通常、256を指定する。数多くのポート に対してスキャンを実行する場合は、これ以上の数値を設定しても、あまり効果は期待できない。ポート数がご くわずかのスキャンを行う場合は、ホストのグループサイズを2048以上に設定すると有効だろう。 --min-parallelism numprobes; --max-parallelism numprobes (プローブの並列処理を調節する) ホストグループに向けて送信されるプローブの総数を決めるオプションで、ポートスキャンやホスト発見に用い られる。デフォルトでは、Nmapは、ネットワークパフォーマンスに基づいて、常に変化する理想的な並列処理可 能数を算出している。パケットが続けて破棄される場合は、Nmapは処理速度を落とし、送信するプローブの数を 減らす。理想的なプローブ数は、ネットワークが示すパフォーマンスの高さに応じて、緩やかに増加する。これ らのオプションは、この変数に対して上限と下限を設定する。デフォルトでは、理想的な並列処理可能数 は、ネットワークの信頼性が低い場合は1まで下がり、最高の状態の場合は数百まで上がる場合もある。 最も一般的な使用法は、--min-parallelismに1より大きな数値を設定して、パフォーマンスの低いホストやネッ トワークに対するスキャンの処理速度を上げることである。ただし、軽く使うにはリスクを伴うオプションであ り、あまりに大きな値を設定すると、精度に悪影響が及ぶ場合がある。またこれにより、ネットワーク状態に基 づいて並列処理可能数を動的に制御するNmapの能力を低下させることにもなる。10程度にしておくのが妥当かと 思われるが、この値の調節は最後の手段としてしか行わない。 Nmapがホストに対して一度に2つ以上のプローブを送れないようにするために、--max-parallelismオプションに 「1」が設定される場合がある。これは、(下で述べる)--scan-delayオプションと組み合わせて用いると便利であ る。もっとも、後者のオプションは通常は単独でも十分に役立つものである。 --min-rtt-timeout time, --max-rtt-timeout time, --initial-rtt-timeout time (プローブのタイムアウトを調節 する) Nmapは、プローブを中止もしくは再送信するまで、プローブの応答を待機する時間をどのくらいにするかを決め る実行タイムアウト値を保持している。 この値は、それまでに送信したプローブの応答時間に基づいて算出され る。 ネットワークの待ち時間が、かなり長くて変化しやすい場合、タイムアウト値は数秒にまで達する可能性も ある。 また、反応が鈍いホストをスキャンする際には、控え目な(高い)レベルから始めて、しばらくの間そのま まの値にしておく場合もある。 --max-rtt-timeout と --initial-rtt-timeoutにデフォルトより小さな値を指定すると、スキャン時間を大幅に 短縮できる。 厳重なフィルタ処理が施されたネットワークに対してpingなし(-Pn)スキャンを行う場合は特にそ うなる。 とはいえ、あまりアグレッシブに小さくしすぎないように。 小さすぎる値を指定してしまったため に、応答が送信されている間に数多くのプローブがタイムアウトして再送信されてしまい、結果的にスキャンの 実行に通常より余計に時間がかかる可能性があるからだ。 すべてのホストがローカルネットワーク上にある場合、100ミリ秒(ms)(--max-rtt-timeout 100ms)にするの が、アグレッシブに小さく指定するとしても妥当な値である。 ルーティングが関係してくる場合は、ICMP pingユーティリティか、ファイアウォールを通過できる可能性が高いhping2などのカスタムパケット作成ツール を用いて、最初にネットワーク上のホストにpingを実行する必要がある。 10個程度のパケットを送信してみ て、最大往復時間(RTT)を調べること。 --initial-rtt-timeoutの値は、この値を2倍にするとよい。 ま た、--max-rtt-timeoutの値は、これを3倍か4倍にしたものにするとよいだろう。 筆者は通常、pingで調査した 時間の大小に関係なく、最大RTTを100ms未満に設定することはないし、1000msを超える値にすることもない。 --min-rtt-timeoutは、ほとんど使用されないオプションであるが、ネットワークの信頼性があまりに低いため に、Nmapのデフォルト値でも小さく設定しすぎになる場合に役立つと思われる。 Nmapは単にタイムアウト時間を 指定された最小値まで小さくするだけなので、ネットワークが信頼できると思われる場合は、この要求は異常で あり、nmap-devメーリングリストにバグとして報告すべきである。 --host-timeout time (遅いターゲットホストを見切る) ホストのなかには、とにかくスキャンに長い時間がかかるものがある。 理由としては、性能・信頼性の低いネッ トワークハードウェアやソフトウェア、パケットレート制限、厳重なファイアウォールなどが考えられる。 ス キャン対象ホスト全体の数パーセントを占める、最も反応が遅いホストによって、スキャン時間の大半を使われ てしまうこともある。このような無駄はカットして、遅いホストは最初から省くほうがよい場合がある。 これ は、待機しても構わない時間の最大値を--host-timeoutに指定することで実現できる。 たとえば、30m を指定し て、Nmapが1つのホストで30分以上無駄にしないようにできる。 この30分の待ち時間に、Nmapは他のホストも同 時にスキャンしているので、完全な時間の損失にはならないことに注意。 タイムアウトするホストはスキップさ れ、ポートテーブル、OS検出、バージョン検出などの結果は出力されない。 0 は特別な値で 「タイムアウトをしない」 を指定できる。 ホストのタイムアウトを15分にデフォルトで指定す る T5 タイミングテンプレートの挙動を上書きする際に有用である。 --script-timeout time スクリプトの中にはコンマ数秒で完了するものもあるが、スクリプトの性質、渡された引数、ネットワークやア プリケーションの状態などによって、数時間以上かかるものもある。 --script-timeout オプションは、スクリ プトの実行時間に上限を設定する。 設定された時間を超えたスクリプトは終了し、何も表示されません。 デ バッグ (-d) オプションを指定すると、各タイムアウトの詳細が表示される。 ホストおよびサービススクリプト の場合、スクリプトは1つの対象ホストまたはポートのみをスキャンし、タイムアウト時間は次のスクリプトのた めにリセットされる。 0 は特別な値で 「タイムアウトをしない」 を意味する。 タイムアウトを10分とデフォ ルトで指定しているT5 タイミングテンプレートを上書きするために使用できる。 .RE --scan-delay time; --max-scan-delay time (プローブ間の遅滞時間を調節する) 指定したホスト宛てに送られる各プローブの送信間隔において、指定した時間だけNmapを待機状態にする。 これは、が行われている場合に特に役に立つ。 Solarisマシンは(制限が特に厳しく)、通常はUDPスキャンの プローブパケットに対して、ICMPメッセージの応答を毎秒1回しか返さない。 Nmapがそれ以上のパケットを 送ってもすべて無駄になる。--scan-delay は次のように設定する。 1sとすると、Nmapはその遅い速度に保 たれる。Nmapは毎秒1回という遅いレートを保つことになる。 Nmapは、レート制限を検出し、それに応じて スキャン遅延を調整しようとするが、どの程度のレートが最適であるかがすでにわかっている場合は明示的 に指定してもよい。 Nmapがレート制限に対処するためにスキャン遅延を増加させた場合、スキャンの速度は大幅に低下する。 --max-scan-delayは、Nmapが許容する最大の遅延時間を指定できる。 --max-scan-delay に少ない時間を指 定すれば、スキャンを高速化できるが、リスクがある。 時間を少なく設定しすぎると、対象が厳格なレート 制限を実装している場合に、無駄なパケット再送信や、ポートの取りこぼしが発生する可能性がある。 --scan-delay には、使用法がもうひとつある。 それは、閾値ベースの侵入検知・防御システム(IDS/IPS)の 回避である。 --min-rate number; --max-rate number (スキャンレートを細かく制御) Nmapのスキャン速度の自動制御は、適切なスキャン速度を見つけるのに効果的である。 しかし、適切なス キャン速度が事前にわかっている場合や、ある時間までにスキャンが終了することを保証しなければならな い場合もある。 あるいは、Nmapがあまりに速くスキャンしないようにしなければならないかもしれない。 --min-rate と --max-rate オプションは、このような状況に対応するために用意されている。 --min-rate オプションが与えられると、Nmap は与えられたレートと同じかそれよりも速くパケットを送信 するよう最善を尽くす。 引数は、1 秒あたりの送信パケット数を表す正の実数である。 例え ば、--min-rate 300 を指定すると、Nmap は送信レートを毎秒300パケット以上に維持しようとする。 最小 レートを指定しても、条件が許す限り、Nmapがより速くなることはない。 同様に、--max-rateは送信レートを最大値を指定できる。 例えば、高速なネットワークを対象に毎秒100パ ケットの送信に制限するには、--max-rate 100を使用する。 10秒に1パケットという遅いスキャンを行うに は、--max-rate 0.1を使用する。 --min-rate と --max-rate を一緒に使うと、レートをある範囲内に保つ ことができる。 これらの2つのオプションは全体的なもので、個々のホストにではなく、スキャン全体に影響する。 ポート スキャンとホスト発見にのみ影響する。 OS検出のような他の機能では、独自のタイミングが実装されてい る。 実際のスキャン速度が指定した最小値を下回る可能性があるのは2つの条件である。 1つは、最小値がNmapが 送信できる最速レートよりも速い場合であり、これはハードウェアに依存する。 この場合、Nmapは単に可能 な限り高速にパケットを送信するが、このような高速なレートでは精度が低下する可能性が高いので注意が 必要である。 2つ目のケースは、Nmapが何も送信しない場合である。たとえば、スキャンの最後にプローブ が送信され、Nmapがタイムアウトや応答を待っているときである。 スキャンの終了時やホストグループ間で スキャンレートが低下するのは正常な現象である。 予測できない遅延を補うために、送信レートが一時的に 最大値を超えることがあるが、平均してレートは最大値以下にとどまるだろう。 最小レートの指定は慎重に行う必要がある。 ネットワークが対応できる速度よりも速くスキャンすると、精 度が低下する可能性がある。 場合によっては、速いレートを使うと、遅いレートを使ったときよりもスキャ ンが長くなることがある。 これはNmapの 適応伝送 アルゴリズムが、過剰なスキャン速度によるネットワー クの輻輳を検知し、精度を上げるために再送信の回数を増やすからである。 そのため、パケットが高いレー トで送信されても、全体としてはより多くのパケットが送信される。 総スキャン時間の上限の設定 は、--max-retriesで再送信の回数を制限できる --defeat-rst-ratelimit 多くのホストは、送信するICMPエラーメッセージ(ポート到達不能エラーなど)の数を減らすために、長い間 レート制限 を使用してきた。 現在、いくつかのシステムは、生成するRST(リセット)パケットに同様のレート制限を適 用している。 このようなレート制限を反映させるためにタイミングを調整するため、Nmapの速度が大幅に低 下することがある。 --defeat-rst-ratelimit を指定することにより、Nmapにこれらのレート制限を無視さ せることができる (SYN スキャンなど、応答がないポートを open として扱わないスキャンのために)。 このオプションを使用すると、Nmapがレート制限されたRST応答を十分に待たないために、一部のポートが無 応答に見えるため、精度が低下する可能性がある。 SYNスキャンでは、無応答に見えたポートは filtered となり、RSTパケット受信時に見られるclosed 状態にはならない。 このオプションは、開いているポートに しか関心がなく、closed と filtered を区別することに余分の時間を割けない場合に有用である。 --defeat-icmp-ratelimit --defeat-rst-ratelimit と同様に、 --defeat-icmp-ratelimit オプションは精度と引き換えに速度を優先 し、ICMP エラーメッセージをレート制限するホストに対して UDP スキャン速度を向上させるものである。 このオプションは、Nmap がポート到達不能メッセージを受信するために遅延しないようにするので、応答し ないポートには、デフォルトの open|filtered の代わりに closed|filtered というラベルが付くことにな る。 これは、UDP で実際に応答するポートだけを open として扱う。 多くの UDP サービスはこの方法では 応答しないので、 このオプションは --defeat-rst-ratelimit よりも不正確である可能性が高い。 --nsock-engine iocp|epoll|kqueue|poll|select 与えられたnsock IO多重化エンジンの使用を強制する。 select(2) ベースのフォールバックエンジンのみ が、システム上で利用可能と保証されている。 エンジンの名前は、利用するIO管理機能の名前にちなんで付 けられている。 現在実装されているエンジンは、epoll、kqueue、poll、select だが、どのプラットフォー ムにも存在しないものもないとは言い切れない。 デフォルトでは、Nmapは「最適な」エンジン、すなわ ち、このリストの中で最初にサポートされたエンジンを使用する。 nmap -Vを使って、自分のプラット フォームでどのエンジンがサポートされているかを確認できる。 -T paranoid|sneaky|polite|normal|aggressive|insane (タイミングテンプレートを設定する) 前節で述べたような、タイミングのきめ細やかな制御はとても効果が大きいが、分かりにくいと感じるユー ザもいるようだ。 さらには、最適化を試みているスキャンを実行するよりも、適切な数値を選ぶほうが時間 がかかるという事態に陥る可能性もある。 そこでNmapには、6つのタイミングテンプレートを用いたもっと 簡単なアプローチが用意されている。 テンプレートは、-Tオプションと番号(0 - 5)か名前で指定できる。 テンプレート名は、paranoid (0)、 sneaky (1)、 polite (2)、 normal (3)、 aggressive (4)、insane (5)である。 最初の2つは、IDS回避用のテンプレートである。Politeモードは、ス キャン処理速度を落とし、帯域幅とターゲットマシンのリソースの使用量を少なくするためのものである。 Normalモードはデフォルトなので、-T3としても特に何もしない。Aggressiveモードは、ユーザが適度に高速 で信頼性の高いネットワーク上にいることを想定して、スキャン速度を上げる。 最後にInsaneモードは、 非常に高速なネットワーク上にいるか、あるいは速度と引き換えに精度の一部を犠牲にしても構わない場合 を想定したモードである。 これらのテンプレートを利用すると、ユーザは、的確なタイミング値の選定はNmapに任せつつ、どの程度ア グレッシブなスキャンを実行したいかを指定できる。 また、今のところきめ細かい制御のオプションが存在 しない、速度の微調整の一部をこのテンプレートで行うこともできる。 例えば、-T4は、TCPポートに対する スキャン処理の動的な遅延時間が10msを越えないようにすることができ、また-T5では、この値の上限 が5msに制限される。 テンプレートを最初に指定する場合に限り、きめ細かい制御オプションとテンプレー トを組み合わせて用いることができる。 そうしないと、テンプレートの標準値がユーザの指定した値で上書 きされてしまう。適度に最近の信頼性が高いネットワークをスキャンする場合は、-T4がお勧めである。 き め細かい制御オプションを追加する場合でも、このオプションを(コマンドラインの最初に)付けておくこと で、テンプレートによって有効になる細部にわたる最適化のメリットを享受できる。 適正なブロードバンド接続やイーサネット接続の環境にいる場合は、常時-T4を利用することをお勧めする。 -T5を好む人もいるが、私にはアグレッシブすぎるように思われる。 -T2を指定しているユーザもたまにいる が、ホストをクラッシュさせる可能性が低いと見ているからか、自分のことを全般的に礼儀正し い(polite)と思っているからのようだ。 こうしたユーザは単に、「-T Polite」が実際にはいかに遅いもの であるかを理解していないだけだ。 Politeモードは、デフォルトスキャンの10倍の時間がかかる。デフォル トのタイミングオプション(-T3)に関しては、マシンのクラッシュや帯域幅が問題になることはめったにない ので、慎重なスキャンユーザには通常はこれを勧めている。 タイミング値をあれこれ操作して、これらの問 題を軽減しようとするよりも、バージョン検出を省略するほうがずっと効率的である。 -T0 や -T1は、IDSの警告を回避するには役立つかもしれないが、何千ものマシンやポートをスキャンするに は非常に長い時間がかかる。 そのように長いスキャンを行う場合は、あらかじめ用意された-T0 や -T1の値 に頼るよりも、必要に応じて的確なタイミング値を設定するほうが好ましいだろう。 T0の主な効果は、スキャンを連続的に実行して一度に1つのポートしかスキャンされないようにすること と、各プローブを送信する間に5分間待機することである。 T1 と T2は似ているが、それぞれプローブ間の 待機時間が15秒と0.4秒しかない。 T3はNmapのデフォルト動作で、並列処理が含まれ る。T4は--max-rtt-timeout 1250ms --min-rtt-timeout 100ms --initial-rtt-timeout 500ms --max-retries 6に相当し、TCPおよびSCTPスキャンの最大遅延時間を10msに設定する。 T5は--max-rtt-timeout 300ms --min-rtt-timeout 50ms --initial-rtt-timeout 250ms --max-retries 2 --host-timeout 15m --script-timeout 10m --max-scan-delayに相当し、TCPおよびSCTPスキャンの最大遅延 時間を5msに設定する。 UDPの最大スキャン遅延時間は T4 や T5 では設定できないが、 --max-scan-delay オプションで設定できる。
ファイアウォール/IDS の回避とスプーフィング
多くのインターネット先駆者たちは、あらゆるノード間のネットワーク接続を可能にする、世界共通のIPアドレス空 間を有する世界規模のオープンネットワークの構想を描いていた。これにより、ホストは文字通りピアとして機能 し、お互いに情報のやり取りができるようになる。ユーザは、自宅のすべてのシステムに仕事場からアクセスし て、エアコンの設定を変えたり、早めに来た客のためにドアを開錠したりできるだろう。このような世界規模の相互 接続性の構想の拡大は、アドレス空間の不足とセキュリティ上の問題によって阻害されている。1990年代初期、組織 は特に相互接続性を軽減する目的で、ファイアウォールを導入し始めた。大規模なネットワークと玉石混淆のイン ターネットとの間に、アプリケーションプロキシ、ネットワークアドレス変換、パケットフィルタなどによる防御線 が張り巡らされた。情報の自由な流れは、認可された通信チャンネルとそこを通るコンテンツに対する厳しい規制に とって代わられた。 ファイアウォールなどのネットワーク上の障害物によって、ネットワークのマッピングは著しく困難になる。これ は、もうこれ以上軽減されることはないはずだ。いつ行われるかわからない探索行為を阻止することが、こうした機 器を実装する主な目的である場合が多いからである。それでも、Nmapは、この複雑なネットワークを理解するのに役 立てたり、フィルタが目的通りに機能していることを検証したりするための機能を数多く備えている。また、実装が 不完全な防御策を回避する仕組みにも対応している。自身のネットワークセキュリティ状況を理解する最善の方法 の1つは、それを打ち破ってみることだ。自分が攻撃者になったつもりで、本節のテクニックを自分自身のネットワー クに対して実行してみるとよい。FTPバウンススキャン、Idleスキャン、フラグメンテーション攻撃などを仕掛けた り、自分のプロキシの1つにトンネルを通したりしてみよう。 企業は、ネットワーク活動を制限することに加えて、侵入検知システム(IDS)によるトラフィック監視を強化してきて いる。メジャーなIDSにはすべて、Nmapによるスキャンを検知するように設計されたルールが標準で搭載されてい る。これは、スキャンが攻撃に先立って行われる場合があるからだ。これらの製品の多くは最近、侵入防止システ ム(IPS)に姿を変えている。IPSは、悪意があると見なされるトラフィックを積極的にブロックする。ネットワーク管 理者やIDSベンダにとって残念なことに、パケットデータを解析して悪意を確実に検知するのは困難な課題である。根 気とスキル、それにNmapの特定のオプションの手助けがあれば、攻撃者はたいていの場合、IDSに検知されないで通り 過ぎることができる。その一方で、管理者は大量の誤検知結果の対処に追われることになる。IDSの誤検知によっ て、悪意のない活動が誤診され、警告が発せられたりブロックされたりする。 Nmapには、ファイアウォールルールを回避したりIDSをこっそりすり抜けたりするための機能は搭載しないようにする べきだと言われることがたまにある。こうした人々の言い分は、その手の機能は、管理者がセキュリティ向上のため に利用するのと同じくらいの確率で、攻撃者に悪用されるおそれがあるというものだ。この論理の問題点は、いずれ にしろこの種の手法は攻撃者に悪用されるに決まっているということだ。攻撃者は、別のツールを見つけてきた り、Nmapに機能を組み込んだりするものだからである。一方、管理者は、自分たちの業務がそれだけますますやりに くくなると思われるだろう。最新型の、パッチを適用したFTPサーバを導入することは、FTPバウンス攻撃を実装して いるツールの配布を阻止しようとすることよりも、はるかに強力な防御策になる。 ファイアウォールやIDSシステムを検出して破壊するための「魔法の弾丸」のようなNmapオプションなど存在しな い。それには、スキルと経験が必要なのだ。チュートリアルについては、本リファレンスガイドの範囲を超えてい る。本稿の目的は単に、関連したオプションを列挙し、それで何ができるかについて説明することだけである。 -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オプションが必要になるだろう。ま た通常は-Pnも使った方が望ましい。 -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などにな る。
出力
セキュリティツールの実用性は、生成される出力で決まる。複雑なテストやアルゴリズムも、結果が整理された、わ かりやすい形で提示されなければ、ほとんど価値はない。ユーザや他のソフトウェアによるNmapの使い方がこれほど 数多くあることを考えると、たった1つですべてのユーザが満足するようなフォーマットが存在するはずもない。そこ でNmapには、人間が直接読めるようにしたインタラクティブ方式や、ソフトウェアで簡単に解析できるXML方式などの さまざまな出力フォーマットが用意されている。 Nmapには様々な出力フォーマットが備わっているだけでなく、出力やデバッグメッセージの冗長性を制御するオプ ションも用意されている。出力結果は標準出力(stdout)や指定したファイルに送られる。ファイルにはデータを追加 したり上書きしたりできる。また、出力ファイルは、中断したスキャンを再開するためにも使われる。 Nmapの出力は、5種類のフォーマットが利用できる。デフォルトはinteractive output(インタラクティブ出力)と呼 ばれるもので、標準出力に送られる。また、出力には、normal output(通常出力)というのがある。これは、インタ ラクティブに似ているが、異なる点は、実行時間情報や警告が表示される回数が少ないことである。その理由は、こ の出力が、インタラクティブにではなくて、スキャン完了後に解析するために提供されるものだからである。 XML出力は、最も重要な出力タイプの1つであり、HTMLに変換し、NmapのGUIやデータベースにインポートして、プログ ラムで容易に解析できる。 残り2つの出力タイプは、grepで検索可能なシンプルな出力で、ターゲットホストに関するほとんどの情報が1行で表 示されるものと、自分のことを>sCRiPt KiDDi3だと思うユーザ向けのsCRiPt KiDDi3 0utPUt(出力)だ。 インタラクティブ出力はデフォルトで、関連するコマンドラインオプションはないが、他の4つのフォーマットオプ ションでは、同じ構文が使われる。取る引数は1つで、結果を保存するファイル名である。複数のフォーマットを指定 してもよいが、各フォーマットは1度しか指定できない。例えば、自分の調査用に通常の出力を保存し、同時に同じス キャン結果をプログラムの解析用にXML形式で保存したい場合もあるだろう。これは、-oX myscan.xml -oN myscan.nmapというオプションを使って実行できる。なお、ここでは簡潔にするためにmyscan.xmlのような単純なファ イル名を用いているが、通常はもっと説明的な名前にするのが推奨されている。どのようなファイル名にするか は、個人の好みの問題だが、筆者はスキャンの実施日と簡単なコメントを組み入れた長い名前を使い、スキャン対象 の企業名にちなんだ名前のディレクトリに入れている。 これらのオプションは結果をファイルに保存するが、同時にNmapは通常通りインタラクティブ出力を標準出 力(stdout)に書き出している。例えば、nmap -oX myscan.xml targetというコマンドで、XML出力がmyscan.xmlに書き 込まれ、同じ結果のインタラクティブ出力が標準出力に書き出される。この出力は、-oXが指定されなかった場合でも 行われる。ハイフン(-)文字を引数としてフォーマットタイプの1つに渡すと、これを変更することができる。すなわ ち、Nmapはインタラクティブ出力を停止して、代わりにユーザが指定した形式の結果を、標準出力ストリー ム(stdout)に書き出すことになる。nmap -oX - targetというコマンドでは、XML出力だけがstdoutに送られる。この 場合も、重大なエラーは標準エラーストリーム(stderr)に書き出される場合がある。 Nmapの一部の引数とは異なり、ログファイルオプションのフラグ(例:-oX)とファイル名やハイフンとの間のスペース は必須である。この注意を無視して、引数を-oG-や-oG-のように指定したら、Nmapの下位互換機能により、それぞ れG-やXscan.xmlという名前の標準フォーマットの出力ファイルが作成される。 またNmapには、スキャン結果の冗長性を制御するオプションや、出力ファイルに上書きしないで追加書き込みするた めのオプションも用意されている。これらのオプションについてはすべて以下で説明する。 Nmapの出力フォーマット -oN filespec (通常出力) 通常の出力が指定した名前のファイルに書き込まれるようにする。上で述べた通り、これはインタラクティブ出 力と一部異なる。 -oX filespec (XML 出力) XML出力が指定した名前のファイルに書き込まれるようにする。Nmapには文書型定義(DTD)が組み込まれており、XMLパーサーはこれを用いて、NmapのXML出力を検証する。本来はプログラムによる使用を目的としたものだが、人間がNmapのXML出力を解釈するのにも役立つ。DTDには、フォーマットの文法要素が定義されており、これらの要素が取ることのできる属性や値が列挙されていることが多い。最新版は以下から常時入手できる:‐ https://nmap.org/data/nmap.dtd XMLは、ソフトウェアで容易に解析できる定型書式を提供する。C/C++、Perl、Python、Javaなどを含む、あらゆ るメジャーなコンピュータ言語用のXMLパーサーが、フリーで入手できるようになっている。これらの言語のほと んどについては、Nmapの出力と実行に特化して処理するためのバインディングも作成されている。例えば、Perl CPAN(Comprehensive Perl Archive Network)のNmap::Scanner[6] や Nmap::Parser[7]などがある。重要なアプリ ケーションがNmapとインターフェースで連結する場合はほとんど、XMLが推奨フォーマットになる。 XML出力はXSLスタイルシートを参照して、出力結果の書式をHTMLに変換できる。これを使用する最も簡単な方法 としては、単にFirefoxやIEなどのWebブラウザでXML出力を読み込むだけでよい。デフォルトでは、これはNmapを 実行したマシン上(もしくは同じ構成のマシン)でのみ機能する。これは、nmap.xslのファイルシステムのパスが ハードコード化されているためである。Webに接続したマシン上であればHTMLとして表示されるような、移植性の あるXMLファイルを作成する方法については、--stylesheetオプションの項を参照のこと。 -oS filespec (ScRipT KIdd|3 oUTpuT) スクリプトキディ出力は、インタラクティブ出力に似ているが、異なる点は、「l33t HaXXorZ」(leet hacker)向 けに後処理してあることだ。Nmapは以前より、一貫性のある大文字やスペルの使い方のせいで、この人たちに見 下されてきた。ユーモアを解さない人々は、「スクリプトキディの手助けをしている」として筆者に非難の言葉 を浴びせる前に、まず気付くべきだ。このオプションが、彼らをからかうためのものだということを。 -oG filespec (Grep検索可能出力) この出力フォーマットを最後に取り上げたのは、廃止予定だからだ。XML出力フォーマットのほうがはるかに強力 であり、熟練ユーザにとっての使い勝手もほぼ変わらない。XMLはパーサーの標準で、多数の優れたXMLパーサー が利用可能になっているのに対し、grep可能出力は筆者独自のスクリプトに過ぎない。XMLは拡張性が高 く、Nmapの新機能がリリースされるたびに対応可能だが、grep可能出力にはこうした機能を追加する余地がない ため、割愛せざるを得ないことも多い。 とはいえやはり、grep可能出力はいまだに広く使われている。各対象ホストが一行ずつ列挙されているというシ ンプルな形式で、grep、awk、cut、sed、diff、PerlなどのUNIXの標準ツールを使って簡単に検索や解析を行うこ とができる。筆者も通常、コマンドラインで行うちょっとしたテストのために使用している。sshポートが開いて いるホストや、Solarisを実行しているホストなどを見つける場合、簡単なgrep検索を行うと、こうしたホストを すべて特定し、パイプでawkやcutコマンドに送って、目的のフィールドを書き出すことができる。 Grep可能出力は、コメント行(パウンド(#)記号で始まる行)とターゲット行で構成される。ターゲット行は、6つ のラベル付きフィールドの組み合わせになっており、それぞれのフィールドはタブで区切られ、最後にコロンが 付く。各フィールドは、Host、Ports、Protocols、Ignored State、OS、Seq Index、IPID、Statusになってい る。 これらのフィールドの中で通常最も重要なのは、Ports(ポート)であり、ここからそれぞれの興味あるポートに関 する詳細情報が得られる。ポートエントリのカンマ区切りリストになっており、各ポートエントリは、1つの興味 あるポートを表し、7つのスラッシュ(/)で区切られたサブフィールドから成る。各サブフィールドはPort number、State、Protocol、Owner、Service、SunRPC info、Version infoである。 XML出力の場合と同様に、本稿でこのフォーマットのすべてを論ずることはできない。Nmapのgrep可能出力フォーマットについての詳細な解説は以下で入手できる:‐ http://www.unspecific.com/nmap-oG-output -oA basename (全フォーマットに出力する) 簡便のために、-oA basenameを指定すると、スキャン結果を通常、XML、grep可能の3つのフォーマットで一度に 保存できるようにした。それぞれ、basename.nmap、basename.xml、basename.gnmapというファイルに保存され る。たいていのプログラムと同じく、以下の例のようにファイル名の前にディレクトリパスを付けることもでき る:~/nmaplogs/foocorp/(UNIX)、c:\hacking\sco(Windows) 冗長性とデバッグのオプション -v (冗長性レベルを上げる) 冗長性レベルを上げて、Nmapが進行中のスキャンに関してさらに多くの情報を書き出すようにする。開きポート は見つかり次第表示され、スキャンの実行に数分以上かかると見なされる場合は予測される完了時間が提示され る。2回使用するとさらに冗長レベルは上がるが、3回以上の使用は無効である。 ほとんどの変更の効果が表れるのはインタラクティブ出力だけだが、通常出力とスクリプトキディ出力にも一部 効果がある。その他の出力タイプは、コンピュータ処理するための出力なので、ユーザの手を煩わさなくと も、デフォルトでかなり詳細な情報が与えられている。それでも、その他の出力モードでもいくつか変更される 点があり、詳細情報を一部省略することで、出力サイズを大幅に減らすことができる。例えば、grep可能出力の コメント行で、スキャン対象の全ポートの一覧表を提供するものは、かなり長くなる可能性があるので、冗長 モードでのみ書き出される。 -d level (デバッグレベルを上げる/設定する) 冗長モードでも満足する情報が得られない場合は、さらに大量の情報を得るためにデバッグを利用できる。冗長 オプション(-v)の場合と同様に、デバッグもコマンドラインのフラグ(-d)で有効になり、これを複数回指定する ことで、デバッグレベルを上げることができる。もしくは、デバッグレベルは-dに引数として与えることでも設 定できる。例えば、-d9でレベル9に設定される。これは最も効果の高いレベルであり、ごく少数のポートやター ゲットに対して非常に単純なスキャンを実行するのでない限り、数千行に及ぶ出力が生成される。 デバッグ出力が有用なのは、Nmapにバグがある疑いがある場合や、Nmapが何をなぜ行っているのかについて単純 によく分からなくなった場合である。この機能は主に開発者向けのものなので、デバッグ行は必ずしも誰が見て もすぐ分かるわけではない。例えば、このような出力が得られる: Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。こうした行の内容が理解できない場合 は、無視するか、ソースコードを見て調べるか、開発リスト(nmap-dev)に助けを求めるかなどをする他ない。見 れば内容が分かる行もなかにはあるが、デバッグレベルが上がるほど、メッセージも分かりにくくなる。 --packet-trace (送受信したパケットやデータを追跡する) Nmapが送受信した全パケットのサマリーを書き出すようにする。デバッグで用いられる場合が多いが、Nmapが見 えないところで何を行っているかを新しいユーザが理解するための手段として役立てることができる。何千もの 行が書き出されないようにするには、-p20-30などを指定して、スキャン対象のポートの数を制限するとよいだろ う。バージョン検出サブシステムの挙動にのみ関心がある場合は、代わりに--version-traceを使用すること。 --iflist (インターフェースや経路の一覧を表示する) Nmapが検出したインターフェースやシステム経路のリストを書き出す。これは、ルーティング問題やデバイスの キャラクタリゼーションの誤り(例えばNmapがPPP接続をイーサネットとして処理すること)などをデバッグするの に役立つ。 その他の出力オプション --append-output (出力ファイルは上書きせず追加する) -oX や -oNなどの出力フォーマットのフラグにファイル名を指定すると、デフォルトではそのファイルは上書き される。既存のファイルの内容はそのままにして、新しい結果を追加したい場合は、この--append-outputオプ ションを指定する。こうしてNmapを実行すれば、ここで指定した出力ファイルはすべて、上書きではなくて追加 されることになる。だがこれは、XMLスキャン(-oX)のデータに対してはあまり有効ではない。XMLの結果ファイル は通常、手動で修正しないと適正に解析できないからだ。 --resume filename (中断したスキャンを再開する) 対象が広範囲にわたるNmapの実行には非常に長い時間がかかり、数日ほどに及ぶ場合もある。そのようなスキャ ンは、常に完了するまで続けて実行できるとは限らない。様々な制約によってNmapを就業時間内に実行できなく なったり、ネットワークがダウンしたり、Nmapが動作しているマシンが計画的あるいは予定外に再起動させられ たり、Nmap自体がクラッシュしたりなどが起こる可能性があるからだ。その他いかなる理由であっても同様 に、Nmapを実行している管理者は、ctrl-Cを押すことによって実行をキャンセルできる。このような場合、ス キャン全体を最初から再開するのは望ましくないだろう。幸いにも、通常出力(-oN)やgrep可能出力(-oG)のログ が残っていれば、ユーザは、実行を中断された際のターゲットに対するスキャンを再開するようNmapに命じるこ とができる。これを行うには、--resume オプションを指定し、通常/grep可能の出力ファイルを引数として渡 す。Nmapはその出力ファイルをパースして、前に指定されたのと同じものを使うので、それ以外の引数は指定で きない。nmap --resumelogfilenameとして、Nmapを呼び出す。Nmapは、前回の実行で指定されたデータファイル に新たな結果を追加する。この再開オプションは、XML出力フォーマットをサポートしていない。2回の実行結果 を結合して1つの妥当なXMLファイルにするのは困難であるためだ。 --stylesheet path or URL (XML出力変換のXSLスタイルシートを設定する) Nmapには、XML出力を閲覧したりHTMLに変換したりするためのnmap.xslというXSLスタイルシートが同梱されてい る。XML出力には、xml-stylesheetディレクティブが組み込まれており、Nmapが最初にインストールした場所(も しくはWindows上の現在作業中のフォルダ)にあるnmap.xmlを参照する。最近のWebブラウザにNmapのXML出力を読 み込むと、ブラウザはファイルシステムからnmap.xsl を読み出して、出力結果の処理に使用する。別のスタイル シートを使いたい場合は、この--stylesheetオプションの引数として指定する。引数はフルパス名かURLで指定す る。よく用いられる例を以下に示す: --stylesheet https://nmap.org/data/nmap.xsl これで、スタイルシート の最新バージョンがInsecure.Orgからブラウザに読み込まれる。これにより、Nmap(および nmap.xsl)がインス トールされていないマシン上でも、結果を閲覧しやすくなる。そのため、URLのほうが便利な場合が多いが、デ フォルトではプライバシー上の理由で、ローカルファイルシステムでのnmap.xslの場所が使われている。 --no-stylesheet (XSLスタイルシート宣言をXMLから除外する) NmapがXML出力をXSLスタイルシートと関連付けないようにする。xml-stylesheet ディレクティブは無視される。
その他のオプション
本節では、他の節のどこにも適合しないオプションで、重要な(およびそれほど重要でない)ものについて述べる。 -6 (IPv6スキャンを有効にする) Nmapは2002年より、その最もよく使われる機能に対してIPv6のサポートを提供している。特に、pingスキャ ン(TCPのみ)、connect()スキャン、バージョン検出などはすべてIPv6に対応している。コマンド構文は、-6オプ ションを追加する以外は従来通りである。もちろん、ホスト名ではなくてアドレスを指定する場合は、IPv6の構 文を使う必要がある。ただし、アドレス表示は3ffe:7501:4819:2000:210:f3ff:fe03:14d0のようになるので、ホ スト名を使う方がよい。出力も従来とほぼ同じであり、「興味のあるポート」行のアドレスがIPv6方式になって いるのが唯一のIPv6の証拠である。 IPv6は必ずしも世界を席巻しているわけではないが、一部(通常はアジア)の国々ではかなり普及しており、最近 のOSのほとんどでサポートされている。NmapをIPv6で使用するためには、スキャンのソースとターゲットの両方 をIPv6対応に設定する必要がある。自分のISP(他の多くのISPと同様の)からIPv6アドレスを割り当てられていな い場合は、様々な場所で入手可能なフリーのトンネルブローカーがNmapとうまく連携して機能する。優れたトン ネルブローカーの1つに、BT Exact社が以下で運営しているものがある。 Hurricane Electric社が以下で提供しているものも使ったことがある:http://ipv6tb.he.net/。「6to4 tunnels」という人 気のフリーソフトもある。 -A (アグレッシブ・スキャンオプション) このオプションは、Additional(付加的)、Advanced(高度)、Aggressive(アグレッシブ)なオプションを有効にす る。だが、このうちのどれを表すのかはまだ明確には決めていない。現在はこのオプションを指定すると、OS検 出(-O)とバージョンスキャン(-sV)を実行できる。今後、さらに多くの機能が追加されるだろう。ポイント は、ユーザが数多くのフラグをまとめて覚えなくても済むように、複数のスキャンオプションを包括的にまとめ て実行できるようにすることである。このオプションが有効にするのは機能のみで、同じくそうしたいと思われ るタイミングオプション(例えば-T4)や冗長オプション(-v)などは、有効にならない。 --datadir directoryname (Nmapの特別データファイルの位置を指定する) Nmapは、実行時に特別なデータ を、nmap-service-probes、nmap-services、nmap-protocols、nmap-rpc、nmap-mac-prefixes、nmap-os-fingerprintsと いう名前のファイルに取得する。Nmapはまず、(ある場合は)--datadir オプションで指定したディレクトリ内 で、これらのファイルを探す。ここで見つからなかったファイルは、「NMAPDIR」環境変数で指定したディレクト リから検索する。次に、実在する有効なUID(POSIXシステムの場合)やNmapの実行ファイル(Win32の場合)が格納さ れているディレクトリの~/.nmap を探し、その次に、組み込みディレクトリの/usr/local/share/nmap や/usr/share/nmapを探す。それでもない場合は最後の手段として、Nmapはカレントディレクトリを検索する。 --send-eth (raw(生の)イーサネット層で送信する) Nmapが、上層のIP(ネットワーク)層ではなくて、rawイーサネット(データリンク)層でパケットを送信するように する。デフォルトでは通常、Nmapは動作しているプラットフォームに最適の層を選ぶようになっている。raw ソ ケット (IP層)は一般に、UNIXマシンには最適であるが、マイクロソフト社がraw ソケットに対応する機能を無効 にしているため、Windows OSにはイーサネットフレームが必要になる。Nmapは、他に選択肢がない(非イーサネッ ト接続などの)場合は、このオプションがあるにもかかわらずUNIX上ではいまだにraw IPパケットを使用する。 --send-ip (raw IPレベルで送信する) Nmapがパケットを送信するのに、下位のイーサネットフレームではなくて、raw IPソケットを介して送るように する。これは、上で述べた--send-ethを補完するオプションである。 --privileged (ユーザが十分な権限を持つことを想定する) Nmapが、通常はUNIXシステム上のroot権限を必要とする操作を行うのに十分な特権を持つことを想定する。こう した操作には、生ソケットの送信やパケット盗聴などがある。デフォルトでは、Nmapはこのような操作が要求さ れた場合でも、geteuid()がゼロでなければ実行を中止するようになっている。--privileged は、Linuxカーネル 機能や、権限のないユーザが生パケットスキャンを実行できるように設定可能な同様のシステムとともに用いる と便利である。注意点は、このオプションフラグを、特権を必要とするオプション(SYNスキャンやOS検出など)よ り前に指定することだ。--privilegedオプションに相当する別の方法には、「NMAP_PRIVILEGED」変数の設定があ る。 -V; --version (バージョン番号を表示する) Nmapのバージョン番号を書き出して終了する。 -h; --help (ヘルプのサマリーページを表示する) 最も一般的なコマンドフラグについての短いヘルプ画面を表示する。Nmapを引数なしで実行しても同様の結果が 得られる。
実行時の対話型操作
Nmapの実行中に、すべてのキープロセスをキャプチャする。これにより、停止して再開という手順を経ないでも、プ ログラムとの情報のやり取りが可能になる。特定の特殊キーで、オプションを変更する。その他のキーは、スキャン に関する情報を伝えるステータスメッセージを表示する。仕様としては、小文字は書き出される情報量を増やし、大 文字は減らす。 v / V 冗長レベルを上げる / 下げる d / D デバッグレベルを上げる / 下げる p / P パケット追跡を有効にする / 無効にする その他 書き出されるステータスメッセージは以下のようになる: Stats: 0:00:08 elapsed; 111 hosts completed (5 up), 5 undergoing Service Scan Service scan Timing: About 28.00% done; ETC: 16:18 (0:00:15 remaining)
使用例
以下に、Nmapの使用例を、単純なものからやや複雑で難解なものまでいくつか示した。例で使用したIPアドレスやド メイン名は、あくまでも具体性を持たせることが目的であるため、実際のスキャンでは、それらを自分のネットワー クのアドレスまたはホスト名で置き換えることに注意する。筆者は個人的に、他人のネットワークに対してポートス キャンを実行することは違法行為には当たらないと見ているが、ネットワーク管理者のなかには、自分のネットワー クを勝手にスキャンされるのを快く思わずに苦情を訴える者もいるかもしれない。最初に許可を得たほうが得策であ る。 ユーザには、テスト目的で、ホストscanme.nmap.orgをスキャンする許可が与えられている。この許可の対象 は、Nmapによるスキャンに限定されるものであり、エクスプロイトやサービス妨害攻撃のテストは含まれない。帯域 幅を節約するために、このホストに対するスキャンは、一日につき十数回以上は行わないようにすること。このフ リーのスキャン対象提供サービスが悪用された場合、サービスは停止され、NmapはFailed to resolve given hostname/IP: scanme.nmap.org(指定したホスト名/IP:scanme.nmap.orgの解決に失敗しました)という報告を出 す。これらの許可は、scanme2.nmap.org、scanme3.nmap.org等の各ホストにも適用されるが、これらのホストは、現 在は存在しない。 nmap -v scanme.nmap.org このオプションを利用すると、scanme.nmap.orgというマシン上の予約済みTCPポートすべてに対してスキャンを実行 する。また、-vが指定されているため、冗長モードが有効になる。 nmap -sS -O scanme.nmap.org/24 scanme.nmap.orgが属している「クラスC」ネットワーク上のマシン255台のうちで稼動している各マシンに対し て、SYNスキャン(ステルススキャン)を実行する。また、稼動中の各ホスト上で動作しているOSの特定も同時に試行す る。SYNスキャンとOSの検出を行うため、root権限が必要となる。 nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127 198.116のクラスBアドレス空間で、8ビットで表せる255のサブネットに属するホストのうち、前半(1-127)のIPアドレ スを持つホストに対して、ホストの列挙とTCPスキャンを行う。このスキャンを行う目的は、対象システム でsshd、DNS、POP3d、IMAPd、4564番ポートが動作しているかどうかを調査することだ。これらのポートのなかで開い ている(open)ことが判明したポートすべてに対してバージョン検出を使用して、何のアプリケーションが動作してい るかを特定する。 nmap -v -iR 100000 -Pn -p 80 Nmapは100,000台のホストを無作為に選び、Webサーバ(80番ポート)のスキャンを行う。ホストの列挙は-Pn で無効に してある。各ターゲットホスト上で1つのポートしか調査しないのに、どのホストが稼動中であるかを特定するために プローブを送るのは無駄だからだ。 nmap -Pn -p80 -oX logs/pb-port80scan.xml -oG logs/pb-port80scan.gnmap 216.163.128.20/20 4096個のIPをスキャンしてWebサーバを見つけ出し(pingなしで)、結果出力をgrep可能およびXMLフォーマットで保存 する。 host -l company.com | cut -d -f 4 | nmap -v -iL - company.comに存在するホストを発見するためにDNSのゾーン転送を実行し、発見したIPアドレスをnmapに渡す。この コマンドは、筆者のGNU/Linuxマシンで使用しているものだ。他のシステムには、ゾーン転送を実行するための別のコ マンドがある。
バグ
Nmapも作者と同様に完全ではない。それでもNmapのほうは、ユーザによるバグの報告やパッチの作成のおかげで、よりよいものにしてゆくことができる。Nmapを使っていて、思い通りに動かない場合は、まず‐ https://nmap.org/から入手できる最新のバージョンにアップグレードしてみる。問題が続くようなら、すでに発見・対処が行われた問題かどうかを調査して確かめる。エラーメッセージをGoogle検索したり、‐ https://seclists.org/でNmap-devアーカイブを閲覧したりしてみる。このmanページも全体に目を通した方がよ い。それでもどうにもならない場合は、バグレポートを<dev@nmap.org>宛てにメールで送ること。メールには、使用 しているNmapのバージョンと、Nmapを実行しているOSの名前とバージョンなどの情報だけでなく、問題に関して分 かったことは何でも書いていただきたい。問題の報告やNmapの使い方についての質問などは、dev@nmap.org宛てに送 るほうが、筆者宛てに直接送るよりも返事がある可能性ははるかに高い。 またバグレポートより、バグを修正するためのコードパッチのほうが歓迎される。ユーザ自身のコード変更によるパッチファイルの作成方法についての基本的な注意事項は‐ https://nmap.org/data/HACKING で参照できる。パッチは、nmap-dev宛てに送る(推奨)か、筆者Fyodorまで直接送っ ていただきたい。
作者
Fyodor <fyodor@nmap.org> (http://www.insecure.org) 翻訳者 修正(2022/7):Taichi Kotake, a.k.a tkmru <taichi.kotake@sterrasec.com> ここ数年で何百人もの人々から、Nmapに対して貴重な貢献をしていただいた。この詳細については、Nmapとともに配布されているCHANGELOGファイルを参照のこと。CHANGELOGファイルは以下からも入手できる:‐ https://nmap.org/nmap_changelog.html
法的通知事項
著作権と使用許諾 Nmapセキュリティスキャナの著作権は、Insecure.Com LLCに帰属している(1996-2005)。ま た、Nmapは、Insecure.Com LLCの登録商標。このプログラムはフリーソフトウェアであり、Free Software Foundation(FSF)が発行するGNU一般公衆利用許諾契約書のバージョン2で定められている条件に従い、再配布、改変 することが可能である。これは、特定の条件下でNmapを使用、改変、再配布する権利を保証するものである。Nmapの 技術を独自仕様のソフトウェアに組み込むことを希望する場合は、喜んで別の形態のライセンスを販売する(その際 は、<sales@insecure.com>に連絡)。多くのセキュリティスキャナのベンダーは、ホスト発見、ポートスキャ ン、OS検出、サービス/バージョンの検出などの、Nmap技術のライセンスを受けている。 GPL(一般公有使用許諾)は、「派生著作物」に対して重要な制約を課していることに注意する必要がある。けれど も、この用語の詳細な定義はいまだに与えられていない。ここでは誤解を避けるため、以下のいずれかの事項が行わ れた場合に、アプリケーションが、GPLにおける「派生著作物」を構成するものと見なす: • Nmapのソースコードを統合する • nmap-os-fingerprints や nmap-service-probesなどの、Nmapの著作権のあるデータファイルを読み込む • Nmapを実行して結果を解析処理する(通常のシェルや実行メニューのアプリケーションとは異なる。これらは未処 理のNmap出力を単に表示するだけなので、派生著作物にはならない) • InstallShield社の製品のような独自開発の実行可能インストーラに統合/組込/集約する • 上で述べたことを行うような、ライブラリにリンクしたりプログラムを実行したりする 「Nmap」という用語は、Nmapの一部あるいは派生物を含めるために用いられるべきである。このリストは排他的な性質のものではなく、一般的な例を用いて、派生著作物の解釈を明確にすることを意図したものである。これらの制約事項は、実際にNmapを再配布する場合にのみ適用される。例えば、Nmap向けの独自開発フロントエンドを作成して販売することには何ら支障はない。ただし、その製品を単体で配布することと、ユーザにNmapのダウンロード先として以下を示すことが必要である:‐ https://nmap.org/ われわれはこれらを、GPLにさらに追加された制約とは見なしていない。そうではなくて、「派生著作物」 という用 語がGPL準拠のNmap製品に適用される場合に、それをどのように解釈するかを明確にするためのものと見なしてい る。これは、Linus Torvalds氏が、Linuxカーネルモジュールに「派生著作物」 がどのように適用されるかについて の自分の解釈を表明したやり方に似ている。われわれの解釈はNmapだけに言及するもので、その他のGPL製品について 述べているわけではない。 GPL準拠でない著作物におけるNmapの使用に対する、GPLライセンスによる制約について質問がある場合は喜んでお答 えするつもりだ。上で述べたように、独自開発のアプリケーションやアプライアンスにNmapを統合するための代替ラ イセンスも提供している。このライセンス契約はすでに多くのセキュリティベンダに販売されており、その内容には 通常、永久ライセンス、サポートやアップデートの優先提供、Nmap技術の開発継続のための資金援助などが含まれて いる。詳細については電子メールで<sales@insecure.com> に問い合わせていただきたい。 Insecure.Com LLCは、GPLの取り決めに対する特例として、NmapのコードとOpenSSLライブラリとのリンクを認めてお り、この2つをリンクで組み合わせたものを配布している。OpenSSLライブラリは、同梱のCopying.OpenSSLファイルに リストされたものと同一のライセンスのもとで配布されている。OpenSSL以外の使用されているすべてのコードに対し ては、あらゆる点でGNU GPLに従わなければならない。このファイルの一部を変更する場合、そのファイルの自身の バージョンにこの例外を拡大して適用できるが、そのように行う義務を負うものではない。 上記の条件以外の条件が記載されたライセンス契約書とともにこれらのファイルを入手した場合、そのライセンス契 約書は、ここで述べた内容に優先する。 ソースコードの入手可能性とコミュニティへの寄与 われわれは、ユーザーにこのプログラムのソースコードを提供している。その理由は、ユーザが実際にプログラムを 実行する前に、そのプログラムがどんな動作を行うのかを正確に知る権利がある、と考えているからだ。また、ソフ トウェアに対して脆弱性を見つけるための監査を行うこともできる(まだ1つも見つかったことはないが)。 ソースコードは、新しいプラットフォームへの移植、バグの修正、新しい機能の追加を可能にする。コードに何らか の変更を加えた場合は、主要ディストリビューションに組み込まれる可能性もあるため、その内容 を<fyodor@nmap.org> までぜひお送りいただきたい。ただし、変更したコードをFyodorまたはInsecure.orgの開発用 メーリングリストの1つに送信することで、そのコードを無制限かつ非独占的に再利用、改変、再ライセンスする権利 をFyodorおよびInsecure.Com LLCに提供するものと見なす。Nmapは常にオープンソースで利用できるようにする予定 だが、これが重要なのは、コードのライセンス再発行ができなかったことで、他のフリーソフトウェア・プロジェク ト(KDEやNSAMなど)に壊滅的な問題が発生したことがあったためである。また上で述べた通り、サードパーティに対 してコードの再ライセンスを行こともある。自分が寄与したコードに特別なライセンス条件を指定したい場合 は、コードの送信時にその旨を伝えて欲しい。 無保証 このプログラムは、人々の役に立つことを期待して配布されているが、その保証は一切行わない。すなわち、商品適 格性や特定目的への適合性の黙示保証は一切行わない。詳細については、GNU一般公有使用許諾契約書を参照のこ と。GNU GPLは、 http://www.gnu.org/copyleft/gpl.htmlから、またはNmapに同梱のCOPYINGファイルで参照できる。 またNmapは、不完全なアプリケーション、TCP/IPスタック、OSなどをクラッシュさせることが確認されていることに 注意すること。きわめてまれなこととはいえ、記憶に留めておく必要がある。ダウンタイムを受容する準備ができて いない限り、Nmapをミッションクリティカルなシステムに対して実行してはならない 。Nmapがシステムやネットワー クに障害を与える可能性がある点については認めたうえで、Nmapの使用により発生しうるいかなる損害や問題に対し ても一切の責任を負わないものとする。 不適切な使用 システム障害のリスクがわずかながらあることや、悪意のある攻撃者が攻撃を実行する前の調査手段としてNmapを好 んで利用することなどのせいで、管理しているシステムがスキャンされると気分を害し、場合によっては苦情を申し 立てる管理者もいる。従って、たとえネットワークを軽くスキャンする際も、事前に管理者の許可を取っておくこと を推奨する。 セキュリティ上の理由から、Nmapは特権(suid rootなど)でインストールしてはならない。 サードパーティ ソフトウェア Nmapには、 Apache Software Foundation[8] によって開発されたソフトウェアが含まれており、改訂版のLibpcap portable packet capture library[9] が、Nmapとともに配布されている。Windows版Nmapでは、libpcapより派生し たWinPcap ライブラリ[10]が用いられる。正規表現のサポートは、Philip Hazel氏作成のオープンソースのソフト ウェアである PCRE ライブラリ[11]パッケージで提供されている。特定のRAWネットワーク機能では、Dug Song氏作 のLibdnet[12]ネットワークライブラリが使用される。修正バージョンが、Nmapとともに配布されている。Nmapはオプ ションで、SSLバージョン検出をサポートするために、 OpenSSL 暗号化ツールキット[13] とリンクできる。ここで述 べたすべてのサードパーティ・ソフトウェアは、BSD方式のソフトウェアライセンスのもとで、自由に再配布できる。 米国輸出管理分類 米国輸出管理:Insecure.Com LLCでは、NmapはUS ECCN(輸出管理分類番号)5D992に該当すると考えている。5D992に 分類されるものは、「5D002で規制されない情報セキュリティソフトウェア」となっており、この分類に唯一適用され る規制は、AT(テロ防止)規制である。ATは、ほぼすべての物品に適用され、イランや北朝鮮などの少数の無法国家 への輸出を禁止する規制である。このため、Nmapの輸出には、特別なライセンスや許可、あるいは政府の承認を一切 必要としない。
注記
1. RFC1122 http://www.rfc-editor.org/rfc/rfc1122.txt 2. RFC792 http://www.rfc-editor.org/rfc/rfc792.txt 3. UDP http://www.rfc-editor.org/rfc/rfc768.txt 4. TCP RFC http://www.rfc-editor.org/rfc/rfc793.txt 5. RFC 959 http://www.rfc-editor.org/rfc/rfc959.txt 6. Nmap::Scanner http://sourceforge.net/projects/nmap-scanner/ 7. Nmap::Parser http://www.nmapparser.com 8. Apache Software Foundation http://www.apache.org 9. Libpcap portable packet capture library http://www.tcpdump.org 10. WinPcap ライブラリ http://www.winpcap.org 11. PCRE ライブラリ http://www.pcre.org 12. Libdnet http://libdnet.sourceforge.net 13. OpenSSL 暗号化ツールキット http://www.openssl.org