サイバー攻撃では、攻撃者が事前に「攻撃が可能な対象」を調査することがある。

 サーバーを攻撃する場合は、TCPやUDPの開いているポートを調べるポートスキャンを行うことが多い(図1-1)。ポートが開いていれば、そのポートを使うサービスに攻撃用のパケットを送り込めるからだ。

図1-1●攻撃可能な対象をあらかじめ調査
ポートスキャンではサーバーの開いているポートを調べる。ARPスキャンではネットワーク内にある機器のMACアドレスとIPアドレスを調べる。
[画像のクリックで拡大表示]

 ネットワーク内にどんな端末が存在するかを調べることもある。それを可能にするのがARPスキャンだ。各端末のMACアドレスやIPアドレスを調べられる。これらの手法を具体的に見ていこう。

ソケットで順番にアクセス

 Pythonによるネットワークプログラムは、Socketモジュールを利用するのが基本だ。そこでSocketモジュールを使ってポートスキャンを実施するコードを記述した(図1-2)。

図1-2●ポートスキャンを実施するPythonのコード
Socketモジュールを利用してソケットを生成し、ポートを順番に指定してアクセスする。返ってきた値(リターンコード)が0の場合はポートが開いているので、そのポートを表示する。
[画像のクリックで拡大表示]

 最初にSocketモジュールをインポートし、次に75番から84番までのポート番号を順番に指定してループを回している。with構文を使ってソケットを生成し、connect_exメソッドを使ってポートにアクセスしている。ここでは「localhost」を指定して自分自身のポートをスキャンしているが、代わりに攻撃対象のサーバーのIPアドレスを指定することで、そのサーバーに対してポートスキャンを実施できる。

 Socketモジュールでポートにアクセスするには本来はconnectメソッドを使う。ただ、connectメソッドだとアクセスに失敗したときにはエラーが返ってくるので、エラー処理を行う必要がある。

 そこで、connect_exというメソッドを使った。このメソッドだと、アクセスに成功したときには0、失敗したときには0以外の数値が返ってくる。if文を使って、返ってきた値が0の場合に、そのポート番号を表示している。

 では、ポートスキャンを実行してみよう(図1-3)。まず、パソコン上で80番ポートを指定して簡易Webサーバーを起動。同じパソコンでコードを実行すると「port 80 is open」と表示され、80番ポートが開いていることを確認できた。

図1-3●ポートスキャンで開いている80番ポートを検出
Pythonのhttp.serverモジュールを利用し、80番ポートを指定して簡易Webサーバーを起動した。ポートスキャンを実施することで、80番ポートが開いていることを確認できた。
[画像のクリックで拡大表示]
▼UDP
User Datagram Protocolの略。
▼MAC
Media Access Controlの略。
▼75番から84番までのポート番号
スキャンするポート番号の範囲を狭くしているのは、このコードのポートスキャンの速度が遅いため。高速化するにはマルチスレッド化などの工夫が必要になる。
▼with構文
ファイルやソケットといったリソースを開く際に便利な構文。with構文を使わずにリソースを開くと、リソースの利用が終わったときに明示的にクローズする必要がある。with構文を使うと、自動的にクローズされる。

この先は有料会員の登録が必要です。「日経NETWORK」定期購読者もログインしてお読みいただけます。今なら有料会員(月額プラン)が12月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら