フォティーンフォティ技術研究所
取締役技術担当
金居 良治

 ポート・スキャナは元々,リモート・ホストの開いているポートをスキャンするシンプルなツールだったが,最近は様々なセキュリティ関連機能が実装され,便利になっている。例えばリモート・ホストが搭載するTCP/IPスタックの挙動の違いなどからOS名を検出したり,簡単なぜい弱性チェックを実行したりできる。

 半面,ポート・スキャナ自体は複雑になっている。ポート・スキャンという技術自体はシンプルなのだが,実はツールとしてのポート・スキャナを使いこなすことが難しくなっているのである。そこで本稿では,ポート・スキャナとして著名なフリーツールの「nmap」を取り上げ,その最新機能を技術面から解説する。

 nmapはポート・スキャナとしてはもちろん,OS検出などの周辺機能が充実していることで有名である。OS検出エンジンのデータベースは非常に充実しており,商用スキャナの中にもnmapのOS検出エンジンを利用しているものが多くある。それ以外の様々な機能を含め,開発は今もアクティブに行われている。

 現在はGoogle Summer of Code(夏休み中の学生をオープンソースやフリーソフトのプロジェクトに迎え,実際に開発に参加させる企画)で開発した新機能をブラッシュアップしている最中で,近く新バージョンが発表されるものと思われる。この新バージョンで実装されている機能により,nmapは単なるポート・スキャナを越えたツールへと進化しようとしている。

nmapの基本機能は4種類

 まず,nmapの基本機能について簡単に説明しよう。nmapをはじめとするポート・スキャナの主な機能は4種類ある。ホスト検出(Host Discovery),ポート・スキャン(Port Scan),OS検出(OS Detection),そしてサービス検出(Service Detection)である。利用する場合には,通常,ホスト検出から順番に実行する。

 ホスト検出は,指定したターゲット・マシンのIPアドレスにホストが存在するかどうかをチェックする機能である。存在しないアドレスに対してポート・スキャンを実行すると非常に時間がかかるので,通常はこのようなステップを経てからポート・スキャンを実行する。nmapはARP(アドレス解決プロトコル)やICMP(インターネット制御メッセージ・プロトコル)を飛ばして応答があった場合にホストが存在するものとして次のポート・スキャン・ステージに進むようになっている。

 この際の注意点が一つある。ターゲットがWebサーバーなどで,ICMPに応答しないように設定してある場合だ。このようにサービスが稼働していることがはじめから明らかな場合は,-PSオプション等を追加してホスト検出にTCP SYNを使用するよう指示する必要がある。

 2番目のポート・スキャンの機能はポート・スキャナのメイン機能で,ターゲット・マシンの開いているポートをリストアップする。デフォルトではSYNスキャンというスキャン方法が選択されており,大抵の場合,これで上手くいく。ただしオプションによりconnect()スキャンやACKスキャンといった方法を選択することもできる。

 connect()スキャンとはOSのTCP/IPスタックを使用する方法で,もっとも確実な結果が得られる(図1)。ただし,スピードは遅い。このほかにも,特殊な状況下や特定のターゲットに対して効果があるスキャン方法が用意されている。

図1●nmapの実行結果の例(その1:nmap -F 192.168.1.22)
図1●nmapの実行結果の例(その1:nmap -F 192.168.1.22)

 TCPだけではなくUDPのスキャンも行うことができるが,UDPスキャンは原理上どうしても非常に時間がかかる。UDPスキャンを実行する場合は,TCPスキャンとは分けて実行し,「-T5」といったスピードを向上させるオプションを指定するといいだろう。

 OS検出とサービス検出は読んで字のごとく,OSとサービスを検出する機能である。nmapではデフォルトでは実行しないようになっている。利用するには,コマンド実行時に「-O」「-sV」といったオプションを指定する必要がある(図2)。nmapのデフォルト動作の結果と,OS検出とサービス検出を有効にした場合の結果を下記に示す。OS検出によりOS のバージョンとサービスパックのレベルを,サービス検出によりアプリケーションのバージョンを取得できることが分かる。

図2●nmapの実行結果の例(その2:nmap -O -sV -F 192.168.1.22)
図2●nmapの実行結果の例(その2:nmap -O -sV -F 192.168.1.22)

 OSやアプリケーションのバージョンをリモートから検出できる機能は,パッチ管理やセキュリティ監査において非常に役立つ。例えばぜい弱性が見付かったApacheやBINDなどのサーバー・アプリケーションが本当に自分の管理するネットワーク内に存在しないことを確認したい場合,サーバーのセットアップやパッチ当て直後に不要なサービスが起動していないかを確認したい場合など,いろいろなケースで利用できる。筆者がISPでサーバー管理をしていたときは,サーバー上での設定チェックとリモートからのスキャンというダブルチェックにより,設定ミスを洗い出していた。