うさちゃんと一緒(6) Scapyから送ったUDPパケットをオウム返し、Rabbit4000

Joseph Halfmoon

うさちゃん(Rabbit4000)相手のネットワーク通信の練習も、そろそろデータを載せてみたいです。今回は高々4文字、UDPでラズパイからうさちゃんへ、うさちゃんからラズパイへと相互にパケットを投げつけあってみたいと思います。わたしゃ止めることを全然気にしていなかったこと発覚。1つ間違えたら自分で自分にDDoS攻撃?

※「うさちゃんと一緒」投稿順indexはこちら

※Ethernetの通信の一方は、Raspberry Pi 3 model B+(Raspberry Pi OS機)上で、Scapy(Python上で任意のパケットを最下層から構築可能なモジュール)を使用して行っています。

※Ethernet通信のもう一方として、「最強のZ80後継機」Rabbit4000を使用しています。開発環境はDynamic C 10.72Eを使用しています。

うさちゃん、Rabbit 4000側のプログラム

健気に頑張っている「ネットワーク実験の対向機」Rabbit 4000ですが、サンプルプログラムが充実してます。サンプルをコピーさせてもらって、設定などチョイと変更すれば今回の対向用のソフトウエアは準備完了です。利用させていただいたサンプルソースは以下です。

UDP_ECHO_DH.C

変更したのはIPアドレスの設定部分です。TCPCONFIGの定義の下に4行 #define文を追加いたしました。

#define TCPCONFIG		1
#define _PRIMARY_STATIC_IP  "192.168.2.59"
#define _PRIMARY_NETMASK    "255.255.255.0"
#define MY_GATEWAY          "192.168.2.1"
#define MY_NAMESERVER       "192.168.2.1"

なお、使用させていただいております処理系は、Dynamic C 10.72 です。

プログラム的には、UDPのポート7(ECHO)にUDPパケットが到着したら、そのパケットの送信元に、そっくりそのまま(送受の方向だけ変えて)オウム返しに送り返すというもの。うさちゃんですがオウム?くだらないことばかり書いておるなよ。自分。

なおソースコードの中でICMPエラーのパケットをわざわざ捨てるコードがありました。ネットワーク素人には、これは何のため?と最初分からなかったのです。しかし、実行してみてその意味が分かりましたぞ。

ラズパイ3のScapy側の操作

うさちゃんに対向しているのが Raspberry Pi 3 model B+機です。ま、普通のLinux機として使用中のものです。この上でPythonの上の超強力モジュール、所望のEthernetパケットをいかようにも組み立てして送信できるScapyを走らせて実験しています。今回もScapyをインタラクティブ使いです。なおScapyは悪用するとヤバそうなツールではあります。

SCAPY上の実験シーケンスはこんな感じで極めて単純なもの。

data="ABCD"
pkt=IP(dst="192.168.2.59")/UDP(sport=7, dport=7, len=12)/Raw(load=data)
send(pkt)

UDPのパケットにペイロード文字列としてABCDなる4文字を載せ、うさちゃんのIPアドレスのECHOポートへと送りつけます。

上記の設定では必要な情報以外Scapyに「後はよろしく」とお願いしています。その辺裏でみな始末してくれるScapyは大好きです。念のため送信パケット内部の設定をダンプしてみるとこんな感じ。

packetSHOW

上記をうさちゃんに向かって投げつけた様子が以下に。なお、以下では上記の実験シーケンスに記した単純なレイヤ3送信のsendでなく、回答期待のsrで実験してます(後に出てくる問題のパケットをキャプチャするため。)

Send000

通信の結果

まずはうさちゃん側。例によってサンプルプログラムは標準出力にいろいろ報告してくれます。以下の画面キャプチャの下の方に、UDPのパケットの到着を知らせる行が表示されています。ポート7(remport)に4文字(len)送られてきていることが分かります。

Rabbit000

今回もみんな大好き Wireshark にお願いしてうさちゃんとラズパイ間の通信の様子を覗き見いたします。ラズパイ3上で走らせている Wireshark が観測したラズパイとうさちゃん間のパケットが以下に(うさちゃん相手の通信だけ表示するようにフィルタかけてます。)

    1. ラズパイからうさちゃんへの UDP ECHO Request
    2. うさちゃんからラズパイへの UDP ECHO Request
    3. ラズパイからうさちゃんへの ICMP、UDPのポートのエラー報告

おやおや3つあるうえに最後の1個はエラーじゃあ~りませんか。

WSK000

第1のパケットを調べてみたものが以下に(長いので先頭部分。)特に問題なしですな。

ECHOto

第2のパケットを調べてみたものが以下に(長いので先頭部分。)これまた特に問題なしですな。

ECHOfrom

第3、エラー報告のパケットが以下に(長いので先頭部分。)これを解釈すると、どうもラズパイ様が、UDPのポート7、ECHOポートにパケットを送ってきたうさちゃんに、文句を言っているようです。ポート7なんぞ使えんよ、と。

ECHOerror

ここにいたってようやく気付きました。

    1. UDP ECHOはデフォルトでOFF
    2. Scapy走らせているラズパイ3でもOFF
    3. そのお陰で、うさちゃんからオウム返しに打ち返されたポート7宛てのパケットにラズパイ33が反応することはなく、ICMPエラーパケットが送られる
    4. うさちゃん側ではICMPエラーパケットが送られてきた場合無視するようにコードされている

ということであります。逆に言うと、ラズパイ3側でUDP ECHOに反応するようにしてしまっていた場合、うさちゃんからのパケットを打ち返し、するとうさちゃんが再び、という流れでラリーが続きそうです。よかった、そうならなくて。

ぼーっとして実験していると危ないデス。

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

うさちゃんと一緒(7) TCPパケットをオウム返しでtelnet、Rabbit 4000 へ進む