TCPパケットのフラグビットを操作

図2●TCPポートスキャンによるパケットの送受信
図4●SYNポートスキャンの仕組み
図5●ACKポートスキャンの仕組み
図6●パケット・フィルタリングを回避するACKポートスキャンの例
図7●TCP(FIN)ポートスキャンの仕組み
図8●TCP-Nullポートスキャンの仕組み
図9●TCP-Xmasポートスキャンの仕組み

 基本的なポートスキャン・テクニックであるTCPポートスキャンとUDPポートスキャンについて,少しでも理解していただけただろうか。分かりやすく言えば,ポート番号として使用可能な範囲である0~65535までの値に対して接続を試みることが,基本的なポートスキャン・テクニックである。

 逆に言えば,システムを守っている管理者は,このような基本的なポートスキャンを容易に検出できる。基本的なポートスキャンは連続して各ポートへの接続を試みるため,連続した各ポートへの接続を検出すれば,誰かがポートスキャンを仕掛けていると判断できるのだ。

 これを回避できないかと考え出されたのが,TCPパケットに記述されているフラグビットを操作するポートスキャン・テクニックである。

 前述の通り,TCPポートスキャンでは3ウェイ・ハンドシェイクが完了して接続確立となることでポートが開いていると判断する。システム管理者は,この接続確立が連続して発生していればポートスキャンの可能性が高いと考えて検知すればよい。しかし,図2[拡大表示]のTCPポートスキャンによるパケットの送受信をもう一度見てほしい。TCP(SYN)パケットを送信して,ポートが開いている場合はTCP(SYN+ACK)パケットが返信されるが,ポートが閉じている場合はTCP(RST+ACK)パケットが返信されていることが分かる。

 つまり,ポートが開いている場合はSYNとACKフラグが「1」のパケット,閉じている場合はRSTとACKフラグが「1」のパケットが戻ってくる。3ウェイ・ハンドシェイクが完了して接続するかどうかではなく,SYNフラグを有効にしたTCPパケットに対して返信されるパケットを調べるだけで,ポートの開閉を判別できるのである(図4[拡大表示])。この手法はSYNポートスキャン,または3ウェイ・ハンドシェイクの半分(ハーフ)だけを行うことからハーフスキャンと呼ばれている。

 SYNポートスキャンは接続を確立せずにポートの開閉を判別するため,連続した接続確立からポートスキャンを検知する手法で,システム管理者がポートスキャンを検知することはできない。いわゆるステルス・スキャンと呼ばれるポートスキャン手法の一つである。

ファイアウォールを通過するACKスキャン

 システム管理者が容易に検知しないようにSYNポートスキャンが編み出されたが,さらにACKフラグを有効にしたTCPパケットを使ったACKポートスキャンと呼ばれる手法も考え出された。ACKポートスキャンでは,ACKフラグが有効なTCPパケットに対して返信されたパケットのウインドウ・サイズを基にポートの開閉を判別する(図5[拡大表示])。

 一般に,ルータやファイアウォールなどに搭載されているパケット・フィルタリング機構では,外部からの接続を確立させないようにSYNフラグが有効になったTCPパケットの通過を拒否する設定や,ACKフラグが有効のパケットだけ通過を許可する設定が施されている場合が多い。この場合でも,ACKポートスキャンはパケット・フィルタリングを回避してポートをスキャンすることができてしまう(図6[拡大表示])。

 ただ,ACKポートスキャンには欠点がある。返信されるTCP(RST)パケットのウインドウ・サイズが,開いているポートと閉じているポートで異なっていないと,ポートの開閉を判別することができない。例えば,Windows NT4.0/2000/XPは,ポートの開閉に関係なく返信されるTCP(RST)パケットのウインドウ・サイズは0になる。このため,ACKポートスキャンでポートの開閉を判別することはできない。

FIN,Null,Xmasなどのスキャン・テクニック

 TCPパケットのフラグビットを操作するポートスキャン・テクニックとしては,このほかにもFINポートスキャンやTCP-Nullポートスキャン,TCP-Xmasポートスキャンなどと呼ばれる手法がある。

 FINポートスキャンは,FINフラグを有効にしたTCPパケットに対して,RSTとACKフラグが有効になったTCPパケットが返信されるかどうかでポートの開閉を判別する(図7[拡大表示])。また,TCP-NullポートスキャンはTCPパケットのフラグビットをすべてOFFにしたパケットを送り,この返信パケットのRSTとACKフラグが有効になっているかでポートの開閉を判別する(図8[拡大表示])。

 一方,TCP-XmasポートスキャンではTCPパケットのフラグビットを複数設定し,このパケットに対してTCP(RST+ACK)パケットが返信されるかどうかでポートの開閉を判別している(図9[拡大表示])。ポートスキャナとして有名なツール「Nmap」(http://www.insecure.org/nmap/index.html)は,FINとURG,PSHを有効にしたTCPパケットを使う。

 これらFIN,TCP-Null,TCP-Xmasポートスキャンにも欠点がある。この三つのポートスキャンでは,TCP(RST+ACK)パケットを受信しなければポートが開いていると判断するため,TCP(RST+ACK)パケットが途中経路で消失もしくは消去された場合にもポートが開いていると判断してしまう。UDPポートスキャンと同様の欠点と言えよう。このため,FIN,TCP-Null,TCP-Xmasポートスキャンの結果も信頼性が低い。

Eiji James Yoshida

筆者はpenetration technique research site(http://www.geocities.co.jp/SiliconValley/1667/index.htm)を運営し,そこでセキュリティ関連の情報を提供している。Internet Explorer,Mozilla,OperaのFTP Viewが抱えていたクロスサイト・スクリプティングぜい弱性を発見したことで有名。監査技術に詳しい。