日経NETWORK2019.10.02コピーしましたPRサイバー攻撃では、攻撃者が事前に「攻撃が可能な対象」を調査することがある。サーバーを攻撃する場合は、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サーバーを起動。open」と表示され、80番ポートが開いていることを確認できた。図1-3●ポートスキャンで開いている80番ポートを検出Pythonのhttp.serverモジュールを利用し、80番ポートを指定して簡易Webサーバーを起動した。ポートスキャンを実施することで、80番ポートが開いていることを確認できた。Protocolの略。▼75番から84番までのポート番号スキャンするポート番号の範囲を狭くしているのは、このコードのポートスキャンの速度が遅いため。高速化するにはマルチスレッド化などの工夫が必要になる。▼with構文ファイルやソケットといったリソースを開く際に便利な構文。with構文を使わずにリソースを開くと、リソースの利用が終わったときに明示的にクローズする必要がある。with構文を使うと、自動的にクローズされる。この記事は有料会員限定です「日経NETWORK」定期購読者もログインしてお読みいただけます。26社DX戦略レポート。DXで成果を上げるために不可欠な情報がこの1冊に。現場の負担軽減を!医療界でのAWS活用法500万社が導入。情報銀行の成り立ち、事例、現状課題やその行方を網羅。経営戦略である以上、「会計」の知識やスキルが欠かせません。