Nmapの動作解析

概要

--

本記事ではポートスキャンツールNmapの動作を解析する。

Nmapはサーバで動作するサービスを特定してくれるツールだ。しかし、サーバで動作するサービスを特定する作業は簡単ではない。なぜなら、サーバの任意のポートにコネクションをつないでも、サーバは自分からサービスを教えてくれない。

そのため様々な通信を行うことでNmapはサービスを特定していると考えられる。本記事ではその動作について調査する。

3ウェイハンドシェイク

まずは、基本的な3ウェイハンドシェイク(コネクションを確立する手順)をWireSharkで確認してみよう。

Netcatを使用し、10.0.2.15の80番ポートにアクセスする。

3つの通信が発生したことが確認できる。

1番上は10.0.2.4(自分)から10.0.2.15(相手)にSYNパケットが送信されている。

次に相手サーバが自分に対してSYN/ACKパケットを送信し、通信が受け入れられることを教える。

最後にACKパケットを相手に送信し、通信が確立している。

Nmapの動作確認(80番ポートで動作するHTTP)

では、Nmapの動作確認を始める。

現在、10.0.2.15:80ではHTTPが動作している。Nmapでそのポートを調べると確かに80番ポートでHTTPが動作していることが確認できる。

この際の通信を調査する。

まず、一番最初にSYNパケットとSYN/ACKパケットがそれぞれ流れ、ACKパケットは続いておらず、RSTパケットが流れていることがわかる。これはNmapがSYN/ACKパケットが送信されたことで、ポートの開放を確認したために、いったん通信を遮断したためと推定できる。

その後少し離れてHTTPで「GET / HTTP/1.0」が送信されている。

10.0.2.15がこれに200OKで返答することで、80番ポートではHTTPが確実に動作していることが確認できた。

今回は80番ポートで通常は動作しているHTTPが、そのまま正しく動作していたためすぐに解析が終わった。では、異なるポートで動作している場合はどうだろう?

Nmapの動作確認(25番ポートで動作するHTTP)

10.0.2.15のApacheの設定を変更し、HTTPを25番ポートで動作するようにした。

Nmapを動かしたところ25番ポートでHTTPを動かしても、正しくサービスを特定していることがわかる。

通信内容を見てみよう。

まず25番ポートで通常動作するのはSMTPである。Nmapはその点からまずはSMTPの各種コマンドを相手に送信していることがわかる(図ではEHLOを送信している)。

しかし、39番目ほどで突然HTTPの通信を送信する(WireSharkでは何故かSMTPと表示されているが、通信内容はHTTPである)。

この通信に正しく応答することで、相手サーバの25番ポートで動作しているのがHTTPであることが確認できる。

どうやらサービスが正しいポートで動いてないとNmapが判断した場合、とりあえず別のプロトコルでサービスを特定するようだ(少なくともHTTPはポート番号に関係なく投げる)。

では、HTTP以外のサービスでも特定可能なのか?

Nmapの動作確認(10021番ポートで動作するFTP)

今回はFTPを10021番ポートで動作させる。

Nmapを動作させると正しくサービスを特定した。

通信内容を確認すると、最初の3ウェイハンドシェイクが終わった後に、サーバがバナー情報を送っていることがわかる(vsFTPd 3.0.3)。Nmapはこの文字列を拾い上げ、本ポートではFTPが動作していると推定したと考えられる。

Nmapの動作確認(10021番ポートで動作するFTP、バナー情報なし)

次はバナー情報を無意味な内容に書き換える。

Nmapを実行すると正しくサービスを特定できたが、今までの数倍の時間がかかった。

通信内容を見てみよう。バナー情報は取得したが、今回はFTPと特定できる情報ではないため、ここでは特定は終わっていない。

次にHTTPで通信を試行するが当然これもうまくいかない。他にもPortmapperやSMTPなど、別のプロトコルの通信を順次送信している様子が確認できた。

しばらく待つと(表示情報TCPになっているが)FTPのコマンドである「HELP」を送信していることがわかる。

それに対してサーバはFTPの定型文を返している。これによってNmapは10021番で動作するサービスはFTPであることを特定したと考えられる。

まとめ

本記事ではNmapの動作について確認した。

Nmapの動作は基本的には総当たりである。まず、そのポートで動作する本来のプロトコルの通信を行い、それで外れたら順次別のプロトコルの通信を行う。また、相手からの通信内容に特定の文字列が含まれれば、それを元にサービスを判断する。

これらがNmapのサービス特定機能(オプションでいうところのsV)の概要だと考える。ポートスキャンとサービス特定はセキュリティの基礎であり、今回はその原理について確認した。この動作について気になった人はぜひ自分でも確認してみてほしい。

--

--