Как написать вирус для ботнета
Обновлено: 28.03.2024
Архитектура — наше все
Существует множество способов управления зараженными хостами и передача команд каждой машине. Все зависит от конкретных предпочтений бот-мастера. В зависимости от типа используемого протокола командным центром может выступать:
Не нужно беспокоиться о своевременном получении команды конкретным ботом. Факты получения, выполнения, успешного/ неуспешного завершения задачи легко фиксируются, что позволяет вести детальную статистику. Однако централизованная топология остается актуальной лишь для небольших бот-сетей по следующим причинам:
В большинстве случаев обилие недостатков и сложность реализации P2P-ботнетов являются решающими факторами в пользу выбора централизованной топологии. Мы также не будем изобретать велосипед, а воспользуемся мировыми практиками.
Псевдослучайные имена
Генератор псевдослучайных чисел имеет одну особенность, которая является ключевой для бот-мастера — получая на вход параметр в виде фиксированного значения, ГПЧ генерирует случайную последовательность, которая будет одинакова на различных рабочих станциях при условии получения их генераторами этого параметра.
Чтобы тебе не пришлось долго искать смысл в использовании ГПЧ, рассмотрим следующую функцию:
Функция генерации псевдослучайной последовательности
int generator (int seed) srand(seed);
/* вывод двадцати первых элементов последовательности*/
for (x = 1; x printf("iteration %d, rand=%d\n", x, rand());
getch();
return 0;
>
Базовыми функциями, отвечающими за инициализацию и генерацию псевдослучайной последовательности, являются давно знакомые нам srand() и rand(). На основе переменной seed функция srand() инициализирует множество чисел, на котором, в свою очередь, будет работать функция генерации rand().
Результат работы функции generator() при значении seed=123:
Таким образом, seed является тем самым параметром, на основе которого будет генерироваться последовательность доменов. Легким движением руки и небольшим шевелением извилин генератор псевдослучайной числовой последовательности превращается в генератор псевдослучайной последовательности доменных имен.
Способ генерации доменного имени основан на простой работе со строками. Ничего сверхъестественного в исходном коде генератора нет, поэтому приводить его здесь не будем — ищи исходники с комментариями на диске. Несколько слов можно сказать об окончаниях доменных имен: доменные зоны берутся из массива и склеиваются со сгенерированной строкой, поэтому, чем больше массив с этими элементами, тем шире диапазон всевозможных вариантов.
Один из методов защиты от несанкционированной передачи заданий ботам заключается в использовании шифрования командного файла на стороне сервера. Клиент, коим выступает зараженная машина, имеет в своем распоряжении ключ для расшифровки этого файла. Идея хорошая, но мы пойдем другим путем, воспользовавшись прелестями современных технологий.
- Аутентификация — непосредственно распознавание клиента, запрашивающего ресурс;
- Авторизация — определение, имеет ли аутентифицированный клиент необходимые права на запрашиваемый им ресурс.
Для установки процесса аутентификации в конфигурационном файле веб-сервиса Config.Web необходимо внести соответствующие изменения:
Бот в разрезе
Структура командного файла
где i, j, k меняются в интервале (1; бесконечность).
Действия бота таковы:
- выделение k-ой строки;
- передача выделенной строки в функцию, которая реализует подключение библиотеки, необходимой для выполнения команды (функция PlugLibrary());
- PlugLibrary() соответствующим образом интерпретирует строку и выполняет необходимое действие, зависящие от типа команды. Парсинг command.txt реализует функция Parse(char *FileName).
В случае необходимости подключения скачанной dll’ки с целью расширения функционала, функция PlugLibrary выполняет следующие инструкции по заранее описанному интерфейсу подключения (он также должен быть оформлен в самой dll):
Функция Load, экспортируемая библиотекой, содержит необходимые инструкции, обеспечивающие расширение функционала основной программы-бота.
И это только начало…
В статье мы немного подсмотрели за процессом приготовления ботнета по правильному рецепту. Наше внимание коснулось большинства аспектов искусства зомбирования: проанализированы основные архитектуры бот-сетей, осуществлена реализация наиболее актуальной топологии с устранением присущих ей недостатков, рассмотрена довольно перспективная область использования вебсервисов в качестве административной панели со своей защищенной зоной, написан плагинный бот, который по мере желания администратора может мутировать до неузнаваемости. И это только начало, ведь сколько нюансов осталось за кадром: сокрытие исполняемого файла в системе, разделение ботнета на подсети и тому подобные задачи, которые тебе еще предстоит решить. Я лишь задал тебе направление движения, естественно, исключительно в ознакомительных целях.
Links
-
— мой ресурс, где ты можешь найти материалы о различных сетях распределенных вычислений, а также задать вопросы и поделиться идеями.
Денис Макрушин
В этой статье я расскажу, как написать на Python простейший троян с удаленным доступом, а для большей скрытности мы встроим его в игру. Даже если ты не знаешь Python, ты сможешь лучше понять, как устроены такие вредоносы, и поупражняться в программировании.
Конечно, приведенные в статье скрипты никак не годятся для использования в боевых условиях: обфускации в них нет, принципы работы просты как палка, а вредоносные функции отсутствуют напрочь. Тем не менее при некоторой смекалке их возможно использовать для несложных пакостей — например, вырубить чей‑нибудь компьютер в классе (или в офисе, если в классе ты не наигрался).
Теория
Логика подобного заражения в том, что пользователь сам скачает себе вредонос на компьютер (например, под видом крякнутой программы), сам отключит защитные механизмы (ведь программа выглядит хорошей) и захочет оставить надолго. Хакеры и тут не дремлют, так что в новостях то и дело мелькают сообщения о новых жертвах пиратского ПО и о шифровальщиках, поражающих любителей халявы. Но мы‑то знаем, что бесплатный сыр бывает только в мусорке, и сегодня научимся очень просто начинять тот самый сыр чем‑то не вполне ожидаемым.
warning
Вся информация предоставлена исключительно в ознакомительных целях. Ни автор, ни редакция не несут ответственности за любой возможный вред, причиненный материалами данной статьи. Несанкционированный доступ к информации и нарушение работы систем могут преследоваться по закону. Помни об этом.
Определяем IP
Сначала нам (то есть нашему трояну) нужно определиться, где он оказался. Важная часть твоей информации — IP-адрес, по которому с зараженной машиной можно будет соединиться в дальнейшем.
Начнем писать код. Сразу импортируем библиотеки:
Обе библиотеки не поставляются с Python, поэтому, если они у тебя отсутствуют, их нужно установить командой pip .
Код получения внешнего и внутреннего адресов будет таким. Обрати внимание, что, если у жертвы несколько сетевых интерфейсов (например, Wi-Fi и Ethernet одновременно), этот код может вести себя неправильно.
Если с локальным адресом все более‑менее просто — находим имя устройства в сети и смотрим IP по имени устройства, — то вот с публичным IP все немного сложнее.
Я выбрал сайт api. ipify. org , так как на выходе нам выдается только одна строка — наш внешний IP. Из связки публичный + локальный IP мы получим почти точный адрес устройства.
Вывести информацию еще проще:
Никогда не встречал конструкции типа print( f'<> ') ? Буква f означает форматированные строковые литералы. Простыми словами — программные вставки прямо в строку.
Строковые литералы не только хорошо смотрятся в коде, но и помогают избегать ошибок типа сложения строк и чисел (Python — это тебе на JavaScript!).
Хакерский мир можно условно разделить на три группы атакующих:
Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.
Зачем ИБ-персоналу эти сомнительные навыки?
Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.
Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.
Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.
Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN:
Для понимания: эта функция определяет нажата клавиш или отжата в момент вызова и была ли нажата после предыдущего вызова. Теперь постоянно вызываем эту функцию, чтобы получать данные с клавиатуры:
Умный кейлогер
Погодите, а есть ли смысл пытаться снимать всю подряд информацию со всех приложений?
Код выше тянет сырой ввод с клавиатуры с любого окна и поля ввода, на котором сейчас фокус. Если ваша цель – номера кредитных карт и пароли, то такой подход не очень эффективен. Для сценариев из реального мира, когда такие кейлогеры выполняются на сотнях или тысячах машин, последующий парсинг данных может стать очень долгим и по итогу потерять смысл, т.к. ценная для взломщика информация может к тому времени устареть.
Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи лайков. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.
Вторая версия кода:
Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.
Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.
Еще более умный кейлогер
Давайте предположим, что злоумышленник смог получить данные кодом, на подобии нашего. Так же предположим, что он достаточно амбициозен и смог заразить десятки или сотни тысяч машин. Результат: огромный файл с гигабайтами текста, в которых нужную информацию еще нужно найти. Самое время познакомиться с регулярными выражениями или regex. Это что-то на подобии мини языка для составления неких шаблонов и сканирования текста на соответствие заданным шаблонам. Вы можете узнать больше здесь.
Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:
Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.
Бесплатно и полностью не обнаружим
В своем примере я использовал Visual Studio – вы можете использовать свое любимое окружение – для создания такого кейлогера за 30 минут.
Если бы я был реальным злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил код для соответствия этим целям. Конечно, также, я запустил бы фишинговую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.
Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?
Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.
В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.
Основная цель этой статьи – показать, что используя одни только антивирусы вы не сможете полностью обеспечить безопасность на предприятии. Нужен более глубинная оценка действий всех пользователей и даже сервисов, чтобы выявить потенциально вредоносные действия.
В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.
Если вы ещё не были в Испании, то обязательно должны её посетить, здесь есть множество мест, заслуживающих внимания. Это Мадрид, город, который никогда не спит, вы видите его на первом слайде, он меньше, чем Нью-Йорк. Это Барселона со своим удивительным храмом Святого Семейства, и, конечно же, Памплона, где люди убегают от разъярённых быков. Здесь всего одно правило: если ты пьян, не беги! А так всё просто: вы просто должны бежать быстрее, чем бык.
Если вам нравятся особые праздники, то вот битва томатов Томатина. Я не уверен насчёт истории этого обычая, но вам всего лишь требуется кидаться помидорами, и это довольно интересно. Да, такова Испания!
Я хочу показать вам увеличенную картинку на экране – это изобретение испанцев, они сидят в бассейне и подключили электронику через удлинитель, который плавает благодаря одетым на него резиновым тапочкам.
Эта прекрасная иллюстрация того, как мы в Испании пользуемся разными вещами. Мы, испанцы, действуем по-своему, не так, как другие. Итак, идея создания ботнета довольно проста – давайте их всех заразим! Очень простая идея, которую мы хотели воплотить в ботнете – чтобы участвующие в нём компьютеры захотели сами себя заразить.
Если подумать, это довольно распространённая в интернете тема. Индустрия вредоносного программного обеспечения широко распространилась за последние 5-10 лет с помощью мошеннических антивирусов и трюков социальной инженерии, так почему бы ботнету не сделать подобный трюк?
Это очень распространённый способ атаки путём конфигурирования специального троянского XML-файла, простой, но отлично работающий.
Если вы не в состоянии контролировать весь браузер, то можно запустить JavaScript в одной пользовательской вкладке, при этом вы сможете проделать множество вещей. Вы сможете получить доступ к коду, модифицировать HTML, получить доступ к полям форм, вы можете управлять вкладкой и так далее.
Проблема заключается в том, что нам нужно сконфигурировать его в интернете, что довольно сложно, если нужно заразить множество сетевых ботов. Так что наша идея была более простой — создать ботнет JavaScript при помощи Scratch.
Идея этой сети проста – если вы последний на линии, то можете получить доступ ко всему контенту, перехватывая все соединения.
Для ее реализации мы собрали машину, которая была ”человеком посередине", и зарегистрировали её как узел TOR и как анонимный прокси сервер, и в обоих случаях проработали какое-то время. Тем не менее, мы должны сказать, что наша вредоносная активность в качестве узла TOR была обнаружена, что привело к игнорированию нашего IP-адреса.
Для реабилитации нам предложили пройти тесты, создать тестовую сессию и так далее, что показалось нам слишком сложным, ведь мы же испанцы. Поэтому следующей вещью, которую мы сделали, было создание собственного прокси сервера. Это достаточно просто, потому что прокси имеет не такую большую инфраструктуру, как TOR, это всего лишь автономный сервер, к которому пытаются присоединится пользователи.
После того, как мы арендовали сервер, мы принялись его настраивать. Это должен был быть простой сервер на основе Apache и SQUID прокси. Далее при помощи этого сервера мы собирались инфицировать все файлы JavaScript одним маленьким кусочком кода, занимающим всего пару строк.
Всё, что нам нужно было сделать, показано на следующем слайде.
Далее мы создали собственно скрипт, показанный на следующем слайде, который заражает файлы JavaScript.
В коде можно было посмотреть, был ли создан элемент или нет. Цель состоит в том, чтобы не запускать pasarela.js более одного раза на одной странице. Поскольку мы как порядочные люди не хотели причинить вред пользователям, мы опубликовали на главной странице сервера следующее обращение ко всем клиентам, которые собирались воспользоваться услугами нашего прокси-сервера.
Если вы не хотите потерять свой пароль или свои персональные данные, не пользуйтесь нашим сервером! Это очень хорошая политика безопасности. Более-менее аналогичную политику безопасности используют в армии – вы видите похожее предупреждение на сайте Инженерного корпуса армии США, так что мы поступили вполне законно.
Итак, мы опубликовали свой прокси-сервер в интернете и написали, что это открытый прокси, и что каждый может добавить свой прокси в нашу базу данных. Вы видите, что у нас есть вкладки со списками разных прокси, сортировка их по стране, по порту, есть вкладка избранных прокси.
Вы видите, что наш IP-адрес появился в выдаче поискового запроса 1110 раз, потому что все прокси-серверы начали копировать самих себя. Потому что если вы разместите свой IP-адрес в списке одного прокси-сервера, все остальные прокси-серверы начинают копировать эти списки. Это весело, потому что однажды это принесёт вам много всякой всячины.
Вот, собственно, и всё — теперь можно было наслаждаться плодами нашего труда. Однажды мы даже смогли мобилизовать 5000 ботов. Проведя анализ соединений, мы установили, что большинство машин нашего ботнета располагались в России, Бразилии, Мексике и Индонезии, где услуги прокси-серверов пользуются большим спросом. Нам не потребовалось платить за это, не нужно было создавать никаких специальных полиморфных вредоносных программ, достаточно было опубликовать в интернете один-единственный IP-адрес сервера. Ну, вы знаете, мы же из Испании.
Вопрос заключался в том, кто же пользуется такого рода услугами? Сколько человек в этом зале пользуется услугами прокси-серверов в интернете? Итак, если вы хотите анонимности, используете один прокси-сервер. Если вы хотите ещё больше анонимности, используйте больше, чем один прокси-сервер, так вы сможете заразить больше, чем 1 прокси-сервер (смех в зале).
В первую очередь мы хотели собрать данные плохих людей, которые делают плохие вещи. Итак, нам удалось собрать всю информацию нигерийских скамеров, включая имена пользователей и пароли. Но мы их об этом предупреждали, так что всё законно.
Этот парень создал целую спамерскую компанию, чтобы дурить людей, предлагая им сделать специальную визу для получения работы в Великобритании, за это он просил по 275 фунтов. На следующем слайде приведено электронное письмо, в котором он просил денег.
Еще один из моих любимых аккаунтов в социальной сети, с сайта знакомств – вот этот парень, вернее, вот эта девушка. Скажите честно, ребята – кто из вас думает, что такая девушка станет искать парня для занятий сексом в сети интернет?
Нет ли здесь кого-нибудь из Вирджинии, кто встречал бы эту девушку?
Но самое интересное, что другой профиль того же пользователя выглядел совершенно по другому. На этот раз наша девушка была из Германии.
И тогда мы решили проникнуть в почтовый ящик этого пользователя и ознакомиться с его письмами. Естественно, это был парень, а не девушка.
Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).
VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до декабря бесплатно при оплате на срок от полугода, заказать можно тут.
Вирусные аналитики и исследователи компьютерной безопасности стремятся собрать как можно больше образцов новых ботнетов. В своих целях они используют honeypot'ы.… Но что если хочется понаблюдать за зловредом в реальных условиях? Подставить под удар свой сервер, маршрутизатор? А что если подходящего устройства нет? Именно эти вопросы натолкнули меня на создание bhunter — инструмента для получения доступа к узлам бот-сетей.
Существует много способов распространения вредоносного по для расширения бот-сетей: начиная от фишинга и заканчивая эксплуатацией 0-day уязвимостей. Но самым распространенным методом до сих пор остается перебор паролей к SSH.
Именно так и работает bhunter. Слушает 22 порт (служба SSH) и собирает все лоигны и пароли, с которыми пытаются к нему подключиться. Затем, используя собранные пароли, пытается подключиться к атакующим узлам.
Программу можно условно разделить на 2 основные части, которые работают в отдельных потоках. Первая — honeypot. Обрабатывает попытки входа, собирает уникальные логины и пароли (в данном случае пара логин+пароль рассматривается как единое целое), а также добавляет в очередь для дальнейшей атаки IP-адреса, которые пытались подключиться.
Вторая часть отвечает непосредственно за атаку. При чем атака ведется в двух режимах: BurstAttack (атака очередью) — перебор логинов и паролей из общего списка и SingleShotAttack (атака одиночными выстрелами) — перебор паролей, которые использовались атакуемым узлом, но еще не были добавлены в общий список.
Чтобы иметь хоть какую-то базу логинов и паролей сразу после запуска, bhunter инициализируется списком из файла /etc/bhunter/defaultLoginPairs.
Предусмотрено несколько способов запуска bhunter:
Просто командой
При таком запуске есть возможность управлять bhunter'ом через его текстовое меню: добавлять логины и пароли для атаки, экспортировать базу логинов и паролей, указать цель для атаки. Все взломанные узлы можно увидеть в файле /var/log/bhunter/hacked.log
Используя tmux
Tmux — терминальный мультиплексор, очень удобный инструмент. Позволяет в рамках одного терминала создавать несколько окон, а окна разбивать на панели. Используя его можно выйти из терминала а потом зайти не прерывая запущенные процессы.
Преимущество этого способа над первым в том, что мы можем смело закрыть терминал и вернуться к нему позже, при этом bhunter не остановит работу. Тем, кто мало знаком с tmux предлагаю эту шпаргалку.
As a service
В данном случае мы включаем автозапуск bhunter при старте системы. В данном методе взаимодействие с bhunter не предусмотрено, а список взломанных узлов можно получить из /var/log/bhunter/hacked.log
За время работы над bhunter мне удалось найти и получить доступ к совершенно разным устройствам: raspberry pi, маршрутизаторы (особенно mikrotik), web-сервера, а однажды ферма для майнинга (к сожалению доступ к ней был в течении дня, поэтому интересной истории не получилось). Вот скриншот программы, на котором виден список взломанных узлов после нескольких дней работы:
К сожалению, эффективность данного инструмента не достигла моих ожиданий: bhunter может перебирать пароли к узлам несколько дней безрезультатно, а может взломать несколько целей за пару часов. Но для регулярного притока новых образцов ботнетов этого достаточно.
На эффективность влияют такие параметры как: страна, в которой расположен сервер с bhunter, хостинг, и диапазон из которого выделен ip-адрес. На моем опыте был случай, когда я арендовал два виртуальных сервера у одного хостера, и один из них подвергался атакам со стороны ботнетов в 2 раза чащще.
При атаке на зараженные узлы в некоторых ситуациях не удается однозначно определить подошел пароль или нет. Журналирование таких случаев ведется в файле /var/log/debug.log.
Модуль Paramiko, который используется для работы с SSH иногда ведет себя некорректно: уходит в бесконечное ожидание ответа от узла, когда пытается к нему подключиться. Я экспериментировал с таймерами, но нужного результата не получил
Service name
Другие вектора
SSH не является единственным средством удаленного управления. Есть еще telnet, rdp. Стоит присмотреться и к ним.
Расширение
Было бы здорово иметь несколько ловушек в разных странах и централизовано собирать с них логины, пароли и взломанные узлы в общую базу данных
На момент написания статьи готова только тестовая версия, которую можно скачать из репозитория на Github.
Читайте также: