Почему у P2P-ботнета нет сервера, который можно просто выключить

1663
Почему у P2P-ботнета нет сервера, который можно просто выключить

Представим миллион заражённых компьютеров, которые раз в несколько минут спрашивают один сервер, что делать дальше. Для преступника схема удобная, но у защитников появляется очевидная цель. Найти сервер управления, изъять его или перехватить домен. Даже огромный ботнет после такой операции может за несколько минут превратиться в толпу заражённых машин, которые больше не знают, куда обращаться за командами.

P2P-ботнет ломает такую модель. Заражённые компьютеры находят друг друга и сами распространяют сведения о соседях, заданиях или адресах дополнительного вредоносного ПО. Центрального узла, без которого перестанет работать вся сеть, может не существовать. Поэтому борьба перемещается с серверов на уровень самого сетевого протокола. Недавняя операция против Sality показала редкий пример такой атаки на инфраструктуру ботнета изнутри.

Здесь сразу поправлю красивую, но неточную историю про «P2P-ботнет, проживший без сервера с 2003 года». Семейство Sality действительно известно с 2003 года, однако ранние версии использовали более традиционную инфраструктуру. P2P-компонент появился примерно в 2008 году. Значит, больше двадцати лет прожило само семейство вредоносного ПО, а децентрализованная сеть существовала около восемнадцати лет. Масштаб все равно впечатляет.

В конце августа международная операция с участием американских и европейских правоохранителей, CrowdStrike и Shadowserver нарушила работу Sality. На момент операции две независимые P2P-сети Sality версий 3 и 4 все еще связывали более 15 тысяч заражённых систем по всему миру. Технические детали опубликованы в разборе CrowdStrike, а юридическую часть и международное участие подтвердил Минюст США.

Как ботнет становится сетью без главного узла

Обычный централизованный ботнет можно нарисовать несколькими строками.

оператор
    |
    v
 C2-сервер
  |   |   |
  v   v   v
 бот бот бот

C2 означает инфраструктуру командования и управления. Вредонос периодически подключается к ней, получает задания, передает результаты и скачивает новые модули. Преступники могут использовать десятки серверов, прокси, постоянно меняющиеся домены и резервные адреса, но архитектура все равно содержит сравнительно небольшой набор узлов, от которых зависит управление.

Правоохранители поэтому часто стараются захватить домены и серверы одновременно. Вместо настоящего C2 заражённая машина начинает попадать на контролируемую инфраструктуру. Такой прием называют sinkholing. Sinkhole не обязательно удаляет вредонос с компьютера, но перехватывает его сетевое взаимодействие и позволяет увидеть адреса заражённых систем.

P2P меняет топологию.

бот A ----- бот B
   |           |
   |           |
 бот C ----- бот D ----- бот E
               |
               |
             бот F

Каждый узел знает несколько других участников. Исчез бот B, компьютер A попробует C. Пропал C, список можно дополнить адресами, полученными от D. Сеть постоянно обновляет собственную карту и переживает потерю отдельных машин.

При этом фраза «P2P-ботнет вообще не использует серверы» тоже вводит в заблуждение. Децентрализованным может быть только один уровень инфраструктуры. Например, заражённые компьютеры через P2P распространяют информацию о заданиях, но сами файлы скачивают с обычных веб-серверов. Другой ботнет может использовать P2P как резервный канал, а основной трафик гонять через классические C2. Kelihos вообще имел многоуровневую архитектуру с рабочими узлами, маршрутизаторами и отдельным уровнем серверов заданий.

Поэтому главное свойство P2P-ботнета не отсутствие серверов как класса. Главное свойство состоит в отсутствии единственной точки, уничтожение которой гарантированно разрушит канал управления.

Новой заражённой машине еще нужно как-то встретить первого участника. Для этого используется bootstrap. Вредонос может содержать несколько IP-адресов прямо внутри исполняемого файла, хранить резервные домены или применять другой механизм первоначального поиска.

Дальше бот получает peer list, список известных соседей. Работоспособные адреса остаются, исчезнувшие постепенно выбрасываются, новые распространяются между участниками. Список не обязательно содержит каждый заражённый компьютер. Домашняя машина за NAT обычно недоступна для входящего соединения, поэтому роль опорных узлов получают системы с публично доступными адресами. Их часто называют super peers.

Sality использовал как раз подобную модель. Старые технические исследования показывали список размером до 1000 узлов. Примерно раз в 40 минут вредонос проверял известных соседей. Успешно отвечающий узел повышал внутреннюю оценку доверия, недоступный постепенно терял ее и мог быть удалён из списка.

Механизм выглядит как обычное обслуживание распределённой сети, но именно здесь спустя годы обнаружилась возможность для ее изоляции.

Материал предназначен для легального изучения вредоносной инфраструктуры и методов защиты. Активное вмешательство в чужие узлы и сети без разрешения может нарушать закон. Нужно учитывать требования законодательства своей страны, включая российское, и не применять описанные принципы для несанкционированного доступа, слежки или вмешательства в работу чужих систем.

Почему нельзя просто войти в сеть и приказать ботам выключиться

На первый взгляд у P2P есть огромная уязвимость. Если любой заражённый компьютер принимает сообщения от соседей, исследователь может написать собственный клиент, подключиться к сети и отправить всем команду удалить вредонос.

Хорошо спроектированные ботнеты отделяют транспорт от полномочий.

Передать данные может обычный участник, но создать доверенное задание способен только оператор. Для проверки используются цифровые подписи. Внутри вредоноса хранится открытый ключ, а закрытый ключ остается у владельца ботнета. Оператор подписывает пакет, заражённые машины распространяют его по P2P-сети и перед выполнением проверяют подпись.

оператор
    |
 подписанное задание
    |
    v
 бот A -> бот B -> бот C -> бот D
           |                 |
           v                 v
      проверка подписи  проверка подписи

Исследователь может разговаривать с сетью и даже стать полноценным соседом тысяч заражённых машин, но подделать подпись без закрытого ключа не должен суметь. Децентрализована доставка, а не право командовать.

Sality хорошо показывает разницу между двумя уровнями доверия. Пакеты с полезной нагрузкой защищались криптографически. В актуальных версиях Sality находились встроенные открытые RSA-ключи для проверки подписи. Но сама P2P-сеть не требовала надежно доказать личность участника. Публично доступная машина, которая правильно отвечала на запросы протокола, могла выглядеть как обычный peer.

Для создателя ботнета такое решение казалось разумным. Подделать вредоносное задание нельзя, а свободный прием новых узлов делает сеть живучей. Однако спустя годы слабость второго механизма оказалась важнее стойкости первого.

Как Sality заставили забыть настоящих соседей

Исследователи не пытались подобрать закрытый RSA-ключ Sality и не рассылали ботам фальшивую команду самоуничтожения. Вместо команд они атаковали сведения о самой сети.

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

Сильно упрощённая схема выглядит так.

раньше
 
 заражённый компьютер
         |
         v
 настоящие super peers
         |
         v
 задания и адреса загрузки
 
 
 после изоляции
 
 заражённый компьютер
         |
         v
 контролируемые peers
         |
         v
 sinkhole

Подмена не требовала одновременно связаться с каждым заражённым компьютером. Большая часть обычных машин скрыта за NAT или межсетевыми экранами и не принимает произвольные входящие соединения. Но бот сам периодически ищет доступных соседей. Когда заражённая машина позже выходит к уже контролируемой части сети, ее список тоже можно постепенно очистить от настоящих узлов.

Параллельно правоохранители изымали связанные с Sality домены и нарушали работу адресов, с которых скачивалась дополнительная полезная нагрузка. Комбинация показывает, почему слово «децентрализованный» не означает «неуязвимый». Защитники атакуют разные уровни одновременно.

  • P2P-топология. Заражённые машины теряют доступ к настоящим соседям.
  • Серверы загрузки. Старые задания перестают приводить к работающим файлам.
  • Домены. Резервные каналы больше не возвращают оператора в сеть.
  • Sinkhole. Защитники видят оставшиеся заражения и передают сведения провайдерам и центрам реагирования.

CrowdStrike заявляет, что оператор Sality потерял возможность доставлять новые задания через две действовавшие P2P-сети. Формулировка «ботнет уничтожен» здесь слишком сильная. Техническая операция прошла совсем недавно, оператор публично не идентифицирован, а заражённые компьютеры никуда не исчезли. Точнее говорить о нарушении командной инфраструктуры и изоляции P2P-сети.

Есть еще одна причина, почему Sality оказался необычно удобной целью спустя столько лет. Сам вредонос распространялся как полиморфный файловый инфектор, заражая исполняемые файлы. Полноценное обновление установленной базы было намного сложнее, чем у обычного загрузчика, который получает новую версию с C2. Новому варианту пришлось бы фактически конкурировать со старым за те же файлы и хосты.

Поэтому архитектура, подарившая Sality исключительную долговечность, одновременно законсервировала старые свойства протокола. Исследователи знали многие из них еще в начале 2010-х. Спустя полтора десятилетия сеть все еще жила по тем же фундаментальным правилам.

GameOver Zeus, Kelihos и Mozi показывают три разных финала

В операции против Sality использовали класс приемов, который защитники отрабатывали на других P2P-ботнетах. Но результаты заметно различались.

GameOver Zeus стал одним из самых известных примеров. В отличие от ранних вариантов Zeus, банковский троян использовал P2P-инфраструктуру и к моменту международной операции насчитывал, по оценкам того времени, от 500 тысяч до миллиона заражённых компьютеров. В 2014 году защитники распространяли контролируемые сведения о соседях, изолировали заражённые машины от инфраструктуры оператора и перенаправляли их на замещающие серверы. Одновременно пришлось блокировать серверную часть и резервные механизмы. Иначе владелец получил бы шанс вернуть контроль, пока P2P-сеть перестраивалась.

Kelihos преподал другой урок. Ботнет несколько раз переживал операции по перехвату и возвращался в новой версии. Разработчики меняли протокол, ключи и архитектуру именно в ответ на предыдущие методы защиты. Последнее поколение использовало иерархию из рабочих ботов, публично доступных маршрутизаторов и серверов заданий. В 2017 году сеть удалось нейтрализовать одновременно с арестом Петра Левашова, впоследствии признавшего вину по делу, связанному с Kelihos.

История Kelihos показывает слабость самого понятия «takedown». Перехватить текущую сеть и остановить человека, способного завтра собрать новую, не одно и то же. После чисто технической операции разработчик может изменить протокол, выпустить другую сборку и начать заново.

Еще интереснее судьба IoT-ботнета Mozi. Его создателей задержали китайские правоохранители, но децентрализованная сеть не исчезла и продолжала самостоятельно заражать новые устройства. Получился почти автономный ботнет без нормальной работы оператора. Лишь через два года исследователи заметили резкое падение активности. По сети распространился правильно подписанный управляющий пакет, который отключал большую часть функций вредоноса.

Кто именно отправил такой «выключатель», достоверно не установлено. Исследователи рассматривали две основные версии. Команду могли выпустить сами разработчики Mozi либо китайские правоохранители при их содействии. Криптографическая подпись показала главное. Кто-то обладал закрытым ключом, которому доверяли заражённые устройства.

Ботнет Что обеспечивало живучесть Что использовали против сети
Sality P2P, списки соседей, файловое заражение Манипуляция peer list, sinkhole, изъятие доменов
GameOver Zeus P2P и резервная инфраструктура Изоляция peers и замещающие серверы
Kelihos Многоуровневая P2P-архитектура и новые поколения протокола Перехват сети вместе с юридической операцией против владельца
Mozi P2P позволял сети жить после исчезновения активного управления Правильно подписанная команда отключения

Из таких историй получается немного неожиданный вывод. Размер ботнета сам по себе плохо показывает его устойчивость. Централизованная сеть из сотен тысяч машин может развалиться после потери нескольких критичных серверов. Гораздо меньшая P2P-сеть способна годами существовать практически по инерции, если заражённые машины умеют самостоятельно находить соседей и обновлять собственную карту.

Но абсолютной децентрализации почти не бывает. Где-то остается точка доверия. Иногда ей служит закрытый криптографический ключ, иногда bootstrap-механизм, иногда сервер заданий, домен, веб-хостинг с полезной нагрузкой или ошибка в протоколе обмена соседями. Работа исследователей состоит не столько в поиске «главного сервера», сколько в поиске такой зависимости.

Именно поэтому захват C2 и удаление вредоноса нельзя считать одной операцией. После sinkhole компьютер все еще заражён. Старые модули могут продолжать работать, изменённые файлы остаются на диске, а другая вредоносная программа на той же машине вообще может использовать независимую инфраструктуру. Владельцу системы все равно требуется очистка или восстановление.

Sality в итоге хорошо отвечает на вопрос, почему некоторые ботнеты невозможно просто выключить. Причина не в миллионах компьютеров и не в какой-то мистической «неуязвимости P2P». Проблема начинается, когда сеть умеет самостоятельно восстанавливать связи и не зависит от одного адреса. Тогда защитникам приходится понять протокол лучше его создателя, найти правила, которым обязаны подчиняться все заражённые машины, и использовать именно эти правила против сети.

Самая ироничная часть истории Sality состоит в возрасте уязвимого решения. P2P сделал ботнет значительно устойчивее и помог ему прожить около восемнадцати лет в децентрализованной форме. Но ботнет так долго сохранял старую архитектуру, что механизм, предназначенный для автоматического восстановления сети, в конце концов превратился в механизм ее изоляции.

ботнет P2P Sality GameOver Zeus Kelihos вредонос sinkhole киберпреступность
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
JATOBA
21.1011:00
Как обеспечить защиту ИБ-систем в регулируемых инфраструктурах?Security Vision и ГАЗИНФОРМСЕРВИС 21 октября на бесплатном вебинаре расскажут о совместном решении на базе сертифицированной СУБД Jatoba: от защиты данных до масштабирования и отказоустойчивости.Регистрация
18+. Реклама. Рекламодатель ООО «Интеллектуальная безопасность», ИНН 7719435412