Выполнил: Дмитриев Антон Игоревич, 11 класс, каф. ИУ-8; Научный руководитель: Медведев Николай Викторович;
Введение Целью проекта является выявление и устранение уязвимостей протокола аутентификации «Kerberos». Для достижения данной цели в работе были поставлены и решены следующие научные задачи: 1)Рассмотреть теоретические аспекты аутентификации «Kerberos»; 2)Описать алгоритм устранения уязвимостей и степень опасности угроз; 3)Привести сравнительный анализ угроз в виде табличных данных. Предметом проекта являются принципы протокола «Kerberos».. Объектом исследования является уязвимости протокола.
Протокол Kerberos это - сетевой протокол аутентификации, позволяющий безопасно передавать данные через незащищённые сети для безопасной идентификации. Его организация направлена в первую очередь на клиент-серверную модель и обеспечивает взаимную аутентификацию - оба пользователя через сервер подтверждают личности друг друга. Сообщения, отправляемые через протокол Kerberos, защищены от прослушивания.
Принцип работы
Подпротоколы 1)AS Exchange 2)TGS Exchange 3)CS Exchange
Строение билета
Флаги билета
Уязвимости В протоколе «Kerberos» существует ряд уязвимостей, существование которых может привести к неправильной работе протокола. Некоторые из них представлены ниже.
1. CVE KDC неправильно ограничивает использование TGT -учетных данных для бронирования TGS - запросов, которые могут разрешить удаленным авторизованным пользователям олицетворять клиента, переписав внутренний запрос. 2.1/ CVE Kerberos 5 неправильно определяет приемлемость контрольных сумм, что может позволить отдаленному атакующему изменить текст, который видит пользователь или подделать сообщение KRB-SAFE через контрольные суммы, которые либо незашифрованы, либо зашифрованы RC4- ключами 2.6/ CVE Использование однокомпонентного имени домен позволяет атакующему вызвать отказ в обслуживании через запрос TGS-REQ, что вызывает пересечение областей(?). 3.5/ CVE Уязвимость модуля базы данных KDC позволяет удаленному атакующему вызвать отказ в обслуживании через формирование запроса. 4.0/ CVE Функция check_1_6_dummy в lib/kadm5/srv/svr_principal.c позволяет вызвать отказ в обслуживании через создания запроса, что пользователь не ввел пароль 4.0/10.0
Практическая часть В своей работе я выбрал 2 уязвимости протокола и устранил их. Первой уязвимостью является переполнение буфера. Второй – вход протокола в бесконечный цикл.
Переполнение буфера Переполнение буфера (buffer overflow) - наверное одна из самых интересных и широко распространённых уязвимостей программного обеспечения. Вроде бы небольшая ошибка программиста может (при особых обстоятельствах) позволить злобно настроенному хакеру сделать практически что угодно на компьютере невинного пользователя программы. Ошибка заключается в том, что в каком-либо месте программы происходит копирование данных из одного участка памяти в другой без проверки того, достаточно ли для них места там, куда их копируют. Область памяти, куда копируются данные, принято называть буфером. Таким образом, если данных слишком много, то часть их попадает за границы буфера - происходит "переполнение буфера". Умелое использование того, куда попадают "лишние данные" может позволить злоумышленнику выполнить любой код на компьютере, где произошло переполнение.
Что же такое переполнение стека и что с ним можно сделать. Рассмотрим следующую программу: #include "stdafx.h" #include void show_array(int arrlen, char array[]) { char buffer[32]; int i; for (i = 0; i < arrlen; i++) buffer[i] = array[i]; printf(buffer); } int main() { char mystr[] = "The possibility..."; show_array(30, mystr); getch(); return 0; }
Функция Тело программы
изменить функцию main следующим образом: #include #include "stdafx.h" void show_array(int arrlen, char array[]){ char buffer[32]; int i; for (i = 0; i < arrlen; i++) buffer[i] = array[i]; printf(buffer);} int main(){ char mystr[] = «Что-тооооооооченьдлииииииннооооееее"; show_array(51, mystr); return 0;}
int main(){ // часть строки, заполняющая буфер char mystr[] = " " "\xb3\x94\xf7\xbf" // адрес возврата // код "\xff\x15\xe8\xf0\x40\x00"; // CALL [KERNEL32.ExitProcess] show_array(47, mystr); return 0;}
Вход в бесконечный цикл Одним из наиболее интересных аспектов использования цикла for является создание бесконечного цикла. Поскольку не требуется ни одна из частей, можно создать бесконечный цикл путем удаления части проверки условия. Например: for ( ; ; ) printf(" this loop will run forever. \n"); Хотя можно использовать части инициализации и увеличения, наиболее типично использование for( ; ; ) без выражений для создания бесконечного цикла.
На самом деле конструкция for( ; ; ) не обязательно создает бесконечный цикл, поскольку в теле цикла может присутствовать оператор break, при достижении которого цикл оканчивает работу. Нижеприведенная программа контролирует нажатие клавиш и, в случае достижения необходимого условия, бесконечный цикл прерывается: for ( ; ; ) { ch = getchar(); /* ввод символа */ if (ch == 'A') break; /* выход из цикла */ } printf("you typed an A"); Цикл будет работать до тех пор, пока на клавиатуре не будет набрана А.
#include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) {char ch; for ( ; ; ) { ch = getchar(); /* ввод символа */ if (ch == 'A') break; /* выход из цикла */ } printf("you typed an A"); system("pause"); return 0; }
Есть много других способов устранения этой уязвимости, однако этот – самый простой из них.
Итог Итогом моей работы стало создание некоторых алгоритмов устранения уязвимостей протокола, использование которых в программе дает существенное повышение безопасности «Kerberos» +=
Список использованных источников 1) 2) 42/product_id-61/MIT-Kerberos.html
Спасибо за внимание!!!