高速通信計算研究所

slankdevの報告

PcapNg解析入門

普段開発しているlibpgenにPcapNgファイルの読み書きの機能追加をした時に PcapNgの入門をしたのでまとめてみました。

PcapNgとは

PcapNg(以下めんどくさいのでpcapng)とはwiresharkで開くことのできる パケットのファイルフォーマットの一つです。 従来までのpcapファイルに加え様々な機能が追加されています。 現在wiresharkではデフォルトのファイルフォーマットとしてサポートされていますが、 他の解析ツールなどとの互換性が低いことからたくさんの人から避けられて(嫌われて)います。 ググってもpcapngを従来のPcapファイルに変換する方法などが先に出てくる現状です。。

PcapNGをサポートしているソフトウェア

ご存知wiresharkを始め幾つかのソフトウェアで読み込むことができます。

  • Wireshark (単セクションのみらしい?)
  • tcpdump
  • CapLoader(windows only) これは知らない。。
  • LibPGEN つい最近LibPGENにpcapngファイルの読み書きに対応させました。

公式サイトlibpgen.orgを参照ください。

簡単に違いを言うと?

従来のファイルフォーマットと新型フォーマットではどのような違いがあるのかを簡単に まとめました。

  • 根本的に構造が違う(後述)
    • pcapは2つのヘッダで管理
    • pcapngは様々なブロックで管理
  • NGは複数インターフェースをサポート
    • NGではコメントなど情報付加機能が強化されている
    • etc….

ファイル構造の違い

pcapとpcapngのファイル構造の違いを説明すれば自ずと違いがわかるはずです。

みんな大好きPcapファイル構造

pcapファイルはグローバルヘッダとパケットヘッダの二種類のヘッダを利用してパケットをまとめています。 ファイルヘッダはファイル先頭に一つだけ存在します。グローバルヘッダのバイナリパターンと 各要素の役割を以下に示します。

Pcap Global Header

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                     Magic Number = a1b2c3d4                   |
 +--------------------------------+------------------------------+
 |          Major Version         |         Minor Version        |
 +--------------------------------+------------------------------+
 |                             Timezone                          |
 +---------------------------------------------------------------+
 |                             Sigfigs                           |
 +---------------------------------------------------------------+
 |                             Snaplen                           |
 +---------------------------------------------------------------+
 |                             Network                           |
 +---------------------------------------------------------------+
要素名 意味
Magic Number ファイル識別用のマジックナンバー
Major Version メジャーバージョン番号
Minor Version マイナーバージョン番号
Timezone GMTタイムゾーン
Sigfigs タイムスタンプ
Network データリンク層のタイプ

Magic Numberはたくさんの人が知ってるアレです。書き込み前なので、バイトオーダは実際は逆になります。 次はパケットごとについているパケットヘッダです。バイナリパターンと要素内容を以下に示します。

Pcap Packet Header

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                        Timestamp Second                       |
 +---------------------------------------------------------------+
 |                      Timestamp Microsecond                    |
 +---------------------------------------------------------------+
 |                         Capture Length                        |
 +---------------------------------------------------------------+
 |                        Original Length                        |
 +---------------------------------------------------------------+
要素名 意味
TS sec 秒のタイムスタンプ
TS usec マイクロ秒のタイムスタンプ
Capture len パケット長
Original len パケット長

パケットについているヘッダはこのような感じになります。c言語の標準で使えるtimeval構造体はsecとusec 合わせて128bitなので、ここでは流用ができないので注意してください。

次世代PcapNgファイル構造

pcapngファイルはブロックという基本単位でデータをまとめています。 説明が下手くそなので図で説明します。以下にpcapngのファイル構造の図を示します。

PcapNg File

 |--         section       --|--       section...
 +--------------+------------+------------+---
 |     Block    |    Block   |    Block   |
 +--------------+------------+------------+---...

Blockの基本的な構造は以下のようになってます。

PcapNg Block

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                           Block Type                          |
 +---------------------------------------------------------------+
 |                       Block Total Length                      |
 +---------------------------------------------------------------+
 /                                                               /
 /                           Block Body                          /
 /                                                               /
 +---------------------------------------------------------------+
 |                       Block Total Length                      |
 +---------------------------------------------------------------+
要素名 意味
Block Type ブロックの種類
Block Total Length ブロック総合の長さ
Block Body Block Typeごとに異なる
Block Total Length ブロック総合の長さ

Block Typeの代表例を以下に示します。

要素名 意味
Section Header Block (SHB) セクションの先頭になるブロック 0x0a0d0d0a
Interface Description Block (IDB) インターフェースの詳細情報を格納 0x00000001
Enhanced Packet Block (EPB) インターフェース情報などを吹くんたパケットを格納 0x00000006
Simple Packet Block (SPB) パケットの情報のみを格納 0x00000003
Name Resolusion Block (NRB) 名前解決情報などを格納 0x00000004
Interface Statistic Block (ISB) インターフェース ごとの統計情報を格納 0x00000005

それではブロックごとにサクッと説明していきます。

Section Header Block 各セクションの先頭になるブロックです。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                   Block Type = 0x0A0D0D0A                     |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+
 |                      Byte-Order Magic                         |
 +-------------------------------+-------------------------------+
 |          Major Version        |         Minor Version         |
 +-------------------------------+-------------------------------+
 |                                                               |
 |                          Section Length                       |
 |                                                               |
 +---------------------------------------------------------------+
 /                                                               /
 /                      Options (variable)                       /
 /                                                               /
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+

OptionsにはキャプチャしたOS情報などが書かれたりしています。Byte-order Magicには0x1a2b3c4dが入ります。

Enhanced Packet Block

wiresharkなどでパケットキャプチャを行うと、標準ではこの形式でパケットが記録されます。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                    Block Type = 0x00000006                    |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+
 |                         Interface ID                          |
 +---------------------------------------------------------------+
 |                        Timestamp (High)                       |
 +---------------------------------------------------------------+
 |                        Timestamp (Low)                        |
 +---------------------------------------------------------------+
 |                         Captured Len                          |
 +---------------------------------------------------------------+
 |                          Packet Len                           |
 +---------------------------------------------------------------+
 /                                                               /
 /                          Packet Data                          /
 /          /* variable length, aligned to 32 bits */            /
 +---------------------------------------------------------------+
 /                                                               /
 /                      Options (variable)                       /
 /                                                               /
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+

Packet Dataは32bitで割り切れる大きさで切り分け、残りは0を埋めます。

Interface Description Block

キャプチャインターフェースの情報を格納します。

   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                    Block Type = 0x00000001                    |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +-------------------------------+-------------------------------+
 |           LinkType            |           Reserved            |
 +-------------------------------+-------------------------------+
 |                            SnapLen                            |
 +---------------------------------------------------------------+
 /                                                               /
 /                      Options (variable)                       /
 /                                                               /
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+

LinktypeにはL2インターフェースのコードが入ります。Ethernetの場合1が、PPPの場合は9が入ります。 (他にもたくさんある)

Simple Packet Block

純粋にパケットの情報のみを格納します。実際のpcapngファイルでは見たことないです。 SPBもEPB同様に32bitでアラインメントされます。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                    Block Type = 0x00000003                    |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                          Packet Len                           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 /                          Packet Data                          /
 /          /* variable length, aligned to 32 bits */            /
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+

Name Resolusion Block

名前解決の情報などを格納します。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                    Block Type = 0x00000004                    |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |      Record Type              |         Record Length         |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                       Record Value                            /
 /          /* variable length, aligned to 32 bits */            /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 .                                                               .
 .                  . . . other records . . .                    .
 .                                                               .
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Record Type == end_of_recs   |  Record Length == 00          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 /                      Options (variable)                       /
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Block Total Length                       |
 +---------------------------------------------------------------+

これも僕は見たことないです。。 Record Typeにはどの種類のレコードなのか、具体的には、トランスポート層とか、 ネットワーク層とかデータリンク層とかの種類が入るんじゃないでしょうか。 一つのブロックで複数の名前解決情報を格納できそうですね。

Interface Statistic Block

インターフェースごとの統計情報を格納します。

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +---------------------------------------------------------------+
 |                   Block Type = 0x00000005                     |
 +---------------------------------------------------------------+
 |                      Block Total Length                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                         Interface ID                          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                        Timestamp (High)                       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                        Timestamp (Low)                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
 /                      Options (variable)                       /
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Block Total Length                       |
 l+---------------------------------------------------------------+

実際に見たことがないのでわからないのですが、Optionsにはどれだけ受信したか、などが 入るのではないでしょうか。。。

pcapng->pcapの変換方法

せっかくpcapngを勉強したので、そんなことしないでぜひpcapngを使用しましょう。

感想

個人的にはパケットキャプチャファイルとしては多機能すぎる気もしますが、大体の構造については理解することが、 できたと思います。 強い人たちが、CTFでpcapng問題とかを出していけば、少しずつ浸透していくかもしれませんね。 wiresharkではうまく読めないpcapngファイルがある話はまたいつか。。。。

参考文献