Scapy でパケットをなりすます

Beginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、強力な Python ベースのパケット操作ツールである Scapy を使用して、ネットワークパケットをスプーフィングする方法を学びます。Wireshark で結果を分析しながら、カスタム TCP パケットを作成して送信する実用的な手法を探索します。

この実験では、Scapy のインストール、Python 仮想環境のセットアップ、パケットスプーフィング操作などの重要な手順をカバーしています。実践的な演習を通じて、ネットワークトラフィックの操作とセキュリティテストの方法について貴重な知見を得ることができます。


Skills Graph

Scapy のインストール

このステップでは、ネットワーク分析とセキュリティテストに使用される強力な Python ベースの対話型パケット操作ツールである Scapy をインストールします。Scapy を使用すると、細かい制御でネットワークパケットを作成、送信、キャプチャすることができます。これはネットワークパケット用のスイスペンチのようなもので、必要なあらゆる種類のネットワークパケットを構築することができます。

始める前に、正しい作業ディレクトリにいることを確認しましょう。~/project ディレクトリが、すべての作業を行う場所です。

cd ~/project

次に、Python のパッケージマネージャである pip を使用して Scapy をインストールします。pip は Python パッケージのアプリストアのようなもので、Python Package Index (PyPI) からソフトウェアをダウンロードしてインストールします。

pip install scapy

インストールが完了したら、すべてが正しくインストールされたことを確認するのが良い習慣です。これは Scapy のバージョン番号を確認することで行います。これにより、Scapy がインストールされていることと、Python が正常にインポートできることが確認できます。

python -c "import scapy; print(scapy.__version__)"

次のような出力が表示されるはずです(バージョン番号は若干異なる場合があります)。

2.4.5

最後に、Scapy の対話モードをテストしましょう。これは、完全なスクリプトを書く前にパケット作成を試すことができるプレイグラウンドのようなものです。対話型シェルに入るには、次のコマンドを実行します。

python -m scapy

Scapy のコマンドプロンプト (>>>) が表示されたら、正常に動作していることがわかります。対話型シェルを終了する準備ができたら、exit() と入力することができます。今は探索する必要はありません - 後のステップで対話型機能について説明します。

Python 環境のセットアップ

このステップでは、Python の仮想環境を使用して、Scapy の実験用の専用ワークスペースを作成します。これは、コンピュータ上の他のプロジェクトに影響を与えることなく作業できるクリーンルームを設定するようなものです。仮想環境は、パッケージのバージョンを管理し、異なる Python プロジェクト間の競合を防ぐのに役立ちます。

  1. まず、正しい場所から始めることを確認しましょう。このコマンドは、プロジェクトをセットアップするデフォルトの作業ディレクトリに移動します。

    cd ~/project
  2. 次に、scapy-env という名前の仮想環境を作成します。これにより、分離された環境に必要なすべての Python ファイルを含む新しいフォルダが作成されます。

    python -m venv scapy-env
  3. 新しい環境を使用し始めるには、それをアクティブ化する必要があります。アクティブ化すると、ターミナルのプロンプトの先頭に (scapy-env) が表示され、現在どの環境で作業しているかがわかります。

    source scapy-env/bin/activate
  4. システムにすでに Scapy がインストールされている場合でも、この環境に特化してインストールします。これにより、このプロジェクトに必要な正確なバージョンが用意されます。

    pip install scapy
  5. すべてが正しくセットアップされていることを確認しましょう。このコマンドは、仮想環境にインストールされているすべての Python パッケージを表示します。リストに scapy が表示されれば、使用準備ができていることが確認できます。

    pip list
  6. 作業が終了したら(ただし、次のステップでこの環境を使用するので、今は実行しないでください)、仮想環境を非アクティブ化して通常のシステムの Python に戻ることができます。

    deactivate

TCP パケットの作成

このステップでは、Scapy を使用して基本的な TCP パケットを作成します。ネットワークパケットの構築方法を理解することは、ネットワーク分析とセキュリティテストに不可欠です。実際のネットワーク通信の仕組みを模倣して、TCP パケットをレイヤーごとに構築します。

  1. まず、正しいディレクトリにいることと、仮想環境がアクティブであることを確認します。仮想環境は Python パッケージを分離します。

    cd ~/project
    source scapy-env/bin/activate
  2. craft_tcp.py という名前の新しい Python スクリプトを作成します。nano テキストエディタを使用しますが、好きなエディタを使用しても構いません。

    nano craft_tcp.py
  3. 次のコードを追加して、簡単な TCP パケットを作成します。各部分の機能を解説します。

    • IP レイヤーはソースアドレスと宛先アドレスを定義します。
    • TCP レイヤーはポートと接続フラグ(この場合は SYN)を指定します。
    • / 演算子はこれらのレイヤーを結合して完全なパケットを作成します。
    from scapy.all import *
    
    ## Create IP layer
    ip = IP(src="192.168.1.100", dst="192.168.1.1")
    
    ## Create TCP layer
    tcp = TCP(sport=1234, dport=80, flags="S")  ## SYN packet
    
    ## Combine layers to create packet
    packet = ip/tcp
    
    ## Display packet details
    packet.show()
  4. ファイルを保存し(nano では Ctrl+O、Enter、Ctrl+X)、実行します。.show() メソッドはパケットの構造を表示します。

    python craft_tcp.py
  5. 次のような出力が表示され、パケットのすべてのフィールドが表示されます。Scapy が自動的に一部の値を埋める一方で、他の値は None のままであることに注意してください(送信時に計算されます)。

    ###[ IP ]###
      version= 4
      ihl= None
      tos= 0x0
      len= None
      id= 1
      flags=
      frag= 0
      ttl= 64
      proto= tcp
      chksum= None
      src= 192.168.1.100
      dst= 192.168.1.1
      \options\
    ###[ TCP ]###
         sport= 1234
         dport= http
         seq= 0
         ack= 0
         dataofs= None
         reserved= 0
         flags= S
         window= 8192
         chksum= None
         urgptr= 0
         options= []

なりすましパケットの送信

このステップでは、TCP パケットのスクリプトを変更して、偽のソース IP アドレスを持つなりすましパケットを送信します。これは、攻撃者がネットワーク通信において自分の出身地を隠す方法を示しています。なりすまし(Spoofing)は、送信者が IP パケットのソースアドレスを意図的に偽造して、自分の身元を隠したり、他のシステムをなりすましたりする一般的な手法です。

  1. まず、正しいディレクトリにいることと、仮想環境がアクティブであることを確認します。仮想環境はこのプロジェクトの Python パッケージを分離します。

    cd ~/project
    source scapy-env/bin/activate
  2. send_spoofed.py という名前の新しい Python スクリプトを作成します。初心者にとって簡単な nano テキストエディタを使用します。

    nano send_spoofed.py
  3. 次のコードを追加して、なりすまし TCP パケットを送信します。このコードは、プライベート範囲(192.168.x.x と 10.x.x.x)のランダムな IP アドレスを生成します。これらはテストに安全です。TCP パケットは、SYN フラグが設定された状態で、Google の DNS サーバー(8.8.8.8)のポート 53 に送信されます。

    from scapy.all import *
    import random
    
    ## Spoofed source IP (using private IP range)
    spoofed_ip = f"192.168.{random.randint(1,254)}.{random.randint(1,254)}"
    
    ## Create and send packet
    packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S")
    send(packet, verbose=False)
    
    print(f"Sent spoofed TCP packet from {spoofed_ip} to 8.8.8.8")
  4. ファイルを保存し(nano では Ctrl+O、Enter、Ctrl+X)、実行します。このスクリプトは 1 つのなりすましパケットを生成して送信します。

    python send_spoofed.py
  5. 次のような出力が表示され、生成された偽のソース IP が示されます。

    Sent spoofed TCP packet from 192.168.45.123 to 8.8.8.8
  6. 複数のパケットを送信し、異なるなりすまし IP を確認するには、スクリプトにループを追加します。これにより、10.x.x.x 範囲の異なるランダムなソース IP を持つ 3 つのパケットが送信されます。

    for i in range(3):
        spoofed_ip = f"10.0.{random.randint(1,254)}.{random.randint(1,254)}"
        packet = IP(src=spoofed_ip, dst="8.8.8.8")/TCP(dport=53, flags="S")
        send(packet, verbose=False)
        print(f"Sent packet {i+1} from {spoofed_ip}")

Wireshark で検証する

このステップでは、前のステップで送信したなりすましパケットを Wireshark を使って検証します。Wireshark は強力なネットワークプロトコルアナライザで、ネットワークトラフィックをリアルタイムでキャプチャして調査することができます。この検証プロセスは、変更したソース IP アドレスでなりすましパケットが実際にネットワーク上を送信されているかどうかを確認するために重要です。

  1. まず、正しいディレクトリにいることと、仮想環境がアクティブであることを確認します。仮想環境にはこの実験に必要なすべての Python パッケージが含まれています。

    cd ~/project
    source scapy-env/bin/activate
  2. LabEx の仮想マシンに Wireshark をインストールします。Wireshark は事前にインストールされていないので、最初にインストールする必要があります。

    sudo apt-get update
    sudo apt-get install -y wireshark
  3. Wireshark をバックグラウンドで起動します。'&' 記号を使うと、Wireshark が実行されている間もターミナルを使い続けることができます。

    wireshark &
  4. Wireshark のインターフェイスで以下の操作を行います。

    • アクティブなネットワークインターフェイス(通常は eth0)を選択します。これはネットワーク接続を表しています。
    • サメのヒレのアイコンをクリックしてパケットキャプチャを開始します。これにより、すべてのネットワークトラフィックの記録が始まります。
    • 表示フィルタを適用します:tcp.port == 53。これにより、ポート 53(DNS ポート)の TCP トラフィックのみが表示されるようにフィルタリングされます。
  5. 別のターミナルで、なりすましパケットのスクリプトを再度実行します。これにより、Wireshark がキャプチャする新しいトラフィックが生成されます。

    python send_spoofed.py
  6. Wireshark で結果を確認します。

    • ポート 53 への TCP SYN パケットが表示されるはずです。これらは接続開始パケットです。
    • ソース IP アドレスがなりすまし IP と一致することを確認します。これにより、なりすましが成功したことが確認できます。
    • TCP ハンドシェイクの試行(SYN パケット)に注意します。これらは接続試行を示しています。
  7. キャプチャを後で分析するために保存するには、以下の操作を行います。

    • 「ファイル」→「保存」をクリックします。
    • ~/projectspoofed_capture.pcap として保存します。PCAP ファイルには、将来参照するための生のパケットデータが含まれています。

まとめ

この実験では、分離された Python 仮想環境でネットワークパケット操作のために Scapy をインストールし、設定する方法を学びました。このプロセスには、環境のセットアップ、Scapy のインストール、バージョンチェックやインタラクティブテストを通じた機能の検証が含まれていました。

また、TCP パケットの作成、ネットワークトラフィックをシミュレートするためのなりすましパケットの送信、および Wireshark を使用した結果の分析に関する実践的な経験を得ました。これらのスキルは、ネットワークセキュリティテストやパケット操作技術の基礎を提供します。