TCP: Как генерируются номера seq / ack? - PullRequest
16 голосов
/ 28 марта 2009

В настоящее время я работаю над программой, которая прослушивает TCP-пакеты, отправляемые и получаемые с определенного адреса. То, что я пытаюсь сделать, это отвечать индивидуально настроенными пакетами на определенные полученные пакеты. Я уже сделал разбор. Я уже могу генерировать действительные Ethernet, IP и - по большей части - пакеты TCP.

Единственное, что я не могу понять, это то, как определяются числа seq / ack.

Хотя это может не иметь отношения к проблеме, программа написана на C ++ с использованием WinPCap. Я прошу любые советы, статьи или другие ресурсы, которые могут мне помочь.

Ответы [ 8 ]

23 голосов
/ 28 марта 2009

Когда установлено соединение TCP, каждая сторона генерирует случайное число в качестве своего начального порядкового номера. Это строго случайное число: существуют проблемы с безопасностью, если кто-либо в Интернете может угадать порядковый номер, поскольку он может легко подделать пакеты для внедрения в поток TCP.

После этого для каждого переданного байта порядковый номер будет увеличиваться на 1. Поле ACK - это порядковый номер другой стороны, отправляемый обратно для подтверждения приема.

RFC 793 (оригинальная спецификация протокола TCP) будет очень полезен.

5 голосов
/ 08 июля 2010

У меня такая же работа. Сначала начальный seq # будет сгенерирован случайным образом (0-4294967297). Затем получатель посчитает длину полученных данных и отправит ACK seq# + length = x отправителю. Последовательность будет тогда x, и отправитель отправит данные. Точно так же получатель посчитает длину x + length = y и отправит ACK как y и т. Д. Это как генерируется seq / ack ...

Если вы хотите показать это на практике, попробуйте прослушать пакет в Wireshark, следуйте потоку TCP и посмотрите сценарий ...

4 голосов
/ 28 марта 2009

Если я вас правильно понял - вы пытаетесь смонтировать атаку с предсказанием TCP SEQ . В этом случае вам нужно изучить особенности генератора Initial Sequence Number вашей целевой ОС.

Были широко обнародованные уязвимости в значительной степени во всех основных ОС , поскольку их генераторы ISN предсказуемы. Я не очень внимательно следил за последствиями, но, насколько я понимаю, большинство поставщиков выпустили патчи для рандомизации их приращений ISN .

2 голосов
/ 28 марта 2009

Похоже, что остальные ответы объяснили почти все о том, где найти подробную и официальную информацию о ACK, а именно: TCP RFC

Вот более практичная и «понятная» страница, которую я нашел, когда выполнял похожие реализации, которые также могут помочь Анализ TCP - Раздел 2: Номера последовательности и подтверждения

1 голос
/ 28 марта 2009

Числа генерируются случайным образом с обеих сторон, а затем увеличиваются на количество отправляемых октетов (байтов).

1 голос
/ 28 марта 2009

Эти значения указывают на ожидаемые смещения начала полезной нагрузки для пакета относительно начального порядкового номера для соединения.

Ссылка

Порядковый номер (32 бита) - имеет двойной роль Если установлен флаг SYN, то это это начальный порядковый номер. порядковый номер фактического первого байт данных будет этой последовательностью число плюс 1. Если флаг SYN не установить, то это порядковый номер первого байта данных

Квитирование число (32 бита) - если флаг ACK установить тогда значение этого поля следующий ожидаемый байт, который получатель ожидает.

1 голос
/ 28 марта 2009

RFC 793 раздел 3.3 охватывает порядковые номера. В прошлый раз, когда я писал код на этом уровне, я думаю, что мы просто сохранили счетчик с единым счетом для сохраняющихся порядковых номеров.

0 голосов
/ 28 марта 2009

Приращение порядковых номеров после установления соединения. Начальный порядковый номер для нового соединения идеально выбирается случайным образом, но во многих ОС есть некоторый полуслучайный алгоритм. RFC - лучшее место, чтобы узнать больше TCP RFC .

...