皆さん、今回はScapyについてブログを書きます。

攻撃をシュミレーションしたり、ペネトレーションテストでパケットを操作したり、いろいろ重宝されるツールです。 Python2, Python3でモジュールが提供されているため、pipで簡単にインストールすることができます。

pip3 install scapy

最近、あるトレーニングのコンテンツでDDoS攻撃されている環境を作らなければならなかったのですが、その時に久しぶりにScapyを使いました。ScapyはIP/UDP/TCPなど各レイヤーやプロトコルで自由自在にプログラミングができるので、簡単なプロトコルを作るのも勉強になって良いと思います。

また、自社で開発した特殊なプロトコルの脆弱性を調査したいときに非常に役に立ちます。例えば、端末で受信するプロトコルをキャプチャーしてパケットを分析するとUDP上で独自のプロトコルで動作していることがわかれば、そのパケットと同じものを Scapyで作って送信して試してみることもできます。

あるプロトコル上のある値を変えてみると、面白い結果になったりと...

下のサンプルコードはDNSアンプ攻撃を行うスクリプトです。 このサンプルプログラムを改造して許可されていないサイトへの攻撃には利用しないでください。不正アクセスになります。

Scapy Sample 1

 

ip = IP(src=target, dst=dns1) 部分はIPプロトコルレイヤーをセットしており、送信先(dst)と送信元(src)のアドレスをセットしています。送信先、送信元以外にもオプションをセットすることができますが、特に指定しない場合はデフォルト値が使用されます。デフォルト値やどのようなオプションが利用できるのか確認する時はscapyコマンドを実行するとインタラクティブモードになりますので、そこでls(IP)を実行すると確認することができます。

Scapy IP Option

 

次にIPプロトコルレイヤーの上で送信するプロトコルを準備します。今回のスクリプトの場合はUDPになりますのでUDP宛先ポートをセットします。udp = UDP(dport=53) 今回宛先ポートしか設定していませんが、IPプロトコルと同じようにls(UDP)で確認することができます。

次にUDP上で送信したいプロトコルを指定します。今回はDNSプロトコルをセットします。
dns = DNS(rd=1, qdcount=1, qd=DNSQR(qname="www.google.com", qtype=255))
同様にls(DNS)でオプションを確認することができますが、DNSの場合ヘッダーフィールドが細かく指定できますので多くのオプションを設定することができます。

Scapy DNS

 

IPプロトコル、UDP、DNSなど各プロトコルをセットしたら、以下のように送信するだけでパケットが送信できます。
request = (ip/udp/dns)
send(request)

今回パケットを一方的に送る例を書きましたが、レスポンスを受け取ることで、レスポンスに応じたロジックを組むことが可能になります。またscapyの利用方法のイメージを掴んでいただくために書きましたが、理解してくると非常に便利なツールです。簡単なスクリプトを書くことでプロトコルの勉強になりますので、是非触ってみてください。また機会があればscapyを使ってプロトコルを解説してみようと思います。今回DNSのサンプルでしたが、DNSの細かい話も別の機会にしたいですね。

関連リンク