LinuxやUNIXでよく利用するポートスキャン(ネットワークスキャン)コマンドといえば、nmapコマンドだ。
今回は、そんなnmapコマンドの覚えておきたい使い方について紹介する。
1.基本的な使い方
nmapコマンドは、基本的に以下のように実行する事で、対象ホストのポートスキャンを行う。
nmap 対象ホスト(ホスト名orIPアドレス)
test@test-vm-ubuntu:~$ nmap 192.168.0.208
Starting Nmap 6.40 ( http://nmap.org ) at 2015-06-01 01:35 JST
Nmap scan report for 192.168.0.208
Host is up (0.00080s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
5222/tcp open xmpp-client
5280/tcp open xmpp-bosh
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
test@test-vm-ubuntu:~$
たとえば、「192.168.0.208」に対しnmapを実行すると、開いているポート番号の一覧を取得することが出来る。
なお、オプション無しで確認できるのはTCPプロトコルのみだ。UDPの確認方法については後述する。
2.複数のホストをスキャンする
複数のホストを同時にスキャンする場合は、以下のようにそのまま複数記述して実行すればいい。
nmap 対象ホスト1(ホスト名orIPアドレス) 対象ホスト2 対象ホスト3 ...
連続したIPアドレスの場合は、以下のように指定する事も出来る。
nmap 192.168.0.100-110
別途、対象ホストを記述したリストファイルを利用してスキャンを行う事も出来る。
nmap -iL リストファイルPATH
その他、ネットワークアドレスを指定してスキャンすることも可能だ。
nmap 192.168.0.100/24
3.スキャンするプロトコル・ポートを指定する
nmapでは、オプションでスキャンをするプロトコル(TCP/UDP/IP)やポート番号を指定することができる。
TCPプロトコルを指定する(デフォルト)
スキャンを行うプロトコルとしてTCPを明示的に指定する場合は、「-sT」オプションを付与する。
nmap -sT 対象ホスト(ホスト名 or IPアドレス)
ポートも一緒に指定する場合は、「-p」で指定する。
nmap -sT -p ポート番号 対象ホスト(ホスト名 or IPアドレス)
なお、TCPに関してはプロトコルの指定方法も細かく分類されている。
- -sS … TCPのSYNパケットを送ってSYN+ACKが返ってくるか調べる(TCP SYNスキャン/TCPハーフスキャン)
- -sA … ACKフラグだけのパケットを送って調べる(TCP ACKスキャン)
- -sN … まったくフラグなしのパケットを送って調べる(TCP Nullスキャン)
- -sF … FINフラグだけのパケットを送って調べる(TCP FINスキャン)
- -sX … FIN/PSH/URGフラグを立てたパケットを送って調べる(Xmasスキャン)
UTPプロトコルを指定する
スキャンを行うプロトコルとしてUTPを指定する場合は、「-sU」オプションを付与する。
nmap -sU 対象ホスト(ホスト名 or IPアドレス)
ポートも一緒に指定する場合は、「-p」で指定する。
nmap -sU -p ポート番号 対象ホスト(ホスト名 or IPアドレス)
IPプロトコルを指定する
スキャンを行うプロトコルとしてIPを明示的に指定する場合は、「-sO」オプションを付与する。
nmap -sO 対象ホスト(ホスト名 or IPアドレス)
4.OSとそのバージョンを検知する
nmapでは、「-O」オプションでOSの種類を、「-A」オプションでOSの種類とそのバージョンを検知する事が出来る。
OSの種類のみ取得
nmap -O 対象ホスト(ホスト名 or IPアドレス)
OSの種類とその細かいバージョンを取得
nmap -A 対象ホスト(ホスト名 or IPアドレス)
5.事前のping送信をせずにスキャンを行う
nmapでは、スキャンの前にpingでの疎通確認を行っている。
これを行わせないようにするには、「-Pn」オプションを付与する。
nmap -Pn 対象ホスト(ホスト名 or IPアドレス)
6. ファイアーウォールで保護されているか確認する
対象のホストがファイアーウォールに 保護されているかどうかは、「-sA」オプションを利用することで確認出来る。
(filteredというのが出力されたら保護されている。なお、これはOS上でファイアーウォールが動作していても同様。)
nmap -sA 対象ホスト(ホスト名 or IPアドレス)
7.パケットの送信元を偽装する
nmapでは、「-S」オプションを利用することで送信元IPアドレスを偽装(IP Spoofing)してパケットの送信を行うことが出来る。
なお、パケット元を偽装する場合は「-e」オプションでインターフェイス(eth0など)を指定する必要があるので注意。
nmap -e インターフェイス -S 偽装したい送信元IPアドレス 対象ホスト(ホスト名 or IPアドレス)
対象ホストのログにこちらのIPアドレスを完全に残したくない場合は、「-sI」オプションでIdleScanを利用し、踏み台経由でのスキャンを行うと良いだろう。
細かい内容については、こちらが詳しい。
nmap -sI 踏み台サーバ 対象ホスト(ホスト名 or IPアドレス)
こちらは通常はあまり利用しないと思うが、「-D」オプションを付与することで、囮の送信元IPアドレスを指定して、複数の送信元から同時にスキャンを行っているように装う事も出来る。
nmap -D 偽装したい送信元IPアドレス1 偽装したい送信元IPアドレス2 ... 対象ホスト(ホスト名 or IPアドレス)
「--source-port」オプションで、送信元ポートを偽装することも出来る。
nmap --source-port 偽装したいソースポート番号 対象ホスト(ホスト名 or IPアドレス)
また、「--spoof-mac」 でMACアドレスの偽装を行う事も出来る。
MACアドレスの指定方法は、直接指定の他にベンダー名(Apple,Ciscoなど)やランダムでの生成(0)などがある。
nmap -sT -Pn --spoof-mac 偽装したいMACアドレス 対象ホスト(ホスト名 or IPアドレス)
8.詳細情報を出力させる
「-v」オプションを付与することで、詳細なスキャン情報を取得することが出来る。
nmap -v 対象ホスト(ホスト名 or IPアドレス)
9.現在動作しているマシンの一覧を取得する
以前こちらでも紹介した内容だが、「-sP」オプションを実行することで、pingを利用してそのネットワークで現在動作しているマシンの一覧を取得する事が出来る。
nmap -sP 対象ホストのネットワーク(192.168.0.0/24など。範囲を普通に指定するだけでも可能)
10.高速にスキャンを行う
高速にスキャンを行いたい場合、「-F」オプションを付与することで、よく利用されるポートのみに絞ってスキャンを行う事で時間を短縮することが出来る。
nmap -F 対象ホスト(ホスト名 or IPアドレス)
11.対象ポートのプロトコルのバージョンを確認する
「-sV」オプションを指定することで、対象のポートで動作しているソフトやプロトコル(sshなど)のバージョンを取得することが出来る。
なお、ポートを指定せずに実行するとすごい時間がかかるので、基本的にポート指定とセットで実行すると良いだろう。
nmap -sV -p ポート番号 対象ホスト(ホスト名 or IPアドレス)
とりあえず、以上11個の使い方を挙げてみた。
nmapには他にも色々な使い方があるので、随時追加していきたいと思う。