Интернет под угрозой Докучаев Дмитрий aka Forb Xakep, номер #067, стр. 067-058-2 Помимо SN, в заголовке присутствует интересное поле Window. Именно оно заставило Уотсона протестировать протокол на уязвимость. Эта часть заголовка является своего рода ограничителем посылаемого сегмента. Будучи установленным при соединении, окно регулирует размер принимаемого сегмента. Предположим, что значение поля Window равно 3000. Таким образом, если посылающая сторона отправит сегмент, состоящий из 5000 пакетов (с нумерацией от 1), 2000 последних пакетов не будут рассмотрены. Думаю, смысл тебе понятен. Остальную часть заголовка составляют специальные флаги: SYN, ACK, PSH, URG, RST и FIN. Я предполагаю, что ты знаешь их назначение (если не знаешь - смотри врезку). По ходу статьи я не раз буду говорить про эти служебные флажки. И, наконец, самые важные поля, формирующие сокет: Source Address, Source Port, Destination Address и Destination Port. Практически все эти поля известны, за исключением Source Port. Локальный порт для срыва соединения придется подбирать. Впрочем, обо всем по порядку. RST-атака Если верить RFC, завершить TCP-соединение можно, послав пустой пакет с RST-флагом. Я уж не говорю о том, что поля SA, SP, DA и DP должны принимать реальные значения. Помимо этого, злобному хакеру еще необходимо угадать текущий Sequence Number и только потом послать хитро сформированный пакет в сокет. Все эти фундаментальные основы сводят вероятность срыва соединения к нулю. Суди сам, SN может изменяться в диапазоне от 1 до 4 294 967 295. Подобный номер угадать, конечно, можно. Но только если TCP-соединение простаивает. В случае активной передачи данных подобный брутфорс просто теряет смысл. Но, как говорится, доверяй, но проверяй. Вот Уотсон и проверил :). В результате тестирования он обнаружил, что настоящий обмен немного отличается от стандартизированного. Взломщик вполне может сорвать текущее TCP-соединение, даже если оно является активным. Для этого ему совершенно не обязательно знать точный SN, а достаточно, чтобы номер поддельного пакета входил в ранжир установленного окна. Помнишь, я говорил про поле Window? Таким образом, если юзер посылает пакет с установленным RST-флагом, SN в котором равен числу 34000, а размер окна при этом равен 35000, пакет нормально "переварится" получателем, и произойдет заветный дисконнект :). Теперь давай рассчитаем точное число попыток, которые должен сделать хакер для срыва соединения. Зная, что в заголовке TCP размер поля Window равен 16К, а максимальный SN может быть представлен числом 4 294 967 295, просто поделим SN на Window. В итоге получаем, что хакеру достаточно сделать чуть больше 260 тысяч попыток. С текущей пропускной способностью такой брутфорс вполне реален. По RFC, размер Window вообще может быть 64К. При этом хакеру достаточно отправить всего 65 537 пакетов. Но на самом деле не все так просто. Помнишь, я рассказывал про поле Source Port, а именно про то, что его не всегда легко узнать? Параллельно с перебором SN, хакер должен перебирать и SP. Последний параметр колеблется от 1025 до 49 152. Некоторые операционки, например OpenBSD, выдают значение SP случайным образом. Но обычно локальный порт формируется путем простого инкремента порта от прошлого соединения. Таким образом, взломщику чаще всего достаточно прогнать значения SP в диапазоне 1025 - 5000. |