Сетевая безопасность: Техника обхода списков доступа ACL

Как Вы уже убедились в предыдущих заметках из серии «Сетевая безопасность», списки доступа ACL не могут гарантировать полную защиту от несанкционированного доступа к сети. Это достигается лишь комплексом различных мер.

В этой заметке рассмотрим одну из особенностей работы списков доступа с фрагментированными IP пакетами.

По умолчанию, протокол IP разрешает фрагментацию пакетов, что открывает достаточно большое число давно известных уязвимостей.

Откуда берутся фрагментированные пакеты?

TCP/IP Encapsulation

Когда пакеты протокола сетевого уровня L3 (IP) модели OSI слишком большие, чтобы передать их одним фреймом на уровне L2 (Data Link), они разбиваются на более мелкие фрагменты.

Например, максимальный размер IP пакета составляет 65535 байт, в то время как для Ethernet фрейма максимально допустимый размер передаваемых данных  MTU составляет всего лишь 1500 байт.

Для того чтобы поместить IP пакеты размера, большего, чем MTU L2, приходится  их разбивать на сетевом уровне на более мелкие фрагменты. Это и называется IP фрагментацией.

Специально сформированные фрагментированные IP пакеты могут приводить к различным видам отказов в обслуживании DoS, а так же позволяют обходить правила фильтрации в списках доступа ACL и политики безопасности на межсетевых экранах Firewall и системах обнаружения атак IDS.

Конечно, это возможно, только если не принять определенных мер защиты от фрагментированных пакетов.

Соображения по поводу безопасности и фильтрации таких фрагментированных пакетов можно почитать в RFC 1858: https://tools.ietf.org/html/rfc1858

Как это работает?

Рассмотрим пример с обходом обычного списка доступа ACL при помощи техники перекрывающихся фрагментированных IP пакетов (IP fragmentation overlapping attack).

Для того чтобы принимающая сторона смогла правильно собрать фрагментированный исходный пакет, в заголовке IP пакет используются поля IP/Fragment ID, Fragment Offset и биты поля «Флаги» DF (Don’t Fragment), MF (More Fragment).

Поле идентификатора фрагмента IP/Fragment ID позволяет однозначно определить, какому пакету принадлежит данный фрагмент.

Поле смещения Fragment Offset указывает положение этого фрагмента в IP пакете при его сборке принимающей стороной. Если значение Fragment Offset = 0, то это либо не фрагментированный пакет (флаг MF тоже равен 0), либо начальный фрагмент (флаг MF = 1).

Флаг DF указывает, можно ли фрагментировать IP пакет (0 – можно, 1- нет).

Флаг MF указывает, есть ли еще фрагменты для IP пакета (0 – последний фрагмент, 1- есть еще).

IP Header

С точки зрения передачи потока данных, IP пакеты уровня L3 инкапсулируются в поле данных фреймов L2 и передаются далее как поток битов на физическом уровне L1.

Предположим, что список доступа ACL разрешает соединение с нашим web сервером по протоколу HTTPS (TCP/443) и запрещает доступ по SSH (TCP/22).

Если не принять определенных мер, то атакующий может попытаться подключиться по протоколу SSH, используя перекрывающиеся фрагментированные IP пакеты.

Особенность работы расширенных списков доступа ACL с фрагментированными пакетами такова, что в первом полученном фрагменте (когда поле Fragment Offset = 0) есть вся необходимая для анализа L3/L4 информация — IP адреса источника и получателя, протоколы TCP/UDP и их порты.

Поэтому, решение пропустить или сбросить этот пакет с помощью ACL будет принято корректно.

В последующих же фрагментах IP пакета ACL сможет проверить только IP адреса источника и получателя, так как в них нет L4 информации, номеров портов и протоколов. Такие фрагменты пропускаются, если соответствуют лишь IP адреса.

Таким образом, можно сформировать второй фрагмент так, чтобы при его сборке принимающей стороной был перезаписан номер порта в первом начальном фрагменте на нужный нам.

Делается это с помощью изменения смещения в поле Fragment Offset и указания номера нужного нам порта в поле данных второго фрагмента.

TCP Header

Получается, что данные второго фрагмента не присоединяется к первому, а накладываются на него, перезаписывая информацию о порте в начальном фрагменте.

Так можно пройти сквозь список доступа, использую разрешенный открытый порт в нем.

Например, список доступа разрешает только TCP/443. Полную проверку в ACL будет проходить только начальный фрагмент. Остальные же фрагменты этого пакета будут проверяться только на соответствие IP источника и получателя.

Во втором фрагменте можно указать порт получателя TCP/22 и при сборке фрагментированного пакета сервер перезапишет начальный заголовок, где указан порт TCP/443 на TCP/22. Надо лишь правильно подобрать смещение для второго сегмента, которое измеряется 8-байтными блоками.

Таким образом, можно пройти сквозь список доступа ACL по разрешенному протоколу и порту, но на самом деле открыть соединение с сервером по запрещенному.

Почему так было сделано? Традиционно, чтобы не снижать производительность маршрутизаторов при обработке ACL.

Какие есть способы защиты от таких атак, кроме совсем очевидных? Делитесь своими соображениями или задавайте вопросы в комментариях к этой статье.

Сетевая безопасность: Техника обхода списков доступа ACL: 5 комментариев

  1. Наверно правильно будет повесить список доступа на исходящий трафик.

    • Да, можно усилить защиту с помощью ACL на исходящий трафик.

      Также можно грубо фильтровать фрагменты с помощью ACL, например:

      ip access-list extended NO_IP_FRAGMENTS

      deny ip any any fragments

      permit ip any any

      А еще лучше предотвратить фрагментацию в принципе. Вот отличный документ, где все это расписано:

      www.cisco.com/c/en/us/sup...mtud-ipfrag.html

      • Спасибо! Интересная статья, с фрагментацией не приходилось сталкиваться.

      • CCNP_ROUTEv7_300-101_GIDE.pdf

        =============================

        страницы 547-548 Securing Access to the Infrastructure Using Router ACLs

        R1 (config)# ip access-list extended ACL-INFRASTRUCTURE-IN

        R1 (config-ext-nacl)# remark Deny IP fragments

        R1 (config-ext-nacl)# deny tcp any any fragments

        R1 (config-ext-nacl)# deny udp any any fragments

        R1 (config-ext-nacl)# deny icmp any any fragments

        R1 (config-ext-nacl)# deny ip any any fragments

        И вешать надо как бы на входящий трафик, нет? Infrastructure ACLs are typically applied in the input direction on the interface that connects to the network users or external networks...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.