ちょっと話題の記事

WiresharkのCLIツール editcap でpcapファイルを加工する

2019.03.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、ゲストの大瀧です。
みなさん、パケットキャプチャ取ってますか見てますか?!軽い気持ちで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ファイルを操って、ネットワークを自在に把握しましょう!