ポートスキャン自体にもいくつかの種類があります。代表的なものを以下に挙げていきます。
対象ポートに3ウェイハンドシェークを確立しようとするスキャンです。
1〜65535番までの全てのポートに対して完全な3ウェイハンドシェーク接続を要求し、接続が確立されたポートをリスト化することでスキャンを行います。3ウェイハンドシェークを確立しているため、対象ホストには完璧にログが残ってしまいます。
+[Scaner]+ +-[Server]-+ | |------[SYN]----->|23 telnet | |detect! |<---[SYN,ACK]----| | | |------[ACK]----->| connect! | | | | | | |------[SYN]----->|119 nntp | |undetect|<---[RST,ACK]----| | | | | | | |------[SYN]----->|110 pop3 | |detect! |<---[SYN,ACK]----| | | |------[ACK]----->| connect! | +--------+ +----------+
完全な3ウェイハンドシェークを確立せず、SYNフラグのパケットを対象ポートに送信します。
SYN+ACKパケットが返ってきたなら、そのポートはlisten状態(ポートが開いている)。RST+ACKパケットが返ってきたなら、そのポートはnolisten状態(ポートが閉じている)だと判断できます。この後、本来ならACKパケットを送信して3ウェイハンドシェークを確立するのですが、SYN Scanでは送信しません。3ウェイハンドシェークは確立していないのでログには残りませんが、IDSで検知されます。
+[Scaner]+ +-[Server]-+ | |------[SYN]----->|23 telnet | |detect! |<---[SYN,ACK]----| | | | | | | |------[SYN]----->|119 nntp | |undetect|<---[RST,ACK]----| | | | | | | |------[SYN]----->|110 pop3 | |detect! |<---[SYN,ACK]----| | +--------+ +----------+
対象ホストにFINフラグのパケットを送信します。対象ホストはRFC793に基づき、クローズしている全てのポートにRSTフラグパケットを返さなければなりません。それ故にRSTフラグパケットが返ってきたなら、そのポートは閉じています。逆に、開いているポートは何のパケットも送ってきません。
しかし、通信途中でパケットが失われてしまうと検査側のPCにはRSTパケットが届かないため閉じているポートであっても開いているポートだと検知されてしまうことがあります。たとえばネットワークトラフィックの多い時間帯にFINスキャンを行うと、RSTを返してこない(開いている)ポートが1200あったとしましょう。しかし、ネットワークトラフィックの少ない時間帯に同様にFINスキャンを行うと、RSTを返してこないポートが120になっている可能性もあるわけです。
+[Scaner]+ +-[Server]-+ | |------[FIN]----->|23 telnet | |detect! | | | | | | | | |------[FIN]----->|119 nntp | |undetect|<---[RST,ACK]----| | | | | | | |------[FIN]----->|110 pop3 | |detect! | | | +--------+ +----------+
対象ポートにFIN、URG、PUSHパケットを送信します。FINスキャン同様、対象ホストはクローズした全てのポートについてRSTを送り返さなければなりません。またFINスキャンと同様、トラフィック状態によってはあまり信頼できるスキャン結果を返しません。
全てのフラグを"0"(オフ)にしたパケットを送信します。FINスキャン同様、対象ホストはクローズした全てのポートについてRSTを送り返さなければなりません。またFINスキャンと同様、トラフィック状態によってはあまり信頼できるスキャン結果を返しません。
アイドルスキャンとは、代理ホスト(Zombi)を利用することで身元を隠してスキャンする技術です。
IPヘッダー内のシーケンス番号(ID)の増加を巧みに利用した技術で、手順は下の図を参照してください。
Scaner----------[ACK,SYN]----------->Zombi IP:AAA<---------[RST/ID:2]-----------IP:BBB 何度かZombiホストにコネクションを張り、IDの増加パターンを解析する ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Scaner Zombi(ID:1) Target IP:AAA IP:BBB IP:CCC | | | |------------------------------------>|SYN Packet[SourceIP:BBB] | | | | |<-----------------|Open=SYN/ACK to IP:BBB | | |Crose=RST/ACK to IP:BBB | | | | |------(ID:2)----->|If Zombi recived SYN/ACK |====[SYN,ACK]====>| |reply RST/ACK. |<--[RST/ID:3ro2]--| | | | |If Zombi recived RST/ACK |Scaner watch Zombi's ID |reply nothing. |and know this port is Open or not | |by checking ID number. |
どうやってポートの開き/閉じを識別しているかといいますと、次の通りです。ここではZombiの初期シーケンス番号は1、シーケンス番号の増分は1だったと仮定します。
ScanerはあらかじめZombiに数回コネクションを張り、Zombiのシーケンス番号の増分を解析します。
そしてScanerは送信元をZombiにしてTargetにSYNパケットを送ります。Targetはそのポートが開いていればSYN/ACKを返し、閉じているならRST/ACKをZombiに返すことになります。SYN/ACKを受け取った場合、Zombiはシーケンス番号を+1し、2になったRST/ACKを送信します。
ここでScanerがZombiにアクセスすると、シーケンス番号を更に+1し、3になったパケットを送信してくるはずです。
一方、RST/ACKを受け取った場合には何も送らないので、Scanerがアクセスした場合にはシーケンス番号は+1した結果2になっているはずです。この増加の違いでポートの開き開きを判別しているわけです。
ここで問題になってくるのはZombiへの第三者のアクセスです。 もしスキャン中に第三者がZombiへアクセスしてしまうと、シーケンス番号にずれが生じ、正確なスキャン結果が得られません。そこでZombiを選ぶ基準があります。
まずZombiがIdle状態であること(スキャンの名称の由来)が挙げられます。また、OSのRSTに対する返信の仕方でも不/可が分かれます。
Linux、OpenBSD、Solarisはシーケンス番号を0に設定してRSTを返すためZombiには仕立て上げられません。FreeBSD、NetBSD、NT5はシーケンシャルに番号を設定するためZombiに仕立て上げられる可能性があります。
対象ポートにUDPパケットを送信した後、対象ポートが「ポート伝達不可能:ICMP port unreachable」メッセージを返してきたら、ポートがクローズされていると判断し、このメッセージが帰ってこなければそのポートはオープンされていると判断する方法です。
ちなみに、パケットフィルタリングを施したデバイスに対するUDPスキャンは比較的時間がかかります。また、インターネット経由でUDPスキャンする時にはトラフィック状況によりパケットが失われる可能性があるため、その結果はあまり信頼できるものではありません。
+[Scaner]+ +-[Server]-+ | |----------[UDP]---------->|23 telnet | |detect! | | | | | | | | |----------[UDP]---------->|119 nntp | |undetect|<-[ICMP port unreachabel]-| | | | | | | |----------[UDP]---------->|110 pop3 | |detect! | | | +--------+ +----------+