ポートスキャンの概要
サーバーに対して攻撃を仕掛ける時にはセキュリティの弱いところを狙う必要があります。
そのようなときに、ターゲットのサーバーはどのポートを開けているかを確認することで攻撃の足がかりを見つけます。
ターゲットのサーバーの空いているポートを取得することをポートスキャンと言います。
これ自体が攻撃というよりも、攻撃をするための準備的なものだと思います。
ポート
ポートは0~65535番まで存在していて、よく使われるものには22番:ssh接続
、80番:http通信
、443番:https通信
などがあります。
ポートについて知らないかたはこちらを!
ポートスキャンの具体例
ポートスキャンをするにはnmapというツールが使用されるようです。ここでは説明を割愛します。
nmapというツールを使うことでWebサーバーのソフトウェアが何か、バージョンは何かということまでわかってしまうので、そのバージョンの脆弱性をついた攻撃をされてしまいます。
ポートスキャンにはいくつかの方法があり、ここではTCPスキャンとUDPスキャンを紹介します。
TCPスキャン
TCPスキャンを理解するためにまず、TCP通信を簡単に紹介します。
TCP通信
TCPでは通信を始める前に以下の3ステップで、相手と通信可能かどうかを確かめます。
①通信したい相手のサーバーにSYNパケットを送信(通信してもいい?)
②相手のサーバーからSYN/ACKパケットが返ってくる(いいよー!)
③ACKパケットを送り返す(ほんじゃ通信するね!)
このように相手と通信できるかどうかを確認することをスリーウェイハンドシェイク
といいます。
TCP通信を用いたポートが空いているかの判別方法
TCP通信ではスリーウェイハンドシェイクを行うので、こちらから特定のポートにSYNパケットを送り相手からSYN/ACKパケットが返ってきた時点でポートが空いているということがわかります。
ここまでで、ポートが開いているかどうかがわかるためACKパケットは送る必要がありません。加えて、もしACKパケットを送り返してしまうと相手のサーバーにログとしてやりとりが残ってしまいます。
攻撃者にとってそれは都合が悪いので、ACKパケットの代わりにRSTパケットを送ります。こうすることで相手のサーバーにログを残すことなく開いているポートを調べることができます。
UDPスキャン
こちらも同じく、まずはUDP通信について軽く紹介します。
UDP通信
TCP通信では相手としっかり通信ができるかを確認してから通信を開始していました。それに対してUDPは相手に届いているかどうかは確認しません。とにかくこちらから相手に向かって送ります。
相手に届いているか確認した方がいいじゃないかとも思いますが、TCPのようにいちいち確認をしているとスピードが落ちます。多少データが届いていない部分があってもいいからとにかく送るという時にはUDP通信を使います。
音声や動画ではUDPが使われているそうです。
確かにビデオ通話とかでは所々通信が悪くて途切れ途切れになることがありますもんね。
UDP通信を用いたポートが空いているかの判別方法
UDP通信では一方的に相手にデータを送るので、相手のサーバーから返信は返ってきません。
ただし、相手のサーバーの閉じているポートに通信を行おうとするとエラーが返ってくるので、これを用いてポートが開いているかを判断します。
つまり、UDP通信を行なってエラーが返って来なければポートが空いているということか!
となりそうなんですが、そうでもないみたいです。
相手のサーバーの設定で、もし開けていないポートに対して通信があってもエラーを返さないようにする。ということもできるみたいです。
つまり、エラーが返ってこない場合は
①ポートが開いていてエラーが返ってこない
②ポートが閉じているが設定でエラーが返らないようになっている
という2パターンがあるので、ポートが空いているかどうかは確実にはわからないみたいです。
対策
不要なポートは閉じる
使用していないポートが不用意に開いていると攻撃の対象になってしまう可能性があるので、使っていないポートは閉じておきます。
IDS/IPSを導入
IDSやIPSはパケットの中身をチェックして攻撃と思われるものが送られてきた時には管理者に通知したり、遮断したりできるものです。
WAFの導入
WebサーバーやWebアプリケーションに特化した、ファイアーウォール。WAFを導入すると、IDS/IPSで検知できないものも防げたりするようです。
おわりに
セキュリティ難しい!
以上です!!