ポートスキャン・ツールNmapを使って、サーバーやファイアウォールなどの確認方法



●Nmapとは

 Nmapは、ポートスキャン・ツールと呼ばれるネットワークツールで、目的のサーバーでどのサービス(ポート)に接続可能なのかを調べるツールです。
 本来は、自身の構築したネットワークで、どのポートが開いているかを調べるために用いますが、クラッカが攻撃目標のサーバーの情報を集めるためにも使われているので、使用にあたっては十分注意してください。
 Nmapは多機能で、TCPのSYNスキャンやNullスキャン、OSの推測が可能です。
 また、Linux以外に、Windows OS、FreeBSD、OpenBSD、Solaris、IRIX、Mac OS X、HP-UX、NetBSD、Sun OSなど多数のOSをサポートしています。
 Nmapの開発元Webサイトは、http://www.insecure.org/nmap/です。同サイトには、ソースファイルもRPMパッケージもあるので、どちらでも好きな方でインストールしてください。インストール方法もサイトの同じページに掲載されています。
 最新バージョンは3.70で、ソースファイルがnmap-3.70.tar.bz2、RPMパッケージがnmap-3.70-1.i386.rpmとなっています。nmap-frontend-3.70-1.i386.rpmであれば、NmapをX-Windowでグラフィカルに操作できます。

●Nmapでポートスキャン

 では、実際にNmapを使ってみましょう。一般ユーザーでも使用できますが、一部機能はroot権限がないと実行できないので、suコマンドでroot権限になって、cdコマンドで/usr/binに移動してください。そこで、
  # nmap
と入力すると、英文ですが簡単な説明が表示されるはずです。基本的な使用方法は、
  # nmap [オプション] ホスト名(またはIPアドレス)
です。
 Nmapには多数のオプションがあり、代表的なオプションは、
オプション 内容
-sT TCPポートのスキャン(TCPフルコネクトスキャン)を行います。目標のコンピュータにSYNパケット(通信開始要求)を送り、相手から許可(SYN/ACKパケット)が送られたら実際にコネクションを張って(ACKパケットを送信)みてポートが開いていると判断します。
-sS TCP SYNスキャン(TCPハーフコネクトスキャン)を行います。目標のコンピュータにSYNパケットを送った後、SYN/ACKパケット(許可)かRST/ACKパケット(拒否)のどちらが返ってきたか、によってポートの開閉を判断します。ただし、SYN/ACKが返ってきた場合、通信を確立しないでRSTパケットを送信して通信を取りやめてコネクションを中断します。従って、サービス自体は全くログを残さないので「ステルススキャン」と呼ばれています。
-sU UDPポートのスキャンを行います。空のパケットを目的のコンピュータに送信、返事が来なかったらポートが開いていると判断し、ICMP-port-unreachableが返ってき たらポートが閉じている、と判断します。ただし、UDPはもともと信頼性のない通信ですので、スキャン結果も基本的に信頼性に欠けます。
-sP 指定されたネットワーク上に、ICMP echo-requestを送り、稼働しているマシンを探します(pingスキャン)。
-P0 ICMP echo-requestが、ファイアウォールなどで許可されていないホストに対してスキャンする場合に使用します。具体的には、ホストスキャン時にpingを使用しません。
-O TCP/IPのフィンガープリントを使用して、対象ホストのOSを調べます。フィンガープリントを用いるためにroot権限がないと実行できません。
-o [filename] スキャンした結果を指定したファイル([filename])に出力します。
-i [filename] スキャン対象ホストをファイル([filename])から読み込みます。
-p [port range] スキャンするポートを[port range]で指定します。例ば「-p 1-65535」のように指定します。


などです。
 では、Sambaサーバー(192.168.1.11)に対して、TCPフルコネクトスキャンを行ってみましょう。
  2:  # nmap -sT 192.168.1.11
  3:
  4:  Starting nmap V. 3.50 ( www.insecure.org/nmap/ )
  5:  Interesting ports on  (192.168.1.11):
  6:  (The 1596 ports scanned but not shown below are in state: closed)
  7:  Port       State       Service
  8:  22/tcp     open        ssh
  9:  111/tcp    open        sunrpc
 10:  139/tcp    open        netbios-ssn
 11:  901/tcp    open        samba-swat
 12:  6000/tcp   open        X11
 13:  
 14:  Nmap run completed -- 1 IP address (1 host up) scanned in 6 seconds
 15:  #
となります。
 8行目の22/tcpがssh(Secure Shell)、9行目の111/tcpがsunrpc(SUN Remote Procedure Call:プロセス同士の通信に用いられるプロトコル)、10行目の139/tcpがnetbios-ssn(IBM社によって開発されたネットワーク制御用BIOS)で、これがSambaサーバーで使用するポート。11行目の901/tcpがsamba-swat(Sambaサーバーの管理を、Webブラウザ経由で行うことの出来るツール)、12行目の6000/tcpがX11(X Window System)です。
 また、6行目の()内の最後にはclosedとあり、8から12行目のState欄にはopenとあります。これらがそのポートの状況であり、ファイアウォールなどでフィルタリングされている場合は、filteredと表示されるので、フィルタリングが設定したとおりに行われているかどうかの判断材料になります。
 上記のように-pオプションを指定しないデフォルトで実行すると、スキャン対象となるポートはWell-Knownポートに限られてしまいます。
 16:  # nmap -sT -p 1-65535 192.168.1.11
と、「-p」オプション指定に続けて、「1-65535」とポート番号の範囲を指定して実行すると、
 17:  Starting nmap V. 3.50 ( www.insecure.org/nmap/ )
 18:  Interesting ports on  (192.168.1.11):
 19:  (The 1596 ports scanned but not shown below are in state: closed)
 20:  Port       State       Service
 21:  22/tcp     open        ssh
 22:  111/tcp    open        sunrpc
 23:  139/tcp    open        netbios-ssn
 24:  901/tcp    open        samba-swat
 25:  6000/tcp   open        X11
 26:  32768/tcp  open        unknown
 27:  
 28:  Nmap run completed -- 1 IP address (1 host up) scanned in 4 seconds
 29:  #
と、26行目のようにWell-Knownポート以外もスキャンされます。  -pオプションに続けて指定されている1-65535のポート範囲は、全てのポートを指定したことになります。
 ちなみに、26行目の32768はTCP、UDP共にNFS(Network File System:分散ファイル・システム)サービスで使用されています。

●netstatで通信状態の確認

 Nmapでは、目的のコンピュータのポートを調べますが、自身の開いているポートなど、TCP/IPプロトコルやネットワーク・インターフェイスの稼働状況を示す各種の統計情報を知るにはnetstatコマンドを用います。
 目的のコンピュータで、
  # netstat -anut【Enter】
と入力すると、
  Active Internet connections (servers and established)
  Proto Recv-Q Send-Q Local Address    Foreign Address        State
  tcp       0      0  0.0.0.0:32768    0.0.0.0:*              LISTEN
  tcp       0      0  127.0.0.1:32769  0.0.0.0:*              LISTEN
  tcp       0      0  0.0.0.0:901      0.0.0.0:*              LISTEN
  tcp       0      0  0.0.0.0:111      0.0.0.0:*              LISTEN
  tcp       0      0  0.0.0.0:6000     0.0.0.0:*              LISTEN
  tcp       0      0  0.0.0.0:22       0.0.0.0:*              LISTEN
  tcp       0      0  127.0.0.1:631    0.0.0.0:*              LISTEN
  tcp      36      0  192.168.1.11:22  192.168.1.7:2234  ESTABLISHED
  udp       0      0  0.0.0.0:32768    0.0.0.0:*
  udp       0      0  0.0.0.0:941      0.0.0.0:*
  udp       0      0  0.0.0.0:111      0.0.0.0:*
と表示されます(行を詰めています)。
 このように、netstatを使うと、開いているIPアドレス、ポート番号と、接続しているホストのIPアドレス、ポート番号、とそれらの状態を確認することが出来ます。
 オプションとして指定されている-anutは、-aが接続待ち状態にある「ソケットも、接続待ち状態にないソケットも表示する」オプションで、-nが「ホスト・ポート・ユーザーなどの名前を解決せずに、数字のアドレスで表示する」オプション、-uが「UDPを指定」、-tが「TCPを指定」するオプションです。
 他のオプションや詳しい説明はmanコマンドで確認してください。

 このように、サーバーやファイアウォールに対して、不必要なポートが開いていないかの確認のためにNmapでポートスキャンを行ったり、netstatでそれぞれのコンピュータの通信状況を確認することは、安全なネットワークを構築するするための重要な作業となります。