Nmap
公式ウェブサイト より:
- Nmap (“Network Mapper”) は、ネットワーク調査およびセキュリティ監査を行うためのオープンソースのツールである。大規模ネットワークを高速でスキャンするように設計されているが、単一のホストに対してもまったく問題なく機能する。Nmap は生の (raw) IP パケットを用いて、ネットワーク上でどのようなホストか利用可能になっているか、これらのホストが提供しているサービス (アプリケーション名とバージョン) は何か、ホストが実行している OS (OS 名とバージョン) は何か、どのような種類のパケットフィルタ/ファイアウォールが使用されているかなど、その他数多くの特徴を斬新な方法で判別する。Nmap は、セキュリティ監査用に広く利用されているばかりでなく、ネットワーク・インベントリ (資産情報収集)、サービスのアップグレード予定管理、ホストやサービスのアップタイム (利用可能時間) の監視等の日常業務に Nmap を役立てているシステム管理者やネットワーク管理者も多い。
目次
インストール
Nmap パッケージには zenmap
という名前の GUI が付属していますが、この記事ではコマンドラインによる利用方法しか扱いません。
使用方法
対象の指定
スキャンする IP アドレスのリストを Nmap に指定する方法は複数存在します。一番簡単な方法はアドレスやドメイン名を単純にわたす方法です:
$ nmap scanme.nmap.org $ nmap 74.207.244.221
複数の対象の指定
CIDR 表記を使用。例えば 10.1.1
から始まる 256 のアドレス全てをスキャンするには:
$ nmap 10.1.1.0/24
ダッシュを使用。例えば 10.1.50.1
, 10.1.51.1
, 10.1.52.1
をスキャンするには:
$ nmap 10.1.50-52.1
カンマを使用:
$ nmap 10.1.50,51,52,57,59.1
上記の組み合わせ:
$ nmap 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2
リストスキャン
実際にスキャンを行う前に、指定したアドレスが問題ないか確認したいときはリストスキャンオプション (-sL
) が便利です:
$ nmap -sL 10.1,2.50-52.1/30 10.1.1.1 10.1.1.2
リストスキャンは指定されたアドレスを出力します。対象にパケットは送信しません。
デフォルトオプション
IP アドレスやドメイン名を一つだけ指定して他にオプションを使わない場合:
$ nmap 74.207.244.221
Nmap は以下のことを行います:
- IP アドレスはドメイン名に逆引きされ、ドメイン名が指定された場合は逆に IP アドレスを取得します (
-n
を指定することで無効化できます)。 - TCP ACK:80 と ICMP を使って Ping スキャンを行います。
-PA -PE
と同じです (-PN
を指定することで無効化できます)。 - 最も有名なトップ 1000 のポートをスキャンします。root で実行した場合、SYN ステルススキャンが使われます。ユーザーで実行した場合、Connect スキャンが使用されます。
Ping スキャン
Ping スキャン (ホスト発見) は特定のコンピュータが動作しているかどうかを調べるために使われます。接続すらできないホストに無駄に時間を費やさないように、デフォルトで Nmap はポートスキャンの前に Ping スキャンを実行します。Nmap で Ping スキャンだけを行うには:
$ nmap -sP 10.1.1.1/8
Nmap は指定された全てのアドレスに ping を送って、ping に応答したホストのリストを報告します。
ユーザー権限で実行されたか、あるいは root 権限で実行されたか、また、スキャンするサブネットが同一かそうでないかなどで、Nmap は別々の種類の ping パケットを使います:
外部 IP | ローカル IP | |
---|---|---|
ユーザー権限 | ポート 80 & 443 の TCP SYN | ポート 80 & 443 の TCP SYN と ARP |
Root 権限 | ポート 80 & 443 の TCP SYN と IGMP | ARP |
Ping スキャンタイプ
オプション | Ping スキャンタイプ |
---|---|
-Pn |
ping スキャンを完全に無効化 |
-PS |
TCP SYN (デフォルトはポート 80) |
-PA |
TCP ACK (デフォルトはポート 80) |
-PU |
UDP |
-PY |
SCTP INIT |
-PE |
ICMP エコー (Echo) |
-PP |
ICMP タイムスタンプ (timestamp) |
-PM |
ICMP アドレスマスク (mask) |
-PO |
他 (Other) の IP プロトコル |
-PR |
ARP スキャン |
マシンのファイアウォールが厳重で、TCP 80 や 443 ポートあるいは IGMP リクエストがブロックされる場合は -Pn
が有用です。ただし他のマイナーなポートが開いている可能性はあります。
ポートスキャン
ポートには主として3つの状態があります:
open
- listen しているプログラムが存在して、このポートに対するリクエストに反応している。closed
- このポートへのリクエストに対して "error: no program listening on this port" がホストから返される。filtered
- ホストが返事を全くしない。おそらく、パケットを "drop" して返答をしないように設定されたファイアウォールルールによって制限されています。
上記に加えて、Nmap はさらに3つの状態にポートを分類します。はっきりとは状態を確認できないが3つの状態のうち2つに絞れる場合に使われます:
open|closed
(unfiltered
) - ポートは開いている、あるいは閉じているclosed|filtered
- ポートは閉じている、あるいはフィルタリングされているopen|filtered
- ポートは開いている、あるいはフィルタリングされている
デフォルトでは /etc/nmap/nmap-services
に記載されている最も人気のある 1000 のポートをスキャンします。一般的なポート番号を指定するには:
$ nmap --top-ports 10.1.1.1
特定のポート番号を指定するには、-p
を使います:
$ nmap -p -25,135-137 10.1.1.1
#対象の指定と同じようにダッシュやカンマが使えます。さらに、ダッシュを使用するときに開始ポートや終末ポートを省くことで、特定のポートの前後のポートを全て指定することができます。例えば、65535 個の全てのポートをスキャンするには (ポート番号 0 は除外):
$ nmap -p -
スキャンタイプ
オプション | ポートスキャンタイプ |
---|---|
-sP |
Ping スキャンのみ |
-sS |
TCP SYN (ステルス) (root ではデフォルト) |
-sT |
TCP connect (root ではデフォルト) |
-sA |
TCP ACK |
-sF |
TCP FIN |
-sX |
TCP FIN, SYN, ACK |
-sW |
TCP ウィンドウ |
-sM |
TCP Miamon |
-sU |
UDP スキャン |
-sI |
Idle スキャン |
-b |
FTP バウンススキャン |
-sO |
他の IP プロトコル |
スキャン対策
iptables PSD モジュール
PSD は iptables の拡張モジュールです。Linux ベースの商用ルーターでも使われています。
PSD モジュールにはパラメータが4つあります:
--psd-weight-threshold threshold
, 規定値:21
- ポートスキャンとして判断する、同一ホストからの別々のポートへの TCP/UDP パケットの総量。
--psd-delay-threshold delay
, 規定値:300
(3秒)
- ポートスキャンとして判断するときに使用する、同一ホストからの別々のポートへのパケットを記録する時間 (センチ秒)。
--psd-lo-ports-weight weight
, 規定値:3
- 特権ポート (<=1024) に送信されたパケットの重み付け。
--psd-hi-ports-weight weight
, 規定値:1
- 非特権ポート (>1024) に送信されたパケットの重み付け。
PSD の原理は単純です。単一の IP からのリクエストが delay で指定した秒数以内に threshold よりも高くなった場合、その IP はポートスキャナとして判断されます。数式で表すと:
lo_ports_weight * REQUESTS_LOW + hi_ports_weight * REQUESTS_HIGH >= threshold
上記の数式の変数の中身は以下のとおり:
REQUESTS_LOW = delay 秒以内の特権ポート (0 から 1024) へのリクエストの数 REQUESTS_HI = delay 秒以内の非特権ポート (1024 から 65535) へのリクエストの数
例:
- 規定値では、3秒以内に7つの特権ポートにパケットが送られると、ポートスキャンと判断されます。
- 規定値では、3秒以内に21の非特権ポートにパケットが送られると、ポートスキャンと判断されます。
- 規定値では、3秒以内に4つの特権ポートと9つの非特権ポートにパケットが送られると、ポートスキャンと判断されます (
4*3 + 9*1 >= 21
)。
探知の回避
PSD を回避する一番簡単な方法はゆっくりスキャンすることです。PSD が規定値なら、以下のパラメータで看破できます:
$ nmap --scan-delay 3.1 192.168.56.1
PSD には他にも、ack
や rst
フラグが設定されていればリクエストをポートスキャンと検出しないという興味深い事実があります (xt_psd.c の is_portscan
関数を見て下さい)。
また、ホストをポートスキャンするときに HTTP(S) サービスが動作している場合、nmap はデフォルトのユーザーエージェントとして Mozilla/5.0 (compatible; Nmap Scripting Engine; http://nmap.org/book/nse.html)
を使います。ユーザーエージェントはログに記録されるので、何をしているのか簡単にわかってしまいます。特に管理者やロボットなら造作もないでしょう。幸運にも、nmap では文字列を簡単に変えることができます: -script-args http.useragent="user agent you want"
と指定して下さい [1]。
Tips and Tricks
スキャン速度の制限
Nmap のスキャンは高速です。基本的には高速なことは良いことですが、場合によっては速すぎて困ることもあります。例えば、侵入を検知するルールを無効にしないでシステムのファイアウォールをテストしたい場合や、特定のポートやサービスを長期間にわたってテストしたい場合などが考えられます。以下のオプションで Nmap がパケットを送信する速度を指定できます。
最大でも 3.333 秒毎にパケットを送信するには:
$ nmap --max-rate 0.3 192.168.56.1
もしくは、3.1 秒毎にパケットを送信するには:
$ nmap --scan-delay 3.1 192.168.56.1
他の速度や並列化のオプションについては man nmap
を見て下さい。
ファイルから入力して対象を指定
とびとびのアドレスを大量にスキャンする必要があるということも考えられます。その場合アドレスをコマンドラインで指定するのは厄介です。これについて Nmap ではリストファイル (list file) からの入力 (input) をサポートしています (-iL
):
addresses.txt
10.1.1.1 10.1.1.2 10.1.1-10.3 10.3.1.3 10.3.1.50 10.3.2.55 10.1.1.100 ...
$ nmap -iL addresses.txt
ファイル内のアドレスは空白で区切っておかなければなりません。
また、Nmap は標準入力からリストを読み込むことも可能です (多くのコマンドラインプログラムで -
は標準入力を意味します):
$ echo "10.1.1.1 10.1.1.2 10.1.1-10.3" | nmap -iL -
スキャンの対象から除外
$ nmap 10.1.1.1-10 --exclude 10.1.1.5,7
ファイルを使用して除外:
$ nmap 10.1.1.1-10 --excludefile excludeaddr.txt
スプーフィング
送信元 IP を偽装するには:
$ nmap -S 192.168.56.35 -e vboxnet0 192.168.56.11
送信元 MAC アドレスを偽装するには:
$ nmap --spoof-mac 192.168.56.11
送信元ポートを偽装するには:
$ nmap --source-port 22 192.168.56.11
スキャンの高速化
デフォルトでは、Nmap は対象の DNS の解決と逆引きを行います。DNS の解決を行わない (never) ように Nmap を設定するには、-n
オプションを渡します:
$ nmap -n 192.168.56.0/24
これでスキャンの速度が2倍になります。
ポート番号 0 をスキャン
デフォルトではポート 0 はスキャンされません。たとえ -p -
と指定されてもです。ポート 0 をスキャンするには、明示的にポート 0 を指定する必要があります。例えば、全てのポートをスキャンするには:
$ nmap -p 0-65535
RFC 標準ではポート 0 は利用できないことになっているのを覚えておいて下さい。しかしながら、ポートスキャナを掻い潜ろうとするマルウェアなどはポート 0 を使うことがあります。
ファイル出力フォーマット
Nmap ではターミナルに出力するだけでなくファイルに出力することもできます:
-oN filename
- ターミナルの出力と同じように通常出力。
-oX filename
- XML で出力。スキャンの詳細な情報が出力され、簡単にソフトウェアでパースできます。
-oG filename
- Grepable 出力。廃止予定。
-oA
- 上記の全ての組み合わせ。ファイル名が指定されなかった場合
sitename.nmap
,sitename.xml
,sitename.gnmap
というファイルが作成されます。
例えば、ターミナルに出力して、ファイルに出力して、XML ファイルに出力するには:
$ nmap -oN output.txt -oX output.xml scanme.nmap.org