tcpdump でキャプったデータから TCP ストリームを取り出す

tcpdump で次のようにキャプって保存したファイルは wireshark で開いて解析できます。

tcpdump -nn -w a.cap port 80

wireshark なら tcpdump よりもいろいろな解析が可能なので、よくサーバでキャプったファイルから HTTP などの TCP ストリームを取り出すのに使っていました。

がしかし、「サーバ上で tcpdump でファイルに保存 → ローカルの落としてきて wireshark で開く」というのが面倒くさくて、CLI だけでできればなーと常々思っていました。

・・・すみません、常々思っていたにも関わらずまったく調べていませんでした。ググれば普通に CLI で出来るツールがでてきました。

tshark

wireshark の CLI 版です。

CentOS 7 とか 8 とか Fedora 31 とかなら標準のリポジトリから入れられます。

# CentOS 7
sudo yum -y install wireshark

# CentOS 8 / Fedora 31
sudo dnf -y install wireshark-cli

CentOS 8 や Fedora 31 で wireshark を入れると X 関係が含まれるのか大量の依存パッケージがインストールされてしまいます。tshark だけなら wireshark-cli で十分です。

次のように tcpdump でキャプチャしたファイルが読めます。-z オプションの末尾の 1 はストリーム番号です。キャプチャファイルに複数のストリームがあるときは番号を変えて別々に実行する必要があります。

tshark -n -q -z follow,tcp,ascii,1 -r a.cap

次のように直接キャプチャすると、キャプっているパケットの概要が逐次表示されつつ、Ctrl+C で止めたときに TCP ストリームが表示されます。

tshark -n -z follow,tcp,ascii,1 port 80

tcpdump からパイプするときは Ctrl+C で tshark が SIGINT で死ぬとなにも表示されません。setsid で SIGINT されないようにすれば大丈夫です。

tcpdump -nn port 80 -w - | setsid tshark -n -z follow,tcp,ascii,1 -r -

tcpflow

tcpdump とは異なり TCP ストリームを再構築して解析できるパケットキャプチャツールです。

CentOS 7 なら epel から入れられます。

sudo yum -y install epel-release
sudo yum -y install tcpflow

CentOS 8 だと CERT Forensics Tools から入れられます。

sudo yum -y install https://forensics.cert.org/cert-forensics-tools-release-el8.rpm
sudo yum -y install tcpflow

Fedora 31 なら標準のリポジトリから入れられます。

sudo yum -y install tcpflow

tcpdump でキャプチャしたファイルを読むと、保存されたすべての TCP ストリームが表示されます。

tcpflow -c -r a.cap

直接キャプチャすれば TCP ストリームをリアルタイム表示できます。

tcpflow -c port 80

tcpdump からパイプもできます。

tcpdump -nn port 80 -w - | tcpflow -c -r -

さいごに

いつも tcpdump でキャプったファイルをローカルに落としてから GUI の wireshark で開いていました・・なぜ今まで tshark や tcpflow のことを知らなかったのか・・今思うとものすごい面倒なことしてました。