V-zlom.ru » Статьи » Как стать участником чужого TCP соединения

Как стать участником чужого TCP соединения

На этот раз предлагаю Вам обсудить довольно сложную тему, а именно как войти в систему не зная пароля и даже имени пользователя. Итак приступим. Многие слышали выражения типа "Зателнеться по такому-то порту" или "Залей сниффер по ФТП-шнику" и т.п. И многие из Вас телнетились или заходили по ФТП на сервер. Ну и что там видно после соединения? Да ничего хорошего. Удаленная машина упорно талдычит "введи пароль". Ну а где нам взять пароль, если мы впервые на этом сервере? Серьезная проблема, не так-ли? Ладно, давайте ее и решать.
Есть предложение воспользоваться вот какой возможностью. А почему бы не переждать, пока настоящий пользователь не зарегистрируется в системе и потом не перехватить его сессию. Заманчиво, правда?

Теория.
Протокол TCP (Transmission Control Protocol) является одним из базовых протоколов транспортного уровня сети Internet. Работа с этим протоколом подразумевает создание непосредственного виртуального соединения, контроль ошибок, повторную пересылку поврежденных пакетов, четкую последовательность пересылки самих пакетов и разрыв соединения в конце сеанса. Нам интересен этот протокол именно потому, что такие известные протоколы прикладного уровня как FTP и TELNET реализованы на его базе. Для опознавания TCP-пакета в его заголовке существеет два 32-разрядных идентификатора, они же в свою очередь служат и счетчиками пакетов. Я имею в виду Sequence Number и Acknowledgment Number. Еще одно немаловажное поле - Control Bits.
Это поле размером 6 бит может содержать следующие командные биты (слева направо):

URG: Urgent Pointer field significant
ACK: Acknowledgment field significant
PSH: Push Function
RST: Reset the connection
SYN: Synchronize sequence numbers
FIN: No more data from sender

Ну что ж, в основную теорию, надеюсь, въехали, пойдем далее. Рассмотрим как происходит процесс соединения по протоколу TCP.

Как происходит ЭТО.
Допустим компьютеру "Клиент" (в интернете каждый компьютер умные люди зовут хостом, а чем мы хуже этих людей?) необходимо создать соединение с хостом "Сервер". Это соединение происходит в 3 этапа:
Первым делом клиент как бы здоровается и посылает пакет серверу с установленным битом SYN (synchronize sequence number), а в поле Sequence Number установлено начальное 32-битное значение (обозначим его как ISSкл) (Initial Sequence Number).
Сервер тоже здоровается с клиентом (он тоже культурный) и посылает свой пакет, в котором отмечены бит SYN и бит ACK. В поле Sequence Number сервер устанавливает свое начальное значение - ISSсерв. Но это еще не все. Тут сервер начинает хитрить и в поле Acknowledgment Number ставит значение ISSкл, полученное в первом пакете от хоста "Клиент" да еще и увеличенное на единицу.
Но клиент тоже не лыком шит и тоже отвечает хитростью: он посылает свой пакет, где установлен бит ACK; поле Sequence Number содержит ISSкл + 1, а поле Acknowledgment Number содержит значение ISSсер + 1.
Тут процесс братания хостов и заканчивается. Виртуальное соединение считается установленным.
Повторим схемотично, что же происходило:

Клиент - > Сервер: SYN, ISSкл
Сервер - > Клиент: SYN, ACK, ISSсер, ACK(ISSкл+1)
Клиент - > Сервер: ACK, ISSкл+1, ACK(ISSсер+1)

Вот теперь, отрекомендовавшись у Сервера, Клиент может преспокойно отсылать свои пакеты данных, не забывая при этом менять поля ACK, ISSкл+1, ACK(ISSсер+1) и DATA.

Разбор полета.
Из предыдущего раздела мы видим, что на этапе установки соединения (когда хосты здороваются) опознавание пакетов осуществляется только по Sequence Number и Acknowledgment Number. Тут сразу становится ясно, что для формирования ложного TCP-пакета нам достаточно знать текущие значения идентификаторов для данного соединения - ISSкл и ISSсер. Усугубляет картину еще и то, что FTP и TELNET вовсе не проверяют подлинность пакетов, полагая, что это сделает за них транспортный уровень. Отсюда вывод: внедрившись в процесс передачи данных на транспортном уровне можно послать пакет с любого хоста в сети Internet не зависимо от потокола (TELNET или FTP) от имени одного из участников данного соединения (например, от имени клиента), и данный пакет будет воспринят как верный! К тому же, постольку поскольку FTP и TELNET не проверяют IP адрес отправителя, то ответ на ложный пакет придет по указанному в нем адресу. Бедный же хозяин пакетов (Клиент) попросту отвалится из-за рассогласования счетчиков (сервер нас уже посчитал).

Дядь, дай десять копеек.
Ну что ж осталось дело за малым. Надо рассчитать ISSкл и ISSсер, а также предсказать динамику их изменения. Это самая сложная задача, но мы трудностей не боимся. (Он сказал "Поехали!" и взмахнул рукой).

Случай 1 (простой).
Предположим, что мы находимся в том же сегменте сети, что и атакуемый хост. Дело за малым. Ставим сниффер, направляем весь трафик через свой хост и смотрим за клиентами, подключающимися к серверу. Конечно же нас интересуют только пакеты со значениями ISSкл и ISSсер (можно даже не интересоваться содержанием поля DATA, т.е. анализировать только заголовки). Итак. Собираем информацию, ищем зависимость, составляем формулу и в путь.

Случай второй (сложный).
Предположим, мы находимся в другом сегменте сети и проанализировать трафик нам не удастся.
Для начала нам надо определить ISN - Initial Sequence Number, т.е. как ОС формирует начальное значение. По документации протокола TCP (RFC 793) рекомендуется увеличивать значение этого 32-битного счетчика на 1 каждые 4 микросекунды, но на практике это далеко не так. Например, в Linux 1.2.8 это значение вычисляется по такому закону:

ISN = mcsec + 1000000 sec, где mcsec - время в микросекундах;
sec - текущее время в секундах, причем отсчет его идет от 1970 года.

в Windows NT 4.0:

ISN = 10 msec, где msec - текущее время в миллисекундах.

ОК, На этом и сговоримся. Закон вычисления ISN зависит от времени и представляет функцию

ISN = F(mсsec)

Вид же самой функции F можно получить проанализировав исходный код ядра. Тут Вы сразу закричите: "Да ты гонишь, где же достать исходники Windows?!" Да, трудновато. Придется импровизировать.
Представим ОС "черным яциком" и проведем серию тестов запрос-ответ, причем фиксируя время между запросом и ответом на него, а также время между запросами. (Проще говоря, прикинемся обезьяной с часами, и будем просить соединения у сервера, записывая изменения ISN во времени).
В результате получится такая таблица значений

ISN(1) - T(1)

ISN(2) - T(2)

ISN(3) - T(3)

...

...

...

ISN(N) - T(N)

Здесь ISN (i) - значение ISN, полученное в момент времени i, а T(i) - время от начела эксперимента (время начала возьмем за 0).
Проанализировав результаты наблюдений, можно составить функцию

ISN(t) = F(t)

С ее помощью уже можно получив ответ, предсказать значение ISN через определенный промежуток времени.
Сразу оговорюсь. Не обязательно нападать с подобными тестами на интересующий нас хост. Можно просто найти такой жи тип ОС, что и там и протестировать ее, а результат (полученную функцию) записать и применить уже в деле.
Вот, собственно, и все. Осталось дождаться, когда пользователь зарегистрируется в системе, введет логинпароль и начнет работу. Какие наши действия? Прогнозируем нимер ISN, создаем пакет с заполненными полями ACK, ISSкл+1, ACK(ISSсер+1) и DATA и, если повезет захватываем сессию. Если не повезло, немного меняем ISSкл вместе с ACK(ISSсер+1) и за старое. Рано или поздно значения будут верными. Тут нам откроются такие возможности! Этими средствами можно даже захватить сеанс полозователя root. Представить страшно.
Вот таким далеко не простым способом можно проникнуть в любую систему. Желаю удачи!

  • Автор: makar
  • Комментарии: 0
  • Просмотры: 938
0

Добавить комментарий

Вы не авторизованы и вам запрещено писать комментарии. Для расширенных возможностей зарегистрируйтесь!