
Спустя много лет я решил поиграть в Minecraft на пиратских серверах. Никакого исследовательского умысла не было - просто хотел поиграть. Но профессиональная деформация взяла свое: я начал ковырять функционал плагинов сервера. То, что я обнаружил, заставило забыть про игру и открыть Interactsh
Спустя много лет я решил поиграть в Minecraft на пиратских серверах. Никакого исследовательского умысла не было - просто хотел поиграть. Но профессиональная деформация взяла свое: я начал ковырять функционал плагинов сервера. То, что я обнаружил, заставило забыть про игру и открыть Interactsh
Уязвимый компонент
Плагин Skins Restorer (повсеместно используется на пиратских серверах Minecraft для кастомизации внешности персонажа). Механика : игрок вводит в чат команду /skin url <ссылка>, после чего плагин инициирует загрузку изображения скина. На этом, казалось бы, безобидном действии строится все дальнейшее.
Технический анализ
Стало интересно, а что будет, если вставить ссылку от interachsh.
И получил результат, который меня насторожил: запросы приходили не с IP игрового сервера, а с нескольких разных IP адресов.
Дальнейший анализ показал, что архитектура плагина устроена следующим образом:
Сервер не проксирует трафик.
Сервер не проксирует трафик.
Он просто передает URL клиенту в составе игрового пакета.
Он просто передает URL клиенту в составе игрового пакета.
Клиент Minecraft самостоятельно выполняет HTTP запрос к указанному URL для загрузки файла скина.
Клиент Minecraft самостоятельно выполняет HTTP запрос к указанному URL для загрузки файла скина.
Если сервер не возвращает валидное изображение, клиент удерживает соединение до истечения тайм-аута (в зависимости от версии - от 15 до 60 секунд).
Если сервер не возвращает валидное изображение, клиент удерживает соединение до истечения тайм-аута (в зависимости от версии - от 15 до 60 секунд).
Никакой валидации URL на стороне сервера не происходит: можно указать любой HTTP/HTTPS эндпоинт
Никакой валидации URL на стороне сервера не происходит: можно указать любой HTTP/HTTPS эндпоинт
Вывод : любой игрок, находящийся на уязвимом сервере, может стать источником HTTP флуда на целевую жертву. Сервер выступает как командный центр (C2), а клиенты как узлы ботнета.
Почему это работает?
На этом этапе мне стало интересно: может ли один случайный игрок нанести урон? Очевидно, нет. Но в процессе исследования я столкнулся с теневым феноменом Minecraft комьюнити - спам ботами. Это целая индустрия: злоумышленники содержат фермы из десятков и сотен аккаунтов, размещенных на VPS, которые могут массово подключаться к серверам и выполнять команды. Боты управляются централизованно через C2 панель, где задаётся: целевой сервер, количество ботов, команда для спама. Случайное знакомство с владельцем одной из таких ферм позволило провести контролируемый эксперимент. Мы направили ботов на мой тестовый стенд.
Тестовый стенд: VPS с веб сервером nginx, без WAF, без CDN, без рейт лимита. Есть мониторинг CPU и мониторинг сетевого трафика в реальном времени. Сценарий 1 : Один сервер, 20 ботов.
20 подключенных ботов к одному серверу, непрерывно отправляли /skin url http://IP
20 подключенных ботов к одному серверу, непрерывно отправляли /skin url http://IP
Длительность: 30 минут
Длительность: 30 минут
Результат: нагрузка CPU поднялась с 2% до 18%. Сайт оставался доступен, но наблюдались задержки
Результат: нагрузка CPU поднялась с 2% до 18%. Сайт оставался доступен, но наблюдались задержки
Сценарий 2 : Три сервера, 300 ботов.
300 ботов, распределенных по 3-м серверам
300 ботов, распределенных по 3-м серверам
Длительность: до отказа цели
Длительность: до отказа цели
Результат: CPU достиг 100% за 14 минут. Сервер перестал отвечать на запросы
Результат: CPU достиг 100% за 14 минут. Сервер перестал отвечать на запросы
Ограничения и потенциал : Этот вектор не опасен для ресурсов уровня PayPal или Google с многослойной защитой. Но может быть опасен для малого или среднего бизнеса, чьи сайты хостятся на незащищенных серверах.