TCP プロトコルは接続指向で信頼性の高いプロトコルですが、悪用される可能性のあるさまざまな抜け穴があります。これらの抜け穴は、主に攻撃の観点から説明されています。
TCP/IP 攻撃シリーズの以前の記事では、ARP キャッシュ ポイズニングについて説明しました。
この記事では、次の 2 つの攻撃について説明します。
<オール>
TCP の概要
攻撃の説明を始める前に。 TCP がどのように機能するかについての基本的な理解を深めましょう。
TCP ヘッダーは次のようになります。
以下の説明では、TCP レベルで 2 つのホスト間で接続が確立される方法について説明します。これは、スリーウェイ ハンドシェイクとして知られています。このハンドシェイクは、あらゆる種類のデータを各方向に送信する前に必要です。接続が確立されると、データは双方向に流れることができます。各パケットには、パケットに含まれるデータの開始バイトのシーケンス番号と、受信したデータの確認応答が含まれます。
- 互いに通信したい 2 つのホスト (A と B) がいるとします。ホスト A が通信を開始するとします。 TCP の観点から見ると、ホスト A は SYN パケットをホスト B に送信します。
- SYN パケットは、SYN フラグがオンの TCP パケットです。
- このパケットには、初期シーケンス番号 (ホスト A の TCP によって生成される値)、送信元ポート、宛先ポートなども記載されています。
- このパケットがホスト B の TCP 層で受信されると、このホストは、SYN フラグと ACK フラグがオン、初期シーケンス番号、およびその他の情報を含む TCP パケットで応答します。
- ホスト A がこのパケットを受信すると、SYN フラグ、確認応答番号 (ホスト A の最初のシーケンス番号 + 1) などの情報をチェックして、これがホスト B からの予期されたパケットであることを確認します。
- 応答として、ホスト A は、ACK フラグがオンで、確認応答番号がホスト B の初期シーケンス番号 + 1 に設定されたパケットを送信します。
したがって、TCP 通信ではシーケンス番号が重要な役割を果たしていることがわかります。シーケンス番号は、TCP が特定のパケット内のデータの開始バイトに関連付ける番号です。このようにして、受信 TCP は受信したデータを追跡し、それに応じて確認します。承認番号は常に、次に予想されるシーケンス番号です。
TCP シーケンス予測攻撃
ホスト A とホスト B が相互に通信しているとします。ここで、間にいる攻撃者が A と B の間のパケットを何らかの方法で監視できるとしましょう。
攻撃者の行動を見てみましょう:
- 攻撃者はホスト A を攻撃したいと考えています。
- 新しいリクエストでホスト B をフラッディングし、サービス拒否攻撃を引き起こし、ホスト B と A との通信を停止します。
- これで、攻撃者は、A が B から期待しているパケットのシーケンス番号を予測できます。
- 攻撃者はそのようなパケットを作成し、ホスト A に送信します。
- それは偽装されたものなので、ホスト A はそれが B から来ていると思います。
- このパケットは、接続を終了するか、ホスト A に悪意のあるコマンド/スクリプトなどを実行するように要求するパケットである可能性があります。
このようにして、攻撃者が接続を乗っ取ることができます。
もう 1 つの方法は、ISN (初期シーケンス番号) の予測です。
RFC-793 からの抜粋を見てみましょう:
<ブロック引用>新しい接続が作成されると、新しい 32 ビット ISN を選択する初期シーケンス番号 (ISN) ジェネレータが使用されます。ジェネレーターは (おそらく架空の) 32 ビット クロックにバインドされており、その下位ビットはおよそ 4 マイクロ秒ごとにインクリメントされます。したがって、ISN は約 4.55 時間ごとに循環します。セグメントは最大セグメント ライフタイム (MSL) を超えてネットワークにとどまらず、MSL は 4.55 時間未満であると想定しているため、ISN が一意であると合理的に想定できます。
BSD TCP/IP スタックは、上記のメカニズムから逸れています。 BSD TCP/IP スタックは、シーケンス番号を毎秒 128,000 ずつ増やし、新しい TCP 接続ごとに 64,000 ずつ増やします。ご想像のとおり、これはより予測可能であるため、簡単に悪用される可能性があります。
TCP リセット攻撃
上記の攻撃が明確になると、この攻撃を理解するのは非常に簡単になります。この攻撃では:
- 攻撃者が TCP セッションをハイジャックできるようになると (前述のとおり)、この攻撃を開始できます。
- 攻撃者は、RST フラグがオンのパケットを A と B の両方、またはいずれかのホストに送信します。
- A と B の両方が、攻撃者がこれらのパケットを送信したことを認識していないため、これらのパケットを通常どおりに処理します。
- パケットがリセットされるため、A と B の間の接続は終了します。
したがって、TCP リセット攻撃は、2 つのホスト間の有効な TCP 接続を終了することを目的としていることがわかります。