(hacking) — HackZona.Ru

(hacking)

(hacking)

Тип статьи:
Со старой ХакЗоны.
Как стать участником чужого TCP соединения (hacking)
Введение.
Доброго времени суток. На этот раз предлагаю Вам обсудить довольно сложную тему, а именно как войти в систему не зная пароля и даже имени пользователя. Итак приступим.

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

4 комментария

16:10
И всё.......
05:35
Хорошая статья, трудоёмкая правда..
03:16
zahadi na sait prikol.co.il
12:30
<a href="http://www.xak-extreme.com"title='http://www.xak-extreme.com'> xak-extreme</a> [www.xak-extreme.com]