9

tcpdump を使用して http ヘッダーをスニッフィングしようとしています。

このフィルターはうまく機能しますが、理解できません -

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

グーグルで検索しましたが、有用な情報が見つかりません

これが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
4

1 に答える 1

18

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

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

以下の計算について説明しましたが、実際のフィルターには、おそらくコピーと貼り付けによって、いくつかの問題があると思います。これらのフィルターを tcpdump で使用する場合、tcp ビット マスキングを使用していることになります。これは通常、バイト境界に該当しないフィールドを調べるときに使用されます。

  • ip[2:2]IP ヘッダーのバイト 2 から始まる 2 バイト (つまり、3 番目と 4 番目のバイト) を指します (オフセット 0 から始まることに注意してください)。この合計は、最大 65535 バイトの IP パケットの合計長を表します。

ここのビットマスクについては、明確にするために、「0」を前に追加したので、マスク0xfは になり0x0fます。マスクの先頭の「0」は、以下の GuyHarris からのコメントに従って削除されます。

  • ip[0]&0x0fは、IP ヘッダーのバイト 0 の後半 (つまり、最初のバイト) を指します。これにより、IP ヘッダーの長さが 32 ビット ワードで得られるため、このような計算では通常、これに 4 を掛けます。

  • tcp[12]&0xf0)バイト 12 の前半 (つまり、11 番目のバイト) を参照します。これはデータ オフセット フィールドであり、TCP ヘッダーのサイズを 32 ビット ワードで指定するため、このような計算では通常 4 を掛けます。

最後の 2 つの長さを 4 倍する必要があります。これは、32 ビット/4 バイトの単語であり、計算を正しく行うために合計バイト数に変換する必要があるためです。

フィルターは次のように計算する必要があります。

  • IP パケットの長さ (バイト単位) - IP ヘッダーの長さ - TCP ヘッダーの長さ

その値がゼロになることを探します。つまり、次のようなものです

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

減算を実行すると、ゼロ以外の合計が求められます。このゼロ以外の合計は、レイヤ 4 より上にデータがあることを意味します。つまり、データは tcp ペイロードにあり、通常はアプリケーション トラフィックです。

port 80また、ほとんどの http トラフィックがポート 80 経由であると仮定して、追加することもできます。

このようなフィルターは、セキュリティ担当者が SYN 上のデータを検出するために一般的に使用します。これは正常ではありませんが、RFC によれば許可されています。全体は次のようになります-

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

TCPIPGuideは、TCP/IP に関する非常に優れた無料のオンライン ガイドです。

更新: Guy Harris からの更新に従って、ビットマスクの「先行ゼロ」セクションを変更します。

于 2012-08-02T15:36:05.097 に答える