Уникальный алгоритм генерации доменов в ботнете Bedep: ставка на курсы валют и теорию групп

botnet

Большинство вредоносных программ, использующих алгоритмы генерации доменов (DGA - метод, позволяющий боту динамически получать адрес сервера управления), предсказуемы. Они берут текущую дату, применяют простые арифметические операции и получают список доменов на месяц вперёд. Специалисту по информационной безопасности достаточно одного дня, чтобы восстановить логику и заблокировать все будущие адреса. Но существует редкое исключение - ботнет Bedep, активный в 2014-2015 годах. Его автор реализовал внутри 32-битной библиотеки настоящий учебник по теории чисел. Результат стал одним из самых математически элегантных образцов вредоносного кода, когда-либо встречавшихся в дикой природе.

Описание

Bedep представлял собой модульный загрузчик, нацеленный на мошенничество с рекламными кликами. Он распространялся исключительно через эксплойт-пакет Angler, который использовал уязвимость нулевого дня во Flash (CVE-2015-0311). В начале 2015 года появились новые версии Bedep с собственным DGA для разрешения адресов командных серверов. Аналитики компании Arbor Networks (подразделение ASERT) организовали трёхдневную "ловушку" (sinkhole) и зафиксировали обращения примерно от 82 тысяч уникальных IP-адресов со всех континентов, кроме России.

Сотрудник ASERT Деннис Шварц впервые восстановил алгоритм DGA и опубликовал его реализацию на Python, а также подробный отчёт. В своей работе он отметил, что часть преобразований осталась для него "чёрным ящиком", а одна из встроенных таблиц, по его предположению, "вероятно, связана с числами Ферма". Он оказался прав. Математическая начинка Bedep заслуживает отдельного разбора.

Хитрость с Европейским центральным банком

Обычно DGA использует дату в качестве начального значения (сида), чтобы и бот, и его владелец могли независимо вычислить одни и те же домены. Bedep пошёл дальше: он берёт не только дату, но и реальные курсы валют из открытых источников. Программа запрашивает два XML-файла: метку времени UTC с сервиса earthtools.org и ежедневные справочные курсы евро от Европейского центрального банка (ЕЦБ) за последние 90 дней. Из этих данных извлекаются курсы на "прошлый вторник" - алгоритм выбирает определённый день недели, чтобы обеспечить еженедельную смену списка доменов.

Из выбранной даты Bedep берёт до 48 курсов валют (доллар США, японская иена, британский фунт и другие). Каждое значение преобразуется в 64-битное число с плавающей запятой, после чего из него извлекаются младшие 32 бита для дальнейших вычислений. Почему это гениально? Курсы ЕЦБ общедоступны, одинаковы для всех ботов в мире, но их невозможно предсказать заранее - никто не знает, каким будет курс евро к доллару в следующий вторник. При этом подделать данные нельзя: ЕЦБ не станет менять официальные котировки, чтобы помочь аналитикам заблокировать сеть. Запросы к серверу ecb.europa.eu выглядят как обычный трафик пользователей, проверяющих курсы. Сетевые сигнатуры, пытающиеся обнаружить такие обращения, давали массу ложных срабатываний.

Математическое ядро: теория групп внутри DLL

Самое интересное начинается, когда из курсов формируется хеш, который служит индексом для поиска в заранее заготовленной таблице из 102 записей. Каждая запись, после расшифровки с помощью специальных констант, даёт два числа: простое число p и целое число q, которое делит p-1. Это основа для построения подгруппы мультипликативной группы по модулю p. Другими словами, автор заранее подобрал такие простые числа, для которых p-1 раскладывается на небольшие множители, что позволяет легко найти генератор группы. Все сложные вычисления были выполнены офлайн и вшиты в код.

Далее вредоносная программа запускает процедуру поиска первообразного корня - элемента, который порождает всю циклическую подгруппу порядка q. Алгоритм в точности соответствует классическому учебнику по теории чисел: перебирает кандидаты g, начиная с двойки, и проверяет, что g^((p-1)/q_i) не равно единице по модулю p для всех простых делителей q_i числа q. Это и есть стандартный метод поиска генератора. В результате Bedep получает число g, возведение в степень которого позволяет пройти по всем элементам подгруппы, кроме единичного.

Затем задаются два случайных показателя степени, полученных из счётчика тактов процессора. Один показатель - начальное положение в группе (seed), второй - шаг (step). После этого для каждого домена выполняется всего одно действие: seed = seed^step mod p. Каждое такое возведение в степень перемещает указатель на следующий элемент циклической подгруппы. Поскольку порядок подгруппы равен q, а шаг взаимно прост с q, обход гарантированно посетит все q-1 различных элементов ровно один раз. Никаких коллизий, никаких лишних итераций. Количество генерируемых доменов строго равно q-1 - для двух конфигураций, встроенных в одну версию, это 22 и 28 адресов, то есть 50 доменов в неделю.

От элемента группы к доменному имени

Полученное 32-битное число преобразуется в домен с помощью процедуры, которая использует все курсы валют. Каждый символ домена (от 12 до 18 букв, плюс две последние позиции могут содержать цифры) вычисляется через смешивание текущего элемента группы, дня и одного из курсов. Например, первый символ зависит от курса доллара, второй - от курса хорватской куны и так далее. Все домены регистрировались в зоне .com за 2-5 дней до начала использования через регистратора Domain Context. Инфраструктура командных серверов базировалась на нескольких IP-адресах во Франции.

Почему это важно

Сравните Bedep с другими семействами того времени. Conficker.C, Gamaredon, Necurs, Matsnu - все они используют предсказуемые сиды, и их будущие домены можно вычислить за часы. Для Bedep это невозможно: курсы валют за следующий вторник ещё не опубликованы. Аналитикам приходится ждать данных от ЕЦБ, а затем вступать в гонку с операторами ботнета за регистрацию доменов. Математическая гарантия отсутствия коллизий и максимальная эффективность генерации делают этот DGA уникальным.

Автор Bedep явно не копировал код с форумов. Он понимал основы теории групп, знал, как находить первообразные корни, и заранее подобрал простые числа с гладким порядком. Всё это было реализовано в рабочей вредоносной программе, работавшей в масштабах десятков тысяч узлов. Отчёт Arbor Networks, опубликованный в 2015 году и сохранившийся в архивах, наглядно демонстрирует, как университетская математика применяется для практического обхода средств защиты.

Урок для специалистов по информационной безопасности: даже такой элегантный механизм в конечном счёте был раскрыт и нейтрализован. Но он напоминает, что изобретательность злоумышленников не ограничивается простыми алгоритмами. Каждый новый метод заставляет команды защиты быстрее реагировать и искать нестандартные подходы, такие как мониторинг необычных DNS-запросов или анализ временных рядов курсов валют. Bedep остаётся ярким примером того, как передовая математика может служить как добру, так и злу.

Индикаторы компрометации

MD5

  • e5e72baff4fab6ea6a1fcac467dc4351

SHA256

  • d0fb1b66b6e4da395892327be9f39adb4533e7759ace39f67bdde0bb1cdaef35

Комментарии: 0