はじめに:text2pcapとは? 🤔
ネットワークのトラブルシューティングや解析を行っていると、パケットキャプチャファイル(pcap形式が一般的)を扱う機会が多いですよね。Wiresharkなどのツールで視覚的に解析できるため非常に便利です。しかし、時にはログファイルやデバッグ出力などで、パケットデータがテキスト形式の16進数ダンプ(ヘッダダンプ)として記録されていることがあります。
「このテキストデータをWiresharkで解析できたら便利なのに…」と思ったことはありませんか?そんな願いを叶えてくれるのが、今回ご紹介する text2pcap
コマンドです!
text2pcap
は、Wiresharkに同梱されているコマンドラインツールの一つで、特定のフォーマットで記述されたASCIIヘッダダンプを読み込み、pcapまたはpcapng形式のキャプチャファイルに変換してくれます。これにより、テキストベースのパケット情報をWiresharkで詳細に分析できるようになります。
特に、アプリケーションレベルのデータダンプしかない場合でも、text2pcap
はダミーのEthernetヘッダ、IPヘッダ、TCP/UDP/SCTPヘッダを自動的に付加してくれるため、完全なパケットとして解析ツールで扱えるようにすることが可能です。これは非常に強力な機能です 💪。
この記事では、text2pcap
の基本的な使い方から、少し応用的なオプションまで、具体的な例を交えながら詳しく解説していきます。テキスト形式のパケットデータ活用への扉を開きましょう!
基本的な使い方 🛠️
text2pcap
の基本的なコマンド形式は非常にシンプルです。
text2pcap [オプション] <入力ファイル> <出力ファイル>
ここで、
[オプション]
: 変換の挙動を制御するための様々なフラグを指定します(後述します)。<入力ファイル>
: 変換したいヘッダダンプが記述されたテキストファイルへのパスを指定します。-
を指定すると標準入力から読み込みます。<出力ファイル>
: 生成するpcap/pcapngファイルへのパスを指定します。-
を指定すると標準出力へ書き出します。
例えば、dump.txt
というヘッダダンプファイルを output.pcapng
というpcapngファイルに変換したい場合は、次のように実行します。
text2pcap dump.txt output.pcapng
デフォルトでは、出力ファイル形式は pcapng になります。もし旧来のpcap形式で出力したい場合は、-F
オプションを使用します(詳細は後述)。
入力ファイルのフォーマット 📝
text2pcap
が正しくヘッダダンプを解釈するためには、入力テキストファイルが特定のフォーマットに従っている必要があります。基本的には、Linuxの od -Ax -tx1 -v
コマンドが出力する形式を想定しています。
主なルールは以下の通りです。
- オフセット: 各行は、その行のデータがパケットの先頭から何バイト目かを示すオフセット値で始まります。
- 区切り文字: オフセットと実際の16進数データの間は、コロン(
:
)、スペース、またはタブで区切られます。 - 16進数データ: パケットデータは16進数で表現され、各バイト(2桁の16進数)はスペースで区切られます。16進数の大文字・小文字は区別されません。
- オフセットの基数: オフセットはデフォルトで16進数として解釈されます。
-o
オプションで8進数や10進数に変更可能です。オフセットは2桁より大きい必要があります。 - 複数パケット: 1つのファイルに複数のパケットを含めることができます。新しいパケットは必ずオフセット
0
または000000
などで始まります。オフセット0
が出現すると、text2pcap
は新しいパケットの開始と認識します。 - オフセットの連続性: 各パケット内では、オフセット値が正しく連続している必要があります。期待しないオフセット値が出現すると、そのパケットの処理は中断され、次のオフセット
0
の出現を待ちます。 - 行の幅: 1行あたりのバイト数や行の幅に制限はありません。ただし、行頭にオフセットがない行は無視されます(長い行が折り返されてオフセットなしで始まらないように注意が必要です)。
- コメント: 行頭の空白文字以外の最初の文字が
#
である行はコメントとして無視されます。 - ディレクティブ:
#TEXT2PCAP
で始まる行はディレクティブとして解釈されますが、現在のバージョンでは具体的なディレクティブは実装されていません。 - 行末のテキスト: 各行の16進数データの後に続くテキスト(
od
コマンドが出力するようなASCII表示など)は無視されます。
以下は、text2pcap
が認識できるヘッダダンプの例です。
000000 00 e0 1e a7 05 6f 00 10 5a a0 b9 12 08 00 46 00
000010 03 68 00 00 00 00 0a 2e ee 33 0f 19 08 7f 0f 19
000020 03 80 94 04 00 00 10 01 16 a2 0a 00 03 50 00 0c
000030 01 01 0f 19 03 80 11 01
000000 00 0e b6 00 00 02 00 0e b6 00 00 01 08 00 45 00
000010 00 28 00 00 00 00 ff 01 37 d1 c0 00 02 01 c0 00
000020 02 02 08 00 a6 2f 00 01 00 01 48 65 6c 6c 6f 20
000030 57 6f 72 6c 64 21
000036
この例では、2つのパケットが含まれています。2番目のパケットはオフセット 000000
から始まっていることに注目してください。最後のバイト(21
)の後には、次の期待されるオフセット(000036
)またはスペース、改行が必要です。
⚠️ 注意: text2pcap
は入力フォーマットに比較的厳格です。もし手元のヘッダダンプが期待通りに変換されない場合は、まずフォーマットが上記のルールに従っているかを確認してください。特に、各バイトがスペースで区切られているか、オフセットが正しく記述されているかが重要です。xxd -g 1
や hexdump -C
、od -Ax -tx1 -v
といったコマンドで期待される形式に近い出力を得られます。
主要なオプション解説 ⚙️
text2pcap
には多くのオプションがあり、変換プロセスを細かく制御できます。ここでは特に重要でよく使われるオプションをいくつか紹介します。
オプション | 説明 | 例 |
---|---|---|
-t <timefmt> |
パケットの前にタイムスタンプがある場合に、そのフォーマットを指定します。strptime(3) でサポートされる書式文字列を使用します。秒未満の精度が必要な場合は、フォーマット文字列の末尾にピリオド(. )を追加する必要があります。タイムスタンプがない場合、最初のパケットには変換時のシステム時刻が、後続のパケットには1マイクロ秒ずつ加算された時刻が使用されます。 |
-t '%Y-%m-%d %H:%M:%S.' (例: 2023-10-27 10:30:15.123456) |
-o hex|oct|dec|none |
入力ファイルのオフセットの基数(radix)を指定します。デフォルトは hex (16進数)です。none を指定するとオフセットがない単一パケットモードになります。 |
-o dec (オフセットが10進数の場合) |
-l <typenum> |
出力pcapファイルのリンク層ヘッダタイプを指定します。これは libpcapのリンク層ヘッダタイプ番号 を10進数で指定します。デフォルトは 1 (Ethernet) です。例えば、ダンプがIPヘッダから始まっている場合などに 101 (Raw IP) を指定します。 |
-l 101 (Raw IPとして扱う) |
-E <encapsulation type> |
出力ファイルのパケットカプセル化タイプを設定します。 text2pcap -E で利用可能なタイプのリストを表示できます。デフォルトは ether (Ethernet) です。これは出力ファイルのメタデータを設定するもので、入力データのヘッダを変換するわけではありません。 |
-E ieee-802-11 (IEEE 802.11として扱う) |
-i <proto> |
各パケットの前にダミーのIPヘッダを挿入します。IPヘッダ内のプロトコルフィールドの値を10進数で指定します。例えば、TCPペイロードのダンプには 6 を指定します。このオプションを使用すると、適切なEthernetヘッダも自動的に付加されます(リンク層がEthernetの場合)。 |
-i 17 (UDPペイロードの前にIPヘッダを追加) |
-4 <srcip>,<destip> |
ダミーIPヘッダを挿入する際に使用する送信元および宛先IPv4アドレスを指定します。-i , -s , -S , -T , -u オプションのいずれかと一緒に使用する必要があります。 |
-4 192.168.1.1,10.0.0.1 |
-6 <srcip>,<destip> |
ダミーIPヘッダを挿入する際に使用する送信元および宛先IPv6アドレスを指定します。IPv4と同様に他のヘッダ挿入オプションと共に使用します。 | -6 2001:db8::1,2001:db8::2 |
-u <srcport>,<destport> |
各パケットの前にダミーのUDPヘッダ(およびIP/Ethernetヘッダ)を挿入します。送信元および宛先UDPポートを10進数で指定します。UDPペイロードのダンプに使用します。 | -u 53,12345 (DNS応答のようなパケットを生成) |
-T <srcport>,<destport> |
各パケットの前にダミーのTCPヘッダ(およびIP/Ethernetヘッダ)を挿入します。送信元および宛先TCPポートを10進数で指定します。TCPペイロードのダンプに使用します。 | -T 80,54321 (HTTP応答のようなパケットを生成) |
-s <srcport>,<destport>,<tag> |
各パケットの前にダミーのSCTPヘッダ(およびIP/Ethernetヘッダ)を挿入します。送信元ポート、宛先ポート、検証タグを10進数で指定します。SCTPペイロードのダンプに使用します。 | -s 2905,2905,12345 |
-S <srcport>,<destport>,<ppi> |
SCTPペイロードの前にダミーのSCTPヘッダを挿入しますが、これはSCTP “DATA” チャンクのペイロードプロトコル識別子 (PPI) も指定する形式です。 | -S 38412,38412,18 (S1APのようなパケットを生成) |
-e <ethertype> |
各パケットの前にダミーのEthernetヘッダを挿入します。EtherTypeフィールドの値を16進数で指定します。IPペイロード (0x0800 ) やIPv6ペイロード (0x86dd ) など。 |
-e 0x0800 (IPv4パケット用のEthernetヘッダを追加) |
-F <file format> |
出力ファイルのフォーマットを指定します。text2pcap -F で利用可能なフォーマットのリストを表示できます。デフォルトは pcapng です。 |
-F pcap (従来のpcap形式で出力) |
--compress <type> |
出力ファイルを指定された形式で圧縮します。--compress のみで利用可能な圧縮形式リストを表示できます。指定しない場合、出力ファイル名の拡張子(例: `.gz`)から推測されます。 |
--compress gzip |
-d |
処理中にデバッグ情報を表示します。複数回指定すると (-dd , -ddd …) より詳細な情報が出力されます。問題発生時の原因究明に役立ちます。 |
-d |
-q |
処理中に標準エラー出力に情報を表示しません(Quietモード)。 | -q |
-a |
ASCIIテキストダンプの識別を有効にします。16進数に見える可能性のあるASCIIテキストダンプの開始部分を識別し、パケットデータに含めないようにします。入力ファイルにASCIIダンプが含まれていない場合は有効にしないでください。 | -a |
-D |
ヘッダダンプの各パケットの前に方向指示子 (‘I’ または ‘O’) が付いていることを示します。これが存在する場合、タイムスタンプよりも前に記述されている必要があります。 | -D |
-v , --version |
バージョン情報を表示して終了します。 | -v |
-h , --help |
ヘルプメッセージを表示して終了します。 | -h |
実践的な例題 🧑💻
いくつかのシナリオで text2pcap
を実際に使ってみましょう。
例1: シンプルなヘッダダンプの変換
od -Ax -tx1 -v
形式の基本的なヘッダダンプファイル simple_dump.txt
があるとします。
# simple_dump.txt
000000 00 11 22 33 44 55 00 66 77 88 99 aa 08 00 45 00
000010 00 28 1a bc 00 00 40 06 ef c8 c0 a8 01 01 c0 a8
000020 01 0a 00 50 c0 f1 12 34 56 78 90 ab cd ef 50 10
000030 10 00 fe dc 00 00
000034
これをpcapngファイルに変換するには、以下のコマンドを実行します。
text2pcap simple_dump.txt simple_dump.pcapng
これで simple_dump.pcapng
が生成され、Wiresharkで開くことができます。デフォルトではEthernetフレームとして解釈されます。
例2: タイムスタンプ付きヘッダダンプの変換
各パケットの前にタイムスタンプが付いている ts_dump.txt
があるとします。
# ts_dump.txt
2024-03-30 10:15:30.123456 000000 00 11 22 33 44 55 00 66 77 88 99 aa 08 00 45 00
2024-03-30 10:15:30.123456 000010 00 28 1a bc 00 00 40 06 ef c8 c0 a8 01 01 c0 a8
2024-03-30 10:15:30.123456 000020 01 0a 00 50 c0 f1 12 34 56 78 90 ab cd ef 50 10
2024-03-30 10:15:30.123456 000030 10 00 fe dc 00 00
2024-03-30 10:15:30.123456 000034
2024-03-30 10:15:32.987654 000000 00 66 77 88 99 aa 00 11 22 33 44 55 08 00 45 00
2024-03-30 10:15:32.987654 000010 00 1c de f0 00 00 40 11 b7 b0 c0 a8 01 0a c0 a8
2024-03-30 10:15:32.987654 000020 01 01 c1 f0 00 35 00 08 ab cd
2024-03-30 10:15:32.987654 00002a
タイムスタンプのフォーマットを指定して変換します。秒未満を含むため、フォーマット末尾に .
を付けることを忘れないでください。
text2pcap -t '%Y-%m-%d %H:%M:%S.' ts_dump.txt ts_dump.pcapng
これで、pcapngファイル内の各パケットに正しいタイムスタンプが設定されます。
例3: アプリケーションデータ(TCPペイロード)の変換
TCPペイロード部分のみがダンプされたファイル tcp_payload.txt
があるとします。
# tcp_payload.txt
000000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d
000010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74
000020 65 78 74 2f 68 74 6d 6c 0d 0a 0d 0a 3c 68 74 6d
000030 6c 3e 3c 62 6f 64 79 3e 48 65 6c 6c 6f 21 3c 2f
000040 62 6f 64 79 3e 3c 2f 68 74 6d 6c 3e
00004a
これがHTTP応答データだと仮定し、ダミーのEthernet/IP/TCPヘッダを付加して変換します。送信元ポート80、宛先ポート54321、送信元IP 10.0.0.1、宛先IP 192.168.0.100 としてみましょう。
text2pcap -4 10.0.0.1,192.168.0.100 -T 80,54321 tcp_payload.txt http_response.pcapng
-T
オプションは自動的に -i 6
(TCPのプロトコル番号)と適切なEthernetヘッダ(-e 0x0800
)も意味するため、個別に指定する必要はありません。同様に -u
(UDP) や -s
/-S
(SCTP) オプションも、対応するIP/Ethernetヘッダを自動的に付加します。
生成された http_response.pcapng
をWiresharkで開くと、指定したIPアドレスとポート番号を持つ完全なTCP/IPパケットとして表示され、HTTPペイロードも確認できます。
例4: Raw IPパケットの変換
ダンプがEthernetヘッダを含まず、IPヘッダから始まっている場合(例えば、ある種のトンネルインターフェースやループバックインターフェースからのキャプチャなど)、-l
オプションでリンク層タイプを指定します。
# raw_ip.txt
000000 45 00 00 34 00 00 40 00 40 06 6b 53 c0 a8 ff 06
000010 ac d9 1c ee 00 4d 00 50 00 00 00 00 00 00 00 00
000020 80 02 fd e8 a5 20 00 00 02 04 05 b4 03 03 00 04
000030 02 00 00
000034
Raw IPのリンクタイプ番号は 101
です。
text2pcap -l 101 raw_ip.txt raw_ip.pcapng
または、ダミーのEthernetヘッダを付加してEthernetフレームとして扱うことも可能です。IPv4なのでEtherTypeは 0x0800
です。
text2pcap -e 0x0800 raw_ip.txt raw_ip_with_ether.pcapng
どちらの方法でもWiresharkでIPレベル以上の解析が可能になります。
例5: デバッグオプションの使用
もし変換がうまくいかない場合、-d
オプションが役立ちます。
text2pcap -d -t '%H:%M:%S' bad_format.txt bad_output.pcapng
これにより、text2pcap
がファイルをどのように解釈しようとしているか、どこで問題が発生したかの詳細なログが出力されます。例えば、「Expecting a hex offset」や「Bad/missing timestamp」のようなメッセージが表示され、入力ファイルの修正箇所を特定するのに役立ちます。さらに詳細な情報が必要な場合は -dd
や -ddd
を試してみてください。
注意点とヒント 💡
- フォーマットの厳格さ: 再度強調しますが、入力ファイルのフォーマットは重要です。特にオフセットとバイト間のスペースに注意してください。期待通りに動作しない場合の最も一般的な原因はフォーマットエラーです。
- タイムスタンプの精度:
-t
オプションで秒未満の精度(ミリ秒、マイクロ秒、ナノ秒)を扱う場合、フォーマット文字列の末尾にピリオド.
を付けることを忘れないでください。 - Wiresharkのインポート機能: 実はWiresharkのGUIにも「ファイル」->「Import from Hex Dump…」という機能があり、
text2pcap
と同様の変換が可能です。こちらの方が対話的にオプションを設定できるため、初心者には使いやすいかもしれません。ただし、2020年時点の情報では、WiresharkのGUIインポートはpcapng形式のみを生成し、pcap形式を選択できないという制限がありました(現在は解消されている可能性もあります)。 - 巨大なファイルの扱い: 非常に大きなヘッダダンプファイルを変換する場合、メモリ使用量や処理時間に注意が必要です。必要に応じてファイルを分割するなどの対策を検討してください。
- Regexモード:
text2pcap
には-r
オプションを使った正規表現モードもありますが、これはより複雑な形式のテキストログからパケットデータを抽出するための高度な機能であり、本記事では割愛します。詳細は公式マニュアルを参照してください。
まとめ 🎉
text2pcap
は、テキスト形式のヘッダダンプをWiresharkなどで解析可能なpcap/pcapngファイルに変換するための強力なツールです。ログファイルやデバッグ出力に含まれるパケット情報を有効活用したい場合に非常に役立ちます。
この記事では、基本的な使い方、入力フォーマットの要件、主要なオプション、そして具体的な使用例を紹介しました。特に、ダミーヘッダを付加してアプリケーションペイロードから完全なパケットを生成する機能は、多くの場面で役立つでしょう。
もし手元に解析したいテキスト形式のパケットダンプがあれば、ぜひ text2pcap
を試してみてください!きっとあなたのネットワーク解析作業を効率化してくれるはずです。🚀
参考情報
- Wireshark text2pcap Manual Page: https://www.wireshark.org/docs/man-pages/text2pcap.html (最新の公式ドキュメント)
- Wireshark User’s Guide – text2pcap: https://www.wireshark.org/docs/wsug_html_chunked/AppToolsText2pcap.html (ユーザーガイド内の解説)