Информационная безопасность

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



ередача, закрытие.

3.pop3_module.cpp - pop3-протокольная реализация сервера.

4.server.cpp - базовые функции pop3-сервера.

5.packet.cpp - печать пакета, создание сырого сокета, привязка его.

3.3 Описание программных элементов

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

Сырой сокет создаётся вызовом функции

SOCKET s;

s = WSASocket (AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,0);

В Windows 2000 cырые сокеты относятся к вопросам безопасности, так как могут быть использованы во вред, и поэтому для их создания необходимы права Администратора.

Кроме создания, необходимо также установить режим включения заголовка IP_HDRINCL:

BOOL bOpt;= TRUE; // If TRUE (while setting IP_HDRINCL), IP header is

// submitted with data to be sent and

// returned from data that is read.= setsockopt (s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));

Опция IP_HDRINCL реализована только начиная с Windows 2000.

Описание элементов клиента raw_send.exe:

Модуль Packet.h содержит следующие элементы:

Директиву #pragma pack(1) - выравнивание полей структур на границу 1 байта.

1. Структура, описывающая пакет IP:

typedef struct ip_hdr

{_char ip_verlen; // IP version & length_char ip_tos; // IP type of service_short ip_totallength; // Total length_short ip_id; // Unique identifier_short ip_offset; // Fragment offset field_char ip_ttl; // Time to live

u_char ip_protocol; // Protocol (TCP, UDP etc)

u_short ip_checksum; // IP checksum_int ip_srcaddr; // Source address_int ip_destaddr; // Destination address

} IP_HDR, *PIP_HDR, FAR* LPIP_HDR;

. Структура, описывающая пакет ICMP:

typedef struct icmp_hdr

{i_type;i_code; // Type sub codei_cksum;i_id;i_seq;

} ICMP_HDR, *PICMP_HDR;

Смысл и значения этих полей соответствуют описанию протоколов IP [12] и ICMP [13].

. Класс ICMP_PACKET:

Представляет описание одного ICMP-пакета. Содержит структуры IP_HDR и ICMP_HDR, символьный буфер, адресную структуру (адрес назначения) для пакета и две простые функции типа SET/GET для установки / считывания полей пакета - PrintPacket и FillFields.

. Класс RAW_SOCKET:

Представляет описание сырого сокета. Содержит поле типа сокет, логическую переменную для выставления опций, две простые функции типа SEND/RECEIVE для отправки / получения пакетов, функцию привязки сокета к IP-адресу, и конструктор, который принимает тип создаваемого сокета (Создавая сырой сокет определённого протокола - неопределённый, ICMP, UDP, IP, и пр.).

Модуль Packet.cpp cодержит следующие элементы:

Определение функции ICMP_PACKET: PrintPacket - распечатка полей полей пакета ICMP.

Конструктор сырого сокета RAW_SOCKET:RAW_SOCKET. Он создаёт сырой сокет путём указания идентификатора SOCK_RAW и нужного протокола (получаемого как параметр) [3]. Также конструктор выставляет у создаваемого сырого сокета опцию IP_HDRINCL, означающую включать IP-заголовок пакета при создании / получении пакета [3].

Определение функции RAW_SOCKET: BindSocket - привязать сокет к определённому адресу (используется только для сервера).

Модуль Raw_send.cpp содержит следующие элементы:

Определение функции ICMP_PACKET: FillFields - формирование полей пакета ICMP. Функция принимает аргумент - массив строк, полученный от HTTP-консоли, в котором содержится предопределённое количество строк, описывающих все необходимые параметры создаваемых пакетов, которые потом будут отправлены серверу в виде атакующей последовательности пакетов. Формирование полей пакетов осуществляется примерно так, как описано в [3] и в [15]: заполняются поля IP-заголовка, поля ICMP-заголовка, вычисляется контрольная сумма для ICMP-пакета, затем заполненные структуры последовательно копируются в символьный буфер. После заполняется структура struct sockaddr_in remote - туда записывается адрес сервера. Эта структура потом будет передана в функцию отправить пакеты.

Определение функции RAW_SOCKET: SendPackets - отправка ICMP-пакетов на сервер. Принимает буфер с сформированным пакетом, количество пакетов, отправляет пакеты.

Определение функции send_icmp_sequence - центральная функция во всём клиенте. Вызывается при каждом HTTP-подключении. Получает параметры из HTTP-клиента, создаёт объекты ICMP_PACKET и RAW_SOCKET, заполняет поля пакетов, отправляет их на сервер и закрывает сырой сокет после этого.

Определение функции checksum (взятая из [15]). Может быть использована для протоколов IP, UDP, TCP, ICMP:

u_short checksum (u_short *buffer, int size)

{_long cksum=0;(size > 1)

{+= *buffer++;-= sizeof (u_short);

}(size)

{+= *(u_char*) buffer;

}= (cksum >> 16) + (cksum & 0xffff);+= (cksum >>16); (u_short) (~cksum);

}

Контрольная сумма представляет из себя битовое дополнение до единицы суммы 16-битовых слогов всего пакета.

Модуль http_plugin.cpp содержит следующие элементы:

. Класс CONF_

Представляет описание абстрактного конфигурационного объекта, содержащего всю конфигурацию HTTP-сервера. Содержит поля:conf_file (из этого файла при запуске программы считываем настройки HTTP-сервера),ip_address[32] (ip-адрес этого сервера),port (порт, на который будем принимать HTTP-запросы (обычно 80),echo (выводить ли на экран каждое действие)_HTTP - конструктор, обнуляющий поля- изменение конфигурации с клавиатуры

Init - считывание конфигурационных параметров из файла http_conf при запуске системы.

2. Класс DISPATCH_SERVER_SOCKET_

Представляет опис