うさちゃんと一緒(4) Rabbit 4000 対 Python Scapy

Joseph Halfmoon

前回はRabbit4000からラズパイに向かってPingかけるのを、ラズパイ上のWiresharkで覗き見してました。今回は、Rabbit4000とパケットをやり取りするトイメンとして、Python上のScapyを使ってみます。これでEthernetの両側をパケットレベルでプログラムできる筈。

うさちゃん(Rabbit4000)の方は、DynamicC開発環境でプログラムしています。いかなるプロトコルでも(自分勝手にでっち上げたものであっても)Ethernetパケットに収まるようなものであれば扱えます。

うさちゃんの対抗機として、Raspberry Pi 3 model B+ を使うつもりです。Raspberry Pi OSで動作しているのでTCP/IPなどのプロトコルスタックは当然載っているし、その上で動くアプリレイヤのプログラムも使えます。しかし、うさちゃんとは

低レベル(Ethernetのパケットレベル)から対決したい

という目論見です。そこで何年かぶりで、Python上のScapyを使ってみることにいたしました。オフィシャル・ページが以下に。

Scapy

Ethernetレベルのパケットから「お好み」のパケットを作り出して、ネットワークに投げつけることができる優れモノ(ちょっとヤバイ)Pythonのモジュールです。まあ、これを使えばxxスキャン的なものは簡単に書けてしまう一品(よゐこは真似しないでね的な。)

次回以降、ウサちゃん側でいろいろプロトコルを実装してみたら、ラズパイ上のScapyでそいつらと対決してみる予定です。今回は、Scapyをラズパイに導入後、うさちゃんとEthernet経由で通信できていることを確認するところまで。

うさちゃん(Rabbit 4000)側の準備

今回、うさちゃん側には第1回で使用したPingにお返事するだけのプログラムを再書き込みして走らせました。DynamicC開発環境から実行後、Stdioウインドウを見ると以下のような感じです。うさちゃん起動!

DynamicC_stdio

ラズパイPico側でscapy起動

Scapyは、Pythonモジュールで、Python2.x系でもPython3.x系でも動作するようです。インストールは pip(あるいはpip3)で可能です。ただし、特権なければ動作しないモジュールなので、特権持った状態で見えるようにインストールしておかねばならないようです。

Pythonのモジュールなので、スクリプトの中で import して使えますが、独自の対話的な実行環境も使えるようです。こんな感じ。

sudo scapy -H

プロンプトが返ってきた後は、scapyの種々の関数などを使えるので、そいつらを呼び出して、いろいろ試してみることができます。

今回は、以下のドキュメントの中から、ARPのパケットを送受する「ワンライナー」を使わせていただきました。前回Wiresharkで観察してみたものを、今回は、パケットレベルから組み立ててみる感じです。

Usage

以下では、Ethernetパケットに送信先「オールF」のブロードキャストアドレスを書き込んであります。その中に載せるのはARPパケットであり、MACアドレスを知りたい装置のIPアドレスとして 192.168.2.59(うさちゃんのIPアドレス)を書き込んであります。

これを レイヤ2(Ethernetレベル)でパケットを送受信するためのsrp()関数に渡しています。

ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.2.59"),timeout=2)

ちゃんとお返事が返れば ans に受信したパケットが入っている筈。タイムアウト時間まで待ってもお返事がなければ unansに残念な結果が入ってくるでしょう。実際に実行してみたところが以下に。

scapyOnRPi

ちゃんと、お返事返ってきました。そして何やらMACアドレスも返ってきてます。前回、うさちゃんのMACアドレスは確認してあったので、比べてみると一致しているようです。良かった。

うさちゃんとラズパイ間で任意のEthernetフレームをやりとりするための「下地」はできたと。

念のため、前回同様 Wireshark で送受されるパケットを観察してみます。こんな感じ。

WireSharkOnRPi

つまらないエラーのあるパケットを作ってしまったりすると、Wiresharkはエラーを報告して「色」を変えたりして見せてくれるので、ネットワーク素人にはありがたい限りです。

それでは次回からは ScapyとWiresharkに頼って、ネットの海(というより、うさちゃんとラズパイ間の井戸)に乗り出していきたいと思います。

うさちゃんと一緒(3) Rabbitとの通信をラズパイWiresharkで観察 に戻る

うさちゃんと一緒(5) ScapyでARPしてICMP、一歩づつ? Rabbit 4000 へ進む