スポンサーリンク

NMAP

NAME
SYNOPSIS
ツール説明
オプション概要
ターゲットの指定
ホストの発見
ポートスキャンの基本
ポートスキャンのテクニック
ポートの指定とスキャンの順序
サービスとバージョンの検出
OS 検出
タイミングとパフォーマンス
ファイアウォール /IDS の回避とスプーフィング
出力
その他のオプション
実行時の対話型操作
使用例
バグ
作者
法的通知事項
NOTES

NAME

nmap − ネットワーク調査ツールおよびセキュリティ/ポート スキャナ

SYNOPSIS

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スキャンの例を、以下の Example 1, “Nmapスキャンの典型的な 例”に示した。この例で使用されているNmapの引数は、OSとそのバージョンの検 出を可能にする−Aと、処理を高速に実行するための−T4、および2つのターゲッ トホスト名だけである。

Example 1. Nmapスキャンの典型的な例

# nmap −A −T4 scanme.nmap.org playground

Starting nmap ( http://www.insecure.org/nmap/ )
Interesting ports on scanme.nmap.org (205.217.153.62):
(The 1663 ports scanned but not shown below are in state: filtered)
PORT    STATE  SERVICE VERSION
22/tcp  open   ssh     OpenSSH 3.9p1 (protocol 1.99)
53/tcp  open   domain
70/tcp  closed gopher
80/tcp  open   http    Apache httpd 2.0.52 ((Fedora))
113/tcp closed auth
Device type: general purpose
Running: Linux 2.4.X|2.5.X|2.6.X
OS details: Linux 2.4.7 − 2.6.11, Linux 2.6.0 − 2.6.11
Uptime 33.908 days (since Thu Jul 21 03:38:03 2005)

Interesting ports on playground.nmap.org (192.168.0.40):
(The 1659 ports scanned but not shown below are in state: closed)
PORT     STATE SERVICE       VERSION
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios−ssn
389/tcp  open  ldap?
445/tcp  open  microsoft−ds  Microsoft Windows XP microsoft−ds
1002/tcp open  windows−icfw?
1025/tcp open  msrpc         Microsoft Windows RPC
1720/tcp open  H.323/Q.931   CompTek AquaGateKeeper
5800/tcp open  vnc−http      RealVNC 4.0 (Resolution 400x250; VNC TCP port: 5900)
5900/tcp open  vnc           VNC (protocol 3.8)
MAC Address: 00:A0:CC:63:85:4B (Lite−on Communications)
Device type: general purpose
Running: Microsoft Windows NT/2K/XP
OS details: Microsoft Windows XP Pro RC1+ through final release
Service Info: OSs: Windows, Windows XP

Nmap finished: 2 IP addresses (2 hosts up) scanned in 88.392 seconds

Nmapの最新バージョンは、http://www.insecure.org/nmap/から入手できる。ま た、本マニュアルページの最新版は、http://www.insecure.org/nmap/man/で参 照できる。

オプション概要

このオプション概要は、Nmapを引数なしで実行すると表示される。最新版 はhttp://www.insecure.org/nmap/data/nmap.usage.txtで参照できる。これを 見ると、比較的利用機会の多いオプションについての概要を確認できるが、本 マニュアルの以下に掲載する詳細な解説に代わるものではない。使用頻度の低 いオプションには、ここに含まれていないものもある。

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
  −sP: Ping Scan − go no further than determining if host is online
  −P0: Treat all hosts as online −− skip host discovery
  −PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery to given ports
  −PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  −n/−R: Never do DNS resolution/Always resolve [default: sometimes]
SCAN TECHNIQUES:
  −sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  −sN/sF/sX: TCP Null, FIN, and Xmas scans
  −−scanflags <flags>: Customize TCP scan flags
  −sI <zombie host[:probeport]>: Idlescan
  −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
  −F: Fast − Scan only the ports listed in the nmap−services file)
  −r: Scan ports consecutively − don't randomize
SERVICE/VERSION DETECTION:
  −sV: Probe open ports to determine service/version info
  −−version−light: Limit to most likely probes for faster identification
  −−version−all: Try every single probe for version detection
  −−version−trace: Show detailed version scan activity (for debugging)
OS DETECTION:
  −O: Enable OS detection
  −−osscan−limit: Limit OS detection to promising targets
  −−osscan−guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  −T[0−6]: Set timing template (higher is faster)
  −−min−hostgroup/max−hostgroup <msec>: Parallel host scan group sizes
  −−min−parallelism/max−parallelism <msec>: Probe parallelization
  −−min_rtt_timeout/max−rtt−timeout/initial−rtt−timeout <msec>: Specifies
      probe round trip time.
  −−host−timeout <msec>: Give up on target after this long
  −−scan−delay/−−max_scan−delay <msec>: Adjust delay between probes
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
  −−data−length <num>: Append random data to sent packets
  −−ttl <val>: Set IP time−to−live field
  −−spoof−mac <mac address/prefix/vendor name>: Spoof your MAC address
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 twice for more effect)
  −d[level]: Set or increase debugging level (Up to 9 is meaningful)
  −−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
  −−stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  −−no_stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
  −6: Enable IPv6 scanning
  −A: Enables OS detection and Version detection
  −−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
  −V: Print version number
  −h: Print this help summary page.
EXAMPLES:
  nmap −v −A scanme.nmap.org
  nmap −v −sP 192.168.0.0/16 10.0.0.0/8
  nmap −v −iR 10000 −P0 −p 80

ターゲットの指定

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][,host3],...> (ホスト/ネットワークを除外する)

ターゲットのコンマ区切りリストを指定し、それらが指定した全ネット ワーク範囲の一部であっても、スキャン対象から除外されるようにする。 引数として渡すリストでは通常のNmap構文が用いられるので、ホスト 名、CIDR表記のネットブロック、オクテット範囲などを含めることもでき る。このオプションが役に立つのは、スキャンしたいネットワークに、 ポートスキャンによって悪影響が及ぶことがわかっている、触れてはなら ないミッションクリティカルなサーバやシステムや、他人が管理している サブネットワークが含まれる場合である。

−−excludefile <exclude_file> (ファイルからリストを除外する)

−−excludeオプションとほぼ同じ機能を提供するが、異なる点は、除外され るターゲットが、コマンドラインではなく、改行文字、スペース、タブな どで区切った除外ファイルで渡されることである。

ホストの発見

ネットワーク偵察ミッションの第一段階に行うべきことの1つは、一連の(非常 に広範な場合もある)IP範囲を限定して、アクティブな状態であるか、関心のあ るホストのリストを作成することである。各IPアドレスのポートを1つ1つス キャンするのは、時間はかかるもののなかなか進まない、通常は無駄な作業で ある。もちろん、あるホストに興味を引かれる要因は、スキャンの目的に大き く左右される。ネットワーク管理者なら、特定のサービスを実行しているホス トにしか興味を示さないかもしれないし、セキュリティ監査人なら、IPアドレ スを持つデバイス1つ1つに関心を引かれる場合もあるだろう。内部ネットワー ク管理者なら、自分が管理するネットワーク上のホストの位置を確認するため にICMP pingを使えるだけで満足かもしれないし、外部のペネトレーションテス トの実施担当者なら、ファイアウォールの制限をすり抜けようとして、多種多 様な調査手法を使う場合もあるだろう。

このように、ホスト発見のニーズは多岐にわたるので、Nmapには、使用する技 法をカスタマイズするための幅広い種類のオプションが備わっている。ホスト 探索はpingスキャンと呼ばれることもあるが、一般的なpingツールによる単純 なICMPエコー要求パケットよりもはるかに優れている。ユーザは、リストス キャン(−sL)を用いるか、pingを無効にして(−P0)、この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スキャンを無効にし たい場合は、−P0オプションの項を参照のこと。

−sP (Ping スキャン)

このオプションを使うと、Nmapはpingスキャン(ホスト発見)のみを実行 し、応答した利用可能なホストの一覧を出力する。それ以上の調査(ポート スキャンやOS検出など)は行わない。リストスキャンよりも一歩立ち入った 調査になるが、同じ目的で使用される場合が多い。ターゲットネットワー クの予備調査を、あまり注意を引かずに軽く実行できる。攻撃者にとって は、IPおよびホスト名を1つ1つリストスキャンして得られるリストより も、アクティブなホストがいくつあるかを知ることのほうが価値がある。

またこのオプションは、システム管理者の役に立つ場合も多く、ネット ワーク上の利用可能なマシンの数を数えたり、サーバの可用性を監視した りするために容易に利用できる。pingスウィープと呼ばれることも多く、 ブロードキャストのクエリには応答しないホストが多いために、ブロード キャストアドレスにpingを打つよりも信頼性が高い。

−sPオプションはデフォルトで、ICMPエコー要求と80番ポート宛てのTCPパ ケットを送信する。高い権限がないユーザが実行する場合は、SYNパケット が(connect()コールを使って)ターゲットの80番ポートに送られる。高い権 限を持つユーザが、ローカル イーサネット ネットワーク上のターゲット のスキャンを試みる場合は、−−send−ipが指定されていない限り、ARP要 求(−PR)が用いられる。−sPオプションを、発見プローブタイプ(−P0を除 く−P*タイプ)のオプションと組み合わせると、さらに柔軟に対応できる。 このプローブタイプのどれかとポート番号のオプションを使うと、デフォ ルトのプローブ(ACKやエコー要求)よりも優先される。Nmapを実行している 発信元ホストとターゲットネットワークの間に、制限の厳しいファイア ウォールが設置してある場合は、これらの高度なテクニックを用いるべき である。さもないと、ファイアウォールでプローブパケットやホストの応 答パケットが破棄された場合に、ホストを検出し損ねる可能性がある。

−P0 (ping なし)

このオプションを指定すると、Nmapが実行するホスト発見の段階が完全に 省略される。Nmapは通常この検出段階で、さらに立ち入ったスキャンを行 うためのアクティブなマシンを割り出す。Nmapはデフォルトでは、ポート スキャン、バージョン検出、OS検出などの立ち入ったプローブは、作動し ていることが判明したホストに対してしか実行しないようになってい る。−P0を使ってホスト発見を無効にすると、Nmapはターゲットに指定され たIPアドレスすべてに対して、要求されたスキャン機能を実行しようとす る。つまり、クラスBのサイズのアドレス空間(/16)を、コマンドラインで ターゲットに指定した場合、65,536個のIPアドレスすべてがスキャンされ る。−P0の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システムでは、 このスキャンはこちらで指定したゾンビマシン(稼動中でかつ特定の条件を 満たす必要がある)から行われているものとして表示される。この非常に興 味深いスキャンタイプは複雑すぎて本稿ではとても全容を説明しきれない ので、完全な詳細を掲載した非公式の論文を以下に投稿しておくことにす る:http://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つに含まれることである。バージョン検出のメカニズム、使 用法、カスタマイズ方法に関する論文は、以下で入手でき る:http://www.insecure.org/nmap/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検出のメカニズム、使用法、カスタマイズ方法について述べた論文は、以下 で入手できる(十数ヶ国語の翻訳版あり): http://www.insecure.org/nmap/osdetect/

OS検出は、以下のオプションで実行および制御できる:

−O (OS検出を実行)

上で述べたOS検出を実行する。また別な方法として−Aオプションを使う と、OS検出とバージョン検出の両方を実行できる。

−−osscan−limit (OS検出を有望なターゲットに絞る)

少なくとも1つのopenおよびclosedのTCPポートが見つかれば、OS検出の効 率はかなり上がる。このオプションを設定すると、Nmapは上の基準に満た ないホストにはOS検出を試行しないようになる。これにより、かなりの時 間が節約できる。多くのホストに対して−P0スキャンを行う場合は特にそう である。−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 <milliseconds>; −−max−hostgroup <milliseconds> (並列ス キャンのグループサイズを調節する)

Nmapには、複数のホストを並行してポートスキャンやバージョンスキャン する能力がある。これは、ターゲットのIP空間をいくつかのグループに分 割し、一度に1グループずつスキャンすることで行われる。一般に、グルー プの規模を大きくするほど、効率がよくなる。デメリットは、グループ全 体のスキャンが終了してからでないと、ホストの結果が得られないことで ある。そのため、グループサイズが50から始めた場合、ユーザがレポート を受け取るのは、(冗長モードで最新情報が提供される場合を除く)最初 の50台のホストが完了してからになる。

デフォルトでは、Nmapはこうした競合問題に対して、妥協的なアプローチ を採る。すなわち、最初の結果がすぐに得られるように、5程度の小さなグ ループサイズから始めて、それから1024くらいにまで増やすようにする。 初めに設定する数値は、指定するオプションによって決まる。効率上の理 由で、Nmapは、UDPスキャンやポート数の少ないTCPスキャンに対しては比 較的大きなグループサイズを用いる。

グループサイズの最大値が−−max−hostgroupで指定されている場合、Nmapが このサイズを超過することは決してない。グループサイズの最小値 を−−min−hostgroupで指定すると、Nmapはグループサイズがこの値よりも小 さくならないようにしようとする。Nmapは、オプションで指定された最小 値の条件を満たすのに十分な数のターゲットホストが、所定のインター フェース上に残っていない場合は、指定より小さいグループサイズを使わ ざるを得なくなる場合もある。グループサイズを特定の範囲内に収めるた めに、最大値と最小値の両方を設定する場合もあるが、これが必要になる ケースはめったにない。

このオプションの主な使用法は、スキャンをより高速に完了できるよう に、グループサイズの最小値に大きな値を指定することである。クラスC規 模のネットワークをスキャンするには通常、256を指定する。数多くのポー トに対してスキャンを実行する場合は、これ以上の数値を設定しても、あ まり効果は期待できない。ポート数がごくわずかのスキャンを行う場合 は、ホストのグループサイズを2048以上に設定すると有効だろう。

−−min−parallelism <milliseconds>; −−max−parallelism <milliseconds> (プ ローブの並列処理を調節する)

ホストグループに向けて送信されるプローブの総数を決めるオプション で、ポートスキャンやホスト発見に用いられる。デフォルトでは、Nmap は、ネットワークパフォーマンスに基づいて、常に変化する理想的な並列 処理可能数を算出している。パケットが続けて破棄される場合は、Nmapは 処理速度を落とし、送信するプローブの数を減らす。理想的なプローブ数 は、ネットワークが示すパフォーマンスの高さに応じて、緩やかに増加す る。これらのオプションは、この変数に対して上限と下限を設定する。デ フォルトでは、理想的な並列処理可能数は、ネットワークの信頼性が低い 場合は1まで下がり、最高の状態の場合は数百まで上がる場合もある。

最も一般的な使用法は、−−min−parallelismに1より大きな数値を設定し て、パフォーマンスの低いホストやネットワークに対するスキャンの処理 速度を上げることである。ただし、軽く使うにはリスクを伴うオプション であり、あまりに大きな値を設定すると、精度に悪影響が及ぶ場合があ る。またこれにより、ネットワーク状態に基づいて並列処理可能数を動的 に制御するNmapの能力を低下させることにもなる。10程度にしておくのが 妥当かと思われるが、この値の調節は最後の手段としてしか行わない。

Nmapがホストに対して一度に2つ以上のプローブを送れないようにするため に、−−max−parallelismオプションに「1」が設定される場合がある。これ は、(下で述べる)−−scan−delayオプションと組み合わせて用いると便利で ある。もっとも、後者のオプションは通常は単独でも十分に役立つもので ある。

−−min_rtt_timeout <milliseconds>, −−max−rtt−timeout <milliseconds>, −−initial−rtt−timeout <milliseconds> (プローブのタイムアウトを調節する)

Nmapは、プローブを中止もしくは再送信するまで、プローブの応答を待機 する時間をどのくらいにするかを決める実行タイムアウト値を保持してい る。この値は、それまでに送信したプローブの応答時間に基づいて算出さ れる。ネットワークの待ち時間が、かなり長くて変化しやすい場合、タイ ムアウト値は数秒にまで達する可能性もある。また、反応が鈍いホストを スキャンする際には、控え目な(高い)レベルから始めて、しばらくの間そ のままの値にしておく場合もある。

これらのオプションはミリ秒単位で設定する。−−max−rtt−timeout−−initial−rtt−timeoutにデフォルトより小さな値を指定すると、スキャン 時間を大幅に短縮できる。厳重なフィルタ処理が施されたネットワークに 対してpingなし(−P0)スキャンを行う場合は特にそうなる。とはいえ、あま りアグレッシブに小さくしすぎないように。小さすぎる値を指定してし まったために、応答が送信されている間に数多くのプローブがタイムアウ トして再送信されてしまい、結果的にスキャンの実行に通常より余計に時 間がかかる可能性があるからだ。

すべてのホストがローカルネットワーク上にある場合、−−max−rtt−timeout の値は100ミリ秒(ms)にするのが、アグレッシブに小さく指定するとしても 妥当な値である。ルーティングが関係してくる場合は、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 <milliseconds> (遅いターゲットホストを見切る)

ホストのなかには、とにかくスキャンに長い時間がかかるものがある。理 由としては、実行手順の不手際、信頼性の低いネットワークハードウェア やソフトウェア、パケットレート制限、厳重なファイアウォールなどが考 えられる。スキャン対象ホスト全体の数パーセントを占める、最も反応が 遅いホストによって、スキャン時間の大半を使われてしまうこともある。 このような無駄はカットして、遅いホストは最初から省くほうがよい場合 がある。これは、待機しても構わない時間を−−host−timeoutにミリ秒単位 の数値で指定することで実行できる。筆者は、Nmapが単一ホストに対し て30分を超える時間を浪費しないように、1800000という値を指定すること が多い。注意すべき点は、Nmapはこの30分の間に、同時に他のホストもス キャンできるので、まったくの無駄にはならないことだ。タイムアウトす るホストはスキップされ、ポートテーブル、OS検出、バージョン検出など の結果は出力されない。

−−scan−delay <milliseconds>; −−max_scan−delay <milliseconds> (プローブ 間の遅滞時間を調節する)

指定したホスト宛てに送られるプローブの送信間隔において、ミリ秒単位 の数値で指定した時間だけNmapを待機状態にする。これは、レート制限が 行われている場合に特に役に立つ。Solarisマシンは(制限が特に厳しく)、 通常はUDPスキャンのプローブパケットに対して、ICMPメッセージの応答を 毎秒1回しか返さない。Nmapがそれ以上のパケットを送ってもすべて無駄に なる。−−scan−delay に1000を指定すると、Nmapは毎秒1回という遅いレー トを保つことになる。Nmapは、レート制限を検出し、それに応じてスキャ ンの進行を遅らせようとするが、どの程度のレートが最適であるかがすで にわかっている場合は明示的に指定してもよい。

−−scan−delay は他にも、しきい値ベースの侵入検知や侵入防止システ ム(IDS/IPS)の回避に使用される。

−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分間待機す ることである。T1T2は似ているが、それぞれプローブ間の待機時間 が15秒と0.4秒しかない。T3はNmapのデフォルト動作で、並列処理が含まれ る。T4−−max−rtt−timeout 1250 −−initial−rtt−timeout 500に相当 し、TCPスキャンの最大遅延時間を10msに設定する。T5−−max−rtt−timeout 300 −−min_rtt_timeout 50 −−initial−rtt−timeout 250 −−host−timeout 900000に相当し、TCPスキャンの最大遅延時間を5msに 設定する。

ファイアウォール /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オプションが必要になるだろう。また通常は−P0も使った方が望まし い。

−e <interface> (特定のインターフェースを使用する)

パケットを送受信する際に、どのインターフェースを利用するかをNmapに 伝えるためのオプション。Nmapは、インターフェースを自動的に検知でき るようになっているが、検知できない場合はその旨がユーザに通知され る。

−−source−port <portnumber>; −g <portnumber> (ソースポート番号を偽装す る)

よく見かける設定ミスの1つは、ソースポート番号だけを基準にして、トラ フィックを信頼していることである。これがどのようにして起きるかを理 解するのは簡単である。管理者が真新しいファイアウォールをセットアッ プすると必ず、恩知らずのユーザから、アプリケーションが機能しなく なったという苦情が殺到することになるものだ。特に、外部サーバから のUDP DNS応答がネットワークに入れなくなることが原因で、DNSが動かな くなる場合がある。この他に、FTPもよく見られる例である。アクティ ブFTP転送が行われる際に、リモートサーバは、要求されたファイルを転送 するために、再びクライアントへのコネクションを確立しようとする。

これらの問題に対するセキュアなソリューションは、多くの場合、アプリ ケーションレベルのプロキシや、プロトコル解析型ファイアウォールモ ジュールの形で存在する。だが残念ながら、もっと簡単で、安全性の低い ソリューションもあるのだ。多くの管理者は、DNS応答は53番ポートから、 アクティブftpは20番ポートから来ることに注目し、これらのポートからの 内向きトラフィックを無条件に許可してしまうという罠に陥る。こうした ファイアウォールの抜け穴の存在に気付いて悪用するような攻撃者がいる とは思ってもいない場合が多い。また別のケースでは、管理者がこうした 処置を、より安全性の高いソリューションを実装するまでの短期間の応急 処置と見なしている場合もある。そして結局、セキュリティを向上させる ことなどすっかり忘れてしまうわけだ。

こうした罠に陥るのは何も、多忙なネットワーク管理者だけではない。こ の種の安全性の低いルールが標準で装備されてくる製品は膨大な数にのぼ る。マイクロソフト社にも、責任の一端はある。Windows 2000 や Windows XPに標準装備されているIPsecフィルタには、88番ポート(Kerberos)から のTCP や UDPのトラフィックをすべて許可するという暗黙のルールが含ま れている。この他に有名なケースでは、Zone Alarm社製パーソナルファイ アウォールの2.1.25以下のバーションでは、ソースポートが53番(DNS)と67 番(DHCP)の内向きUDPパケットをすべて許可するようになっていた。

Nmapには、この種の弱点を突くためのオプションとして、−g−−source−port(これらは同等のもの)が用意されている。単ポート番号を 指定すると、可能な場合であれば、Nmapはそのポートからパケットを送信 する。特定のOS検出検査が正しく機能するようにするために、Nmapは様々 なポート番号を使用する必要がある。NmapはDNS要求の処理にシステムのラ イブラリを用いているので、この−−source−portフラグを指定していて も、DNS要求には無視されることになる。SYNスキャンを含む大部分のTCPス キャン、およびUDPスキャンは、このオプションに完全に対応している。

−−data−length <number> (送信パケットにランダムデータを付加する)

通常、Nmapはヘッダのみを含む最小限のパケットを送信する。従って、TCP パケットは通常40バイト、ICMPエコー要求パケットは28バイト程度の大き さしかない。このオプションは、Nmapが送信するほとんどのパケットに、 指定したバイト数のランダムデータを付加するようにする。OS検出(−O)パ ケットにはデータは付加されないが、ほとんどのping およびポートスキャ ンのパケットには付加される。これにより、処理速度は低下するが、ス キャンを幾分でも目立たなくすることができる。

−−ttl <value> (IPのTTLフィールド値を設定する)

送信パケットのIPv4生存時間(TTL:Time−to−Live)フィールドを指定した値 に設定する。

−−randomize−hosts (ターゲットホストの順番を無作為化する)

このオプションは、Nmapがスキャンを実行する前に、各グループあたり最 大8096のホストをランダムに並び替えるようにする。これにより、特にス キャン速度を遅く設定するタイミングオプションと併用する場合は、各種 ネットワーク監視システムにスキャンが検知される可能性を小さくするこ とができる。より大規模なグループを無作為化したい場合は、nmap.h のPING_GROUP_SZを増やして再コンパイルする。別の手段としては、リスト スキャンでターゲットIPリストを作成し(−sL −n −oN filename)、これ をPerlスクリプトで無作為化して、−iLでリストをそのままNmapに渡す。

−−spoof−mac <mac address, prefix, or vendor name> (MACアドレスを偽装す る)

Nmapが送信するすべての生イーサネット フレームに、指定したMACアドレ スを使うようにする。このオプションは、Nmapが実際にイーサネットレベ ルのパケットを送信するように、−−send−ethが必要条件になる。MACアドレ スは、さまざまな形式で指定できる。文字列の“0”だけが指定された場合 は、NmapはセッションのMACアドレスを完全に無作為に選ぶ。指定した文字 列が偶数の16進数(一組ずつ状況に応じてコロンで区切る)の場合は、Nmap はこれをMACアドレスとして使用する。12桁未満の16進数が指定された場合 は、Nmapは残りの6バイトにランダムな値を補充する。引数が0や16進文字 列ではない場合は、Nmapはnmap−mac−prefixes を調べて、指定した文字列 を含むベンダ名を見つける(大文字と小文字は区別されない)。一致するも のがあった場合、そのベンダのOUI(Organizationally Unique Identifier:3バイトのベンダコード)を使用し、残りの3バイトにはランダ ムに記入する。有効な−−spoof−mac引数 は、Apple、0、01:02:03:04:05:06、deadbeefcafe、0020F2、Ciscoなどに なる。

出力

セキュリティツールの実用性は、生成される出力で決まる。複雑なテストやア ルゴリズムも、結果が整理された、わかりやすい形で提示されなければ、ほと んど価値はない。ユーザや他のソフトウェアによる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には、フォーマッ トの文法要素が定義されており、これらの要素が取ることのできる属性や 値が列挙されていることが多い。最新版は以下から常時入手でき る:http://www.insecure.org/nmap/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 http://www.insecure.org/nmap/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」変数の設定がある。

−−interactive (インタラクティブモードで開始する)

Nmapをインタラクティブモードで開始する。このモードでは、対話型のプ ロンプトによって、複数のスキャンを(同時進行かバックグラウンドかで) 簡単に開始することができる。これは、マルチユーザシステムからスキャ ンを行う場合に役に立つ。システムのセキュリティ検査を行う際に、どの システムをスキャンしているかをシステム上の誰にも知られずに実施した い場合が多いからだ。−−interactive を使ってインタラクティブモードに したら、h と入力してヘルプを表示してみよう。このオプションはめった に使用されない。なぜなら、適切なシェルのほうが、使い慣れているし、 機能も揃っているからだ。このオプションには、シェルコマンドを実行す るためのbang演算子(!)が組み込まれている。setuid rootでNmapをインス トールしない多くの理由の1つがこれである。

−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 −P0 −p 80

Nmapは100,000台のホストを無作為に選び、Webサーバ(80番ポート)のスキャン を行う。ホストの列挙は−P0 で無効にしてある。各ターゲットホスト上で1つの ポートしか調査しないのに、どのホストが稼動中であるかを特定するためにプ ローブを送るのは無駄だからだ。

nmap −P0 −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を使っていて、思い通りに動かない場合は、ま ずhttp://www.insecure.org/nmap/から入手できる最新のバージョンにアップグ レードしてみる。問題が続くようなら、すでに発見・対処が行われた問題かど うかを調査して確かめる。エラーメッセージをGoogle検索した り、http://seclists.org/でNmap−devアーカイブを閲覧したりしてみる。こ のmanページも全体に目を通した方がよい。それでもどうにもならない場合は、 バグレポートを<dev@nmap.org>宛てにメールで送ること。メールには、使用し ているNmapのバージョンと、Nmapを実行しているOSの名前とバージョンなどの 情報だけでなく、問題に関して分かったことは何でも書いていただきたい。問 題の報告やNmapの使い方についての質問などは、dev@nmap.org宛てに送るほう が、筆者宛てに直接送るよりも返事がある可能性ははるかに高い。

またバグレポートより、バグを修正するためのコードパッチのほうが歓迎され る。ユーザ自身のコード変更によるパッチファイルの作成方法についての基本 的な注意事項はhttp://www.insecure.org/nmap/data/HACKING で参照できる。 パッチは、nmap−dev宛てに送る(推奨)か、筆者Fyodorまで直接送っていただき たい。

作者

Fyodor <fyodor@nmap.org> (http://www.insecure.org)

ここ数年で何百人もの人々から、Nmapに対して貴重な貢献をしていただいた。 この詳細については、Nmapとともに配布されているCHANGELOGファイルを参照の こと。CHANGELOGファイルは以下からも入手でき る:http://www.insecure.org/nmap/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のダウンロード先として以下を 示すことが必要である:http://www.insecure.org/nmap/

われわれはこれらを、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の輸出には、特別なライセンスや許可、あるいは政府の承認を一 切必要としない。

NOTES

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

スポンサーリンク