GodMode in Backyard Monsters или «А как вы обмениваетесь данными с приложением»

в 14:10, , рубрики: flash, безопасность, игры, Песочница, социальные сети, метки: , , ,

Публикация со слов знакомого.

Однажды меня пригласили поиграть в игру Backyard Monsters на Google+. Игра не плохая, в интернетах пишут что это чуть ли не #1 игра в соцсетях. Играл я себе играл, и однажды (как любому программисту) стало скучно играться дальше. Долгие ожидания выполнения заданий, высокая стоимость действий (апгрейды, захват новых баз) превратили игру в некое подобие фермы — зашел, «собрал урожай» (пофармил нубов, неписей), поставил апаться какой нибудь домик на много часов (некоторые по неделе и больше апгрейдятся). Возникла мысль о написании бота. Тут и начались удивления от ДЫРЫ в безопасности.

Для начала поснифал трафик (при помощи Wireshark), посмотрел, какими запросами клиент и сервер обмениваются. Удивление раз: обмен идет обычным текстом (оказалось используют JSON). Попытка поиграться с заменой параметров приводила лишь к ошибке Invalid hash. Ну что же, пойдем ковырять саму флешку.
Интернеты посоветовали для этой цели AS3 Sorcerer. Получить флешку игры большого труда не составило. Приступаем к препарации.

После недолгого ковыряния найдена процедура отправки «сообщений» на сервер. И тут же рядом алгоритм генерации того самого хэша — генерируется на основании отправляемых данных, эдакая «подпись» сообщения. Пора попробовать самому сгенерить запрос, удостовериться в правильности догадок. Берем питон, для отправки/приема данных интернеты подсказывают requests. Пробуем получить информацию по своей базе. И… PROFIT! Есть контакт. Ура!!!
С преобразованием ответа из строки (JSON формат) в данные будет работать, по совету интернетов, ast.literal_eval(text.replace('null','None')). Этого для разбора достаточно (плюс еще несколько реплэйсов для нашего животного). Питоновский json-модуль попался позднее, да и не все с ним легко получилось. Из интересного в ответе:

{'fbid': '116797799793671216717', 'basevalue': 172461612,
'buildingdata': {'4787': {'l': 6, 't': 25, 'Y': -115, 'X': 235, 'id': 4787, 'fort': 4}, ...},
'resources': {'r4': 47358582, 'r1': 36449238, 'r1max': 75050000, 'r3': 72963216, 'r3max': 75050000, 'r2': 24155238, 'r2max': 75050000, 'r4max': 75050000},
'champion': {'ft': 1340003358, 'hp': 29751, 'l': 6, 'fb': 0, 'fd': 1, 't': 3},
'academy': {'C3': {'powerup': 3, 'level': 6}, ...}, 'quests': {'C51': 2, ...},
'credits': 4045, 'baseid': 1000071112, 'lockerdata': {'C10': {'t': 2}, ...}, 'userid': 79671, 'createtime': 1334196000, ...

fbid оказался G+ айдишником, тем самым, который нужен для посмотреть на профиль юзера.

Загрузка прошла успешно, надо попробовать чего нибудь сохранить. Изучение поснифанного трафика, текста флешки, несколько попыток с ошибками, поломанная (так что не зайти в игру) и успешно восстановленная база — и в результате имеем рабочий модуль для отправки валидных данных на сервер. Сразу найдено (и несколько позднее реализовано) несколько плюшек: установка себе любого количества ресурсов, возможность проапать любое здание, прокачать чемпиона, прокачать монстров по уровням и абилкам, моментально создать армию любого состава, получать монетки собирая мухоморы (240 монеток за полчаса). Чего еще желать?

Посмотрим на мир вокруг, на карту то есть. Снифаем, грипаем, прогаем, получаем результат — карта мира. Что тут есть из интересного?
{'53': {'77': {'c': 4, 'b': 3, 'uid': 79671, 'f': 4, 'i': 163, 'bid': 1000012527, 'fbid': 9223372036854775807L, ...}, ...

Игровой юзер айди uid, идентификатор базы bid. fbid у всех одинаковый. Странно… Дальнейший анализ показал, что для заглянуть к соседу в гости нужен всего лишь уже известный нам bid. Пробуем заглянуть программно… От ответа глаза полезли на лоб. И полные данные про здания, и про чемпиона, и про монстров, и про их апгрейды, и ненужное содержимое шопа, и количество ресурсов игрока. Рассказывают все, как будто я домой зашел. Ну что… видно кого выгоднее фармить. Эээ… что это...? Вражий fbid!!!

Смотрим на параметры, необходимые для «разговора» с сервером, находим самое необходимое, отбрасывая некоторые по очереди… Удивление два — нам нужен только fbid (G+ айдишник) и несколько констант. Так это… fbid любого соседа получается без особых проблем… Проверяем — глаза еще больше. Это что же? Мало того что с собой можно делать что угодно, так еще и соседям можно праздник устроить? Так и сделаем. Ставим анонимусовский Тор, что бы не светиться и приступаем. В процессе несколько удивлений поменьше, порция новых знаний и некоторый фан.

В результате вышло это и это.

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

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

Тут можно взять исходники рабочего читера для Google+.

Автор: Mogidin

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js