次のNetcatコマンドを実行してパケットを表示すると、ワイヤーシャーク、これはUDPパケットのフォーマットが正しくないことを示します。
$ echo "this is a test" | nc -u 127.0.0.1 53
同様に$ echo "this is a test" > /dev/udp/127.0.0.1/53
、Wiresharkで次のコマンドを使用すると、「Malformed Packet」エラーが発生します。
echoコマンドは、エラーなしでNetcatサーバーに送信/転送されます。しかしそれは私を気にする:echoやその他の基本的なUnixツールを使用して正しいUDPパケットを手動で構築できますか?
私はDebianとmacOSを使用しています。
答え1
IP と UDP の観点から見ると、パケットは完全に有効です。 Wiresharkの下部ペインでEthernet / IP / UDPのプロトコルの詳細を展開すると、パケットが正常に解析されたことを確認できます。
ただし、宛先がポート53であるため、WiresharkはそれをDNSパケットに解析しようとしますが、実行できません(文字列「this is a test」は有効なDNS要求ではないため)。RFC 1035仕様)。
そのリンクの仕様によれば、DNS要求で解析されたときに有効なパケットを設定できます。パケットを別のポートに送信すると、WiresharkはパケットをDNS要求として解析しなくなり、警告は表示されません。
答え2
Bashは特別なエイリアスでリダイレクトを介して送信できます。
Bashのマンページから:
/dev/tcp/host/port ホストが有効なホスト名またはインターネットアドレスで、ポートが整数のポート番号またはサービス名の場合、bash は対応する TCP ソケットを開こうとします。
/dev/udp/host/portホストが有効なホスト名またはインターネットアドレスで、ポートが整数のポート番号またはサービス名の場合、bashはそのUDPソケットを開こうとします。
これにより、ポート8080の192.168.2.11にUDPパケットが送信されます。
echo "This is a test" > /dev/udp/192.168.2.11/8080
答え3
これにはいくつかの問題があります。 「誤ったパケット」の主張は、チェックサムのオフロードによるものである可能性があります。そうであれば、これは完全なビューのないパケットキャプチャを反映する偽のエラーです。一部の操作はネットワークハードウェアで行われます。 WireSharkにはこれに関する文書が必要です。
そうしないと、さまざまなツール(たとえば、、、、または、またはなどsocat
のnc
シェルnetcat
の非常によく似た機能を介して)が標準入力からバイトを取得してUDPパケットにダンプできます。これが「正しい」かどうかはプロトコルによって異なります。理論的には、このようにDNSまたはDHCPパケットを設定して送信することができますが、一般的にこれはより簡単であるため、関連プロトコルを正しく実装するためにライブラリまたは特殊ソフトウェアを使用することがよくあります。設定するよりも少し複雑です。具体的には、応答処理、タイムアウトまたはエラー後の再試行、パケットヘッダフィールドなどを処理してネットワークを介して送信されるパケットの本文である。これらのプロトコルは一般にRFCによく文書化されています。詳細については、Stevensの「TCP / IP Illustrated」書籍シリーズを参照してください。ksh93
bash
nmap
パケットの構築などの特定のツールは、非常にカスタマイズされたタスクを実行します。そうでない場合、パッシブパケットの作成には通常プログラミング言語が使用されますが、ほとんどのソフトウェアは既存のライブラリまたはシステムサービスを使用してDNS、DHCP、またはその他のUDPパケットを送信します。これは、生のパケットを手動で作成するよりも作業が少ないためです。数量ははるかに少ないです。エラーが発生する可能性が低い。パケットは最初から始まります。