WindowsでEtherインターフェースを指定してパケット送信する方法[scapy Python Ethernetパケット送信]

Python
この記事は約3分で読めます。
スポンサーリンク

今回は、Windows上で、EthernetのRawソケットでパケット送信してみたいなと思い、Python で送信する方法について挑戦してみたので、その方法についてシェアします。

使用ライブラリ

まずは、今回必要となるライブラリです。

  • scapy

scapyは、Pythonで有名なEthernetのパケット生成・送受信・解析用のライブラリです。

scapyのインストール方法は以下です。

pip install scapy

上記をコマンドプロンプトで実行すると以下のようになり、successfully installedと表示されればインストール完了となります。

プログラムと実行結果

今回のプログラムの全体は以下の通りです。

# 参考
# https://scapy.readthedocs.io/en/latest/usage.html

from scapy.all import *

def main():
    IFACES.show()  # IFACE 確認
    
    iface = IFACES.dev_from_index(4)  # Iface名取得
    socket = conf.L2socket(iface=iface)  # ソケット取得
    
    ### SEND
    print("Ether")
    ls(Ether)
    pcakt = Ether(dst='11:22:33:44:55:66',src='66:55:44:33:22:11',type=2048)
    socket.send(pcakt) # send raw data

    print("\n")
    print("ARP")
    ls(ARP)
    pcakt = ARP()
    socket.send(pcakt) # send raw data

    print("\n")
    print("ICMP")
    ls(ICMP)
    pcakt = ICMP()
    socket.send(pcakt) # send raw data

    print("\n")
    print("IP")
    ls(IP)
    pcakt = Ether()/IP()
    socket.send(pcakt) # send raw data

    print("\n")
    print("TCP")
    ls(TCP)
    pcakt = Ether()/IP()/TCP()
    socket.send(pcakt) # send raw data
    
    print("\n")
    print("Dot1Q")
    ls(Dot1Q)
    pcakt = Ether()/Dot1Q(vlan=1)/IP()/TCP()
    socket.send(pcakt) # send raw data
    
    print("\n")
    print("Dot1Q")
    ls(Dot1Q)
    pcakt = Ether()/Dot1Q(vlan=1)/Dot1Q(vlan=2)/IP()/TCP()
    socket.send(pcakt) # send raw data
    
    socket.close()
    
    

if __name__ == '__main__':
    main()

実行結果は、wiresharkのログを見てもらえればと思います。

ちなみに、wiresharkというのは、パケットキャプチャを行うためのツールで、最も一般的に使用されているフリーソフトのツールになります。
以下からダウンロードできます。

Wireshark · Download

ここからは、プログラムの解説になりますが、次ページにて記載します。

スポンサーリンク

コメント

タイトルとURLをコピーしました