簡易パケット操作ツール群(pkttools)
■ 概要
パケットキャプチャ&送信などを行うテキストベースの簡易ツール群です.
各ツールはパイプで繋げて連携させることができます.
テキストベースなので,パケットをパッと見てみたりちょっと修正して再送信
したり,各種スクリプトを組み合わせて利用したりということが簡便にできます.
(重要!) 本ツールはネットワークの勉強・検証を目的として作成・配布
するものです.不用意な利用はネットワークに様々な影響を与えたり,
様々な問題を引き起こす可能性があるため,
ツールの動作を理解した上で,ローカル環境で利用するか
ネットワーク管理者の許可を得た上で利用するようにしてください.
勉強や検証を目的として,正しいモラルのもとで利用してください.
以下のツールがあります.
- 簡易パケットキャプチャ
- 簡易パケット送信
- pcap/pcapngフォーマットとの変換 (Wiresharkと連携できます)
- バイナリデータとの変換 (バイナリエディタと連携できます)
- フラグメント・パケットの分割/再構築
- 簡易パケットアナライザ
- チェックサム再計算
- パケットの簡易チェック
- パケットフィルタ
- パケット変換
- ping応答ツール
*BSD/Linux/Windows/MacOSをサポートしています.
32ビット環境/64ビット環境の両方に対応しています.
FreeBSD-8.4/FreeBSD-10.3/CentOS6.5の環境でコンパイルと動作確認をしています.
フリーソフトウェアです.ご自由にお使いください.
ただし無保証です.本ツールを利用することで発生した不具合や問題などについて,
作者は一切の責任を負いません.各自の責任の下で利用してください.
ライセンスは添付の KL-01 と LICENSE を参照してください.
■ ツール説明
- pkttools-1.0.zip (2014/05/17)
- pkttools-1.1.zip (2014/05/22)
- 各種チェックを追加
- VLANタグを正常に読めないバグを修正
- TCP/UDPのチェックサムの計算誤りを修正
- IPv6対応
- pkttools-1.2.zip (2014/05/28)
- パケットフィルタ・パケット変換を追加 (pkt-filter/pkt-change)
- pkt-analyze の表示フォーマットを改良
- pkttools-1.3.zip (2014/06/01)
- 時刻表示でマイクロ秒の桁がずれている問題を修正
- パケットのフィールド出力・入力・オプションでの書き換えに対応
- pkttools-1.4.zip (2014/06/04)
- 簡易フィルタ機能を追加
- pkt-sendに-jオプション追加 (時刻差分を直前のパケットに対して計算する)
- pkttools-1.5.zip (2014/06/14)
- フィールド値の書き換えに対応
- ペイロードの読み書きに対応
- パケットのサンプルを追加
- テキスト読み書きなどの細かいバグをいろいろ修正
- pkttools-1.6.zip (2014/06/17)
- ペイロードをプロトコルごとに定義
- フラグメントパケットの対処を追加 (ただし未サポート.従来は不正に処理してしまっていた)
- pkttools-1.7.zip (2014/10/25)
- pkttools-1.8.zip (2015/08/27)
- rawsockでtimeoutの設定位置を修正
(Linuxのselect()はtimeoutを書き換えるため)
- チェックサム計算の不要なエンディアン変換を廃止
- pkt-txt2bin, pkt-bin2txt を追加
- -l オプションを全ツールに適用
- -s オプションを全ツールに追加
- -n オプションでの桁数指定を追加
- TIME: を省略したときはゼロ時刻でなく現在時刻を適用する
- IPヘッダの総サイズが不正の際に,パケットサイズを越えてバッファオーバー
ランしてチェックサム計算がされてしまうバグの修正
- インターフェースのダウン時にpkt-recvが無限ループに入ってしまう問題を修正
- pkt-checkを追加
- pkt-analyzeに正しいチェックサム値の出力を追加
- pkt-correctでエラーパケットはそのまま出力するように動作を変更する
(エラーパケットを検出したいならばpkt-checkでフィルタすればいいため)
- pkttools-1.9.zip (2015/10/06)
pkttools-1.9 (Windows版) (2015/10/06)
- パケット送受信ライブラリをクラス化する
- libpcap/WinPcap対応
- netlib対応
- Windows対応
- MinGW対応
- pkttools-1.10.zip (2016/03/06)
pkttools-1.10 (Windows版) (2016/03/06)
- Windowsでpkt-recvをインターフェース指定で実行した際にも "Available interface list:" のメッセージが出力されていた問題を修正
- libpcap利用時にインターフェースのダウンを検出できず,インターフェースダウン時に高負荷の無限ループに入ってしまう問題を修正
- pkt-recvに-soオプションを追加(送信パケットのみ受信する)
- -sオプションによるパケットのスキップ指定時に,簡易フィルタにより無視されるパケットもカウントされていた問題を修正
- 共通オプションとして -nb/-nm を追加(ブロードキャスト・マルチキャストパケットを無視する)
- pkt-analyze に -ll / -lh / -lv オプションを追加(解析する層やレベルの指定)
- pkt-analyze でペイロードのダンプの表示を追加(解析レベル5で表示)
- glibc環境でMACアドレスが1桁で表示される場合があるので,2桁固定の表示にする
- pkttools-1.11.zip (2016/03/16)
pkttools-1.11 (Windows版) (2016/03/16)
- PcapNgに対応(pkt-pcapng2txt / pkt-txt2pcapng)
- pkttools-1.12.zip (2016/04/14)
pkttools-1.12 (Windows版) (2016/04/14)
- IPv4/IPv6フラグメントパケットの分割・再構築に対応(pkt-fragment / pkt-defragment)
- TCP/UDP通信用のサンプルプログラムを追加(toolsディレクトリ以下)
- pkttools-1.13.zip (2016/04/23)
pkttools-1.13 (Windows版) (2016/04/23)
- データリンク層の指定を追加 (LINKTYPE: の入出力と -lt オプション)
- Ethernet以外のインターフェースにも対応可能にする (現状,Ethernet以外はループバック・インターフェースのみに対応)
- サイズ情報を適切に伝達するように修正 (caplen / datalen)
- コマンドライン引数で16進数での指定を可能にする (「0x」を付加する)
- pkttools-1.14.zip (2016/05/03)
pkttools-1.14 (Windows版) (2016/05/03)
- toolsにrequest/replyツールを追加(送信の後,応答を受ける)
- PCAP/PcapNgファイルでループバック・インターフェースのパケットを扱う際に,アドレスファミリー情報をホストに合わせて補正する
- pkttools-1.15.zip (2016/10/26)
pkttools-1.15 (Windows版) (2016/10/26)
- MacOSX,NetBSD,OpenBSDに対応
- -doオプションを追加(データのみ出力する)
- Windowsで標準入力がコンソールの場合にツール類が動作していなかった問題を修正
※ Windows版で標準入力がコンソールの場合にバッファサイズが大きいと,
read(0, ...)が誤動作してエラーを返す.tools以下のツールとpkt-bin2txtで
バッファサイズを調整した
- toolsのツール類で,-vオプション付加時のみメッセージを出力するように変更
- 簡易フィルタや-aオプションの利用時などにメモリリークする問題を修正
- フィルタ条件で同じキーワードを重複して指定すると誤動作する問題を修正
※ (例 IP.TTL==0x10 IP.TTL==0x20)
- Windows版でバイナリを扱うツールでは入出力を無条件にバイナリモードに
切替えていたが,コンソールの場合にはテキストモードで動作するように修正
- toolsのツールにシグナル処理を追加し,Ctrl+Cによるブレーク時に終了処理が
行われるようにする
- pkt-sendでEthernetフレームの最小サイズ未満のフレームを送信する際に,
パディングが不定のデータで埋められてしまうのを修正.明示的にゼロで埋める
- pkt-recvの標準バッファサイズを自動設定から80KBに変更
- pkttools-1.16.zip (2016/11/10)
pkttools-1.16 (Windows版) (2016/11/10)
- PCAP/PcapNgによる出力時のエンディアン指定を追加(-ne/-le/-beオプション)
netlib (Windows版のビルドに必要)
ツール一覧
- pkt-recv ... パケットキャプチャして,受信データをテキスト出力
- pkt-send ... テキスト入力されたパケットを送信
- pkt-txt2txt ... テキスト入力されたパケットをテキストで再出力(テキストの整形)
- pkt-txt2pcap ... テキスト入力されたパケットをpcapフォーマットに変換
- pkt-pcap2txt ... pcapフォーマットを解読してテキスト出力する
- pkt-txt2pcapng ... テキスト入力されたパケットをPcapNgフォーマットに変換
- pkt-pcapng2txt ... PcapNgフォーマットを解読してテキスト出力する
- pkt-txt2bin ... テキスト入力されたパケットをバイナリデータに変換
- pkt-bin2txt ... バイナリデータを変換してテキスト出力する
- pkt-fragment ... IPv4/IPv6パケットをフラグメント分割する
- pkt-defragment ... フラグメント分割されたIPv4/IPv6パケットを再構築する
- pkt-analyze ... テキスト入力されたパケットを解析
- pkt-correct ... テキスト入力されたパケットのチェックサムを再計算して再出力
- pkt-check ... テキスト入力されたパケットの簡易チェックをして再出力
- pkt-filter ... テキスト入力されたパケットをフィルタして再出力(※1)
- pkt-change ... テキスト入力されたパケットを変換して再出力(※1)
- pkt-pingrep ... テキスト入力されたパケットからpingの応答パケットを出力する
- samples ... 各種パケットのサンプルデータ
- tools ... TCP/UDP/TCP6/UDP6のソケットツール群(簡単な送受信など)
※1 ルールをソースコードに直接記述してコンパイルしなおして利用する
■ パケットデータの例
例えば以下は,eth0というインターフェースでパケットを受信する例です.
user@letsnote:~/pkttools>% pkt-recv -i eth0
LINKTYPE: 1 (Ethernet)
-- 1 --
TIME: 1400167480.561500 Fri May 16 00:24:40 2014
SIZE: 98/98
000000: 00 11 22 33 44 55 00 AA BB CC DD EE 08 00 45 00 : .."3DU.. ......E.
000010: 00 54 00 00 00 00 40 01 F7 55 C0 A8 01 01 C0 A8 : .T....@. .U......
000020: 01 02 08 00 4A 2F 03 0F 00 00 53 8A C4 11 00 07 : ....J/.. ..S.....
000030: A8 1B 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 : ........ ........
000040: 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 : ........ .. !"#$%
000050: 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 : &'()*+,- ./012345
000060: 36 37 : 67
==
-- 2 --
TIME: 1400167480.561510 Fri May 16 00:24:40 2014
SIZE: 98/98
000000: 00 11 22 33 44 55 00 AA BB CC DD EE 08 00 45 00 : .."3DU.. ......E.
000010: 00 54 00 00 00 00 40 01 F7 55 C0 A8 01 01 C0 A8 : .T....@. .U......
000020: 01 02 08 00 4A 2F 03 0F 00 00 53 8A C4 11 00 07 : ....J/.. ..S.....
000030: A8 1B 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 : ........ ........
000040: 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 : ........ .. !"#$%
000050: 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 : &'()*+,- ./012345
000060: 36 37 : 67
==
「--」〜「==」でくくられている部分が,1個のパケットになります.
パケットデータを出力するツール(pkt-recvなど)は,
上のようなテキストフォーマットで出力します.
パケットデータを入力するツール(pkt-sendなど)は,
上のようなテキストフォーマットの入力を受け付けます.
出力されたパケットデータをテキストファイルとしていったん保存し,
テキストエディタで特定のパケットのみ切り出したりパケットを部分的に書き換えて,
他のツールに印加したりすることができます.
例えばpkt-recvで受信し出力されたパケットデータをいったんテキストファイルとして
保存し,テキストエディタで特定のパケットのみ切り出して再度保存,pkt-sendで送信
することで,特定のパケットのみ繰り返し送信したりすることができます.
pcapフォーマットと連携できます.例えばWiresharkでキャプチャしたパケットをpcap
で一旦保存,pkt-pcap2txt で上記テキストフォーマットに変換,変換したテキスト
ファイルをテキストエディタで修正,pkt-txt2pcap でpcapフォーマットに戻す,と
いったことができます.
このようにテキストエディタで扱ったり,パイプによるスクリプト処理がしやすい
ような作りになっています.
■ Windows版の利用
Windows版では,実行にWinPcapがインストールされていることが必要です.
あらかじめインストールしておいてください.
WiresharkをインストールするとWinPcapもインストールされるので,
Wiresharkをインストールしてしまうのが楽でいいでしょう.
まずpkt-recv/pkt-sendをインターフェース未指定(-iオプション無し)
で実行し,インターフェースの一覧を出力してください.
インターフェースの一覧から利用したいインターフェースを選択し,
以下のように番号でインターフェースを指定して,
pkt-recv/pkt-sendを起動してください.
C:\> pkt-recv -i 1
■ 使いかたの例
以下は Linux で eth0 を使う場合の例です.
- パケットの受信
% pkt-recv -i eth0
- パケットをキャプチャして解析して表示
% pkt-recv -i eth0 | pkt-analyze
- パケットをキャプチャして各フィールド値を表示
% pkt-recv -i eth0 -a
- eth0 → eth1 にパケットをブリッジする
% pkt-recv -i eth0 | pkt-send -i eth1
- IPパケットのみブリッジ
% pkt-recv -i eth0 ETHERNET.TYPE==0x0800 | pkt-send -i eth1
- 宛先が192.168.1.Xのパケットのみブリッジ
% pkt-recv -i eth0 "IP.DST_ADDR>=192.168.1.0" \
| pkt-txt2txt "IP.DST_ADDR<=192.168.1.255" | pkt-send -i eth1
- TTL値を書き換えてチェックサム再計算してブリッジ
% pkt-recv -i eth0 IP.TTL=0xFF | pkt-correct | pkt-send -i eth1
- eth0 ←→ eth1 の間を双方向にブリッジする (簡易ブリッジ)
% (pkt-recv -i eth0 -ro | pkt-send -i eth1) &
% (pkt-recv -i eth1 -ro | pkt-send -i eth0) &
- パケットを一旦保存し解析.さらに別インターフェースに強制送信
% pkt-recv -i eth0 > capture.txt
% cat capture.txt | pkt-analyze
% cat capture.txt | pkt-send -i eth1
- パケットをpcapフォーマットで保存し,あとで Wireshark で開く
% pkt-recv -i eth0 | pkt-txt2pcap > capture.pcap
% wireshark capture.pcap
- Wiresharkでキャプチャし保存したパケット(capture.pcap)をeth0に強制送信
% cat capture.pcap | pkt-pcap2txt | pkt-send -i eth0
- pcapngからpcapフォーマットへの変換
% cat capture.pcapng | pkt-pcapng2txt | pkt-txt2pcap > capture.pcap
- 1個のパケットをバイナリデータとして保存しバイナリエディタで開く
% pkt-recv -i eth0 -l 1 | pkt-txt2bin > capture.bin
% hexedit capture.bin
- バイナリエディタで作成・編集したパケットを送信
% hexedit capture.bin
% cat capture.bin | pkt-bin2txt | pkt-send -i eth0
- チェックサムがエラーのパケットを出力する
% pkt-recv -i eth0 | pkt-check | pkt-check -cs -rc
- キャプチャしたパケットを改造してチェックサムを再計算し再送信
% pkt-recv -i eth0 > capture.txt
% vi capture.txt
% cat capture.txt | pkt-correct | pkt-send -i eth0
- 受信したARPとICMP Echoにすべて応答する(あらゆるpingに応答します)
% pkt-recv -i eth0 -ro | pkt-pingrep | pkt-send -i eth0
- L3〜L4層を解析し,簡易的な情報のみ出力する
% pkt-recv -i eth0 | pkt-analyze -ll 3 -lh 4 -lv 2
- L4層のみ解析し,ペイロードのダンプも出力する
% pkt-recv -i eth0 | pkt-analyze -ll 4 -lh 4 -lv 5
- フラグメント分割されたパケットを再構築し,チェックサム再計算して再度分割
% cat capture.txt | pkt-defragment | pkt-correct | pkt-fragment
- MTU=1200でフラグメントし,さらにMTU=1000でフラグメントする
% cat capture.txt | pkt-fragment -fm 1200 | pkt-fragment -fm 1000