Обзор эксплойтов Крис Касперски ака мыщъх Хакер, номер #092, стр. 092-050-5 Список узлов, через которые должен пройти пакет, содержится в поле данных, которое вмещает до 9 IP-адресов, перечисляемых в порядке следования. Поле ptr указывает на текущий номер обрабатываемого узла и каждый раз увеличивается на 4, причем номер первого адреса равен 4. Рассмотрим пакет, направляющийся из узла X в узел Y и проходящий через маршрутизаторы M1 и M2. На выходе из узла X в поле «Destination Address» (адрес назначения) IP-пакета содержится адрес M1, а в списке «навязанных» адресов (в поле options) – M2 и Y, при этом ptr равен 4, то есть указывает на M2. По прибытии пакета на M1 из поля «навязанных» адресов извлекается адрес, определяемый указателем ptr (в данном случае это M2) и копируется в поле «Destination Address», ptr увеличивается на 4, а поверх адреса M2 записывается адрес того интерфейса маршрутизатора M1, через которой пакет будет направлен на M2 (это и называется «записью маршрута»). По прибытии на M2 вся процедура повторяется, и пакет передается конечному получателю Y, а в поле опций оказывается записанным маршрут пересылки. Когда узел Y получает пакет с опцией Loose Source/Strict Source, он должен использовать записанный маршрут для обратной отправки отклика. Опции Loose/Strict Source Routing могут быть использованы для несанкционированного проникновения через неправильно настроенный брандмауэр: в поле destination address устанавливается разрешенный адрес, и пакет благополучно пропускается брандмауэром, далее из поля опций извлекается запрещенный адрес (который забывает проверить брандмауэр), и пакет перенаправляется по навязанному маршруту прямиком к атакуемому узлу, но к описываемой дыре в TCP/IP-протоколе эта особенность никак не относится. Теперь, учитывая все вышесказанное, попробуем разобраться с exploit'ами. Ключ командной строки -j Window-утилиты tracert, соответствующий ключу -g Linux-утилиты traceroute, задает свободный выбор маршрута по списку узлов, среди которых присутствует только один узел — 0.0.0.0. Это специальный IP-адрес, буквально обозначающий «данный узел». Ключ -h утилиты tracert (соответствующий ключу -m утилиты traceroute) ограничивает максимальное число переходов при поиске следующего назначенного узла, равное в данном случае 1, то есть мы как бы имитируем «Strict Source Routing» (на который tracere/traceroute не способны) на основе опции «Loose Source Routing», поддерживаемой утилитами трассировки. Что же получается в итоге? А вот ни хрена не получается! Мне, несмотря на все усилия, так и не удалось завалить ни одну систему из списка уязвимых: ни в локальной сети, ни через интернет, ни из-под Windows, ни из-под Linux. Прежде всего в Си-версии exploit'а допущена грубая ошибка, ограничивающая предельную длину IP-адреса всего 9 знаками, то есть при попытке атаковать, например, «192.168.7.2», IP-адрес усекается, и атакуется несуществующий узел «192.168.7». Замена всех strncat(x,y,9) на strncat(x,y,15) решает проблему (естественно, размеры буферов необходимо увеличить тоже), но атакуемые узлы упорно падать не хотят. Почему?! |