WiresharkのCLIツール editcap でpcapファイルを加工する
ども、ゲストの大瀧です。
みなさん、パケットキャプチャ取ってますか見てますか?!軽い気持ちでtcpdump
でpcapファイルを取ってみたけど、Wiresharkなどのビューワで見ようとして苦戦したことはないでしょうか。本記事では、Wiresharkに同梱されているユーティリティコマンドeditcap
でpcapファイルを加工してみた例をご紹介します。
- 動作確認環境
- OS : macOS Mojave
- Wireshark : バージョン3.0.0
editcapコマンドとは
Wiresharkの公式ページなどからWiresharkをインストールすると、いくつかのコマンドラインツールがセットで配置されます。どんなコマンドがあるかは、こちらのマニュアル一覧で確認できます。editcap
はそれらの一つで、コマンド名の通りpcapファイルを編集するコマンドです。ヘルプは以下が表示されます。
$ editcap --help Editcap (Wireshark) 3.0.0 (v3.0.0-0-g937e33de) Edit and/or translate the format of capture files. See https://www.wireshark.org for more information. Usage: editcap [options] ... <infile> <outfile> [ <packet#>[-<packet#>] ... ] <infile> and <outfile> must both be present. A single packet or a range of packets can be selected. Packet selection: -r keep the selected packets; default is to delete them. -A <start time> only output packets whose timestamp is after (or equal to) the given time (format as YYYY-MM-DD hh:mm:ss). -B <stop time> only output packets whose timestamp is before the given time (format as YYYY-MM-DD hh:mm:ss). Duplicate packet removal: --novlan remove vlan info from packets before checking for duplicates. -d remove packet if duplicate (window == 5). -D <dup window> remove packet if duplicate; configurable <dup window>. Valid <dup window> values are 0 to 1000000. NOTE: A <dup window> of 0 with -v (verbose option) is useful to print MD5 hashes. -w <dup time window> remove packet if duplicate packet is found EQUAL TO OR LESS THAN <dup time window> prior to current packet. A <dup time window> is specified in relative seconds (e.g. 0.000001). NOTE: The use of the 'Duplicate packet removal' options with other editcap options except -v may not always work as expected. Specifically the -r, -t or -S options will very likely NOT have the desired effect if combined with the -d, -D or -w. --skip-radiotap-header skip radiotap header when checking for packet duplicates. Useful when processing packets captured by multiple radios on the same channel in the vicinity of each other. Packet manipulation: -s <snaplen> truncate each packet to max. <snaplen> bytes of data. -C [offset:]<choplen> chop each packet by <choplen> bytes. Positive values chop at the packet beginning, negative values at the packet end. If an optional offset precedes the length, then the bytes chopped will be offset from that value. Positive offsets are from the packet beginning, negative offsets are from the packet end. You can use this option more than once, allowing up to 2 chopping regions within a packet provided that at least 1 choplen is positive and at least 1 is negative. -L adjust the frame (i.e. reported) length when chopping and/or snapping. -t <time adjustment> adjust the timestamp of each packet. <time adjustment> is in relative seconds (e.g. -0.5). -S <strict adjustment> adjust timestamp of packets if necessary to ensure strict chronological increasing order. The <strict adjustment> is specified in relative seconds with values of 0 or 0.000001 being the most reasonable. A negative adjustment value will modify timestamps so that each packet's delta time is the absolute value of the adjustment specified. A value of -0 will set all packets to the timestamp of the first packet. -E <error probability> set the probability (between 0.0 and 1.0 incl.) that a particular packet byte will be randomly changed. -o <change offset> When used in conjunction with -E, skip some bytes from the beginning of the packet. This allows one to preserve some bytes, in order to have some headers untouched. --seed <seed> When used in conjunction with -E, set the seed to use for the pseudo-random number generator. This allows one to repeat a particular sequence of errors. -I <bytes to ignore> ignore the specified number of bytes at the beginning of the frame during MD5 hash calculation, unless the frame is too short, then the full frame is used. Useful to remove duplicated packets taken on several routers (different mac addresses for example). e.g. -I 26 in case of Ether/IP will ignore ether(14) and IP header(20 - 4(src ip) - 4(dst ip)). -a <framenum>:<comment> Add or replace comment for given frame number Output File(s): -c <packets per file> split the packet output to different files based on uniform packet counts with a maximum of <packets per file> each. -i <seconds per file> split the packet output to different files based on uniform time intervals with a maximum of <seconds per file> each. -F <capture type> set the output file type; default is pcapng. An empty "-F" option will list the file types. -T <encap type> set the output file encapsulation type; default is the same as the input file. An empty "-T" option will list the encapsulation types. --inject-secrets <type>,<file> Insert decryption secrets from <file>. List supported secret types with "--inject-secrets help". --discard-all-secrets Discard all decryption secrets from the input file when writing the output file. Does not discard secrets added by "--inject-secrets" in the same command line. Miscellaneous: -h display this help and exit. -v verbose output. If -v is used with any of the 'Duplicate Packet Removal' options (-d, -D or -w) then Packet lengths and MD5 hashes are printed to standard-error.
ちなみにMacではこれらコマンドラインツールの多くがwireshark
バイナリへのシンボリックリンクになっていて、実質1バイナリで提供される形態だったりします。面白いですね、ビルドは果たして速いのか遅いのか(今回はビルド済みのインストーラを使ったので不明)。
$ ls -l `which editcap` lrwxr-xr-x 1 root admin 11 3 19 13:39 /usr/local/bin/editcap@ -> ./wireshark
では、用途ごとのコマンド実行例をいくつか見ていきましょう。
カプセル化の解除
tcpdump
を実行するときにeth0などの物理インターフェースを指定すると、L2やL3でカプセル化が施された状態のトラフィックをキャプチャすることがあります。カプセル化といってもIPsecなどのセキュアトンネルでなければ、パケットの先頭にヘッダが付与されるシンプルな形式ですので、ヘッダ長を調べて-C
オプションで除去することができます。
IoTプラットフォームSORACOMでは、SORACOM JunctionでGREのL2、SORACOM GateでVXLANトンネルを扱うので、以下のように除去します。
SORACOM JunctionでGREのL2の例
GREのL2の場合は先頭から以下のヘッダの合計である38バイトを除去します。
- Outer Ethernet : 14
- Outer IPv4 : 20
- GRE : 4
$ editcap -C 38 gre_source.pcap dest.pcap $
SORACOM GateでVXLANの例
VXLANは先頭から以下のヘッダの合計である50バイトを除去します。
- Outer Ethernet : 14
- Outer IPv4 : 20
- Outer UDP : 8
- VXLAN : 8
$ editcap -C 50 vxlan_source.pcap dest.pcap $
ファイルの分割
tcpdump
を流しっぱなしにすると必然的にpcapファイルが肥大し、Wiresharkでオープンできなくなることがあります。開ける程度にeditcap
で分割して対応します。分割は、パケット数単位と時間単位が指定できます。
パケット数
パケット数で分割する場合は-c
オプションで数を指定します。出力ファイル名は第二引数にdest.cap
と指定すると以下の規則で作成されます。
dest_<00000からの通し番号>_YYYYMMDDHHMMSS.pcap
$ editcap -c 1000 source.pcap dest.pcap $ ls dest* dest_00000_20190319174309.pcap dest_00001_20190319174356.pcap dest_00002_20190319174433.pcap dest_00003_20190319174512.pcap dest_00004_20190319174550.pcap dest_00005_20190319174619.pcap dest_00006_20190319174700.pcap $
時間単位
時間で分割する場合は-i
オプションで秒数を指定します。出力ファイル名は-c
オプションと同様です。
$ editcap -i 60 source.pcap dest.pcap $ ls dest* dest_00000_20190319174309.pcap dest_00001_20190319174409.pcap dest_00002_20190319174509.pcap dest_00003_20190319174609.pcap $
特定時間の切り出し
発生時刻のわかっている事象を見たいのであれば、特定時間のパケットを切り出すのも有効でしょう。以下のオプションで切り出しできます。
-A
: 開始時刻。YYYY-MM-DD hh:mm:ss
の形式で指定-B
: 終了時刻。指定形式は-A
と同じ
$ editcap -A"2019-03-19 17:44:00" -B"2019-03-19 17:45:00" source.pcap dest.pcap $ capinfos -uae dest.pcap File name: dest.pcap Capture duration: 59.854508 seconds First packet time: 2019-03-19 17:44:00.097381 Last packet time: 2019-03-19 17:44:59.951889 $
実行例の最後に出てくるcapinfos
コマンドもWiresharkに同梱されるユーティリティの一つで、pcap/pcapngファイルの情報を表示するコマンドです。今回の時刻表示以外にパケット数を-c
オプションで出せるので、カプセル化の解除時に欠けたパケットが無いかなどチェックにも有用です。
$ capinfos -c source.pcap dest.pcap File name: source.pcap Number of packets: 6,240 File name: dest.pcap Number of packets: 6,240 $
まとめ
WiresharkのCLIツールeditcap
でpcapファイルを加工する様子をご紹介しました。pcapファイルを操って、ネットワークを自在に把握しましょう!