Информационная безопасность
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
ередача, закрытие.
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_
Представляет опис