Nmap

概要

nmapはGordon Lyonによって書かれた、非常によく知られたセキュリティスキャナである。名前は、ネットワーク上にどのような機器やサービスが動いているかという、ネットワークの地図を作成すること (Network Mapper) に由来する。ポートスキャン機能だけでなく、特定ポートで動作するサービスアプリケーション（daemon類）の種類とバージョンを検出する機能、TCP/IP stack fingerprintingを用いたOSおよびそのバージョンを検出する機能など、多数の機能を備えており、2010年現在のバージョンでは、指定可能な引数は100種類を越える。また、Luaスクリプト言語で記述されたスクリプトを解するスクリプトエンジン「Nmap Scripting Engine」が用意されており、これを用いてスキャン動作を利用者がより柔軟に取り扱える仕組みが備わっている。
セキュリティ関連の書籍で取り上げられることも多く、LinuxQuestion.org主催のネットワークアプリケーション部門のベストアプリケーション賞（ユーザー投票に基づく）を5年以上連続して受賞しているなど、多数の高評価を得ている。
このようなツールがセキュリティ分野以外で取り上げられることは少ないが、「マトリックス リローデッド」でトリニティが脆弱なSSHサーバーを発見する際にnmap（バージョンは2.54BETA25）を用いていることはセキュリティ分野の人々の間ではよく知られており、このことはnmap作者のサイトやセキュリティ界最大コミュニティポータルであるsecurityfocus.comなどで紹介された。nmap作者は、馬鹿げた3Dアニメーションで取り繕ったようなハッキング場面を用いる演出の映画が多い中、マトリックスのそのハッキング場面を見て大きな衝撃を受けたと語っている。また、nmapはこの映画以外にも複数の映画において、ハッキング場面（例：ダイ・ハード4.0）や、登場人物がハッカーであることを演出する場面（例：バトル・ロワイアル）などで使用されており、これらの画像はnmap作者によってカタログ化されている。

歴史

nmapの誕生は、作者のGordon Lyon（当時はFyodorという名前を使っていた）がPhrackにポートスキャナを投稿するところから始まる。Fyodorは当時、ポートスキャナーを探していたが、当時のポートスキャナーはどれも自分に合わないものばかりであったことから、自分が使いたいものを作ろうと考え、そうして出来上がったものがnmapの初期版である。そして作成後、自分以外にもこのツールを使いたい人がいれば使って欲しいという想いでPhrackに投稿、そのツールが1997年にPhrack 51号にソースコード付きで掲載され、nmapが世界に知れ渡ることになった。Phrack 51号への投稿の段階で、その時点で発見されていた複数のポートスキャン方法（TCP SYNスキャン、TCP FINスキャン、タイニーIPフラグメントなど）に対応していた。
その後、FyodorはPhrack 54号でOSおよびそのバージョンを検出するアイデアを発表する。もちろんnmapに実装の上である。この発表までは、OSの検出手法といえば、サービスプログラムから返される文字列タイプのバナーを確認するというものであった。例えば、対象サーバーにtelnet接続した場合に表示される
FreeBSD/i386 (wikipedian.local)login:
といった文字列である。このバナー表示を信じればこのシステムはFreeBSDということになる。対象OSが何であるかという情報は、ネットワーク攻撃においては重要な情報であり、それが故、昨今ではバナーを隠すことはごく普通に行われていることである。nmapではTCP/IP stack fingerprintingと呼ばれる手法を用いてOSとバージョンを特定する。これは、OSごとにTCP/IPスタックの実装が微妙に異なることを用いて、ポートスキャン同様のパケットに対する挙動を基に、OSおよびそのバージョンを特定するというものである。一例を挙げると、TCP FINスキャンはBSD由来のTCP/IPスタックで有効に働き、Windowsには有効に働かないといった違いがある。このような挙動の違いを集めることで、対象OSおよびそのバージョンを特定できる可能性があるわけである。
初期にはCが用いられていたが、後にC++を用いるようになった。また、上記はいずれもIPv4を対象としているが、後にIPv6やSCTPにも対応するようになった。
このように多数の機能を備えたセキュリティスキャナであるが、更に、Luaスクリプト言語で記述されたスクリプトを解するスクリプトエンジン「Nmap Scripting Engine」（NSEと略される）が実装されることとなる。NSEを用いずとも様々なスキャンが可能なnmapであるが、NSEを用いることで、スキャン動作の自動化、より多角的な診断を行うことができるようになる。
これら、nmapの歴史の大半は付属資料にも記されている。

スキャン速度の自動調整

nmapのスキャンの特徴の一つに、スキャン速度の自動調整機能が挙げられる。これは、相手サーバーからの応答状況に応じて、スキャン速度を調整するというものである。nmapでは、パケット破棄されることが前提となるような特殊なパケットを送出するケースが多い上、OSおよびバージョン検出機能などのように、単一のスキャン機能で複数のパケットを送出するケースも多くある。そのため、nmap作者は処理速度、パフォーマンスという要素を重要視している。
単にパケットを送出する間隔を短くするだけでは、相手サーバーの処理能力以上のパケットを投げてしまう可能性がある。こうなるとパフォーマンスの向上には繋がらない上に、相手の侵入検知システムによってスキャンパケットが弾かれる可能性もある。このような状況を避けつつもパフォーマンスを維持するため、相手サーバーからの応答状況に応じてスキャン速度は自動的に調整されるようになっている。また、時間に関する各種パラメータのいくつかはオプション引数で指定可能となっている。

TCP/IP stack fingerprinting機能

nmapが単なるポートスキャナではなくセキュリティスキャナと呼ばれる所以となる機能の一つが、OSおよびそのバージョンを特定する機能である。これは、Phrack 54号で発表された。既にTCP FINスキャンで説明したように、BSDベースのTCP/IPスタックは他のシステムと異なる応答を返す場合がある。このように、OSごとにTCP/IPスタックの実装が微妙に異なることを用いて、ポートスキャン同様のパケットを送出、それらのパケットに対する挙動を基に、OSおよびそのバージョンを特定するというものである。
この手法が確立されるまで、OSやそのバージョンを特定する方法といえばアプリケーションサービスのバナーなどに頼るしかなかったが、この手法では単にopenポートとclosedポートが1つずつあれば、確認が可能となる。nmapは様々なパケットを送出し、それに対する応答パケットの特徴を確認、その結果を多数の（2010年時点では1000以上の）OSおよびバージョン情報に付き合わせて、応答パケットの特徴との適合状況を出力する。完全に1つのバージョンに特定されるとは限らず、可能性のある複数のOSが%表記で結果表示されることもある。

Nmap Scripting Engine

nmapには、Luaスクリプト言語で記述されたスクリプトを解するスクリプトエンジン「Nmap Scripting Engine」が実装されている。このエンジンの実装により、nmapが行う各種スキャンをスクリプト記述することができるようになっており、これによってスキャンの自動化、一括化、利用者レベルでのスキャン挙動の調整が可能となっている。