Коротко о Bungee
BungeeCord — прокси-сервер, позволяющий игровым проектам объединять несколько серверов Minecraft с возможностью быстрого переключения игроков между ними.
В этой статье я поделюсь опытом работы с ядром, расскажу о проблемах с безопасностью на использующих его серверах, а так же дам несколько простых советов, которые, возможно, помогут предотвратить взлом такого сервера.
Коротко, где чаще всего используется BungeeCord:
- Сервера с несколькими игровыми режимами (в том числе, сервера с мини-играми)
- Сервера с высокой нагрузкой и необходимостью распределения онлайна
- Сервера, использующие защиту от бот-атак на основе BotFilter (характерный признак такого сервера — «проверка на падение» или капча при входе)
Наиболее распространенные уязвимости таких серверов:
- Неконтролируемый доступ к командам прокси-сервера
- Обход сервера авторизации
- Подмена данных игрока
- Уязвимости модулей промежуточных серверов
Как это работает
Большинство проектов под управлением BungeeCord представляют из себя следующую цепочку серверов (которые могут располагаться хоть на одном IP с разными портами, хоть на машинах в разных частях мира).
Proxy
Первый этап — собственно, это и есть сам сервер, к которому подключаются игроки. Он не имеет точки спавна или игровых миров — его задача перенаправить подключившегося к следующему этапу.
Казалось бы, тут все просто — но нет.
Основную прелесть, а вместе с тем и проблему на этом этапе составляет само перенаправление — сервер не просто редиректит игрока к другому IP, а выполняет роль промежуточного сервера.
Проще говоря, все команды, которые игрок отправляет, все пакеты синхронизации, каждое сообщение в чате сначала обрабатывается именно тут.
Чем нам это грозит?
Объясню на гипотетическом примере: Наш разработчик Drygok, доблестно выполняя свою работу, имеет на серверах права, близкие к максимальным. Он прекрасно защитил свой аккаунт собственной системой авторизации — сложный пароль, двухфакторная аутентификация, да еще и привязка к конкретному диапазону IP-адресов его провайдера, после чего со спокойной душой выходит с сервера, но через 10 минут все игроки «вылетают», а сервера останавливаются потому что кто-то выполнил команду /end от его имени.
Что же произошло? Все просто: Неизвестный вошел в игру под никнеймом нашего разработчика и, игнорируя требования сервера авторизоваться, ввел команду, которая обрабатывается самим Прокси-сервером, а значит не может быть предотвращена даже для неавторизованных пользователей.
Как предотвратить?
Простейший способ предотвращения подобных ситуаций — отключение всех внутренних команд ядра и обнуление любых прав на этом этапе. Даже для разработчика. Тем более для разработчика.
Сервер авторизации
Второй этап в цепочке — сервер, на котором игрок регистрируется и авторизуется.
Именно тут наш пользователь впервые почувствует твердую кубическую землю под своими геометрическими ногами.
Чаще всего сервера этого этапа выглядят примерно так:
- Небольшой участок земли в бескрайнем пространстве пустого мира, где игрок стоит до успешной (или не очень) авторизации
- Базовые плагины:
SkinsRestorer - плагин, восстанавливающий скин игрока, пропавший из-за использования прокси
Любой плагин авторизации (иногда собственный, но чаще один из популярнейших)
Плагин, перенаправляющий игроков на следующий этап (иногда это делает плагин авторизации)
Плагин, ограничивающий выполнение циклов обновления мира (отключение AI живых существ, смены погоды и времени суток, запрет обновления блоков и пр.)
Плагин, скрывающий игроков друг от друга
AutoSaveWorld для удобного взаимодействия с загруженными плагинами и миром
- Отсутствие какого-либо контроля прав
- Отсутствие любых систем защиты от уязвимостей ядра или самой игры
Основная проблема на этом этапе — чрезвычайные права для игроков. Редко кто-то занимается их настройкой, ведь воспользоваться ими сможет только авторизованный игрок, а при авторизации игрока сразу перенаправляет на следующий этап.
Чем нам это грозит?
В некоторых случаях игрок может предотвратить перенаправление на другой сервер после авторизации: Зачастую быстрые переподключения к игровому серверу предотвращаются ядром или плагинами того сервера. Так, при переподключении игрока сразу после успешной авторизации, сервер на следующем этапе может отклонить подключение и авторизованный игрок останется на сервере авторизации.
Далее игрок, имеющий повышенные права, спокойно узнает список установленных у нас плагинов (/plugins), а далее, узнавая их возможности с имеющимися у него правами, начинает свое темное дело.
Приведу два примера, которые встречал лично далеко не единожды.
Пример первый. Доступ к ASW.
AutoSaveWorld — крайне полезный, а вместе с тем и опасный плагин для любого сервера. Его возможности в моем пересказе, кратко:
- Автоматическое сохранение мира
- Автоматический бекап мира
- Очистка мира по заданным настройкам
- Подключение, перезагрузка и отключение плагинов без перезапуска игрового сервера (/asw pmanager)
- Запуск, остановка и управление порожденными процессами (/asw process)
Нас интересует последний пункт из этого списка.
Нет, это не ошибка. На огромном количестве серверов и правда стоит плагин, позволяющий запустить любой процесс, имея соответствующий доступ, который некоторые сервера предоставляют всем игрокам на этом этапе.
В таком случае какой-нибудь
/asw process start QQHABR rm -rf /
(НЕ ВЫПОЛНЯЙТЕ ЭТУ КОМАНДУ!) будет наименьшей из проблем. Думаю, рассказывать, что может сделать «взломщик» с доступом к терминалу, не стоит.Пример второй. Безобидный SkinsRestorer.
SkinsRestorer — крайне популярный плагин, использующийся на огромном количестве серверов. В основном он используется для восстановления пропавших из-за использования прокси скинов, но так же имеет возможность установки собственных. Именно эта возможность и является потенциальной уязвимостью.
С помощью команды /skin можно не только загрузить скин другого игрока с его никнеймом, но и установить собственный, указав адрес изображения (/skin URL). Опасность этой команды заключается в том, что изначально доступ к ней предполагается для игроков (а не только при неправильной настройке прав, как в случае с ASW).
Как же это можно использовать? Загрузка изображения по указанному адресу — обычный GET-запрос. Запрос, выполняемый с самого сервера.
Вариантов дальнейшего использования множество — начиная с обращения к закрытому API (например, выдачи доната), доступ к которому предоставляется для определенных IP-адресов, заканчивая обычным флудом.
Как предотвратить?
Предотвратить подобное можно, ограничивая права игроков (что рекомендуется делать на любом сервере), блокировать все возможные команды кроме команд авторизации и регистрации, а так же запретить установку собственного скина по URL (рекомендую сделать это на всех серверах)
Hub
Hub — общее пространство, куда попадают игроки для выбора игрового сервера и режима
Чаще всего Хабы, как и основные игровые сервера, уникальны для каждого сервера, но некоторые проблемы безопасности для них едины.
Прямое подключение
Подключаясь к этому серверу напрямую (к его IP), игрок может миновать предыдущие этапы, в том числе авторизацию
Чем нам это грозит?
Пропустив этап авторизации, игрок может пользоваться всеми правами пользователя, никнейм которого использован для подключения
Как предотвратить?
Большинство ядер сервера имеет встроенную настройку, блокирующую подключение без использования BungeeCord. Например, Spigot в spigot.yml:
settings:
bungeecord: true
Если Вы используете эту настройку — обязательно прочитайте следующий пункт!
Подмена данных игрока
Практически все ядра серверов, блокирующие прямое подключение к серверу (в том числе Spigot), имеют активную уязвимость, связанную с подменой данных игрока через собственный BungeeCord-сервер: Игрок ставит свой прокси-сервер с перенаправлением подключений на наш основной игровой сервер, таким образом ядро игрового сервера определяет, что для подключения используется BungeeCord и доверяет всем данным, передаваемым с него (IP прокси на совпадение с IP сервера в таком случае не проверяется)
Чем нам это грозит?
Чаще всего таким образом подменяются: IP игрока (обход сессий и получение доступа к чужому аккаунту) и UUID (используется некоторыми плагинами и самим сервером для идентификации игрока, обход контроля прав и доступ к правам других игроков).
При использовании BungeeCord необходимо исправлять самостоятельно, иначе это может позволить злоумышленнику получить доступ не только к аккаунтам игроков, но и к возможностям администраторов!
Как предотвратить?
Предотвратить это проще всего закрытием лишних портов для сторонних подключений, а => любой возможности подключения к серверу в обход Proxy-сервера.
Рекомендуется закрытие для внешнего подключения всех портов всех серверов кроме основного BungeeCord-сервера!
Игровые сервера
Игровые сервера с собственными режимами. Актуально все изложенное выше.