Как проанализировать полезную нагрузку TCP-пакета - PullRequest
2 голосов
/ 29 ноября 2010

Я использую pcap для захвата пакетов TCP, для которых я хотел бы проанализировать полезную нагрузку. Моя стратегия такова:

  1. Получить заголовок Ethernet и проверить, имеет ли он тип ETHERTYPE_IP (IP-пакет)
  2. Проверьте, имеет ли IP-пакет протокол IPPROTO_TCP (TCP-пакет)
  3. Проверка размера полезной нагрузки> 0 (size = ntohs(ip_header->total_length - ip->header_length*4 - sizeof(struct tcp_header)).

  4. анализировать полезную нагрузку (захватить URL-адрес хоста)

Я еще не начал анализировать полезную нагрузку, потому что у меня возникают расхождения. Ниже приведена распечатка полезной нагрузки 10 захваченных пакетов TCP с использованием фильтра "host = www.google.com".

номер пакета: 3 : пакет TCP: порт источника: 80 порт назначения: 58723 Нет данных в пакете

номер пакета: 4 : пакет TCP: порт источника: 58723 порт назначения: 80 Нет данных в пакете

номер пакета: 5 : пакет TCP: порт источника: 58723 порт назначения: 80 полезная нагрузка: GET / HTTP / 1.1 Хост: www.google.com Пользователь-агент: Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ru-ru) AppleWebKit / 533.19.4 (KHTML, как Gecko) Версия / 5.0.3 Safari / 533.19.4 Принять: application / xml, application / xhtml + xml, текст / html; q = 0,9, текст / обычный текст; q = 0,8, изображение / png, / ; q = 0,5 Accept-Language: en-us Accept-Encoding: gzip, выкачать Cookie: THICNT = 25; SID = DQAAAKIAAAB2ktMrEftADifGm05WkZmlHQsiy1Z2v- Подключение: keep-alive

номер пакета: 6 : Пакет TCP: Исходный порт: 80 Порт назначения: 58723 Нет данных в пакете

номер пакета: 7 : пакет TCP: порт источника: 80 порт назначения: 58723 полезная нагрузка: \ 272 ن и \ 243 \ 255 \ 375 \ 375} \ 336H \ 221 \ 227 \ 206 \ 312 ~ \ 322 \ 317N \ 236 \ 255A \ 343 # \ 226 \ 370 ֤ \ 245 [\ 327` \ 306 ը пЕ \ 263 \ 204 \ 313 \ 356 \ 3268) р \ 344 \ 301_Y \ 255 \ 267 \ 240 \ 222х \ 364

номер пакета: 8 : пакет TCP: порт источника: 58723 порт назначения: 80 Нет данных в пакете

номер пакета: 9 : пакет TCP: порт источника: 80 порт назначения: 58723 полезная нагрузка: HTTP / 1.1 200 ОК Дата: понедельник, 29 ноября 2010 г. 10:11:36 GMT Истекает: -1 Cache-Control: приватный, max-age = 0 Content-Type: text / html; кодировка = UTF-8 Контент-кодировка: gzip Сервер: GWS Длина контента: 8806 X-XSS-защита: 1; Режим = Блок \ 213

Почему существует расхождение в полезных нагрузках и портах? В идеале я хотел бы анализировать только пакеты типа 5. Как игнорировать пакеты типа 7 и 9?

Ответы [ 3 ]

6 голосов
/ 29 ноября 2010

Только путем анализа контента. Ничто в заголовке IP или TCP не может пометить пакеты «HTTP Request». Даже «первый пакет данных в соединении» не будет работать, потому что есть постоянные соединения.

Кроме того, чтобы быть полностью уверенным в перехвате всех URI, вам необходимо пересобрать поток TCP и проанализировать HTTP-запрос: URI можно разделить на два или более пакетов.

2 голосов
/ 30 ноября 2010

Ваш размер вычислен неверно - вы не можете выполнить вычитание в порядке сети-хоста, вы должны сначала преобразовать каждое поле в порядок байтов-хостов:

size = ntohs(ip_header->total_length) - ntohs(ip->header_length) * 4 - sizeof(struct tcp_header))

Однако, как Реми Лебо указывает, что вам на самом деле нужно изучить поле offset в заголовке TCP, чтобы узнать, где начинается полезная нагрузка.

Разница между пакетом 5 и пакетом 7 заключается в том, что первыйпроисходит от клиента, до сервера, и последний является ответом от сервера клиенту.Вот почему порты переключаются - адреса источника и назначения также будут переключаться.

Если вы хотите просматривать только пакеты, поступающие от клиента, убедитесь, что адрес источника равен адресу клиента.

2 голосов
/ 30 ноября 2010

Как и заголовок IP, заголовок TCP также имеет переменную длину.Вы не принимаете это во внимание.Вместо того чтобы слепо вычитать sizeof(struct tcp_header)) из общего размера пакета, вам нужно найти заголовок TCP в данных IP, а затем использовать его поле длины (которое нужно умножить на 4, как это делает поле длины заголовка IP), чтобы узнатьгде находится фактическая полезная нагрузка данных.

...