Принцип работы TCPdump


Макаров Тихон

принцип работы tcpdumpВ продолжение о возможности обходить firewall, советую просмотреть заголовок дейтаграммы из нее.

Я много нападок уже делал на firewall'ы. Их главной проблемой является то, что они внушают пользователю чувство уверенности, что он защищен (а после того, как у меня на компьютере Outpost стал занимать 4 Гигабайта оперативной памяти из-за поразившего его червя, использовавшего уязвимость в outpost, я уже полностью перестал так думать). Я предполагаю, что одного Firewall мало, необходимо иметь еще и обычный анализатор пакетов и голову на плечах. Зачем нужен анализатор пакетов? Например, он может помочь определить, взломали ваш компьютер или просто сканировали, в то время как Kaspersky Anti-hacker даже не даст нормального журнала событий, а может помочь и от атаки со вставкой.

Итак, вкратце расскажу про TCPdump (или Windump в windows). Для его установки понадобится WinPCap. Что делает это программа? Она анализирует пакеты, которые предназначены вашему компьютеру и показывает дату соединения, IP-адреса отправителя и получателя, тип пакета, а так же адрес данных в стеке TCP/IP. Если windump запускается с параметром -vv, то он показывает так же и сам пакет в виде шестнадцатеричного кода.

Вот пример его отчета:

12:00:00.000000 makarov.homenet.4000 > user.homenet.23 : S 100000000:100000000(0) win 8760 (DF)
12:00:00.000001 user.homenet.23 > makarov.homenet.4000 : S 200000000:200000000(0) ack 100000001 win 1024 (DF)
12:00:00.000002 makarov.homenet.4000 > user.homenet.23: . ack 10 win 8760 (DF)

Теперь просмотрим эти записи. Сначала лучше подумайте сами, а потом прочитайте пояснения. makarov.homenet отсылает с порта 4000 пакет компьютеру user.homenet на порт 23 на соединение (SYN, обозначение буквой S), так что тот занесется в стек с по адресу 100000000. В скобках указан размер полезного содержимого пакета (0 байт), 8760 обозначает размер окна (это размер буфера, который имеет отсылающий в своем распоряжении для обмена данными), а 1460 - максимальный размер TCP-сегмента (максимальный размер (1500) для сетей Ethernet - 40 байт заголовков).

Далее user.homenet отсылает обратный запрос на makarov.homenet. Он по принципу построения отличается только тем, что в нем есть ack 100000001, что обозначает, что это ответный пакет на соединение (ack), который был занесен в стек по адресу 100000001.

Теперь уже makarov.homenet отправляет последний ack пакет, связанный с подключением, в котором говорит user.homenet, что получил его пакет с ответом и ждет первых 10 байт данных. Причем здесь уже цифра написана не 100000001: 100000011, а 10, потому что мы согласовали место, с которого вниз по стеку будут "расти" данные еще при подключении и теперь нам достаточно указывать только размер, а не адрес.

Если бы был включен параметр -vv, то какой-нибудь пакет выглядел бы так (выбран случайный пакет):

12:00:00.000000 127.127.127.127 > 127.127.127.128: icmp: echo reply
4500 004E 80CB 0000 8011 9852 C0A8 4031 E..N:,:.V.RA
C0A8 5ААА 0089 003A BA6F 82F6 0110 A~_y.%.%: o, o ..
0001 0000 0000 0000 2045 4F45 4645 4C46 ::. EOEFELF

(прошу прощения за неточности в пакете, но шрифт не позволяет передать полностью верный формат данных).

Первые 4 бита указывают на используемую версию протокола IP. В данном случае это есть версия 4 (4500 из 16 в двоичную, берем старшие 4 бита, получаем 4, а не потому что первая цифра - 4). Можно узнать версию протокола (который идет со смещением в 9 байт). В данном случае это 11 (четыре части по четыре символа + одна по две итого смещение девять байт, а за ними идет 11). Такое значение подходит для протокола UDP. Можно посчитать заголовок, и соответственно найти полезную часть пакета (данные в нем). Всего надо отсчитать 40 байт, то есть полезная нагрузка здесь - 4F45 4645 4C46.

Помимо SYN и ACK флагов могут употребляться и другие, которые располагаются в одном байте:

Резерв. Резерв. URG ACK PSH RST SYN FIN
7 6 5 4 3 2 1 0

7 и 6 биты должны быть равны нулю. Они зарезервированы, но часто их используют для определения ОС, т.к. стеки в разных ОС по-разному реагируют на эти флаги.

URG - Экстренная информация, ее надо передать раньше другой (обозначается буквой U)
PSH - Передача данных проходит быстрее (обозначается буквой P)
RST - reset, срочное завершение (обозначается буквой R)
FIN - медленное завершение (обозначается буквой F)

Иногда встречаются неправильные пакеты. Так, в них могут быть установлены флаги Syn и Rst, что позволит узнать реакцию на такой пакет и определить, например, ОС жертвы.

Хочется рассмотреть еще один случай. В нем в отчет добавится еще один параметр - номер пакета. Это происходит из-за фрагментации, которая существует чтобы большие пакеты могли проходить в сети, в которой существует предел размера пакета.

makarov.homenet > user.homenet: icmp: echo request (frag 10000:120@0+)
makarov.homenet > user.homenet: icmp: (frag 10000:120@120+)
makarov.homenet > user.homenet: icmp: echo request (frag 10000:120@240+)

Здесь с 10000 - номер (ID) пакета, 120 - его длина, frag - обозначение фрагментации, @0 - смещение фрагмента пакета относительно начала пакета, а + - обозначение включенной фрагментации (флаг MR), а так же то, что есть еще фрагменты этого пакета.

В Windump можно так же делать фильтры. Так ip[x]=y обозначает, что для x - смещение:длина значение должно быть y. После чего можно ввести команду tcpdump 'ip[x] = y' или сохранить в файле строку ip[x] = y, а потом запустить tcpdump -F /somefile.

Как, например, определить, что данный пакет пришел на завершение? Tcp[13] & 0xff = 1, где 13 - начало байта с флагами, 0xff - длина, а 1 значение. И поскольку Fin - самый младший бит байта, то значение байта должно быть равно 1, если установлен только этот флаг.

Кажется, на этом пока все.