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