C言語で通信を盗聴する !? その1【ARPキャッシュポイズニング】
こんにちは!まさです。
今日では有線より無線で通信する機会が多くなっています。それに伴い、ますます盗聴のリスクは高まっていると思います。具体的に盗聴はどのようにしてなされるのでしょうか。
今回は2つの通信機器同士の通信の盗聴の具体的な仕組みについて紹介したいと思います。
通信機器同士が通信をする場合その2つをつなぐ通信経路ができます。この通信経路の間に第三者が入り込み、通信路を流れるパケットを盗み見る攻撃のことを総称して"中間者攻撃(MITM攻撃)"といいます。
この攻撃を成功させるためには通信経路を攻撃者の都合のいいように変更できなければなりません。一体どのようにして通信の向きを変更するのでしょうか?
今回は"ARPキャッシュポイズニング"という手法について紹介したいと思います。
簡単のため、今回は攻撃者と被害者はすべて同一のネットワーク(LAN)にいることを想定してください。
この攻撃を理解するためにはまず、ARPについて理解する必要があります。
★ ARP(Address Resolution Protocol)
ARPは通信相手のMACアドレスとIPアドレスの対応づけのためのプロトコルです。
ここでは、IPアドレスは通信したい相手の名前だと思ってください。
スマホを使って誰かに電話したいとき、相手の名前(IPアドレス)を知っているだけでは通話できません。電話番号が必要です。この電話番号の役割をするのがここではMACアドレスだと思ってください。
つまり通信機器が通信するためにはIPアドレス(名前)とMACアドレス(電話番号)の対応づけが必要なのです。これを担うのがARPです。
具体的なARPによるやり取りはARPリクエストとARPリプライで成立します。
まず通信したい機器はARPリクエストを送ります。このとき、通信したい相手のIPアドレスは知っていますが、そのMACアドレスを知りません。そのため、"LAN全体にブロードキャスト"でリクエストを送ります。
リクエストを受け取った機器の中で、該当するIPアドレスの機器"だけ"がリクエストに応答して、自分のMACアドレスをARPリプライとして送信します。
これにより、二者の間のIPアドレスとMACアドレスの対応が取れたので通信が開始できるわけです。
これがARPの仕組みです。
さて、ここでもし再び同じ相手と通信したい場合はどうすればいいでしょうか?
もう一度ブロードキャストでリクエストを送るのでしょうか?
それでは効率が悪いのでPCには一度通信した相手のMACアドレスとIPアドレスを記憶するための"ARPキャッシュ"というものが存在します。
(ちなみに"arp"コマンドでARPキャッシュは確認することができます。)
PCはこのARPキャッシュを参照して通信相手にパケットを送るわけです。
ここからが "ARPキャッシュポイズニング" の話になります。
もし悪意を持った者が偽りのARPリプライを送ったらどうなるでしょうか?
つまり、攻撃者が自分と異なるIPアドレスを以てして、自分自身のMACアドレスを付与したARPリプライを送りつけるとどうなるか。
被害者はニセのARPリプライの情報をもとにARPキャッシュを上書きしてしまいます。
被害者は上書きされたARPキャッシュを参照してパケットを送信します。
これによって、中間者攻撃が成立するのです。
ここまでの話は2つのPCの間の通信を例に説明しましたが、MACアドレスとIPアドレスを持っている機器であればPCかどうかを問いません。
つまり、"スマホ"や"ルータ"に対してARPキャッシュポイズニングを行えば、スマホからインターネットに流れるパケットを盗聴することができます。
ではどうやってこの攻撃を防ぐことができるのでしょうか。
具体的な対策として考えられるのは以下の2つだと考えています。
今ではほとんどのウェブサイトがhttpsでの通信を行っており、パケットが暗号化されているので、この攻撃を受けてもデータを盗み見ることはできません。
しかし、httpではパケットが平文のまま送信されるため、もしウェブサイトがログインフォームでクレジット情報やパスワードの入力を求めてきた場合はすべて筒抜けになります。
2つ目にFreeWifiなどホストが不明なアクセスポイントに接続してしまうと、そのホストが悪意ある者だった場合、この攻撃を受ける危険性があります。
今回は中間者攻撃の仕組みについて説明しました。
次回は実際にプログラムで偽のARPリプライを生成する方法について説明したいと思います。