Коллектив авторов - Защита от хакеров корпоративных сетей
Механика чисел: полуслепая (semiblind) фальсификация пакетов SYNIACK. Хотя брокер подключения действительно информирован относительно времени и главным образом места предполагаемой фальсификации, есть нетривиальные проблемы, сопутствующие кровавым деталям того, что на самом деле было отправлено. Не рассматривая синхронизацию и размещение пакета, можно сказать, что фактический пакет инициализации соединения SYN содержит два блока случайных данных, которые должны быть полностью согласованы с межсетевым экраном. Иначе нельзя будет получить ответ. К этим данным относятся номер порта отправителя и начальный порядковый номер.
Сначала несколько слов о номере порта отправителя. Это число из диапазона от 0 до 65 535, которое используется клиентом для выделения нужного соединения среди любого числа возможных соединений с одним и тем же сервисом на одном и том же хосте. Стандартные межсетевые экраны просто передают этот номер порта дальше. Это означает, что Алиса может заранее выбрать номер порта. Она знает, что когда он испарится при передаче, то это будет означать, что номер порта был передан через межсетевой экран. Реализация трансляции сетевых адресов в межсетевых экранах может быть довольно изощренной. При трансляции межсетевой экран может поставить в соответствие одному IP-адресу целые сети, используя локальный номер порта для того, чтобы различать одно соединение от других. Поскольку теоретически эти соединения выбирают номер порта случайным образом, то обычно не имеет значения, если извне виден другой порт до тех пор, пока во время трансляции сетевых адресов внешние величины не будут преобразованы во внутреннее представление.
Применительно к разбираемому случаю это означает, что Алисе необязательно знать номер порта, по которому, как предполагается, будет отослан пакет SYNIACK. В обычном режиме номером порта отправителя будет считаться тот порт, который она установила как свой порт получателя, а портом получателя – тот порт, который она установила как свой порт отправителя. Выбранные номера портов теперь должны быть отосланы по некоторому другому порту отправителя, о котором знает только межсетевой экран и маршрутизатор Интернета. Что Алиса в этом случае может сделать?
К счастью, многие реализации трансляции сетевых адресов будут пытаться поставить в соответствие локальному порту числа. Может быть, Алисе не придется вообще что-либо делать до тех пор, пока она не столкнется с уже используемым портом. Те, кто изменяют номер порта, почти всегда увеличивают его при каждом подключении. Это позволит Алисе использовать тривиальный способ для косвенного сообщения брокеру ее соединения номера порта, который будет использовать ее межсетевой экран. Прямо перед посылкой своего обреченного пакета SYN Алиса устанавливает соединение с брокером. Тем самым она информирует брокера о двух вещах. Во-первых, Алиса неявно предоставляет глобальный маршрутизируемый адрес своего межсетевого экрана, снимая с себя обязанность найти его самостоятельно. Во-вторых, Алиса предоставляет брокеру уменьшенный на единицу номер порта отправителя, записанный в пакете SYN, который ее межсетевой экран оттранслирует от ее имени. Ввиду предположения назначения последовательных значений номеров порта при последовательных соединениях и отсутствия попыток открытия новых соединений еще кем-либо за короткий промежуток времени между установлением связи брокером и посылкой пакета SYN брокер сможет сравнительно легко определить номер порта.
Конечно, никакое предположение не гарантирует правильного результата, но проверить его можно. Путем быстрого открытия многочисленных соединений к брокеру и контроля номеров порта, которые были выбраны при трансляции сетевого адреса, брокер сможет определить, являются ли выбранные порты отправителя полностью случайными, последовательными или каким-то образом предсказуемыми. Если номера портов полностью случайны, то хм это не является невозможным, но это откровенно плохое решение. Номера портов отправителя, как уже говорилось, расположены в диапазоне от 0 до 65 535. Под них отводится 16 бит энтропии. Без подсказки номера порта, который следует выбрать, можно только сохранять посланные пакеты SYMIACK со случайными номерами портов, пока не будет найден тот номер порта, по которому передавались данные. Но для этого для каждого удачно угаданного номера порта потребуется послать в среднем около 320 000 пакетов (вероятно, получить ответ удастся после перебора примерно половины типового набора). В полном объеме это неосуществимо. Но если будет послано достаточное число обреченных SYN-пакетов, то они займут различные номера портов отправителя по одному и тому же IP-адресу, полученному в процессе трансляции сетевых адресов, и каждый из них будет считаться успешным соответствием в процессе согласования посланных пакетов SYMIACK.
Сколько для этого нужно пакетов? Удивительно, но всего лишь несколько. Ищется совпадение среди 65 000 возможностей. Согласно теории, прежде чем будет найдена подходящая пара с шансами на успех не менее 50 %, следует перебрать число вариантов, приблизительно равных квадратному корню из всех возможных вариантов. (Это известно как парадокс дня рождения (Birthday Paradox), который назван так потому, что у собранных в комнате двадцати человек есть более пятидесятипроцентные шансы встретить в этой же комнате двух человек с одним и тем же днем рождения. Это несколько противоречит ожиданиям. Для каждого из находящихся в комнате человека шанс родиться в один из дней года оценивается как 365:1, но вполне логично, что чем больше в комнате людей, тем больше шансы на совпадение их дней рождения с заданной датой.) В случае с Алисой, посылающей 256 обреченных пакетов SYN, и брокером, фальсифицирующим поступившие от Боба 256 пакетов SYNIACK, шанс получения Алисой правильного пакета SYNIACK от Боба превышает 50 % (однако при этом Боб пострадает от шквала 255 TCP пакетов сброса соединения RST).
Несколько замечаний по поводу того, что в то время как число пакетов является большим, размер этих пакетов сравнительно невелик. Пустой пакет (пакет, не несущий содержательной информации) занимает в байтах немногим больше места, чем (в терминах libnet) LIBNET_ETH_H(Ethernet) + LIBNET_IP_H(IP) + LIBNET_TCP_H(TCP). Это всего лишь 14 + 20 + 20 байтов, или 54 байта. 256 х 54 равно почти 14 K6, что, конечно, является огромным числом по стандартам установления связи, но это намного меньше среднего графического файла читателя. Именно это облегчает иначе невозможную связь. В некоторых сетях на уровне канала передачи данных, как, например, Ethernet, блоки информации канального уровня могут дополняться до 64 байт, но это размер все еще сравнительно небольшой.
Одна очень важная проблема заключается в необходимости знать, какие из многочисленных попыток установления соединения закончились успешно. Помните, трансляция сетевых адресов межсетевыми экранами осуществляется в обратном порядке: то, что видит внешний мир, преобразуется в то, что должна видеть частная сеть – в данном случае ее собственный частный IP-адрес и ее собственный выбранный номер локального порта. Это означает, что Алиса не может, только глядя на номер локального порта, узнать, какой пакет через него был получен. Алиса также не может спросить об этом у брокера. Брокер не знает этого, он только посылает пару сотен пакетов. Откуда он может узнать о пристрастиях и особенностях работы межсетевого экрана Алисы? Ответ должен был содержаться где-нибудь в пакете. Но где? Автор полагает, что, скорее всего, в поле IPID. Редко используемое поле используется для отличия одного пакета IP от другого независимо от протоколов более высокого уровня. Это поле может принимать одно из значений в пределах от 0 до 65 535. Будучи редко использованным, поле, вероятно, большинством межсетевых экранов не изменяется и, в отличие от номера локального порта, не транслируется. Так, если полю IPID будет присвоено значение номера порта адресата в пакете SYMIACK, то откуда бы пакет SYMIACK ни поступил, он сохраняет отметку, которая позволит ему передавать внутри заголовка IP нужные данные.
Но почему так много внимания следует обращать на номера портов? Потому что пока не будет достигнута симметрия номеров портов, нельзя будет установить соединение. При обычной установке TCP-соединения инициирующий соединение хост использует некоторый случайный номер порта отправителя для подключения к хорошо известному порту адресата, а адресат меняет эти номера портов. Таким образом, ответные пакеты поступают от хорошо известного номера порта к случайному порту.
После установки соединения обязательно нужно достичь зеркальной симметрии номеров портов: номер порта адресата должен стать номером порта отправителя, и наоборот. Всегда известен номер порта, по которому данные отправляются, но не обязательно известно, кто их прослушивает. В конечном счете данные установления связи возвращаются с фальсифицированного сервера обратно, но при этом редко есть возможность установить, какой из возможных портов был прослушан. В данном случае возможность выбора даже не рассматривается. Счастье, что вообще есть связь. Более проблематичной является борьба за получение успешного пакета SYMIACK по заданному номеру порта отправителя. Очень важно, чтобы первоначально выбранный порт назначения соответствовал порту отправителя на другом конце соединения и был бы воспринят его межсетевым экраном. Если на той стороне соединения столько же проблем при получении доступа к определенному порту отправителя на межсетевом экране, что и на этой, то число требуемых попыток для установления соединения быстро приравняет к нулю любой шанс просачивания сессии TCP через межсетевой экран. Конечно, все возможно, только шансы того, что звезды и порты выровняются в зеркальную структуру, становятся чрезвычайно низкими. Это немного похоже на наши первоначальные условия – ограничения в управлении установления связи вплоть до случая подключения более ограниченного в своих возможностях сайта к более либеральному сайту.