- •Выпускная квалификационная работа дипломированного специалиста
- •Лабораторный стенд для изучения принципов работы системы обнаружения вторжений. Сигнатурные методы анализа
- •Реферат
- •Основные определения
- •Перечень сокращений
- •Аннотация
- •Содержание
- •1. Анализ задачи проектирования 10
- •2. Теоретические основы систем обнаружения вторжений 15
- •3. Описание лабораторного стенда 26
- •4. Технологический раздел 45
- •5. Экономическая часть проекта 52
- •6. Эргономическая часть проекта 69
- •Введение
- •Анализ задачи проектирования
- •Основные функции программного обеспечения
- •Выбор инструментария и сторонних библиотек
- •Обзор прототипов системы
- •Система обнаружения вторжений Snort
- •Теоретические основы систем обнаружения вторжений
- •Технология обнаружения вторжений
- •Классификация систем обнаружения вторжений
- •Обнаружение аномалий в защищаемой системе и обнаружение злоупотреблений
- •Выбор оптимального множества параметров оценки
- •Определение общего показателя «аномальности»
- •Методы обнаружения аномалий
- •Методы обнаружения вторжений
- •Системы обнаружения вторжений на уровне сети или хоста
- •Описание лабораторного стенда
- •Описание интерфейса программы
- •Сигнатуры атак
- •Smurf-атака
- •Land-атака
- •Атака на сервисы Windows
- •Запрещённые комбинации tcp-флагов
- •Технологический раздел
- •Руководство программиста
- •Описание входных данных
- •Описание выходных данных
- •Программная реализация лабораторного стенда
- •Тестирование
- •Экономическая часть проекта
- •Оценка затрат
- •Расчет трудоемкости разработки программного продукта
- •Расчет стоимости машинного часа
- •Амортизация оборудования
- •Расходы на отопление и водоснабжение
- •Расходы на зарплату обслуживающего персонала
- •Прочие расходы (почта, телеграф и т.Д.)
- •Расчет себестоимости программного продукта
- •Обоснование цены программного продукта
- •Анализ конкурентоспособности
- •Расчет экономического эффекта от внедрения программного продукта
- •Эргономическая часть проекта
- •Оценка показателей лабораторного стенда, задающих необходимое качество взаимодействия человека с машиной
- •Меры минимизации помех разработчику лабораторного стенда
- •Меры повышения удобств для разработчика лабораторного стенда
- •Вопросы охраны труда и техники безопасности
- •Анализ вредных и опасных факторов производственной среды
- •Производственное помещение и размещение оборудования
- •Микроклимат и организация воздухообмена
- •Производственное освещение
- •Эргономика организации рабочего места. Режим труда и отдыха
- •Электробезопасность
- •Пожарная безопасность
- •Охрана окружающей среды
- •Заключение
- •Библиографический список
Описание выходных данных
Лабораторный стенд отображает результаты своей работы на мониторе (постоянно) и записывает их в выходной файл (при желании пользователя).
Пример выходных данных:
28.03.2016 11:30:4.801479 - 11:30:4.873915 aтака на порт № 139
15.04.2016 11:29:50.50932 - 11:30:4.873915 aтака на порт № 445 не обнаружена
25.04.2016 21:33:47.454210 - 21:33:51.458822 aтака "ICMP-flood"
29.04.2016 10:59:59.50000 - 11:30:4.873915 aтака "ICMP-flood" не обнаружена
01.05.2016 10:33:3.304621 - 10:33:38.490907 TCP-сканирование не обнаружено
01.05.2016 10:59:59.50000 - 11:30:4.873915 aтака на порт № 137 не обнаружена
Последняя запись говорит о том, что:
проверка была проведена 01.05.2016;
10:59:59.50000 – время пакета, с которого была начата проверка;
11:30:4.873915 – время пакета, на котором была остановлена проверка из-за обнаружения вторжения или данный пакет является последним во входных данных;
«атака на порт № 137 не обнаружена» – результат проверки.
Программная реализация лабораторного стенда
Функционал лабораторного стенда разделен условно на 2 независимых модуля. Первый модуль осуществляет захват сетевого трафика с последующим формированием массива данных, удобного для анализа на предмет вторжения. Второй модуль отвечает за непосредственное обнаружение самого факта вторжения или каких-либо аномалий.
В первый модуль входят следующие функции:
void Initialize_setting();
void Number_of_Interface_for_Sniffer();
string IP_PK();
string Sniffer(int index_id, string ipv4_str);
Packet_Info[] Parser(string name_file).
Функция void Initialize_setting() отвечает за настройку параметров лабораторного стенда по умолчанию.
Функция void Number_of_Interface_for_Sniffer() является функцией определения доступных сетевых интерфейсов на персональном компьютере. Number_of_Interface_for_Sniffer() запускает анализатор трафика, расположение которого указано в области «Настройка программы» в поле «Путь к WinDump». Результатом работы данной функции является выпадающий список (checkbox) «Сетевой интерфейс» (см. Рисунок)
Рисунок 18. Результат работы функции определения сетевого интерфейса
Функция string IP_PK() получает IP-адрес компьютера, на котором запущен лабораторный стенд. Определение адреса происходит через параметр командной строки ipconfig.
private string IP_PK()
{
ProcessStartInfo cmd = new ProcessStartInfo(@"cmd.exe");
/// процесс cmd.exe с параметром "ipconfig"
cmd.Arguments = @"/C ipconfig";
/// скрываем окно запущенного процесса
cmd.StandardOutputEncoding = Encoding.GetEncoding(866);
cmd.WindowStyle = ProcessWindowStyle.Hidden;
cmd.RedirectStandardOutput = true;
cmd.UseShellExecute = false;
cmd.CreateNoWindow = true;
/// запускаем процесс
Process proc_ipconfig = Process.Start(cmd);
/// считываем переменную
StreamReader srIncoming = proc_ipconfig.StandardOutput;
string ipconfig = srIncoming.ReadToEnd();
/// закрываем процесс
proc_ipconfig.Close();
///ищем IPv4 в строке ipconfig
…
///
return ip;
}
Функция string Sniffer(int index_id, string ipv4_str) запускает анализатор трафика в режиме прослушивания сетевого трафика на сетевом интерфейсе с номером index_id для компьютера с IP-адресом ipv4_str. Номер сетевого интерфейса определяет пользователь, выбрав одну из записей выпадающего списка «Сетевой интерфейс». Параметр ipv4_str является результатом запуска предыдущей функции string IP_PK(). WinDump запускается с параметрами, описанными в пункте «Описание входных данных» данного раздела. По окончанию своей работы функция возвращает строковую переменную, которая содержит путь к файлу с данными о трафике. Функция Packet_Info[] Parser(string name_file) в качестве входного параметра принимает данный путь. Перед тем, как начать сбор трафика, функция Sniffer запускает параллельный поток void thread_time(), который следит за временем захвата пакетов. В исполняемом коде программы прописано, что превышение времени захвата трафика в 120 секунд влечет за собой автоматическое завершение данной функции. Интервал в две минуты выбран из расчета, что лабораторный стенд является средством для помощи в обучении студентов. Он может быть изменен при необходимости в исходном коде программы.
private string Sniffer(int index_id, string ipv4_str)
{
int kolvo_packets = Convert.ToInt32(KolichestvoPacketov.Text);
string name_file = Application.StartupPath.ToString() + "\\log_.txt";
/// Сниффер
ProcessStartInfo cmd_1 = new ProcessStartInfo(@"cmd.exe");
cmd_1.Arguments = "/c " + textBox_windump.Text + " -i" + index_id + " -s 0 -c " + kolvo_packets + " -vv -n ip host " + ipv4_str + " > " + name_file;
/// скрываем окно запущенного процесса
cmd_1.StandardOutputEncoding = Encoding.GetEncoding(866);
cmd_1.WindowStyle = ProcessWindowStyle.Hidden;
cmd_1.RedirectStandardOutput = true;
cmd_1.UseShellExecute = false;
cmd_1.CreateNoWindow = true;
/// параллельный поток считает время
Thread my_thread = new Thread(thread_time);
my_thread.Priority = ThreadPriority.AboveNormal;
my_thread.Start();
Process proccess_1 = Process.Start(cmd_1);
proccess_1.WaitForExit();
if (exit_cmd == 0) exit_cmd = 1;
richTextBox_data.Text += "Захват пакетов окончен \n";
richTextBox_data.Text += String.Empty.PadLeft(30, '=') + "\n";
if (exit_cmd == 1)
return name_file;
else return "";
}
Packet_Info[] Parser(string name_file) – функция преобразования данных сетевого трафика из файла в массив данных Packet_Info[]. Класс Packet_Info является пользовательским типом данных. Поля данного класса представляют собой поля заголовков IP и TCP пакетов. В Таблице приведен пример для записи входного файла
11:11:50.236378 IP (tos 0x0, ttl 128, id 9821, offset 0, flags [DF], proto: TCP (6), length: 41) 192.168.1.5.3546 > 173.194.122.193.443: ., cksum 0xaf6c (correct), 274325955:274325956(1) ack 3778425421 win 256
Таблица 2 - Данные класса Packet_Info
Поле Packet_Info |
Значение поля Packet_Info |
public int[] time; |
time[0] = 11; time[1] = 11; time[2] = 50; time[3] = 236378 |
public string tos; |
0x0 |
public int ttl; |
128 |
public int id; |
9821 |
public int offset; |
0 |
public string flag_fragment; |
DF |
public string flag_urgent; |
- |
public string flag_psh; |
- |
public string flag_rst; |
- |
public string flag_fin; |
- |
public string flag_syn; |
- |
public Int64 ack; |
3778425421 |
public string flag_icmp; |
- |
public string proto; |
TCP (6) |
public int len; |
41 |
public string IP_ot; |
192.168.1.5 |
public int port_ot; |
3546 |
public string Ip_pol; |
173.194.122.193 |
public int port_pol; |
443 |
public string checksum; |
correct |
public int win; |
256 |
public string text; |
- (сообщение в шестнадцатеричном виде) |
public int size_data; |
1 |
public string seq |
274325956 |
Функция Parser является завершающей в первом модуле программы.
Второй модуль представляет собой совокупность сигнатур, вызываемых по очереди или обособленно друг от друга (в зависимости от цели пользователя). Сигнатуры, представленные в лабораторном стенде:
void TCP_scan(Packet_Info[] packets, string ipv4_str);
void Port_dos(Packet_Info[] packets, string ipv4_str, int number_port);
void ICMP_flood(Packet_Info[] packets, string ipv4_str);
void SMURF_attack(Packet_Info[] packets, string ipv4_str);
void Land_attack(Packet_Info[] packets, string ipv4_str);
void Bad_packet_TCP(Packet_Info[] packets, string ipv4_str).
Подробный алгоритм функционирования правил распознавания вторжений представлен в пункте «Сигнатуры атак».
Входными данными для всех функций являются IP-адрес компьютера-жертвы и массив данных с характеристиками сетевых пакетов. void Port_dos() также принимает дополнительный параметр – номер порта, который задается в исходном коде программы.
