Pull to refresh

В поиске бесплатных билетов, исследование игры Аэрофлота: Миссия 2017

Reading time 3 min
Views 10K
В преддверие Нового Года, разгребая тонны поздравительных писем, я наткнулся на предложение от Аэрофлота спасти Новый Год и получить 150 000 миль за первое место. Памятую о прошлой их промо акции и имея слабость к взломуанализу подобных мероприятий, я перешел по ссылке.



Промо было сделано в виде игры, суть которой заключалась в отгадывании точки на карте по изображению с Google StreetView и получение за это все очков, количество которых пропорционально точности ответа. На все про все дается 6 минут. Также между раундами предлагается половить\покидать подарки и полетать на аэроплане за дополнительные очки. Шесть минут можно увеличить до десяти, правильно ответив на вопросы викторины. За хорошие результаты дают порядочное количество миль.

Просканив директории(для успокоения души) и не найдя ничего интересного(кроме торчащего в Интернет phpmyadmin), я приступил к анализу самой игры.

1) Первое, что нашел это Replay атака. Раунд не помечается, как сыгранный и один и тот же запрос можно посылать бесконечно, получаю профит.

for i in {0..50}; 
  do torify curl 'http://mission2017.aeroflot.ru/ajax/round' --data 'val1=49&val2=9&game=563058&round=4974078&atype=map' & done;

Однако, эту уязвимость быстро закрыли.

2) Мини-игры реализовывали всю логику на своей стороне. И отправляли на сервер только итоги. Соответственно данные запросы можно было модифицировать и пролетать сотни тысяч км на своем аэроплане.

3) Викторина до конца промо была уязвима для Replay атак. Так что можно было накручивать себе время на игру. Минус этого метода в том, что по логике создателей, невозможно набрать более 10 минут времени, поэтому результат выбивался бы из ровного списка десятиминутников.

4) Но все вышеперечисленное — это хаки, которые можно отследить и наказать за них. Значит настало время писать бота! Скрипт игры представляет из себя неплохой необфусцированный код, с довольно ясными именованием функций и переменных. Примечательно, что в ответе на запрос к /ajax/round приходили верные координаты. Это обстоятельство позволяло замапить каждый url панорамы на координаты.

map = {"https://www.google.com/maps/embed/v1/streetview?pano=_EjgB69lOpQheNB4ldZWsA&key=AIzaSyAdpt2jitUXkLd8NtkNQ_Ee6THUA_DZ-K0" : {lat: 40.62, lon: 22.94},
 "https://www.google.com/maps/embed/v1/streetview?pano=oIMBbAJeLJfwiwNtgiVl-g&key=AIzaSyAdpt2jitUXkLd8NtkNQ_Ee6THUA_DZ-K0" : {lat: 22.27, lon: 114.16},
 ...
}

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

Стоит отдать должно разработчикам(а может быть модераторам), у них был неплохой антифрод и все сомнительные участники банились. Я не смог выяснить все параметры по которым производился анализ на фрод, но два из них мне известен: скорость и точность ответа.

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

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

1) STO — Security Through Obscurity, отсекает ленивых и школьников. Обфускация и шифрование — наше все!
2) Плохая идея возвращать участнику координаты верной точки в чистом виде. Решить проблему можно по разному: возвращать результат в виде изображения или маски над ним, преобразовывать в другую систему координат с меньшей точностью.
3) Добавить больше клиент-серверного взаимодействия, например нажатие клавиш, перемещение курсора, клики. Данная мера усложнит написание ботов для мини-игр и добавит данных для проведения обратного теста Тьюринга.

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

P.S. Все действия произведенные мной носят исследовательский характер, а выводы надеюсь послужат назиданием разработчикам промо.
Tags:
Hubs:
+16
Comments 11
Comments Comments 11

Articles