Wireshark を用いて SN実験2 で実装した TCP 通信をキャプチャしてみた.

こんにちは.あらい大先生です.

SN コース の 2 回生は,秋学期に SN実験2 と ネットワークセキュリティ を履修しました(します).
SN実験2 では TCP を用いてサーバとクライアントが通信するプログラムを実装しましたし,ネットワークセキュリティでは TCP を悪用した攻撃の一つである SYN Flood 攻撃を習いました.
当時は何とか理解して課題をこなすだけで精一杯でしたが,ほぼ研究だけの生活で余裕がある今となって一つの疑問が湧きました.

それは,
「SN実験2 で実装した TCP サーバにも SYN Flood 攻撃を行えるのではないか?」
です.

ただし,SYN Flood 攻撃を理解するには,TCP の仕組み,特に 3-way handshake の仕組みを理解する必要があります.
3-way hand shake は コンピュータネットワーク や ネットワークセキュリティ の授業で丁寧に説明されていたと思います.
とはいえ,「パケットキャプチャツール等を用いて 3-way handshake が行われる様子を観測したことがないので,何となくで仕組みを理解している」という学生は少なくないでしょう.
ということで,今回のブログでは準備編として,Wireshark を用いて 3-way handshake が行われる様子を観測しながら,その仕組みを説明します.

実験環境

例のごとく,実験のための環境を用意しました.

ネットワーク

以下のマシン,およびネットワークを構築しました.

役割マシンOSIPアドレスポート番号
クライアントWSLDebian192.168.56.1/24p
サーバVMDebian192.168.56.101/2412345

TCP クライアントは WSL で,TCP サーバは VM で動作させます.
VM でサーバを構築した理由は,サーバに脆弱性を持たせたり,攻撃したりするからです.
一方,クライアントは,ELF ファイルを実行できれば良いので WSL を用いました.

OS は両方とも Debian です.
Debian を用いた理由は,Ubuntu よりも軽量で研究用 PC のストレージを圧迫させずに済むからです.

また,クライアント と サーバ は VirtualBox Host-Only Ethernet Adapter によって接続されています.

プログラム

使用するプログラムは,SN実験2 の ネットワークとセキュリティ実験の資料に記載されていた simpleTCPclient.c と simpleTCPserver.c です(著作権の都合でソースコードを公開することはできません…).
ただし,本実験のために,simpleTCPclient.c の inet_pton() の第二引数を “127.0.0.1” から “192.168.56.101” へ書き換えます.

予想

以上から,以下のような通信が行われると予想できます. 

  1. クライアント は p 番ポート を用いて,サーバ の 12345 番ポートへ SYN パケットを送信する.
  2. SYN パケットを受信した サーバ は 12345番ポートを用いて,クライアント の p 番ポートへ SYN/ACK パケットを送信する.
  3. SYN/ACK パケットを受信した クライアントは p 番ポートを用いて,サーバ の 12345 番ポートへ ACK パケットを送信する.

Wireshark でパケットキャプチャ

それでは,Wireshark を用いて VirtualBox Host-Only Network の中で流れるパケットをキャプチャしつつ,simpleTCPclient と simpleTCPserver を実行します.
次に,実験とは無関係なパケットをキャプチャする場合があるので,「tcp.port == 12345」といった条件でフィルタリングします.
その結果,以下の画像が示すように 8 つのパケットが見つかりました.

ここからは,それぞれのパケットの送信元 IP アドレス,送信先の IP アドレス,TCP セグメント内の Flags を確認していきます.

通信の開始

画像 1 ~ 3 より,先ほどの予想に p = 58502 を当てはめると,確かに 3-way handshake が行われていることを確認できます.

画像1
クライアント は 58502 番ポート を用いて,サーバ の 12345 番ポートへ SYN パケットを送信しています.
画像2
SYN パケットを受信した サーバ は 12345番ポートを用いて,クライアント の 58502 番ポートへ SYN/ACK パケットを送信しています.
画像3
SYN/ACK パケットを受信した クライアントは 58502 番ポートを用いて,サーバ の 12345 番ポートへ ACK パケットを送信しています.

"HELLO" の送信

また,画像 4 より,サーバ から クライアント へ ”HELLO” を送信していることも確認できます.

画像4
サーバは 12345 番ポートを用いて,クライアント の 58502 番ポートへ "HELLO" を送信しています.

通信の終了

画像 5 ~ 8 より,3-way handshake で通信を開始したように,FIN や ACK パケットを送受信して通信を終了していると考えられます.

画像5
"HELLO" を受信した クライアント は 58502 番ポートを用いて,サーバ の 12345 番ポートへ FIN/ACK パケットを送信しています.
画像6
FIN/ACK パケットを受信した サーバ は 12345番ポートを用いて,クライアント の 58502 番ポートへ FIN/ACK パケットを送信しています.
画像7
FIN/ACK パケットを受信した クライアントは 58502 番ポートを用いて,サーバ の 12345 番ポートへ ACK パケットを送信しています.
画像8
ACK パケットを受信した サーバ は 12345番ポートを用いて,クライアント の 58502 番ポートへ ACK パケットを送信しています.

終わりに

今回は SYN Flood 攻撃を理解するための準備編として,Wireshark を用いて TCP の 3-way handshake を観測しました.
また,同様の手順で シーケンス番号 と ACK 番号 が対応していたり,"HELLO" が平文で送信されていたりといったことも確認できます.

このように,ツールやプログラムを用いて実物を確認すると,「知識として」だけではなく「経験として」も知ることできます.
慣れないうちは実験のための準備だけでも大変かもしれませんが,それも大事な経験なので,ぜひともやってみましょう.

コメントを残す

メールアドレスが公開されることはありません。