Как уже неоднократно подчеркивалось, существует принципиальная возможность отправить IP-пакет от имени (с IP-адреса) любого хоста в Internet. Эта возможность заложена в формате самого IP-заголовка, поскольку в нем не предусмотрено ни одного дополнительного идентифицирующего поля (за исключением поля Source Address). Ничто не мешает кракеру поставить в этом поле то же самое значение, что и в поле Destination Address, то есть сформировать IP-пакет, где адрес отправителя совпадает с адресом получателя пакета. Кроме того, в TCP-заголовке также ничто не мешает установить одинаковые значения в полях Source Port Number и Destination Port Number. Таким образом, формируется обычный IP-пакет, направленный как бы сам на себя. В случае атаки в заголовке такого IP-пакета в качестве адресов назначения и отправления указываются IP-адреса объекта воздействия, а в качестве порта назначения и отправления - любой открытый порт на атакуемой системе.
Однако, как оказалось (первые сведения о данной уязвимости датированы 1997 годом), существуют операционные системы, для которых подобный запрос является нестандартной ситуацией, вызывающей некорректную обработку, - ответ системы самой себе, в результате чего происходит зацикливание.
Наши эксперименты показали, что такой уязвимости подвержены все версии ОС Windows NT/95. Причем Service Pack 4.0 в этом случае почти не помогает. После приема одного Land-запроса на некоторое время (45 секунд при установленном Service Pack 3) загрузка системы увеличивается до 100% и доступ в систему становится невозможным (Windows 95 обычно показывает синий экран). Мы недаром выделили слово "одного". Ведь ничто не мешает атакующему организовать шторм или мини-шторм Land-запросов, а это сделает работу Windows-системы практически невозможной. Например, при тестировании направленным штормом Land-запросов Windows NT 4.0 на платформе Pentium 200 с установленным Service Pack 4 (где серьезно улучшена реакция NT на атаку Land) порог "нормальной" работы был в случае шторма не более 3 500 зап./с. При шторме Land-запросов свыше указанного порогового значения система "замирала" и доступ к ней становился невозможным.
Данная уязвимость основана на ошибках разработчиков операционной системы в модуле, отвечающем за сборку фрагментироваиных IP-пакетов. При такой сборке, как и следовало ожидать, формируется цикл по всем полученным фрагментам, из них в отдельный буфер копируется информативная часть, а затем данный буфер передается на уровень IP для дальнейшей обработки.
Разработчики ввели проверку на слишком большой объем копируемой информации (чтобы ядро не переносило такой объем данных), но не предусмотрели проверку на копирование слишком маленького фрагмента (фрагмента отрицательной длины). Рассмотрим, к чему приводит отсутствие такой проверки.
Когда фрагмент сообщения помещается в очередь сборки, выполняется поиск его положения в очереди:
end = (offset + total_len) - ihl;
Соответственно, если (фрагменты перекрываются, то нужно выровнять их таким образом, чтобы устранить наложение:
if (prev!=NULL && offset<prev->end) { i=prev->end-offset; offset += i; ptr += i, }
Таким образом, если смещение текущего фрагмента попало в предыдущий фрагмент, необходимо произвести корректное выравнивание. Данный фрагмент кода работает правильно всегда, кроме одного случая: если длина текущего пакета слишком мала, чтобы заполнить собой перекрытие, то offset окажется больше, чем end (именно эти переменные определяют длину фрагмента, копируемого в отдельный буфер, где и осуществляется сборка).
Тогда при заполнении структуры, описывающей копируемый блок данных, возникает следующая ситуация:
fp->offset = offset fp->end = end fp->len = end-offset (Отрицательная)
Заключенная в цикл инструкция по сборке фрагментов выглядит следующим образом:
memcpy((ptr+fp->offset), fp->ptr, fp->len),где: ptr+fp->offset - смещение фрагмента в буфере;
Попытка скопировать блок данных отрицательной длины (что равносильно копированию очень большого блока данных) приводит к затиранию достаточно большого участка памяти и к "зависанию" или перезагрузке компьютера.
Таким образом, для реализации данной атаки пакеты формируются по следующему правилу (рассмотрим атаку из двух пакетов):
Последовательная передача таких пакетов приводит к возникновению рассмотренной выше ситуации, когда копирование блока отрицательной длины вызывает выход компьютера из строя.
Для NT существуют две похожие программы, которые реализуют этот механизм, связанный с наложением IP-фрагментов: teardrop и newtear (с несущественными отличиями в константах). Пакеты посылаются с любого адреса на любой из портов, независимо от того, открыт он или нет.
Есть и другая вариация на тему этой атаки - bonk. В данном случае после сборки фрагментов в пакете остаются "дырки" - пустые, не заполненные данными места, что также может привести к сбою ядра операционной системы и "зависанию" компьютера.
Обе эти уязвимости присутствовали во всех версиях ОС Windows 95/NT до Service Pack 4 включительно и в ранних версиях ОС Linux (например, Linux 2.0.0). На сегодняшний день ошибки, связанные с некорректной сборкой фрагментов, скорее всего, исправлены в большинстве сетевых ОС.
Как известно, протокол IP поддерживает возможность broadcast-адресации (широковещательная) пакетов. Например, адрес 104.255.255.255 является широковещательным для сети 104.0.0.0. Особенность широковещательной передачи состоит в том, что такой IP-пакет получат все хосты внутри данной подсети (на канальном уровне в заголовке данного IP-пакета указывается адрес FF-FF-FF-FF-FF-FF, чем, очевидно, и достигается "широковещательность" сообщения).
Одной из функций протокола IСМР является передача по сети тестовых запросов Echo Request/Reply. Атака, получившая название Smurf, состоит в передаче в сеть одиночного широковещательного запроса IСМР Echo Request от имени (с IP-адреса) "жертвы". В результате все операционные системы (а их теоретически может быть очень много), получив этот Echo-запрос, перешлют на IP-адрес "жертвы" ответ, что может привести к перегрузке ОС компьютера этими ответами. На практике, однако, оказывается, что, во-первых, большинство роутеров не передает в сеть полученный широковещательный IP-запрос, а, во-вторых, ОС, отличные от UNIX-совместимых (например, MS Windows), не воспринимают широковещательный IP-трафик и, соответственно, не отвечают па подобные запросы.
Таким образом, можно сделать вывод, что атака Smurf является практически (но не принципиально!) неосуществимой.
Такая атака, называемая Out of Band (00В), на сегодняшний день абсолютно устарела: она заключалась в передаче на атакуемую Windows-систему пакета TCP/IP с флагом 00В на открытый (обычно 139-й) TCP-порт и эффективно "подвешивала" Windows NT/95 до выхода Service Pack 3.
[39933]
|
|