В течении года я работал над социальным приложением, где каждый может опубликовать или найти мероприятия на карте. То есть любой может заполнить информацию о том где и когда он хочет провести мероприятие. А потом договориться с другими в чате. Например можно отметить на карте, что завтра я пойду на такой-то квест и хочу набрать людей. И эта метка у всех отобразиться.
Вообще много размышлял над тем, что проблема начать что-то делать заключается в отсутствии единомышленников. Так происходит с пробежкой по утрам, походом в музеи, театры. А иногда вообще на квест хочется, а вокруг все уже морально старенькие. Ну и придумали решение, приложение с картой, где все желающие как-то провести время ставят соответствующую метку на карте. А другие эти метки видят и могут списаться в чатике. Ну и без понтов мы не могли, и прикрутили дофига всего поверх, от рисовалки на карте до модерации изображений по ИИ:) Оценить, что получилось можно по ссылке: https://play.google.com/store/apps/details?id=dev.platovco.letsgo Но только для товарищей с android, для ios и web еще пилим.
Кстати организаторов мероприятий мы пока решили поощрять. Условия как получать 500 рублей за каждое успешное мероприятие:
- Вы должны организовать реальное мероприятие в нашем приложении - На ваше мероприятия должны записаться 2 или более человека. Причем, это необязательно должны быть люди из вне. Вы можете попросить своих старых участников записаться через приложение. Обманом это не считается, да и отследить мы это не можем - После проведения мероприятия вы должны отправить фотоотчет о проведённом мероприятии. Вы можете тегнуть админа в чате мероприятия в приложении через @ moderator . Или написать напрямую мне в телегу @android_artem
Победа очень высоковероятна при соблюдении всех условий. Но не гарантирована. Если нас что-то смутит или не понравится, то можем и не дать. Но в наших же целях поощрять регулярных организаторов. А еще лучше, когда они останутся довольны) Пока проводим до конца января. Публиковать можно исключительно мероприятия. Публикации без мероприятий, а со спамом или анкетами для любовных знакомств блокируются. Но сначала предупреждение:)
Всем привет! Расскажу как я организовал небольшой, простенький CTF для своего друга. Что такое CTF? Постараюсь объяснить своими словами. Это онлайн квест, где для решения задачи необходимо найти спрятанный ключ/флаг. Как правило CTF чаще направлены на специалистов, разбирающихся в информационной безопасности. Т.к задания бывают по типу "получить доступ к базе данных на сервере, изучить данные в базе и найти в ней искомый ключ и подсказку, где находится следующее задание". Конечно, взламывать что-то незаконно. Организаторы CTF создают заранее уязвимые системы, раскидывают в них подсказки и.т.д. Таким образом создается некая песочница, где игроки пытаются найти слабые места в системе и получить искомые флаги.
В интернете очень много различных CTF и их подробных прохождений, можете ознакомиться самостоятельно, это действительно интересно. Я сам частенько в них участвую.
Рождение идеи
Мой друг недавно купил себе 3d-принтер, я подумал, здорово будет подарить ему компактную гравировочную машинку. У него есть китайский аналог dremel, но он большой и не подходит для совсем мелких работ. Случайно на youtube увидел интересный вариант гравировочной машинки и сразу понял что это будет хороший подарок другу на Новый год. Сразу заказал на Али.
Несколько недель ожидания и будущий подарок готов!
Концепция
Чтобы определить направление задач и сложность необходимо сначала составить модель игрока. Мой друг далек от инфобеза и он не IT-шник.Можно назвать его опытным пользователем ПК) Он рисует модели для печати на 3d принтере, с недавних пор решил изучить Питон. Периодически я помогаю ему решать задачи по программированию, обсуждаю с ним рефакторинг его кода. Иногда рассказываю ему про pipeline разработки, например, зачем нужна система контроля версий, и всякие истории про информационную безопасность, которые могут быть понятны и интересны обычному, нормальному человеку)
И так, исходя из вышеописанного, нужно сделать простые задачи. Никакого поиска и реализации уязвимостей, рысканья по linux серверам, дизассемблирования кода и прочего, что обычный человек знать не должен. Тем не менее, хочется чтобы друг почувствовал себя крутым IT-специалистом. Я решил что задачи должны быть ближе к разделу OSINT. Это направление где основной задачей является поиск информации из доступных источников.
Сеттинг игры я захотел сделать в стиле матрицы, зеленые экраны с терминалом, ручной ввод команд, минимум интерфейса и некая неизвестная тебе личность, которая ведет тебя.
Для лучшего погружения в атмосферу необходимо реализовать место концентрации, где игрок может как-то взаимодействовать со всей имеющейся у него информации.
Сюжет
Это очень важная часть любой игры. Хороший сюжет улучшает погружение и способствует лучшему понимаю происходящего. Помогает ответить на вопросы что и зачем делает игрок в конкретный момент времени.
К сожалению, я не сценарист да и времени совсем не было. Создать CTF я неожиданно решил перед самым новым годом.
Сюжет следующий - игрок получает посылку от Деда Мороза на новый год, но посылка необычная, это шкатулка закрытая на 2 кодовых замка. Чтобы узнать что внутри - необходимо получить два кода. Начальные подсказки приводят игрока на сервер, в последующем игрок понимает что он попал на секретный закрытый сервер (помните, я писал о месте концентрации) Дедушки Мороза. Используя данный сервер игрок ищет различные подсказки, которые помогут ему раздобыть коды от замка
Сам сюжет раскрывать нужно не сразу, сюжет должен быть небольшим сюрпризом. Сначала игрок должен выполнить несколько простых задач, для разминки. Проще говоря, пройти небольшое обучение а далее начать саму игру.
Упаковка подарка
Здесь все достаточно легко, в строительном магазине я купил самый простой ящик для инструментов. Сделал простые петли для замка. Замки у меня уже были.
Первая задача
Как я писал ранее, первая задача будет выдана игроку в лоб, без объяснений. Сюжетный квест еще не начался, но нам нужно немного разогреть игрока, чтобы к началу сюжета он уже понял что его ждет.
У нас есть основное место работы игрока - это терминал. Так вот импровизированное обучение будет состоять как раз к поиску и входу на этот терминал.
Вместе с контейнером игроку будет выдана мозаика, посмотрите на неё и подумайте, что с ней делать?
Собрали, что дальше?? Попробуйте понять, на что похоже эти странные надписи? У них есть что-то общее:
Строка состоит из букв нижнего регистра и цифр
Строка не имеет спецсимволов
Самое важное. Обратите внимание на конец каждой строки
Ответ под спойлером:
Каждая строка кончается доменной зонной( COM, RU, PRO, SITE), что подсказывает нам о том что это не просто сгенерированные строки а доменные имена!.
Введя различные строки в браузер и в одну из попыток открывается сайт. Ура!!
Рабочее место игрока
Хотелось сделать некий виртуальный рабочий стол/терминал, с красивым дизайном в стиле матрицы. Первая мысль была - дать доступ по ssh к серверу на linux, пускай с него и работает, запускает скрипты, выполняет команды, ищет подсказки. Мне показалось это слишком сложно для игрока, обычный пользователь может потратить достаточно времени чтобы подключиться по ssh. Тем более функционал полноценной ОС излишен, легко запутаться.
Решил создать веб-эмулятор терминала, конечно писать с нуля очень сильно не хотелось. Начал искать по интернету. В основном находились различные эмуляторы которые под видом терминала выводили надпись.
Например:
Демо. Красиво, но бесполезно. Нет обратной связи, мне необходимо чтобы игрок мог взаимодействовать с окружением.
Ищу дальше... все так-же запрограммированные скрипты с анимацией или полноценные проекты, эмулирующие SSH через веб. Мне не подходит.
Спустя несколько часов поиска я наткнулся на один крутой проект. jquery.terminal.
Именно то, что мне нужно, подумал я! Открытый исходный код, подробная документация, живое сообщество с кучей вопросов.
Покупаю виртуальный сервер, разворачиваю на нем nginx, привязываю домен и подключаю проект веб-терминала.
Игрока встречает молчаливая страница, которая просит ввести логин и пароль. Как его получить? Подумайте. Вся необходимая информация у вас есть.
Вторая задача
Вас встречает окно авторизации. Просит ввести логин, затем пароль. При неверном вводе комбинации логин-пароль, выводится стандартное сообщение об ошибке. Что делать?
Ответ под спойлером:
Посмотрите внимательно на открытую страницу в браузере. Посмотрели? Посмотрите еще) Периодически меняется заголовок вкладки. Появляется надпись "CTRL + SHIFT +I => Console". Это подсказка, необходимо открыть меню разработчика, вкладку консоль.
Третья задача
Выполнив действия из подсказки, игрок увидит строку:
secrethappynewyear@8ctkbvhvxftepw8.site
Очень интересно, но ничего не понятно. Попробовав различные комбинации логина и пароля из полученной новой информации игрок не приходит к результату. Что делать?
Ответ под спойлером:
Необходимо отправить любое письмо на почту, автоответчик направит вам письмо с логином и паролем
Успешно авторизуемся и попадаем внутрь терминала!
Разминка окончена. Пора играть!
После успешной авторизации нас встречает красивое(на мой взгляд) окно нашего виртуального терминала.
Здесь мы сразу видим подсказку, необходимо ввести команду help. Не будем тянуть время, вводим!
Видим несколько доступных команд в терминале. Первая в списке Into, логично начать с неё. Вводим:
Здесь то мы и получаем некоторую завязку сюжета
кто вспомнит, из какого CTF взята идея задания?
И так, игра началась!
Четвертая задача
У нас есть текст, который говорит о неком боте ассистенте. так-же отсылка к подписи деда мороза. Что будем делать?
Ответ под спойлером:
В тексте есть отсылка к мессенджеру телеграм и подписи деда. Необходимо найти бота в телеграмм по имени big_dick_ded_test_bot.
Открываем переписку с ботом видим следующее сообщение:
Пятая задача
На первый взгляд мы никуда не продвинулись с предыдущей подсказки. Подумайте еще. Бот рассказал нам о некотором github репозитории. Хорошо, идем на гит. Открываем главную и страницу иии... что делать дальше?
Мы помним как Дедушка Мороз везде любит подписываться. Попробуем через поиск что-нибудь найти. Находим один репозиторий. Описание репо сходится с тем, что говорил нам бот. Идем посмотреть.
Изучим структуру файлов репозитория. В корне есть три файла, классический README и два скрипта на Питоне:
Еще есть папка requests, внутри множество текстовых файлов.
Попробуем открыть любой из них, видим содержание:
Khoor Ghg Prurc,
L uhdoob zdqw d qhz vrffhu edoo iru Fkulvwpdv. Fdq brx sohdvh eulqj rqh iru ph? L surplvh wr sudfwlfh hyhub gdb!
Iurp, Doha
Кажется, с текстом что-то не так. Имена скриптов decrypt и encrypt подсказывают нам что с текстом производили некоторые манипуляции. Описание к репозиторию сообщает нам что обязательно шифровать все входящие заявки. Как это сделать, описано.
Что же, скачиваем репозиторий себе. Для начала откроем файл, который судя по названию должен шифровать данные.
Видим здесь небольшой скрипт, который шифрует данные в файлах в папке requests. Откроем файл decrypt
Код практически идентичен, используется самый простой алгоритм симметричного шифрования по ключу. На самом деле нам это знать и не нужно. Что делать дальше?
Ответ под спойлером:
По аналогии из описания с командой шифрования, нам необходимо выполнить расшифровку текста. Сделать это просто, выполним скрипт decrypt.py. Проверяем, ничего не изменилось... хмм... странно. Обратите внимание на строку 25 в обеих скриптах. В файле decrypt словно нарочно убрана строка, которая вызывает функцию расшифровки. Добавляем в файл decrypt.py строку decrypt_files('requests'). Запускаем еще раз скрипт. Готово, текстовые файлы приобрели читабельный вид!.
Теперь мы можем читать файлы заявок. В одной из заявок в тексте есть четырехзначное число, обратите внимание, ранее ни в одной из подсказок не было чисел. Хм.. может это оно:
Dear Santa Claus!
I can buy myself a gift, but I am missing three thousand eight hundred sixty-five rubles
From Stas
Идем к нашему сейфу, попробуем набрать 3865. Отлично! Замок открыт! Остался еще один, но мы не получили никаких новых вводных. Что-же делать? Помним что у нас есть наше рабочее место, вернемся к нему. Возможно там есть то, что поможет нам продвинуться дальше.
Шестая задача
Стоит вспомнить, какие у нас доступны команды
Нас должна заинтересовать команда CODE. У нас как раз есть код. Вводим
Видим ошибку, сообщающую что команда должна принять аргумент. Пробуем добавить наш пин-код. Отлично! Сработало!
Получаем еще одно сообщение, нам намекают о втором пин-коде и речь о каких-то печеньках.
Давайте попробуем еще доступные нам команды, остались links и image.
Вводим image и видим ошибку о нехватке аргументов, ок, вводим links:
Получаем список ссылок. На самом деле это подсказки с информацией, которая нам может пригодится в прохождении. Первая же ссылка называется Cookie(печенье), мы уже встречали это слово. Перейдем по ссылке. У нас загрузится страница с описанием что существуют некие cookie( печеньки) в браузере. Вернемся в наш терминал и посмотрим, записаны ли у нас куки. Открываем в браузере режим разработки и смотрим:
Мы видим наличие куки image со значением koteyka. Ничего не напоминает? У нас в терминале есть команда image, которая как раз просит ввести какой-то аргумент.
Вводим в терминал image koteyka
получаем изображение. Вспоминаем что одна из ссылок в подсказках была с статья о стеганографии. Сохраняем полученную картинку и отправляем её в сервис декодирования изображений.
Сервис успешно расшифровывает спрятанные в изображении сообщение и выдает его нам. Это ссылка на файлообменник.
Переходим по ссылке и скачиваем архив, в архиве текстовый файл. Открываем его.
Программисты надежно защищают пин-код. Они создали для него отдельное хранилище.
Код для этого хранилища передать невозможно, он динамический, меняется регулярно.
Одного из программистов Деда Мороза перекупил Санта Клаус. Пообещав ему внж в Штатах.
Теперь этот программист сливает инфу гномам санты. Недавно он слил информацию по доступу в хранилище.
Ниже алгоритм формирования кода доступа для хранилища. Зная его ты можешь написать код, генерирующий код активации:
Алгоритм генерации кода на основании ключа
1. Из сгенерированного ключа удаляются все буквы, остаются только числа
2. Строка обрезается до первых пяти символов
3. В полученном числе, каждая четная цифра меньше 5 умножается на два
4. Итоговое число преобразуется в формат base64
5. К строке в формате base64 добавляется дата в формате Y-m-d H:i пример: "2000-01-01 00:00"
Сразу переходим по ссылке, чтобы проверить. Нас встречает простая форма
при попытке ввести что-то в поле code - получаем ошибку. При обновлении страницы генерируется новый ключ. Значит нам действительно необходимо написать небольшой скрипт, который будет генерировать код на основании полученного ключа. Алгоритм нам описан. Что такое base64 и md5 есть в подсказках по команде links в терминале.
Пишем скрипт. Генерируем код и отправляем. В ответ получаем второй долгожданный пин-код!
Седьмая задача
Снимаем замки, открываем наш импровизированный сейф ииии видим наш подарок, только он еще под одним замков ( к сожалению, фото утеряно)
Еще в сейфе лежит usb-флешка и какое-то странное устройство.
При подключении флешки видим на ней архив "курилка.rar" , но он под паролем. При подключении странного устройства не происходит ничего, только странно мигает красный светодиод.
Идем обратно к терминалу, вводим code *наш последний код*, получаем новые вводные:
Нам необходимо найти курилку где тусуются ассистенты дедушки мороза и послушать. Снова ничего не понятно.
Будем решать задачи по мере их поступления. Сейчас у нас на руках есть запароленный архив "курилка.rar" и странный девайс. Маловато информации... Обратимся за помощью, введем команду links . Нам еще и разу не пригодилась ссылка с именем Morse, кликаем. У нас открывается азубка Морзе. Что делаем дальше?
Ответ под спойлером:
Светодиод в устройстве подозрительно мигает, пробуем сопоставить импульсы светодиода с азбукой Морзе. Получаем пароль. Вводим в наш архив, готово!
Восьмая задача
В архиве фото. Открываем фото, видим лист бумаги где написано число 906. Вводим код в последний замок, не открывается. Что делаем дальше?
Ответ под спойлером:
У нас есть еще одна неиспользованная ссылка EXIF , переходим по ней. По ссылке инструкция о том, как смотреть координаты где сделано фото. Пробуем посмотреть их на фото из архива, получаем координаты. Координаты для нас знакомы. Совпадение? Не думаю. Одеваемся и идем к месту.
Девятая задача
Мы на месте по координатам, осматриваемся, не замечаем ничего необычного. Помним что у нас есть код 906 из архива и упоминание Попова А.С. На месте ( или заранее) вспоминаем или гуглим, что за ПОПОВ А.С
Создатель радио. В подсказке написано что Попов пел новогодние песни, нужно подойти к курилке и послушать.
Включаем радио на телефоне. Какая станция? Вспоминаем про код 906 которые еще не играл. Настраиваемся на частоту 90.6, слышим новогоднюю песню.
У меня завалялся ft-трансмиттер для авто. Решил использовать устройство для квеста. Я его немного переделал под домашнее использование.
Разобрал. Припаял кусок мгтф провода как антенну, для усиления сигнала.
Сделал отверстие в корпусе под разъем и припаял type-c
Так разъем выглядит снаружи. Теперь можно пользоваться устройством подключив его к любому зарядному устройству 5вольт.
Собственно геометка в фотографии из архива на флешке указывала на место под моим окном. А на подоконнике у меня был включен fm-трансмиттер, который в бесконечном цикле проигрывал песню. Конечно, я все все проверил заранее, походил по двору и проверил зону покрытия сигнала, меня все устроило.
Кто внимательно слушал песню, услышал код. Вводим код на последнем замке...
Похоже я сглазил сам себя, сегодня при установке нового оборудования выяснилось, что мышки скушали не*уёвый кусок проводки, жил 10 где то, так что игры пока отменяются)) всем бобра (и мешок денег) Пысы: фотки не делал, потому как это высоко и сыкотно итак там висеть, а фоткать уж подавно.
Взять с собой побольше вкусняшек, запасное колесо и знак аварийной остановки. А что сделать еще — посмотрите в нашем чек-листе. Бонусом — маршруты для отдыха, которые можно проехать даже в плохую погоду.