1

この TCPdump BPF スタイル フィルタを分解しようとしており、助けが必要です:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

ここから取った

何が起こっているのかをよりよく理解するために取った手順:

1. Lets convert the 0x47455420 to ascii 
    ===> GET 
    ===> tcp[((tcp[12:1] & 0xf0) >> 2):4] = GET
2. Examine the inner tcp filter: (tcp[12:1] & 0xf0) 
    ===> the 0xf0 == 0000 0000 1111 0000 ===> I suppose it is save to discard the upper zeros so I can write 1111 0000
    ===> tcp[12:1] == 08 (start filtering from byte 13 (0 based indexing, so you could also say start with the byte that has index 12) for 1 byte, so only 13th byte);
    ===> 08 == 0000 1000
    ===> 0000 1000 & 1111 0000 == 0000 (bitwise and = if both are 1 then end result is one)

これが私が混乱したところです。上で提供したハイパーリンクの説明は、

multiply it by four ( (tcp[12:1] & 0xf0)>>2 ) which should give the tcp header length

ゼロだと無理。お願いします:

  1. 計算の間違いを見つけるのを手伝ってください (TCP ヘッダーと IP ヘッダーを混在させているのではないでしょうか?);
  2. 私の論理が正しいかどうかについてのガイダンスを提供してください。

これはパケットです:

19:10:30.091065 IP (tos 0x0, ttl 63, id 40127, offset 0, flags [DF], proto TCP (6), length 2786)
10.240.35.81.47856 > 172.17.13.201.8080: Flags [P.], cksum 0xf2ef (incorrect -> 0xb8f8), seq 2263020471:2263023205, ack 4187927811, win 28, options [nop,nop,TS val 1906863883 ecr 214445688], length 2734
0x0000:  1a17 8e8a a3a0 026d 627d 049c 0800 4500  .......mb}....E.
         0,1  2,3  ...  ...  ...  ...  12,13 ...                    <=== byte indexes
         1,2  3,4  ...  ...  ...  ...  13,14 ...                    <=== counting how many bytes
0x0010:  0ae2 9cbf 4000 3f06 ac3b 0af0 2351 ac11  ....@.?..;..#Q..  <=== 0x0010 number correctly identifies that the first two diggits are the 16th byte
         16,17 ... ...
0x0020:  0dc9 baf0 1f90 86e2 f3b7 f99e b503 8018  ................
0x0030:  001c f2ef 0000 0101 080a 71a8 6f0b 0cc8  ..........q.o...
0x0040:  2e78 4745 5420 2f69 636f 6e73 2f75 6e6b  .xGET./icons/unk
0x0050:  6e6f 776e 2e67 6966 2048 5454 502f 312e  nown.gif.HTTP/1.
0x0060:  310d 0a68 6f73 743a 2070 6870 2d6d 696e  1..host:.php-min
4

1 に答える 1

4

tcp[12:1]TCP ヘッダーの先頭から 12 バイトのオフセットにあるバイトです。12 は、パケットの先頭からのオフセットではなく、 TCP ヘッダーの先頭からのオフセットです(それtcp[12:1]は 、notether[12:1]またはそのようなものです)。「1」は、参照されているバイト数です。

TCP の仕様であるRFC 793によると、TCP ヘッダーの先頭から 12 バイトのオフセットにあるバイトは、上位 4 ビットにデータ オフセットが含まれ、下位 4 ビットは予約ビットです。データ オフセットは、「TCP ヘッダー内の 32 ビット ワードの数」であり、「データの開始位置を示します」。

パケット内のデータは、一連のバイト ペアとして表示されます。個々のバイトのシーケンスとして提示すると、少し理解しやすくなります。

0x0000:  1a 17 8e 8a a3 a0 02 6d 62 7d 04 9c 08 00 45 00
         eth dest          eth src           etype IP hdr

パケットの最初の 6 バイトは、イーサネット宛先アドレスです。

パケットの次の 6 バイトは、イーサネット ソース アドレスです。

その後の 2 バイトは、イーサネット タイプの値です。これはビッグエンディアンであるため、その値は 0x0800 であり、IPv4 のイーサネット タイプの値です。

次の 2 バイトは、IPv4 ヘッダーの最初の 2 バイトです。IPv4 の仕様であるRFC 791によると、IPv4 ヘッダーの 1 バイト目は、上位 4 ビットに IP バージョン、下位 4 ビットにヘッダー長が含まれます。そのバイトの値は 0x45 であるため、IP バージョンは 4 (IPv4 の場合) であり、ヘッダーの長さは 5 です。ヘッダーの長さは「32 ビット ワードのインターネット ヘッダーの長さ」なので、5 です。 32 ビット ワード、または 20 バイト。

したがって、今のところ、IPv4 ヘッダーをスキップして、TCP ヘッダーに進みましょう。

0x0020:  0d c9 ba f0 1f 90 86 e2 f3 b7 f9 9e b5 03 80 18
               TCP header                          12 13

したがって、TCP ヘッダーのバイト 12 は 0x80 です。0x80 & 0xf0 は 0x80、0x80 >> 2 は 0x20、つまり 32 です。これは、8*4 = 32 として、そのバイトの上位 4 ビットが 32 ビット ワードのデータ オフセットであることと一致しています。

tcp[((tcp[12:1] & 0xf0) >> 2):4]したがって、このパケットの はtcp[32:4]、つまり、TCP ヘッダーの先頭から 32 のオフセットにある 4 バイトです。

TCP ヘッダーの先頭から 32 バイトは次のとおりです。

0x0040:  2e78 4745 5420 2f69 636f 6e73 2f75 6e6b
              ^

そこにあり、それが HTTP リクエストの「GET」ヘッダーであり、TCP セグメント データの先頭から始まります。問題の 4 バイトは「GET」です。

したがって、12 inは、パケットの先頭からのオフセットでtcp[12:1]なく、 TCP ヘッダーの先頭からのオフセットです(それtcp[12:1]は ではないether[12:1]か、またはそのようなものです)。

そして、パケットのバイトとその内容に関する質問への回答:

0x0000:  1a 17 8e 8a a3 a0: Ethernet destination
         02 6d 62 7d 04 9c: Ethernet source
         08 00: Ethernet type/length field - 0x0800 = IPv4

したがって、パケットの最初の 14 (0x000e) バイトはイーサネット ヘッダーです。

このパケットでは、イーサネット タイプ/長さフィールドは 0x0800 であるため、イーサネット ヘッダーに続くイーサネット ペイロードは、IPv4 ヘッダーで始まる IPv4 パケットです。

         45: IPv4 version/header length
         00: IPv4 Type of Service/Differentiated Service
0x0010:  0a e2: IPv4 total length
         9c bf: IPv4 identification
         40 00: IPv4 flags/fragment offset
         3f: IPv4 time-to-live
         06: IPv4 (next) protocol - 6 = TCP
         ac 3b: IPv4 header checksum
         0a f0 23 51: IPv4 source address
         ac 11: first 2 bytes of IPv4 destination address
0x0020:  0d c9: second 2 bytes of IPv4 destination address

IPv4 ヘッダーの長さは 5 なので、IPv4 ヘッダーは 20 バイトです。これが最小の IPv4 ヘッダー長です。ヘッダーの固定長部分の後に IPv4 オプションがある場合は、小さくすることはできませんが、大きくすることはできます。この場合、何もありません。

プロトコル フィールドの値が 6 であるため、IPv4 ペイロードは TCP パケットです。

         ba f0: TCP source port (47856)
         1f 90: TCP destination port (8080)
         86 e2 f3 b7: TCP sequence number
         f9 9e b5 03: TCP acknowledgment number
         80: TCP data offset + reserved bits
         18: reserved bits + TCP flags
0x0030:  00 1c: TCP window
         f2 ef: TCP checksum
         00 00: TCP urgent pointer

これは、TCP ヘッダーの 20 バイトの固定長部分です。ただし、TCP ヘッダーの長さは 32 バイトであるため、ヘッダーには追加の 12 バイトの TCP オプションがあります。

         01: TCP No-Operation option
         01: TCP No-Operation option
         08 0a 71 a8 6f 0b 0c c8: first 8 bytes of TCP Timestamp option
0x0040:  2e 78: last 2 bytes of TCP Timestamp option

TCP ヘッダーの長さは 32 ビットの倍数、つまり 4 バイトの倍数でなければなりません。TCP オプションの長さは 4 の倍数ではない場合があります。TCP タイムスタンプ オプションの長さは 10 バイトです。そのため、No-Operation オプションがパディングに使用されます。

したがって、これらの 32 バイトは TCP ヘッダーでした。以下は TCP ペイロードです。どうやら、これは HTTP 接続上にあり (パケットは代替 HTTP ポートであるポート 8080 に送信されています)、これは HTTP GET 要求の始まりです。

         47 45 54 20 2f 69 63 6f 6e 73 2f 75 6e 6b
0x0050:  6e 6f 77 6e 2e 67 69 66 20 48 54 54 50 2f 31 2e
0x0060:  31 0d 0a 68 6f 73 74 3a 20 70 68 70 2d 6d 69 6e

そう:

  • これは、監視モードでないときのイーサネットまたは Wi-Fi ネットワーク (または、イーサネット ヘッダーを使用するか、Wi のようにアダプターまたはドライバーが「偽のイーサネット」ヘッダーを提供する他のタイプのネットワーク) でキャプチャされたためです。 -Fi)、パケットはイーサネット ヘッダーで始まります。
  • イーサネット タイプの値は 0x0800 であるため、その後に IPv4 ヘッダーが続きます。
  • IPv4 プロトコルの値は 6 であるため、その後に TCP ヘッダーが続きます。
  • TCP ポート番号の 1 つは通常 HTTP で使用されるポート番号 (8080) であるため、おそらく何らかの HTTP データが続きます (ただし、これは保証されませんが、TCP ポート番号はヒントのようなものです)。

同じネットワーク上の ARP の場合、イーサネット ヘッダー (これffff ffffはイーサネット ブロードキャスト アドレスであるため、ARP 要求が通常そうであるように、パケットはブロードキャストされます) を持ち、イーサネット タイプの値である 0x0806 のイーサネット タイプを持ちます。 ARP 用。

同じネットワーク上の ICMP の場合も、イーサネット ヘッダーがあり、IPv4 ヘッダーもあるため、イーサネット タイプは 0x0800 になります。ICMP の場合、IPv4 ヘッダーのプロトコル フィールドの値は 1 になります。

于 2015-02-08T19:10:21.090 に答える