
- •Введение
- •1 Анализ основных типов мэ и способов их применения
- •1.1 Типы межсетевых экранов
- •1.1.1 Фильтры пакетов
- •1.1.2 Фильтры пакетов с контекстной проверкой
- •1.1.3 Сервер уровня соединения
- •1.1.4 Серверы прикладного уровня
- •1.2 Способы применения межсетевых экранов
- •1.Стандартные схемы защиты отдельной локальной сети.
- •1.2.1 Стандартные схемы защиты отдельной локальной сети
- •1.2.2 Применение в составе средств коллективной защиты
- •1.3 Персональные межсетевые экраны
- •1.4 Обобщенная концепция применения межсетевых экранов
- •1.5 Обзор персональных межсетевых экранов, доступных на рынке
- •2 Классификация уязвимостей сетевых экранов, создающих предпосылки их компрометации
- •2.1 Уязвимости сетевых протоколов
- •2.1.1 Снифферы пакетов
- •2.1.2 Уязвимость маршрутизации от источника
- •2.1.4 Атаки типа “отказ в обслуживании”
- •2.1.5 Атаки syn flood
- •2.1.6 Атака Smurf
- •2.1.7 Атака Tribe Flood Network
- •2.1.8 Атака WinFreeze.
- •2.1.9 Атака Loki.
- •2.1.10 Arp атаки
- •2.1.11 Фрагментация
- •2.2 Уязвимости операционных систем
- •2.2.1 Получение прав другого пользователя
- •2.2.2 Нелегальное подключение к системе
- •2.2.3 Человеческий фактор
- •2.2.4 Совместимость с другими операционными системами
- •2.2.5 Парольные атаки
- •2.2.6 Вирусы и приложения типа "троянский конь"
- •2.3 Уязвимости программной реализации сетевых экранов
- •2.3.1 Атаки через туннели в межсетевом экране
- •2.3.2 Атаки вследствие неправильной конфигурации межсетевого экрана
- •2.3.3 Атаки осуществляемые в обход межсетевого экрана
- •2.3.4 Атаки осуществляемые из доверенных узлов и сетей
- •2.3.5 Атаки путем подмены адреса источника
- •2.3.6 Атаки на сам межсетевой экран
- •2.3.7 Атаки на подсистему аутентификации межсетевого экрана
- •2.4 Выводы
- •3 Исследование архитектуры и функционирования мэ на примере предложенного по
- •3.1 Исследование механизмов взаимодействия средств сетевой безопасности с операционной системой
- •3.1.1 Подходы к организации фильтрования трафика в ос Windows
- •3.3 Выводы
- •4 Разработка алгоритмов для проверки уязвимостей средств сетевой безопасности
- •4.1 Обобщённый алгоритм воздействия на средства сетевой безопасности
- •4.3.2.1 Инвентаризация Windows nt/2000/xp
- •4.3.2.3 Инвентаризация unix
- •4.3.3 Проникновение в сеть и захват контроля над хостом
- •4.3.3.1 Взлом хоста с ос Windows
- •4.3.3.2 Взлом хоста с ос Unix
- •4.4 Разработка алгоритмов воздействия на средства сетевой защиты изнутри защищенной сети
- •4.4.1 «Инъекции» кода
- •4.4.2 Использование виртуальной машины
- •4.4.3 Использование уязвимостей ActiveX
- •4.5 Разработка алгоритмов, основанных на уязвимостях механизма взаимодействия средств сетевой безопасности с операционной системой
- •4.6 Разработка алгоритмов установления соединения с компьютером, защищенным межсетевым экраном, персональным сетевым экраном и несколькими сетевыми экранами
- •4.6.1 Http-тунелирование
- •4.6.2 Icmp-тунелирование
- •4.6.4 Pcap-тунелирование
- •4.7 Выводы
4.5 Разработка алгоритмов, основанных на уязвимостях механизма взаимодействия средств сетевой безопасности с операционной системой
Работа по исследованию алгоритмов установления связи в обход файрвола делится на две части: исследование алгоритмов посылки пакетов и исследование алгоритмов приема пакетов.
Для приема пакетов необходимо использование алгоритмов, подобных алгоритмам сниффера с добавлением возможности фильтрации трафика. Один из способов заключается в перехвате функции менеджера пакетов, переданных сетевой картой. Эта функция занимается передачей пакетов всем, привязанным к сетевой карте, протоколам. Перехват функции возможен двумя методами – модификацией указателя на функцию и изменением точки входа функции. Фактически необходимо перехватывать две функции: однопакетную EthFilterDprIndicateReceive и многопакетную ethFilterDprIndicateReceivePacket . Первая из них экспортируется драйвером NDIS.sys, вторая – нет.
Для передачи пакетов необходимо вызывать функции NDIS и получать ответ об отправке пакета. Существует два метода решения проблем: без регистрации собственного протокола и с регистрацией собственного протокола. Проблемы первого метода – в получении указателей на функции отправления и получении уведомлений об отправке пакетов. Проблема второго метода – в «невидимой» для файрвола регистрации протокола. Самый популярный метод перехвата регистрации протокола – патч экспорта ndis.sys. Они перехватывают функции NdisRegisterProtocol(), NdisDeregisterProtocol(), NdisOpenAdapter(), NdisCloseAdapter(). Также все четыре функции могут быть перехвачены путем правки кода внутри образа NDIS.sys. После регистрации протокола файрвол может пройти список всех зарегистрированных протоколов. Голова списка протоколов находится в ndisProtocolList. Список этот состоит из структур NDIS_PROTOCOL_BLOCK, в каждой из которых существует голова односвязного списка структур NDIS_OPEN_BLOCK, который описывает привязку протокола к сетевой карте. Файрвол изменяет содержимое полей NDIS_OPEN_BLOCK.
Рассмотрим, какие функции NDIS вызываются во время загрузки сетевых драйверов. На первом этапе инициализируется драйвер сетевой карты вызовом функции NdisMInitializeWrapper(). Далее следует вызов функции NdisMRegisterMiniport(), регистрирующий точки входа MiniportXxx минипорта для NDIS. После этого вызывается точка входа в драйвере сетевой карты MiniportInitialize(), которая готовит реальную или виртуальную сетевую карту для выполнения сетевых операций ввода/вывода, запрашивает все аппаратные ресурсы, необходимые сетевой карте, и размещает ресурсы, необходимые драйверу для выполнения сетевых операций ввода/вывода.
Далее происходит инициализация драйверов протоколов TCP/IP, NETBEUI, IPX/SPX и т.д. Для каждого из них вызывается функция NdisRegisterProtocol(), которая регистрирует точки входа ProtocolXxx драйвера и имя протокола для NDIS.
После инициализации драйвера протокола и драйвера сетевой карты вызывается функция NdisOpenAdapter(), которая устанавливает связь между вызвавшим эту функцию протоколом и определенным нижележащим драйвером сетевой карты или промежуточным драйвером. А затем уже начинается обмен пакетами между драйвером протокола и драйвером сетевой карты.
Посылка пакетов в обход файрвола осуществляется с помощью регистрации собственного протокола. Стало быть, для посылки пакетов необходимо использование следующих функций, экспортируемых NDIS’ом: NdisRegisterProtocol(), NdisDeregisterProtocol(), NdisOpenAdapter(), NdisCloseAdapter(). Однако, эти функции могут быть перехвачены файрволом, а значит точки их входа будут изменены. Следовательно, во избежание перехвата файрволом этих функций, их можно считывать с диска.
Для противоборства правки кода внутри образа необходимо прочитать NDIS.SYS и спроецировать его на свой участок памяти либо построением поддеревьев кода NDIS’а.
Построение поддерева начинается с выявления точек входа в данное дерево исполнения. Далее, в процессе анализа дерева, необходимо отмечать скопированные участки кода, например, битовым полем. Разветвления – условные переходы и подфункции. Листья (конец ветвления) – выход из подфункции, непредсказуемый переход, переход внутрь уже построенного дерева. В скопированных участках кода корректируются относительные переходы и настраиваются абсолютные адреса.
Далее регистрируем свой протокол с помощью функции NdisRegisterProtocol().
После регистрации протокола файрвол может пройти список всех зарегистрированных протоколов. Голова списка протоколов находится в ndisProtocolList. Список этот состоит из структур NDIS_PROTOCOL_BLOCK, в каждой из которых существует голова односвязного списка структур NDIS_OPEN_BLOCK, который описывает привязку протокола к сетевой карте. Файрвол изменяет содержимое полей NDIS_OPEN_BLOCK.
Для противодействия нахождения файрволом нашего протокола в списке протоколов необходимо до регистрации протокола исправить указатель на глобальную переменную NdisProtocolList в клонируемом коде на подложную.
Обычно ndisProtocolList указывает на голову связного списка структур NdisProtocolBlock (рис 4.29).
Р
ис.
4.29 - Связный список структур NdisProtocolBlock
Очевидно, для нашей работы в этом списке нет необходимости, поэтому мы формируем пустой связный список, то есть переменная ndisProtocolList является нулевой (Рис. 4.30).
Р
ис.
4.30 - Созданный пустой связный список