今回は,「Sys-Security Group」という団体(サイト)が開発したスキャニング・ツール「Xprobe」を取り上げ,ICMP(Internet Control Message Protocol)パケットを制限することの重要性について考えてみたいと思う。
通常,攻撃者が事前に情報収集をする際,TCP や UDP アプリケーションを利用することが一般的である。そのため,ルーターやファイアウオール等でパケット・フィルタリングする場合,TCP や UDP パケットについては注意を払う。しかし,ICMP パケットについては比較的軽視されがちであると思う。ところが,ICMP でもある程度の情報収集ならば可能なのだ。
ICMP と「Xprobe」
ICMPとは,ホストやデバイス同士がエラー・メッセージや制御メッセージなどをやり取りするためのプロトコルである。実装形態としては,ping や traceroute といったアプリケーションに代表されるように,主にリモート管理等を目的として利用されることが多い。そのため,ICMP パケットを許可しているサイトは多い。しかし,ICMPを利用する必要性がないにもかかわらずICMP パケットの通過を許可しているサイトも多いようだ。この点に着目したのが,Ofir Arkin 氏によって創設されたサイト「Sys-Security Group」である。同サイトでは,「ICMP Usage in Scanning Project」として,ICMP を利用したスキャニング手法を研究している。
そのプロジェクトの過程で,ICMP を利用して対象サイトのOSを特定する理論が発見された。この理論は「X」と呼ばれている。そして,「X」を実践するために,Fyodor Yarochkin 氏等によって開発されたツールが「Xprobe」である。
Xprobe は,「OS フィンガープリント」を利用する。OS フィンガープリントとは,OS の指紋(fingerprint),つまり OS を特定するための特徴を指す。OS フィンガープリントは,TCP/IP のスタック構造の違いに起因する。具体的には,パケットを生成する際の,各ヘッダー(TCP や IP など)内の,各フィールド値の設定規則の違いなどである。ベンダーによって異なる理由は,それぞれで RFC(Request for Comment) の解釈が違うためである。
ポート・スキャナ・ツールとして有名な「nmap」も,OS を特定する機能がある。“-O”オプションを付けて利用することにより,高い精度で OS を特定できる([参考資料])。しかし,nmap は主に TCP パケットのヘッダーを情報源としており,Xprobe とは仕組みが異なる。以下,Xprobe の仕組みを詳しく説明する。
Xprobe の仕組み
Xprobe では,5種類のパケットを用いる。
- 明らかに閉じられていると思われるポートに対する UDP パケット
- ICMP Echo Request(Type:8)
- ICMP Timestamp Request(Type:13)
- ICMP Information Request(Type:15)
- ICMP Netmask Request(Type:17)
これらのパケットを組み合わせて送信し,返信された ICMP パケットの IP ヘッダーを基に OS を特定するのである。
3 ~ 5 に関しては,応答パケットの有無自体が判断材料となる。1 と 2 については,以下の IP ヘッダー内のフィールドを情報源とする。
- Total Length(総パケット長)
- Identification(識別子)
- Type of Service(サービス・タイプ)
- Flag(フラグ)
- Fragment Offset(フラグメントのオフセット)
- Time to Live(有効期限)
- Checksum(チェックサム)
例えば,Time to Live(TTL)に関しては,ICMP Echo Requestを使用する ping などのツールでも,その生成規則が異なることが分かる。具体的に見てみよう。以下は,上から順に,同一セグメント上にある Windows NT 4.0 Server,Windows 2000 Professional,Solaris 7搭載のIntel マシンに対して ping を打った結果である。それぞれで TTL の値が異なる。
C:\>ping 10.0.0.1 (Windows NT 4.0 Server) Pinging 10.0.0.1 with 32 bytes of data: Reply from 10.0.0.1: bytes=32 time<10ms TTL=64 ・・・・・・・・・ C:\>ping 10.0.0.2 (Windows 2000 Professional) Pinging 10.0.0.2 with 32 bytes of data: Reply from 10.0.0.2: bytes=32 time<10ms TTL=128 ・・・・・・・・・ C:\>ping 10.0.0.3 (Solaris 7 intel) Pinging 10.0.0.3 with 32 bytes of data: Reply from 10.0.0.3: bytes=32 time=10ms TTL=255 ・・・・・・・・・
同様に,他のフィールドに関しても,OS の種類に依存した生成規則がある。そのため,これら ICMP パケットを利用することで,OS フィンガープリントを取得することが可能となるのである。ちなみに,Xprobe では 4 ステップ以内で 26 種類の OS を判別できる。
以下は,Windows 2000 Professional マシンに対して Xprobe を実行した結果である。
# ./x -v 10.0.0.2 X probe ver. 0.0.1p1 ------------------ Interface: eth0/10.0.0.10 LOG: Target: 10.0.0.2 LOG: Netmask: 255.255.255.255 LOG: probing: 10.0.0.2 TEST: UDP to 10.0.0.2:32132 [98 bytes] sent, waiting for reponse. TREE: IP total length field value is OK TREE: Frag bits are OK TEST: ICMP echo request to 10.0.0.2 [68 bytes] sent, waiting for reponse. TREE: Microsoft Windows Family TCP stack TREE: Other Windows-based OS (ttl: 128) FINAL:[ Windows 2k. SP1, SP2 ]
この例では,始めに UDP パケットを,次に ICMP Echo Request を送信し,それらに対する返信 ICMP パケットを基に,OS が Windows 2000 であると判断している。
◇ ◇ ◇ ◇ ◇ ◇
TCP や UDP では困難でも,ICMP が許可されているために,今回紹介した Xprobe ようなツールを使えば OS を特定できてしまうサイトは意外に多い。もちろん,「この程度の情報ならリスクも低いだろう」という考え方もあるだろう。OS 情報の漏洩自体は,侵入の原因となり得る直接的な問題ではない。
しかし,「不必要なサービスは提供しない」というセキュリティの定石に則るならば,TCP や UDP パケットと同様,不必要な ICMP パケットも制限すべきなのである。LAN 内の ICMP パケットまでフィルタリングする必要はないが,グローバル IP アドレスを割り当てられているルーターやファイアウオール,各種サーバー・マシンでは,不要な ICMP パケットを制限することが望まれる。
ただし,闇雲にフィルタリングすることは避けなければならない。フィルタリングによって問題が発生する場合があるからだ。例えば,ICMP need fragment をフィルタすると,path MTU discovery が機能しなくなってしまい,状況に応じた効率の良いデータ転送ができなくなるという問題が発生する(詳細については参考資料を参照のこと)。
◎参考資料
◆Sys-Security Group
◆Remote OS detection via TCP/IP Stack FingerPrinting (日本語訳)
◆INTERNET CONTROL MESSAGE PROTOCOL (RFC 792)
◆Path MTU Discovery and Filtering ICMP
矢次 弘志 (Hiroshi Yatsugi)
株式会社ラック 不正アクセス対策事業本部
yatsugi@lac.co.jp
IT Proセキュリティ・サイトが提供する「今週のSecurity Check [一般編]」は,その週に起きたUNIX関連およびセキュリティ全般のニュースや動向をまとめた週刊コラムです。セキュリティ・ベンダーである「株式会社ラック」のスタッフの方を執筆陣に迎え,専門家の立場から解説していただきます。