このブログを検索

2019/04/07

ポートスキャン - 「ポートが開いている」とはどういう状態か?

セキスペの過去問を解いていたらポートスキャンに関する問題が出てきた。

synを送ってその反応を見る、というもので、

まず「それを何というか」という問題があり、「ポートスキャン」と回答したが、
正解は「SYNスキャン」であった。

SYNスキャンはポートスキャンの一種なので間違いではないが、
SYNだけ送って、そのあとSYNACKが返ってきてもセッションを確立しないので、
スキャン先に接続履歴を残したくないときに使うそうだ。

もう一つの問題は、「ポートが閉じているときにどういう反応があるか」というもので、
私は「応答なし」と答えたのだが正解は「RSTACK受信」および「応答なし」であった。

私は応答がないと思い込んでいたので、えっと思って
パソコンでwiresharkを起動して自分のサーバへのアクセスで試してみた。

接続できないはずのtelnetアクセスをしてみると応答がない。

しかしそれはポートが開いてるかどうか以前にiptablesで許可していないからだと気づき、
一時的にiptablesを無効にして、再度telnetしてみた。

RST,ACKが返ってくる。

なるほど。

以前nmapでポートスキャンしたときに、「ポートにアクセスできないがフィルターされているかもしれない」みたいな結果が出たことがあった。

これはsynに応答がなかった場合であろう。
サーバでtelnetサービスが動いていてもiptablesとかその前のFW装置で許可されていなければ応答が返ってこない。
だから応答が返ってこない場合はポートが開いているか閉じているかはわからない。

今書いていて思ったのだが、ポートが開いていないときにRSTを返さないような設定ができるんじゃないだろうか?
できないか?

まあいい。ふつうはRST ACKが返るということがわかった。

ところで、「ポートが開いている」という言い方をよくするが、
私はまだ若いころ、その確認方法がよくわからなかった。

どこかに設定ファイルがあって、開けるポート番号または閉じるポート番号を指定してあるのだと思っていた。

しかし、サーバ(RedHat9)設定のどこを探してもそのような設定はない。

そのサーバではiptablesは設定していなかった。設定方法も知らなかった。
検証環境のサーバだからだ。

調べていくうちにiptablesのこともわかってきたのだが、
iptablesは確かに通信を許可するポートを開けたり閉めたりするが、
いわゆる「ポートが開いている」というのはそのことを言うのではない。
まあ、ユーザや運用管理者にとっては「FWで閉じている=閉じている」
ということでよいだろう。

しかし、「FWで開いている=開いている」にはならない。

というか、そもそも「ポートが開いている」という言い方が不正確で誤解を生む。

開いているという言い方だとFWで開け閉めするのを想像するが、
正確には「そのポートをリッスンしているサービスが稼働している」
という状態である。

たとえばtelnetサービスを有効にしていてその使用ポートが23であれば、
「TCP23が開いている」となる。

使用ポートは変更できるので、telnetサービス(正確にはtelnetサーバサービス)が動いている=23番が開いているとも言えない。

そんな人はいないと思うが、telnetで80番を使うようにすることもできる(よね?)。

私のサーバではtelnetは動作していず、sshが動作していてポート番号は22でないものに変更している。

このとき、「TCP23は開いていず、SSH接続できるがTCP22は開いていない」という状態になる。

そして、iptablesでTCP23とTCP22は拒否しているので、
ポートスキャンするといずれも応答が返らない。

しかし、その結果だけからは、サーバの手前の別装置のFWやアクセスリストで拒否されているのか、
サーバのiptablesで拒否されているのか、サーバがダウンしているのか、はわからない。
アクセスしているIPアドレスが間違っている可能性もある。

pingは返ってくる、80番はアクセスできる、23番は応答がない、
であればFWかサーバのiptablesで拒否されているとわかる。