Описание моей дипломной программы

Дипломный руководитель - Садовой Николай Николаевич

Введение

Пожалуй у любого студента-программиста хотя бы раз возникали вопросы: "Что такое есть хакеры? Как они осуществляют свои замыслы? Как конкретно они всё это делают - все эти взломы, кражи, нсд, атаки и прочие виды сетевых правонарушений?"

Студент ДГТУ специальности 22.04.00, проучившись 5 лет, всё-таки не получает в конце своей учёбы чёткого и ясного ответа на эти вопросы. Студент получает некое довольно абстрактное представление обо всём этом. Конечно, тут нет ничего удивительного - это программистское направление одно из самых новых, здесь и литературы мало (попробуйте, к примеру, найти в Интернете хоть какой-нибудь стоящий учебник по хакерству в электронном виде), и к тому же, более глубокое изучение хакерства сдерживают высокие цены на Интернет в России.

На вышеназванные вопросы в ДГТУ на специальности 22.04.00 пытается ответить целый ряд дисциплин. Самые важные из них в данном контексте - это "Корпоративные сети", где студенты получают общее представление о локальных сетях и смежных вопросах, "Принципы построения и услуги Интернет" (которая является, на мой взгляд, ключевой дисциплиной 5 курса), где студенты осваивают практическое сетевое программирование на базе библиотеки сокетов, и, наконец, "Защита данных и программного обеспечения" [1], где студенты получают общее теоретическое представление о хакерах, об атаках, и т.п.

Но чего же не хватает в этих перечисленных ДГТУшных дисциплинах, какого учебного материала там нет (с точки зрения изучения хакерства)?

Я могу сказать, что в ДГТУ на специальности 22.04.00 начисто отсутствует практический материал по хакерству. Нет ведь ни по одной дисциплине ни одной лабораторной работы на тему хакерства. Да и теоретический материал по сетевым технологиям подаётся студентам в контексте обычного сетевого пользователя, без достаточной глубины (как, скажем, в [15] или в [18]), необходимой для понимания техники хакерства.

Вот эти пробелы в учебных дисциплинах ДГТУ я и попытался (хотя бы в какой-то посильной для себя мере) восполнить в своей дипломной работе. Моя дипломная работа состоит из теоретического исследования существующих программных хакерских инструментов (под ОС Windows) плюс программа на эту тему. Основной смысл и основная ценность моей дипломной работы заключается в её исследовательской сути. Я искал, изучал и исследовал разные существующие программные хакерские инструменты (под ОС Windows), их достоинства, недостатки и возможности. Всё это мне пришлось делать потому, что мы, студенты, это не изучали. Разработанная в моей дипломной работе программа довольно проста, но это кажущаяся простота, потому что сначала нужно было как-то вообще в принципе подойти к созданию такого рода программы. Я, начиная разрабатывать эту программу (к дипломной работе), не имел совершенно никакого понятия, как именно я её сделаю, чем напугал своего дипломного руководителя. Помню, как он (Садовой Н.Н.) мне говорил:"А как вы это всё будете делать? А если вы так и не найдёте никакого способа сделать задуманное, что вы тогда будете делать?" Так что это был в определённой степени риск. Понятно, что мой дипломный руководитель (Садовой Н.Н.) был для меня просто формальным, и не только не мог мне чем-то помочь, а наоборот, это я ему помог, разработав дипломную работу по новой тематике - Садовой Н.Н. пообещал разработать для студентов лабораторные работы на базе моей дипломной работы. Конечно, я его, Садового, даже и ни в чём не упрекаю, не может же он знать всё, и к тому же я мог бы и изначально взять какого-нибудь другого дипломного руководителя, более сведущего в этой конкретной тематике. Просто я специально выбрал Садового потому, что он, хоть мне и не помогал, но, что самое главное, и не мешал сильно.

Когда я начинал разрабатывать дипломную программу, то первой была мысль о создании принципиальной модели межсетевого экрана (МСЭ) (другое название - брандмауэр или файервол), хотя бы даже наиболее простой.

Но по мере изучения вопроса я отказался от этой идеи и принял решение о создании так называемой системы обнаружения атак (СОА).

В чем разница между  МСЭ и СОА с точки зрения программиста? Я, конечно, точно не знаю, но имею некие предположения. На мой взгляд, МСЭ - это фильтр IP-пакетов (другие протоколы типа ATM и прочие я и не рассматриваю в своей дипломной работе). Операционная система Windows имеет в своём составе некий модуль, в котором программно реализован стек TCP/IP, т.е., проще говоря, все электрические сигналы, принимаемые сетевой картой, пропускаются затем через этот программный TCP/IP модуль, в котором они распознаются, проходя через все четыре уровня модели стека TCP/IP снизу вверх (это знает каждый наш студент). Так вот задача создания МСЭ состоит в том, чтобы встроить (внедрить) свою программную "прослойку" в этот существующий модуль TCP/IP где-то между этими четырьмя концептуальными уровнями. Эта "прослойка" и должна будет заниматься фильтрацией сетевых пакетов, проходящих сквозь Windows-модуль TCP/IP, и, соответственно, сквозь эту "прослойку".

Так вот я пока ещё точно не знаю, как это можно сделать, также как не представляю устройство Windows TCP/IP-модуля. Думаю, что такая "прослойка" может быть сделана в виде специального dll-файла и ещё я думаю, что информацию об этом следует искать в [4] (почитайте там 14 главу).

А вот СОА выглядит значительно проще. СОА просматривает входящие IP-пакеты и по своим сигнатурам проверяет поля IP-пакетов (поля имеют предопределённый формат). Атакой считается последовательность "плохих" IP-пакетов.

Разница между СОА и МСЭ в том, что в случае СОА нет нужды именно встраивать (внедрять) свою "прослойку" в имеющийся Windows TCP/IP-модуль, а достаточно просто установить свой программный модуль параллельно с имеющимся Windows TCP/IP-модулем, потому что МСЭ обязана пропускать "хорошие" сетевые пакеты "наверх" по TCP/IP стеку к работающему приложению, а вот СОА в любом случае замыкает входящие IP-пакеты на себя, как "хорошие", так и "плохие", не предполагая, что на компьютере работает ещё и какое-то сетевое приложение, к которому и поступают эти пакеты.

Вот почему СОА реализовать проще, чем МСЭ. СОА ставится просто поверх драйвера сетевой карты, а МСЭ - где-то выше в многоэтажной цепочке компонент Windows TCP/IP-модуля, что сложнее для реализации.

Самыми известными СОА на сегодняшний день являются программы Snort [13] и, что похуже, Shadow [17]. Програма Snort - бесплатна и имеет открытые исходные коды. Кроме того, она имеет специальный высокоуровневый язык, на котором пишутся правила фильтрации пакетов и затем они (правила) компилируются в двоичный вид! Информацию о синатурах возможных атак можно помотреть на том же сайте [14]. 

Довольно сложно, не правда ли? И потом ни Snort, ни Shadow не имеют в комплекте отладочный генератор сетевых атак. Ну, хорошо, скачаете вы себе тот же Snort. A как вы его испытаете или настроите? Даже если у вас есть неограниченный доступ в Интернет, то что, вы будете сидеть и ждать с включённым Интернетом, когда же вас наконец кто-нибудь атакует :) ?

Обзор инструментария низкоуровневого сетевого программирования

Как известно, существует великое множество всякого рода хакерских программ. Пожалуй, любого студента-программиста рано или поздно начинает интересовать вопрос об их принципиальном устройстве. Ведь только понимание общих принципов устройства даёт возможность ориентироваться в подобных программах.

Так вот большой пласт хакерских и просто админских программ основан на работе с сетевыми пакетами, как правило, это IP-пакеты. К таким программам относятся всевозможные анализаторы протоколов, сетевые мониторы, хакерские программы, генерирующие зловредные пакеты, и, также, системы обнаружения атак.

Это означает, что нужно искать некий пакет функций для подобного низкоуровневого сетевого программирования (в моём случае под ОС Windows, как наиболее распространённую и доступную для любого студента).

Поисками такого пакета функций я и занимался на первом этапе выполнения своего дипломного проекта, причём совершенно не зная, а существует ли такой пакет вообще. Просто я думал, что раз такие (хакерские) программы уже существуют, должны же они быть на чём-то основаны?

В результате поисков мне удалось найти два надёжных программных инструмента для низкоуровневого сетевого программирования и ещё один гипотетический вариант.

Гипотетический вариант описан в [3] (9 глава). Это прямое программирование NE2000-совместимых сетевых карт на Ассемблере. Гипотетическим этот вариант я называю потому, что во-первых, не все же сетевые карты совместимы со стандартом NE2000, а во-вторых, всё это здорово похоже на большой геморррой. К тому же книжка эта уже на сайте издательства не продаётся (хотя я её видел в двух магазинах), да и покупать её я не вижу смысла, по-моему, вполне достаточно скачать исходники к книжке и в них разобраться, там хорошие комментарии.

Первый надёжный вариант из вышеуказанных описан в [2]. Кстати, очень приличная вещь. Это, по сути дела, готовая библиотека для низкоуровневого сетевого программирования под ОС Windows. Эта библиотека (называется "winpcap" - "windows packet capture") разработана неким итальянским студентом-программистом из г.Турин, она бесплатна и имеет открытые исходники (наш человек!) и представляет из себя спортированную на ОС Windows аналогичную UNIX-библиотеку libcap. Только winpcap даже ещё и расширена по сравнению с исходной libcap - она умеет ещё и формировать пакеты для отправки, а не только расшифровывать входящие пакеты, как libcap. winpcap имеет те же функции, что и libcap, с тем же синтаксисом, плюс набор своих функций, которых нет в libcap. Пакет winpcap имеет удобный инсталлятор и содержит 2 библиотеки - packet.dll и winpcap.dll. Я думаю, что весь этот пакет - winpcap - это просто драйвер к сетевой карте (конкретно это packet.dll), разработанный при помощи Platform DDK (Device Driver Kit), плюс навешенный сверху на packet.dll переходник (winpcap.dll), обеспечивающий libcap-подобный интерфейс для управления драйвером сетевой карты packet.dll.

Библиотека winpcap мне сразу как-то понравилась и я захотел её применить в своей дипломной работе. Но! Всё не так просто оказалось. Огромный минус пакета winpcap состоит в том, что он рассчитан для работы на, как минимум, ДВУХ компьютерах, объединённых в локальную сеть. Но ведь у меня всего только один компьютер дома, а в институт я, понятно, не пойду, чтобы там разрабатывать дипломную программу. Потом уже я придумал возможный выход - применить программу Virtual PC v5.0 (её дистрибутив есть в локальной сети кафедры, а кряк к ней точно есть на www.crack.ru), эмулирующую на одном компьютере несколько виртуальных независимых компьютеров, объединённых к тому же в виртуальную локальную сеть (Кстати, под UNIX есть аналогичная программа WMWare). Но я не стал такой вариант даже и пробовать, потому что он довольно трудоёмок и временеёмок для дипломного проектирования, и к тому же нет никаких гарантий, что всё это заработает по такой схеме. Я даже купил вторую сетевую карту и соответствующий сетевой кабель, один конец которого я вставил в одну сетевую карту, а другой конец - во вторую. Всё равно ничего не вышло (без Virtual PC v5.0). Но я эту идею не оставил (с Virtual PC v5.0), и теперь уже, после получения диплома, попробую всё это проделать и напишу здесь, чем это закончится.

Так что вариант с библиотекой winpcap пришлось оставить за неимением второго компьютера.

Второй надёжный вариант низкоуровевого сетевого программирования описан в [4]. Между прочим, очень дельная книга (там, кстати, очень часто ссылаются на книгу [15]). Так вот этот вариант основан на использовании так называемых "сырых" (raw) сокетов [4]. Сокеты, как известно любому нашему студенту, есть просто программно оформленная логическая оконечность сетевого соединения. Сокеты мы изучали в рамках дисциплины "Принципы построения и услуги Интернет". Правда, "сырые" сокеты мы тогда не изучали. Обычно сокеты работают между пятым и шестым уровнями модели OSI [4], тогда как "сырые" - на третьем уровне, сетевом, давая возможность "вручную", а точнее, программно целиком формировать/расшифровывать присылаемые/отправляемые IP-пакеты [4].

"Сырые" сокеты бывают разными. Они могут быть для неопределённого протокола, а могут быть предопределённого типа под протоколы TCP, UDP, ICMP, IGMP. Кроме того, эти подтипы "сырых" сокетов и ведут себя по-разному. Так, практически все они, также, как и библиотека winpcap, требуют наличия как минимум ДВУХ компьютеров, объединённых в локальную сеть. Только при выполнении этого условия, а также при условии, что оба эти компьютера работают под управлением ОС не ниже Windows 2000 да ещё и с правами Администратора (т.к. "сырые" сокеты могут быть применены во вред в компьютерной сети) "сырые" сокеты будут действительно работать в режиме низкоуровневого сетевого программирования. Под Windows 98 не поддерживается опция "включение низкоуровнего програмирования" (IP_HDRINCL), а под Windows 2000 с правами Администратора на ОДНОМ компьютере "сырые" сокеты все работают, но не в низкоуровневом режиме, а в обычном.

Так что опять повторяется ситуация, когда необходимо иметь два компьютера для разработки дипломной программы. Где же тогда выход?

Выход я всё-таки нашёл, как можно обойтись одним компьютером для случая "сырых" сокетов и при этом получить полноценное низкоуровневое сетевое программирование. Случайно обнаружилось, что нужными свойствами обладает Windows-реализация протокола ICMP [10].

Протокол ICMP - это протокол третьего, сетевого уровня, а не четвёртого, транспортного, как протоколы TCP и UDP. Протоколу ICMP неведомо понятие "порт", он оперирует только IP-адресом. Протокол ICMP применяется в сети Интернет для регулировки работы протоколов TCP и UDP, конкретнее для посылки сообщений управления и ошибок протоколов TCP и UDP типа "host unreachable" или изменения размера фрагментации для TCP. Ещё протокол ICMP применяется в известных утилитах "Ping" и "Traceroute".

На компьютере под управлением ОС Windows 2000 с правами Администратора успешно заработали одновременно ICMP-клиент и ICMP-сервер в низкоуровневом режиме, разработанные на основе [11]. Такая же пара "UDP-клиент и UDP-сервер" (почти в неизменном виде позаимствованная из [4]), запущенная при таких же условиях на одном компьютере хотя и работала, но в обычном, а не в низкоуровневом режиме. Точнее сказать, UDP-пакеты формировались, как надо - в низкоуровневом режиме - на клиенте, а вот сервер, принимающий пакеты, не захотел работать в низкоуровневом режиме, а работал в обычном, отбрасывая IP- и UDP-заголовки и выводя лишь полезную нагрузку пакета. Я ещё хотел попробовать создать аналогичную низкоуровневую пару "TCP-клиент и TCP-сервер" и посмотреть, как она будет работать, но не успел. Да и протокол TCP вручную реализовать очень канительно.

Так что для своей дипломной работы, исходя из жёсткого требования полной работоспособности низкоуровневой сетевой пары "клиент-сервер" на единственном компьютере, я избрал вариант "сырых" сокетов и конкретно протокол ICMP.

Описание моей дипломной программы

Система обнаружения атак (СОА) в моей дипломной программе представляет из себя клиент-серверную пару низкоуровневых сетевых приложений - отладочный генератор атак (клиент) и, собственно, система обнаружения атак (сервер). Обе программы являются консольными Win32-приложениями на базе библиотеки Windows Sockets v2.0 с использованием "сырых" сокетов. Кроме того, предусмотрена система удалённого управления и администрирования клиентом на базе протокола HTTP и многопоточной структуры клиента. Это значит, что клиент запускает дополнительную нить (тред), в которой работает соответствующий HTTP-сервер, который и даёт возможность УДАЛЁННО и ДИНАМИЧЕСКИ администрировать и управлять им.
HTTP-сервер даёт возможность выбрать ручной и автоматический режимы генерации сетевых атак, а также динамически, во время работы программы, выбирать и проводить одну из предопределённых атак.
Также реализована система уведомления администратора сети об атаке - выдачей сообщения на консоль и посредством электронной почты. Сервер, как и клиент, имеет многопоточную архитектуру, и при начале работы запускает дополнительную нить (тред), в которой работает POP3-сервер, к которому может подключиться сторонняя почтовая программа и проверить наличие сообщения об атаке. Как только сервер регистрирует атаку, он сразу же помещает соответствующее сообщение в электронный почтовый ящик, откуда его можно получить при помощи сторонней почтовой программы.

Для реализации программы существуют по крайней мере 2 варианта библиотек низкоуровневого сетевого программирования:

1.    Библиотека Windows Sockets v2.0 (Microsoft Corporation) [4], [5].
2.    Библиотека Windows Packet Capture Library (Torino Netgroup) [2].

На базе этих двух вариантов реализовано множество низкоуровневых сетевых приложений для ОС Windows [16] - анализаторы, снифферы, СОА, и т.д. Наиболее ярко такая двойственная возможность реализации проявилась в программном продукте daSniff [6], который реализован обоими способами.

Оба подхода в реализации низкоуровневых сетевых приложений имеют свои достоинства и недостатки. Так, библиотека Windows Sockets v2.0 требует для низкоуровневых сетевых приложений права Администратора при работе под Windows 2000 и не способна в большинстве случаев перехватывать исходящие пакеты. Библиотека Windows Packet Capture Library не поддерживает Loopback Adapter.
Общим недостатком обоих вариантов реализации явлется то обстоятельство, что для отладки полноценного анализатора пакетов необходимо иметь как минимум два (а не один) компьютера, объединённых в локальную сеть. В случае отсутствия второго компьютера совершенно невозможно организовать отладочную атаку на проектируемую СОА для практически всех протоколов. Единственным (известным) исключением является протокол ICMP, реализованный с помощью библиотеки Windows Sockets v2.0. В этом случае возможно на одном и том же компьютере как генерировать отладочную атаку средствами протокола ICMP, так и перехватывать её. Все остальные протоколы (в случае использования только одного компьютера) на низком уровне позволяют (при использовании библиотеки Windows Sockets v2.0) лишь генерировать атаки, а перехватывать - только на высоком уровне (что практически не имеет смысла). И только применив второй компьютер (с библиотекой Windows Sockets v2.0), подключённый к первому по локальной сети, можно перехватывать атакующие пакеты на низком (а не на высоком) уровне.
Библиотека Windows Packet Capture Library [2] вообще не предполагает никаких вариантов одновременной работы на одном компьютере отладочного генератора атак вместе с системой обнаружения атак.
Теоретически можно попробовать обойти это принципиальное ограничение (требование наличия двух компьютеров, объединённых в локальную сеть) при помощи такого специализированного ПО, как Virtual PC (или VMWare для Linux) - программы, которая эмулирует несколько виртуальных компьютеров на одном. Однако подобная задача выходит за рамки данного дипломного проекта.
Другой аспект создания собственной СОА - это разработка и применение сигнатур атак. После создания низкоуровневого сетевого анализатора пакетов задача регистрации атак сводится к анализу полей входящих пакетов (IP) и их последовательности.
Для любой дипломной работы наибольший практический интерес представляет такой программный продукт, который может полноценно работать на одном компьютере (не требуя наличия нескольких компьютеров). Из этого краткого обзора средств реализации низкоуровневого сетевого программирования под ОС Windows видно, что единственным подходящим вариантом является клиент-серверная реализация системы "отладочный генератор атак - система обнаружения атак" на основе протокола ICMP, реализованного низкоуровневыми средствами библиотеки Windows Sockets v2.0. Только этот вариант из всех рассмотренных позволяет создать полноценную систему обнаружения атак, основанную на использовании протокола IP и ICMP. Ценность такой системы состоит в том, что впоследствии она может быть легко переделана под протоколы TCP и UDP (с подключением второго компьютера по локальной сети) из-за концептуального сходства формата полей протокола ICMP и протоколов TCP и UDP.
Библиотека Windows Sockets v2.0 [4], [5] - это стандартное средство для программирования сетевых приложений для ОС MS Windows. Помимо стандартных и общеизвестных функций эта библиотека содержит также некоторые малоизвестные низкоуровневые возможности. Существуют некоторые удачные их описания [4] и примеры [11].
Для создания низкоуровнего сетевого ICMP-приложения необходимо ознакомиться в общих чертах с работой протокола IP [7], затем подробно изучить протокол IP [9] и протокол ICMP [10], а также изучить сетевые атаки на базе протокола ICMP [12].
Протокол ICMP - это служебный протокол, применяемый в основном для сообщений об ошибках и для настройки протоколов TCP и UDP. Он также применяется в известных утилитах Ping и Traceroute. Протокол ICMP - это протокол сетевого (третьего) уровня, также, как и протокол IP. Это проявляется тем, что для протокола ICMP не существует понятия "порт" и "вложенное сообщение" (в отличие от протоколов транспортного (четвёртого) уровня - TCP и UDP). Однако формат полей пакета концептуально тот же, что и для протоколов TCP и UDP - в пакете сначала идёт заголовок IP, затем - заголовок ICMP. ICMP-пакет не может нести полезное сообщение (в отличие от протоколов TCP и UDP), но зато он предусматривает поля "тип" и "код", каждое из которых может принимать значения от 0 до 127. Многие комбинации полей "тип" и "код" имеют предопределённое значение [4]. Все ICMP-сообщения делятся на 2 группы - ошибки и запросы [4]. Опытным путём было выявлено, что библиотека Windows Sockets v2.0 не может генерировать ICMP-пакеты типа "ошибка" (оставляя эту возможность за маршрутизаторами), а только ICMP-пакеты типа "запрос" (также за некоторыми исключениями).

По прошествии полгода с момента написания мною этой статьи я случайно наткнулся на другую интересную статью о создании firewall для Windows - смотрите [19]. Добавляю и другие ссылки по теме - см. [20].

Продолжение следует ...

Литература

1.  Курс лекций "Защита информации в компьютерных системах" (Колесников Д.Г.)

2.  Windows Packet Capture Library.

3.  Книга "Программирование на аппаратном уровне: специальный справочник. 2-е изд.(+дискета)" (В. Кулаков).

4.  Книга "Программирование в сетях Microsoft Windows (Джонс А., Оланд Дж.)" :

5.  MSDN 6.0/Platform SDK/Networking and Distributed Services/
Windows Sockets version 2 / Windows Sockets version 2 API / Reference

6.  daSniff

7.  Семейство протоколов TCP/IP (Брежнев А.Ф., Смелянский Р.Л.)  (41 КБ)  Формат - HTM (RUS).

8.  Телекоммуникационные технологии (v2.1) (Семенов Ю.А. (ГНЦ ИТЭФ)

9.  RFC 791 (на http://www.rfc-editor.org/)

10.  RFC 792 (на http://www.rfc-editor.org/)

11.  Пример "Ping" из MSDN  (4 КБ), (MSDN v6.0 Disk1):\Samples\VC98\SDK\Netds\Winsock\Ping.

12.  Обнаружение нарушений безопасности в сетях (С. Норткатт, Новак Дж.) http://www.williamspublishing.com ISBN 5-8459-0526-5 (рус.)

13.  Snort

14.  Snort documentation

15.  TCP/IP Illustrated, Vol.1. The Protocols (W. Richard Stevens)  (888 КБ) Формат - HTM. (ENG)

16.  Windows Packet Capture Library (Links).

17.  Shadow

18.  Эффективное программирование TCP/IP. (Йон Снейдер).   СПб.: Издательство "Питер", 2002.  ISBN 5-318-00453-9.

19.  Написание Firewall для Windows 9x/ ME/ NT/ 2000/ XP.  © Вадим Смирнов 2003.

20.  Lib_Ru Computer Security и firewall'ы.

Сайт создан в системе uCoz