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