スプーフィングはどのように行われるのか
サイバー攻撃のニュースで、侵入者による IP アドレスや MAC アドレスのスプーフィングという言葉を耳にする機会は多いと思いますが、これは正確にはどういう意味なのでしょうか。とても複雑なことをするものなのでしょうか。そして、このような攻撃からどのように身を護ることができるのでしょうか。
難しい攻撃方法で、コンピュータの天才でもなければできないように思うかもしれませんが、実際には、それほど複雑なことではありません。私自身は、物事を複雑に考えすぎてしまう傾向がありますが、複雑だったり、よくわかなかったりすることがあったら、自分でテストして確かめてみるのが、理解の近道です。そこで今回は、スプーフィングの方法を学んでみたいと思います。この記事で取り上げるのは、IP アドレスと MAC アドレスのスプーフィングです。
このテストに必要なものは以下のとおりです。
- 管理アクセス権がある 2 つ以上のネットワークホスト(コンピュータやノート PC など)。仮想マシンでも可で、実際によく使われます
- VM を使用する場合は、仮想マシンマネージャ(VirtualBox、VMware Fusion / Workstation)をダウンロードします
- パケットキャプチャ用の Wireshark をダウンロードしてインストールする手段が必要です
- Python スクリプト言語、具体的には「Scapy」モジュールをインストールします
スプーフィングのテスト方法
- 仮想化を利用する場合は、使用するオペレーティングシステムによって異なりますが、該当する仮想化ソフトウェアをダウンロードします
- ホストが同一ネットワーク上に設定され、相互に通信できることを確認します
- Wireshark をダウンロードしてインストールし、実行します
- Python と Scapy モジュールの最新版をダウンロードします
私の場合は、MacBook Pro で VMware Fusion と Ubuntu VM を使用し、Windows 10 のクライアントを使用してテストしました。Python、Scapy、Wireshark はすでにインストールされていたので、準備はこれで完了です。私の Ubuntu インスタンス(この場合の IP アドレスは 172.17.42.141)と Windows インスタンスのスクリーンショットは以下のとおりです。端末で「ip addr」を実行して、IP アドレスと MAC アドレスの両方を表示しました。
Ubuntu から Windows 10 インスタンスに(IP アドレスは 172.17.42.140)に ping しました。
Wireshark に次のような詳細が表示されました。
左側の「No.」列の下を見ると、2 つの ping 要求、4 つのパケットを確認できます。「Info」列の下には、「Echo (ping) request…」または「Echo (ping) reply…」が表示されています。これが、私の Ubuntu ホストからの ping 要求と ping した IP(この場合は私の Windows 10 インスタンス)からの応答です。ここでの reply とは、要求に対する応答であり、誰かに「やあ!」と言うと返事が返ってくるようなものです。
IP パケット 1 と 3 は私の Ubuntu からのパケットで、パケット 2 と 4 が応答です。上記のスクリーンショットの「Source」と「Destination」列にその IP アドレスが表示されています。
次に、最初のパケットだけに注目するため、このパケットをダブルクリックして、「Ethernet II」と「Internet Protocol Version 4」のセクションを展開します。以下の図では、注目すべき部分を四角で囲みました。この図には、細かいデータに関する情報が表示されていますが、この記事の本題から外れるため、説明は省略します。
上記のスクリーンショットに MAC アドレスが表示されていますが、これは、Windows では「物理アドレス」と呼ばれ、Ubuntuでは「link/ether」と出力されます。これまでのところ、MAC アドレスと IP アドレスが一致しています。ここから、スプーフィングのステップに進みます。以下のスクリーンショットは、私の Ubuntu インスタンスのスプーフィングされた IP アドレスのスクリーンショットで、特別に作成したパケットを Windows インスタンスに送信しています。
ここに気づくのは、「Ethernet II」の説明の MAC アドレスは前のスクリーンショットと同じですが、IP アドレス「Source」が「IP addr」で表示されたものと異なる点です。以下は、これを実行するために Python で使用したコマンドのスクリーンショットです。
このコンストラクタをさらに詳しく調べることもできますが、ここではこの記事の本題に沿って、MAC アドレスを変える方法と IP アドレスのスプーフィングのステップに進むことにします。
ここまでの説明を読んだだけで MAC と IP アドレスがスプーフィングされたことを検証するのは難しいと思いますが、実は、前述の同じ 2 つの VM を使えば、いずれも手作業でできることなのです。そのための Python / Scapy コマンドを以下に示します。
ここまでの説明でスプーフィングの攻撃側の手順がおわかりいただけたと思いますので、最後に残った疑問、すなわち、防御側がどのような対策でこのような攻撃から身を護ることができるのかを説明して、この記事を締めくくることにしましょう。
実は、IP スプーフィング対策は難しいことではなく、ウォッチガードではデフォルトで有効になっているため、方法は驚くほど簡単です。「Default Threat Protection」と呼ばれる、指定したインタフェースに対する着信要求を検証する機能があります。製品マニュアルに詳しく説明されていますが、簡単に言えば、ウォッチガードのファイアウォールは、着信パケットとその宛先をいくつものレベルで確認します。たとえば、あるコンピュータがインスタンス 0(インターネットを宛先とする通信を許可するデフォルトの外部インタフェース)にスプーフィングされた内部 IP アドレスが存在する場合、ファイアウォールの「スパイダーマン」がこれを感知してブロックします。
MAC アドレスのスプーフィングの場合は話が少し複雑であり、それは、クライアントそのものが任意の MAC アドレスを送信し、何を送信するかをファイアウォールが制御できないためです。ファイアウォールができるのは、そのような状況を処理することだけです。さらには、MAC アドレスはインターネットを通過することはなく、ローカルネットワークのトラフィックだけです。そこで、MAC スプーフィングを心配していて、実際に何らかの脅威が存在するのであれば、攻撃者がすでにローカルネットワークに侵入しているため、問題がさらに大きくなることを意味します。MAC アドレスのホワイトリスト/ブラックリストに登録する方法はありますが、前述のような攻撃者に突破されてしまう恐れがあります。そこで、対策となるのが、何らかの認証の要件を設けてクライアントが認証情報を入力して認証サーバに対して必ず認証するようにしてからアクセスを許可するようにする方法です。具体的な手順については、こちらを参照してください。
参考資料
Biondi, P. 共著、
「Welcome to Scapy’s documentation!」、
出典:https://scapy.readthedocs.io/en/latest/index.html
Pierre(2017 年 12 月 26 日)、
「Understanding the Scapy “Mac address to reach destination not found. Using broadcast.” Warning」[1件目の答え]、
出典:https://stackoverflow.com/questions/18625072/understanding-the-scapy-mac-address-to-reach-destination-not-found-using-broad