Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диплом. вариант_1.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.21 Mб
Скачать
      1. Описание выходных данных

Лабораторный стенд отображает результаты своей работы на мониторе (постоянно) и записывает их в выходной файл (при желании пользователя).

Пример выходных данных:

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 не обнаружена» – результат проверки.

      1. Программная реализация лабораторного стенда

Функционал лабораторного стенда разделен условно на 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() также принимает дополнительный параметр – номер порта, который задается в исходном коде программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]