2012-08-01 5 views
7

tcpdumpを使用してhttpヘッダーをスニッフィングしようとしています。Tcpdumpフィルタとビットマスキングの理解

このフィルタはうまく動作しますが、私はそれを理解することはできません -

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

を私はそれをGoogleで検索しましたが、私はここで、いずれかの有用な情報

を見つけることができません全体tcpdumpコマンド

です
sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

答えて

15

httpヘッダーを取得するのはBPFフィルターではなく、tcpdumpコマンドの「-A」スイッチです。

tcpdumpコマンドは、最終的なBPFフィルタにゼロ以外の合計値をもたらす計算が含まれている、特定の宛先またはeth0の特定の送信元からのtcpトラフィックを検索します。 "-A"オプションを指定すると、各パケットがASCIIからリンクレベルヘッダーを差し引いた値で出力されます。

私は以下の計算について説明しましたが、実際のフィルタにはコピーや貼り付けなどの問題があると思います。あなたはtcpdumpの中でこれらのフィルタを使用するときは、

  • ip[2:2]は2バイト(すなわち第三& 4バイト)を指し、バイト境界に該当しないフィールドを調べる際に一般的に使用されているTCPビット・マスクを、使用していますIPヘッダーでは、バイト2から始まります(オフセット0から始まることに注意してください)。この合計は、IPパケットの全長を表し、最大65535バイトになります。ここでのビットマスク用

、明確にするため、私は事前に保留しました「0」ので0xf0x0fなっマスク。マスク上の先頭の「0」は、以下のGuyHarrisからのコメントに従って削除されます。

  • ip[0]&0x0fあなたの32ビット・ワードでIPヘッダ長を与える、そのようなものとして、これは典型的に4を乗じて、IPヘッダ内のバイト0の後半(つまり、1バイト目)を指しそのような計算。

  • tcp[12]&0xf0)は、データオフセットフィールドであり、32ビットワードのTCPヘッダーのサイズを指定するため、通常これで乗算されます4とする。

    あなたは、彼らが32ビット/ 4バイトワードですので、あなたのフィルタがあるべき正しい

    であることを計算にバイト単位の合計に変換する必要があるため4で最後の2本の長さを乗算する必要が

計算: - IPヘッダ長 - (バイト単位)

  • IPパケット長TCPヘッダ長

し、その値を探しているZEしますあなたは減算を実行すると、RO、すなわちこの

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

のようなものは、あなたが非ゼロの合計を探しています。この非ゼロの合計は、レイヤ4より上のデータ、すなわち、典型的にはアプリケーショントラフィックであるtcpペイロード内のデータがあることを意味する。

ます。また、ほとんどのHTTPトラフィックは、このようなフィルタは、一般のRFCによると、通常はありませんが、SYN、上のデータを検出するために、セキュリティ民俗で使用され

80ポートの上にあると仮定し port 80を追加することもできますそれは許される。その全部は次のようになります -

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuideをところでTCP/IP上で非常に良い、無料のオンラインガイドです。

更新:Guy Harrisのアップデートに従ってビットマスクの 'leading zero'セクションを修正しました。

+1

'0x0f'と' 0xf'は同じものです。先頭のゼロは16進値で省略することができます。ただし、先頭のゼロが存在する場合は、コードをもっと*はっきりと読み取ることがあります。 '<< 2"は '* 4'と同じです。しかし、 '' 2'は '/ 2'(2で割る)です。これは間違っています。おそらくタイプミスです。 –

+1

非常に包括的な答えをありがとう! – kingasmk

+1

@GuyHarris thx、先頭のゼロが削除されたかどうかは分かりませんでしたので、わかりやすくするためにコメントに入れたいと思っていました。 「* 2」は「* 4」と同じですが、「* 4」はかなり明確で、値の違いを説明する必要があると感じていたため、簡潔にするために「>> 2」に変更しました-bitワード対バイト)、 '<< 2"のタイプミスの疑いを取り除くためです。 –

関連する問題