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

 最近,nmapに新しい方法のOS検出機能が実装された。第2世代OS検出エンジンである。今回は,この第2世代のOS検出エンジンについて解説する。ただその前に,そもそものOS検出の仕組みを簡単に説明しておこう。

 OS検出を実施するには,まずTCP/IP/ICMPパケットに含まれる様々な特徴パラメータを抽出したデータベースが必要不可欠になる。どのパケットからどのようなパラメータを抽出するかはOS検出エンジンによる。例えば最近のOSの多くはTCP ISN(初期シーケンス番号)の最大公約数が限りなく1に近い。

 これに対して古いスイッチやプリンタの中にはかなり大きな値のものがある。HP-UXなどいくつかのOSでは,TCP RST のデータ部分にテキストでエラー・メッセージを格納して送信するようになっている。これはRFC 1122 4.2.2.12で許可されている方法だが,この機能を実装するかどうかはベンダーの判断による。つまり,OSの実装を見ると,それぞれ仕様,振る舞いにブレがある。このブレをOS検出に使用することができる。

 OS検出を実行する時には,ターゲット・ホストに様々な種類の検査パケットを送信し,このような特徴パラメータを含んだ応答パケットを返信させる。OS検出は,この応答パケットに含まれる特徴パラメータをデータベースと突き合わせることで可能になる。OSやパッチ,サービス・パック・レベルによって異なる特徴が得られるパラメータを探り,データを収集し,データベース化することでOS検出の精度は上がっていく。

 nmapに初めてOS検出が実装された頃に比べ,最近はECN(Explicit Congestion Notification)といった新しいTCP拡張機能が出てきた。ECNもOS検出に利用できるが,当然ながら nmapの古い方法ではこのような新しい機能は利用できない。このようなネットワーク・スタックの新しい仕様に対応したり,新しく発見された特徴パラメータを導入したりすることを目的として,nmapには新しいOS検出エンジンが実装された。以下では,この第2世代エンジンについて見てみよう。

第2世代OS検出エンジン

 nmapは,OS検出のために取得した情報を「fingerprint」として出力できるようになっている。OSの特徴を見極めるためのパラメータとして取得した情報を,シンプルな記号の羅列にまとめたものである。図1は古いOS検出エンジンのfingerprint,図2は第2世代OS検出エンジンのfingerprintである。理解しやすくするため図には色を付けたが,実際のnmapの出力には色は付いていない。両方とも同じサーバーに対して同じオプションで実行したものだが,新しいfingerprintにはより多くの情報が含まれていることが分かる。両方とも同じサーバーに対して同じオプションで実行したものだが,新しいfingerprintにはより多くの情報が含まれていることが分かる。

図1●古い検出エンジンの出力
図1●古い検出エンジンの出力
[画像のクリックで拡大表示]

図2●第2世代OS検出エンジンの出力
図2●第2世代OS検出エンジンの出力
[画像のクリックで拡大表示]

 fingerprintにはSCANやSEQ,OPSなど,OS検出のためのテスト・カテゴリが14個ある。ちなみに古いOS検出エンジンでは10個だけだった。fingreprintの中には,「%」記号で区切られたパラメータが複数入っており,それぞれ「X=Y」といった形式で取得した特徴パラメータを記述してある。左辺が実行したテストの名前,右辺がターゲットから取得した値である。右辺は数値の場合もあれば,記号や空欄になることもある。

 例えばどちらのエンジンにも共通してある,一番初めの行の「SCAN」を見てみよう。この行は,スキャン環境に関する情報をまとめた分類項目で,最初のパラメータの「V=4.22SOC6」はバージョンが4.22SOC6であることを意味している。「D」は日付,「OT」はOS検出に使用したTCPのOpen port,「CT」はClosed TCPポートの番号,「CU」はClosed UDPといった具合である。このSCAN行はほかの行と比べると特殊で,これらのパラメータは実際のリモートのOSとはまったく関係がない。どちらかというとnmapのデバッグ用途という位置付けだ。

●シーケンス・テスト(SEQ,OPS,WIN,T1)
 nmap第2世代OS検出エンジンの最初のテストは,6種類のTCP SYN パケットを使ったテストである。これら6種類のパケットにはさまざまなTCPオプションが設定されており,それを110ミリ秒間隔でターゲットの開いているTCPポートに送信する。ここでは複数のテストが同時に実行される。

 まずSEQカテゴリのテストだが,6種類のパケットの応答をすべてを使う。SEQカテゴリには時間や各種カウンタの更新周期や更新方法にかかわるようなテストが含まれている。カウンタの更新周期を計算するには,多くの検査パケットを使用し多くのデータを収集した方が統計的に信頼性が高い値を算出できる。この点ではパケットは6種類より多くても構わない。6種類になっているのは,時間がかからない程度に少ない数という考えだと思われる。

 SEQテストの一つにTSテストがある。このテストでは,OSがTCP Timestampオプションに使われるカウンタ値をどの程度の間隔で更新しているかという周期を調査する。よくある実装は500ミリ秒に一つだけTimestampカウンタを更新するというもので,ほかにも10ミリ秒周期などOSによっていろいろなパターンがある。

 その他のテストもいくつか同時に行わる。6種類の応答パケットに含まれるTCPオプションのレイアウトがOPSのそれぞれO1~O6というテスト名で記録されている。それぞれのパターンでどのオプションがどのような並びで応答されるのかが,OS を特定する手掛かりになる。WINも同様で,応答パケットのウィンドウ・サイズがそれぞれW1~W6になっている。最後のパケットはこれらに加えてさらに,T1カテゴリのテストにも使用される。T1のテストはTCPスタックの実装に関するテストである。

●TCP explicit congestion notification (ECN)
 ECNは,RFC3168でサポートされている新しいプロトコルに関係したテストである。TCPのCWR,ECE,SYNフラグの立ったパケットを一つだけ,開いてるTCPポートに送信する。応答からECNカテゴリにあるテスト結果が得られる。ECNカテゴリのテストはT1~T7のTCPテストに似ているが,ここには「CC」というECNのサポート,非サポートによるTCPスタックの挙動の違いを検出するテストが含まれている。

●TCPテスト(T2~T7)
 TCP/IPの各種フラグやTCPオプションの異なる様々なTCPパケットを6個送信する。このうち3個は開いているTCPポートへ,あとの3個は閉じているTCPポートへ送信する。これらのパケットにはTCPの様々なオプションが設定されており,その実装の方法による挙動の違いを検出している。なお,このテストは古いOS検出エンジンのテストとほとんど同じだが,新しいOS検出エンジンの方がより多くの情報を応答パケットから得られるようになっている。ちなみに,T1テストもテスト項目自体はこのカテゴリとほとんど同じで,テストはシーケンス・テストと同時に実行される。

●UDPテスト(U1など)
 閉じているUDPポートに対して1個のUDP パケットを送信し,ICMP Destination port unreachableパケットを受信する。古いOS検出エンジンではPUというカテゴリ名だったが,新しいOS検出エンジンではU1という名前に変更されている。

 このテストは閉じているUDPポートに対する唯一のテストで,いくつかの重要なテストを含んでいる。ICMP Destination port unreachableパケットにはエラーの元になったパケットが含まれており,このエラー元パケットを調べることで様々なことが分かる。例えばターゲットまで何ホップ離れているかを調べるために,nmapはこのエラー元パケットを使用する。エラー元になったパケットのTTLは既にデクリメントされているので,この値からターゲットが何ホップ離れているかを計算できる。TTLの計算はT1~T7,U1,IEの「T」チェックを実行するのにも必要になる。閉じているUDPポートがなくてもnmapのOS検出は実行可能だが,精度が格段に落ちてしまう。

●ICMP ECHOテスト(IEなど)
 このテストでは,中身が異なる二つのICMP ECHOパケットを送信する。2個のパケットの違いはTOSフィールド,DFビット,ICMPのコード,データ長である。応答パケットとしてICMPリプライを受信する。2個の応答パケットの違いや応答パケットの中身から分かるのは主にIEカテゴリのテストだが,他にもICMPパケットにおけるIP IDの生成アルゴリズムのテスト(SEQ カテゴリのIIテスト)も分かる。