2015-02-08 2 views
1

Пытаясь разобрать этот фильтр стиля ТСРйитра BPF, и нуждаются в помощи:Разбирая BPF фильтра ТСРйшпра

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

Его взят из here

Шагов, которые приняли, чтобы лучше понять, что происходит:

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 [email protected]?..;..#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 

ответ

3

tcp[12:1] является байт со смещением 12 байт от начала заголовка TCP; 12 - это не смещение от начала пакета, это смещение от начала заголовка TCP (это tcp[12:1], а не ether[12:1] или что-то в этом роде). «1» - это количество байтов, на которые ссылается.

В соответствии с RFC 793, который является спецификацией для TCP, байт со смещением в 12 байт от начала the TCP header содержит смещение данных в верхних 4 битах, а нижние 4 бита - зарезервированные биты. Смещение данных - «Число 32-битных слов в заголовке TCP», которое «указывает, откуда начинаются данные».

Данные в пакете отображаются в виде последовательности пар байтов. Это немного легче понять, если представить в виде последовательности отдельных байтов, так:

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 байт пакета являются адрес назначения Ethernet.

Следующие 6 байтов пакета - это адрес источника Ethernet.

2 байта после этого являются значением типа Ethernet; это big-endian, поэтому его значение равно 0x0800, что является значением типа Ethernet для IPv4.

Следующие 2 байта - это первые 2 байта заголовка IPv4. Согласно RFC 791, который является спецификацией для IPv4, первый байт the IPv4 header содержит версию IP в верхних 4 битах и ​​длину заголовка в младших 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 

Так байт 12 заголовка TCP является 0x80. 0x80 & 0xf0 - 0x80, а 0x80 >> 2 - 0x20, что равно 32; это согласуется с верхними 4 битами этого байта, являющимися смещением данных в 32-битных словах, как 8 * 4 = 32. Таким образом, для этого пакета 444, т.е. 4 байта со смещением 32 из начала заголовка TCP.

32 байт от начала заголовка TCP является:

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

там, и это «GET» заголовка запроса HTTP, начиная с начала данных TCP сегмента. Эти 4 байта - «GET».

Так 12 в 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) байт пакета являются заголовок Ethernet.

В этом пакете, то/поле длины типа Ethernet, является 0x0800, так что полезная нагрузка Ethernet, после заголовка Ethernet, является 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 

Это 20-байтовый фиксированной длины часть заголовка TCP; однако, длина заголовка 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-Header должна быть кратной 32 бит, то есть кратна 4 байта; Параметры TCP могут не быть кратным 4 в длину - параметр временной метки TCP имеет длину 10 байт, поэтому для заполнения используется опция No-Operation.

Итак, эти 32 байта были заголовком TCP; что следует за полезной нагрузкой TCP.По-видимому, это на соединение HTTP (пакет посылается на порт 8080, который является альтернативным HTTP порт), и это начало запроса 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 

Итак:

  • , поскольку это было зафиксировано либо в сети Ethernet, либо в сети Wi-Fi, если оно не находится в режиме мониторинга (или в каком-либо другом типе сети, в котором используются заголовки Ethernet или на которых адаптер или драйвер снабжают заголовки «поддельные Ethernet», как с Wi-Fi), пакет начнется с заголовка Ethernet;
  • как значение типа Ethernet - 0x0800, за ним следует заголовок IPv4;
  • , поскольку значение протокола IPv4 равно 6, за ним следует заголовок TCP;
  • как один из номеров портов TCP - это номер порта, который обычно используется HTTP (8080), это , вероятно,, за которым следуют HTTP-данные (это не гарантировано, однако, номера портов TCP больше похожи на подсказки) ,

Для ARP над одной и той же сети, вы будете снова иметь заголовок Ethernet (ffff ffff является адресом Ethernet вещания, так что пакет транслируется, как и ARP запросы, как правило, являются), с типом Ethernet из 0x0806 , который является значением типа Ethernet для ARP.

Для ICMP по той же сети у вас снова будет заголовок Ethernet, и у вас также будет заголовок IPv4, поэтому тип Ethernet будет 0x0800. Значение в поле протокола в заголовке IPv4 будет 1 для ICMP.

+0

Большое спасибо. Я думаю, что я отсутствовал, это правильное понимание «смещения данных». Прежде чем принимать ответ, позвольте мне спросить вас: (1), что же такое структура пакета - первые байты 0x0010 - это заголовок протокола ethernet? (2) Затем заголовок протокола IP? (3) Откуда вы это знаете (в каком-то контексте нужно было понять, какой пакет ожидать). Давайте сравним это с ARP tcpdump (ffff ffff ffff 0026 ...) или ICMP (0800 27b9 caba 0026 ...). Как узнать, какие цифры означают, что и когда? –

Смежные вопросы