Кто остановил шредер или как нужно было проходить квест с уничтожением сервера

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

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

emo30hzrnwdncjx-ezjh4m7beci.jpeg


И вот как это закончилось:

Как всё начиналось и о чём вообще речь?


Игра началась 12 августа, когда мы выложили в блоге пост с видеороликом, в котором хакер в образе черепа предлагает сыграть в игру, уничтожить сервер, устроить в комнате короткое замыкание (ну или мини-пожар) и забрать оставшиеся в шредере деньги.

Это был онлайн-квест: мы запустили ютуб-трансляцию из комнаты, которую заполнили iot-устройствами, подкроватным сервером (который и надо было уничтожить), а над сервером закрепили аквариум и подвесили над ним гирю. Чтобы игра была более остросюжетной, мы решили сделать призовой фонд в 200 000 рублей, который загрузили в шредер и настроили его на включение каждые 60 минут. Каждый час шредер съедал по 1000 рублей — чем раньше игроки остановили бы его, тем больше денег бы выиграли.

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

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

Над проектом не покладая рук трудились 7 человек: бекендер, специалист-хардващик, настоящий кинопродюсер, CG-дизайнер и два идейных вдохновителя-сопродюсера.

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

Что было у игроков в начале игры


Все предметы в комнате делились на три категории:

  • Простые в управлении, не игровые iot-устройства
  • Игровые устройства для прохождения квеста
  • Антураж


jkiqfg2wtveysw9oykc1jnpznhi.png

Мы разместили 8 очень простых в управлении элементов: две лампы, одну гирлянду, пять букв СОКОЛ, каждой из которых можно было менять цвет. Все это можно было включать/выключать прямо с сайта и сразу видеть результат на трансляции — мы специально сделали их доступными для всех игроков, вне зависимости от уровня технической подкованности.

jfv30m8fzbptjfzupedh-gpclio.png
Все, что просто включалось с сайта

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

  1. Сервер с открытой крышкой и аквариумом над ним
  2. Гиря, подвешеная так, чтобы разбить аквариум
  3. Мегатрон 3000 — мощная лазерная указка, направленная на верёвку, которая держит гирю
  4. Мощный вентилятор, который запускался при нагрузке на сервер
  5. Флипчарт, на котором были написаны логин и пароль к Мегатрону
  6. Телефон, на который можно было позвонить и увидеть свой звонок в прямом эфире
  7. Шредер, который поедал по 1000-рублевой бумажке в час


Как именно разгадывался квест


Скажу сразу: ларчик открывался довольно просто.

Целью игры было остановить шредер, устроив в комнате короткое замыкание. Для этого надо было разбить аквариум, запустив в нее гирю и залить водой сервер. Гиря держалась на шнурке, на который был нацелен Мегатрон. Захватив управление Мегатроном, веревку можно было перерезать. Это делалось в 5 простых шагов:

Шаг 1. Нагрузить сервер, стоящий в комнате


Например, посылая пакеты командой.

ab -r -n 10000 -c 100 -s 280 -l https://ws.ooosokol.ru/captcha


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

co7a7mfu4sijy-yit2grxrahqy8.png
Та самая капча, которую надо было атаковать

g_fnzrbzvvsqg5cqxrt80nfvavw.png

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

А саму страницу управления Мегатроном можно было найти, проверив все сертификаты, выпущенные на домен ooosokol.ru.

На поддомене megatron.ooosokol.ru находилась страница управления Мегатроном. Но она не открывалась, пока на Мегатрон не подадут первичное питание.

Все эти этапы игроки прошли почти сразу в комментариях трансляции на youtube. Дальше задачки были посложнее и игроки создали дискорд-сервер RUVDS Hack Room и продолжили обсуждение там.

Шаг 2. Подать первичное питание на Мегатрон


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

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

h5tkr1hggczqjxy2gwsiphea-oc.png

Для этого нужно было посмотреть на идентификаторы устройств и заметить, всего устройств 4, а на сайте доступно только 3.

lwi-b3mzgl7wvlcesapeoxb0oya.png

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

nal5eqgjtbqrhuwzl2rj2e1-8vo.png
Подсказка об управляющей компании

3. Дозвониться до управляющей компании и попросить включить питание Мегатрона


По ЛОРу Мегатрон не мог выстрелить, потому что в офисе выбило пробки. Включить питание обратно могла только управляющая компания, до которой надо было дозвониться и пройти идентификацию, как владелец ООО.

Найти номер управляющей компании было легко — мы вставили её прямо в футер.

3ko4l8e7vmfgnwgob8bza3eeqyk.png

А вот пройти идентификацию было гораздо сложнее.

При звонке на номер +74991130688, трубку поднимала девушка-оператор и скучающим голосом просила назвать ИНН компании и полное ФИО владельца. Без этого включать питание она отказывалась и объясняла это тем, что она обычная диспетчерская на аутсорсе, у них 2000 клиентов и офисов и без этой информации найти нужный просто не получается.

Для игроков это оказалось самым сложным этапом. Правильные ИНН и ФИО владельца искали почти двое суток, а я (в лице оператора диспетчерской) за это время приняла более 400 звонков. Телефон звонил каждые 2–3 минуты.

Ребята копали как могли. В ход шло всё: они потрошили исходники сайта, гуглили владельца сайта Соколова, пробивали по соцсетям.

Они искали ИНН разных компаний


В какой-то момент даже позвонили с подменой номера — будто бы звонили из офиса компании Сокол, указанной в футере.

Тогда мы узнали, какое огромное количество компаний носит название Сокол. Практически каждой из этих компаний дозванивались игроки, но это ни шло ни в какое сравнение с тем, что пережил сайт lasermasters.ru, у которых мы действительно покупали тот самый Мегатрон около месяца назад.

Сначала дискорд атаковал поддержку Лазерсмастерс.

scchin3bnninfrrpo-pdhlnqzlm.jpeg

Затем смогли найти там чей-то аккаунт! В то время как поддержка Лазермастерс уже перестала скупиться на выражения.

Осторожно, уберите детей от экрана
ve0sovnlo9qzdzputgxkcxpi_tk.png
s3bbrhmh-d1ziekeuldbkp-nrik.png


В конце концов, решили Лазермастерс просто заддосить и их сайт упал. Равно как удалось положить и сайт Сокола, хотя мы его быстро подняли.

e48q-b6gvy5zm2yu8bqmg0jgzke.jpeg

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

nz-h6nnxd_ojt2stixhz9wl0exo.png
Андрей Соколов, персонаж игры

kljly6n4gppjcnhhay1omjvsdyq.jpeg
Юрий, модель

Если бы он знал, как заставил 600 человек не спать двое суток…)

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

2pqx-haprp_trwkygdpgv7osntg.jpeg

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

Мой дорогой родной брат, которому тоже перепало
ukt2xxibdmbpvb_5u8g-i4w2ajw.jpeg


Тем временем догадки становились всё невероятнее и невероятнее
a5r2rpptb6qo-u22naihwx12tfe.jpeg

И дошло до иллюминатских теорий.

pv_w5ngyhdcisupkrh1celrbln0.jpeg


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

Откуда Спанч Боб и Гарри Поттер, скажете вы? Мы засунули их адреса в страницу контактов Сокола и это породило массу догадок в дискорд-сообществе. Хотя мы просто хотели отдать дань своим любимым произведениям детства.

yxp1fjimeccarh5bbxgdv04ozkq.png
Та самая отсылка на странице «Контакты»

И в результате

zqg8djdghuu9ij-bt4oiyqxed0m.jpeg

orfzg9ic4mz0goeku7aoy7v8r6u.jpeg

peaub7dcy8maxnd0s0qsqahqaga.jpeg

wlmou8y-j8jzqb9p-bc5auvvmp0.jpeg

2ak93ulneti4i-eb9xhholx2zcm.jpeg
Оказалось в сериале действительно есть документы Губки Боба. Их называли как ИНН

6rwfyibndz4xlvnf-vwnst3kkhi.jpeg

Одна из самых сложных теорий была о том, что в мигании китайской гирлянды зашито сообщение азбукой морзе.

Мерцание записывали и пытались расшифровать


Из теорий попроще — ребята пытались понять, не зашита ли подсказка в картах.

nfr2pum2jedmqeh5xudwbogwgwq.jpeg

По дороге нас сравнивали с Цикадой 3310 — незаслуженно высокая оценка, но всё равно приятная.

igawmvw32lm31jaesf1mniug52c.jpeg

fxiu5df0eoqhawul22xct_m3vwa.jpeg

Игроки вовсю пробовали социальную инженерию. Мне звонили под видом ФСБ, пожарных, самого Соколова, его бывшей жены и охранника, который якобы сидит у нас внизу. Говорили, что начался пожар, кто-то застрял в лифте, а самая душераздирающая история была о том, что в офисе, охваченном огнём, якобы сидит песик звонившего.

puwf3xdju-xbhhzyfdlng2d5ha8.jpeg
Попытки подкупа тоже были

Потихоньку в чате стали появляться собственные мемы.

Вот парочка


А заводы тем временем простаивали


Подсказка


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

Отдельным постом в блоге мы выложили ролик. В начале был вставлен кусочек из Бойцовского Клуба — как отсылку к Тайлеру Дердену, который помышлял вставкой 25-го кадра в фильмы, пока работал в кинотеатрах.

Мы решили применить эту же механику и вставили 25-м кадром подсказку, как загуглить верный ИНН и ФИО владельца.

ulsyqsxkjylrs3pkvp8bolrv5ji.png
После этого ребята разобрались очень быстро

Шаг 4. Пострелять лазером в не-боевом режиме


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

3q-qinarads5zvbczqzuwq4myyu.png
Каждые 25 секунд генерировался новый токен, его можно было использовать, чтобы включить лазер на 10 секунд на мощности 10/255

Затем лазер охлаждался 1 минуту и в эту минуту был недоступен, не принимал новые запросы на выстрел.

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

Реакция сообщества была более, чем бурной
mwlx9pifluplj_6dl1eldy0nrqe.jpeg


Но все быстро успокоились и поняли, что это еще не конец игры
1xgiuib-wnbufgfcmzkyg-xueqm.jpeg


Дальше сообщество начало разбираться, как запустить боевой режим

Брейншторм


Сообщество подошло к шагу 4. Разобраться, как генерируются токены: найти gist и сгенерировать токен, который включает лазер в боевом режиме


Боевой режим Мегатрона — это 100% мощность лазера в 3 Вт. Этого вполне достаточно на 2 минуты, чтобы пережечь верёвку, которая держала гирю, разбить аквариум и залить сервер водой.

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

6uado5glxmf76qycvrxn7piq3la.png
Как все быстро догадались, это было 42

В комментариях гиста была переписка Андрея Соколова с разработчиком («мудрый разраб», как назвали его ребята из дискорда).

В переписке Андрей присылал один из боевых токенов, а разраб ответил, что этот токен был иницииализирован при значении счетчика 42.

ncaxegpry8a4wyobkt7dt27sj-w.png

Зная эти данные, можно было перебрать 2 последних символа соли и фактически выяснить, что для нее использовались числа из Lost, переведенные в 16-ичную систему.

Дальше игрокам оставалось поймать значение счётчика (проанализировав тестовый токен) и сгенерировать боевой токен, используя следующее значение счётчика и подобранную на прошлом шаге соль.

Счётчик просто инкрементировался при каждом тестовом выстреле и каждые 25 секунд. Об этом мы нигде не писали, это должно было быть небольшой игровой неожиданностью. Ребята с этим очень быстро разобрались и запустили мегатрон в боевом режиме.

Шаг 5. Пережечь лазером верёвку



Как это было

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

  • Выключался весь свет в комнате
  • Кнопки iot-девайсов на сайте становились недоступны
  • Включалась мигалка и звук сирены
  • Красная гиря подсвечивалась
  • На экране телевизора начинался обратный отсчёт до запуска лазера в боевой режим


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

Тем временем в дискорде
l-x1elrnpdybuzvrvta8amemszs.jpeg

tyornojftbf1jlmextdqbsa4rqs.jpeg


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

Раз уж вся команда собралась там, мы сняли небольшое обращение всем, кто двое суток боролся за финал с дискорде и пошли открывать шампанское:

Как мы просчитали время запуска рекламных видеороликов и полёт гири?


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

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

Что у нас не получилось?


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

Кто же победитель?


Победителем вышел Аркадий Алексеев из Санкт-Петербурга — именно он первым сгенерировал тестовый токен и выиграл оставшиеся в шредере деньги в размере 134 000 рублей.

Небольшое интервью с Аркадием.

Расскажи о себе, чем занимаешься на работе?


По образованию я безопасник, закончил БИТ в ИТМО. Работаю фулстэк-веб-разработчиком на аутсорсе. В школе был олимпиадником, в том числе по программированию и математике.


Как узнал про игру?


Зашел на Хабр просто почитать, увидел статью, заинтересовался.


Сколько часов играл, когда присоединился?


Присоединился вечером того дня, когда выложили статью (т.е. за сутки до конца). Посидел вечер и немалую часть следующего дня.


Что понравилось, что нет?


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


Как ты понял, как найти боевой токен к мегатрону?


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

Еще легко было найти профиль на гитхабе и гист с комментами. Оттуда очевиден процесс генерации токена и secret для него же. В таких квестах не нужно шибко изобретать имхо, так как можно утонуть в куче вариантов развития событий; и соответственно надо следовать туда, куда тебя толкает создатель квеста.

С учётом остальных поддоменов и тестового сайта на тильде, было ясно, что после подачи питания на лазер, надо будет подобрать токен. Соответственно ещё в тот же вечер я набросал примерный запрос на включение лазера (на основании 4х доступных форм: 1 на рабочем сайте и 3 на тестовом/старом) и попытался побрутить рабочими токенами начиная с 42 (ну так, на дурака — вдруг там уже всё включено, а страничку с отправкой токена просто откроют после ИНН и ФИО).

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

Ещё там была очевидная логика с вебсокетами и управлением устройств в app.js-файле. Там был жирный намёк на a9 устройство, при отправке power: true на которое сокет крашился. Я попытался всякое на него поотправлять — мало ли, там могло быть дополнительное устройство для разгадки ИНН, но без успехов.

Потом я ещё побрутил остальные айдишники рядом с теми десятью, но везде было unknown device. Ещё попытался погуглить всякое, залезть на chsokolow@gmail.com, поотправлял всякое в форме на странице прайс-листа, покопался с lasermasters, но всё без успехов. На следующий день сидел в чате, гуглил всякое, потом всплыла стего-тема и я посоветовался с человеком стегсолв для картинок и гифок (но умом понимал, что 99% там ничего нет, так как это было бы слишком + противоречие с основной линией квеста).

Но в итоге тоже пару часов сидел и копался во всех пикчах и гифках. Еще пару раз звонил с различными вариантами ИНН, но мимо. Потом уже решил подзабить, но там подсказку выложили — и стало ясно, что в ближайшее время ИНН найдут, что и случилось. Потом то ли я, то ли кто-то ещё (там не очевидно) отправил power: true на а9-устройство и лазер заработал, хотя может быть тут связи нет и он заработал просто после ИНН. В общем, зашёл в админку лазера и немало удивился, так как сервер сам присылал токен (а я то уже готовился брутить). Стало очевидно, что токен тестовый, так как трансляция + здравый смысл + я его проверил.

В коде была логика отправки рабочего токена куда-то нотификацией, но, видимо, либо это был неверный код, либо это было нужно для других частей системы. Я набросал скрипт для получения текущего рабочего токена из текущего тестового и стал сидеть на ф5, пытаясь их отправить — с этим были проблемы, так как все постоянно тыкали кнопку отправки по возможности тем самым изменяя токен. Потом еще сайт упал, счетчик сбросился, но уже не суть — через некоторое время я отправил рабочий токен. По идее счетчик был 58 и токен был 449a776938f7ce4cf19f8603045dca0f на момент активации, если не ошибаюсь. Собственно всё.

Потом у меня еще несколько подгорело от комментов, а ля «да это все тривиально, да повезло прост». Ну, если зайти на страницу, подумать минутку, написать скрипт за пару минут, проверить его — то да, тривиально. Но я сделал это секунд за 10–20, и потом просто несколько минут не мог отправить токен.

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


Но это ещё не конец


Мне совершенно не терпится рассказать вам о всей замечательной команде, которая строила этот квест и всех инженерных решениях, которые она находила. Но этот пост и так получился слишком огромным — поэтому об этом будут отдельные статьи, так что stay tuned и подписывайтесь на наш блог на Хабре.

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru