Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4,6 Firewalls Общая информация и применение пер...doc
Скачиваний:
1
Добавлен:
06.01.2020
Размер:
4.61 Mб
Скачать

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 - Созданный пустой связный список