Закулисье поиска сокровищ Оси: Как мы прятали подарки на сервере, а их нашли быстрее, чем планировалось

Всем привет!

Меня зовут Алексей, я системный администратор Бегета.

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

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

Обещали – делаем 🙂

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

Что ж, приглашаю вас в закулисье поиска сокровищ!

Вступление

Организация таких мероприятий позволяет здорово обогатить свой запас знаний и интересно провести время. 

А когда еще веселиться, как не под Новый год? 🙂

В этом году мы вдохновились такой штукой, как CTF (от англ. capture the flag – популярный среди ролевиков, в пейнтболе, компьютерных играх и информационной безопасности формат, при котором главной целью является захват “флага”).

CTF известен в качестве формата соревнований – в таких турнирах игрокам обычно предоставляется набор заданий, которые необходимо решить, а ответ дается в виде флага, состоящего из набора символов или произвольной фразы. Есть и другой вариант, при котором участникам дается доступ к VDS-серверу с набором уязвимых сервисов, на которые периодически направляется приватная информация (флаги), а игрокам, в свою очередь, необходимо находить и устранять уязвимости на своем сервере и пользоваться найденными уязвимостями для получения флагов у соперников.

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

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

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

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

Подготовка VPS-сервера

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

Выбрали очень мощный сервер. Нет, не так. ОЧЕНЬ. МОЩНЫЙ. СЕРВЕР. Два процессора AMD EPYC 7763, дающих вместе 256 логических ядер с частотой в бусте 3.5 GHz.

Оперативной памяти 2 терабайта! Да, терабайта. 

Диски NVMe в количестве 12 штук по 3.5 терабайта каждый. Не то чтобы это было необходимо, но раз начали готовиться к акции, то идем в своем увлечении до конца. Единственное, что меня беспокоило – это сеть. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек, чей сервер дудосят. И я знал, что довольно скоро мы в это окунемся 🙂

Вот почему на нашем сервере было несколько сетевых карт по 10 Гб. Объединив два из них в агрегированный канал, мы бы получили до 20 Гбит/c интерфейс. 

Со стороны изолированности сессий пользователей было несколько идей. Это и создание отдельных VPS-серверов, и автобаланс по этим серверам, и изменение заданий, чтобы дать возможность использовать один сервер, и создание отдельных доступов на каждое задание, как это сделано в том же “Бандите”. 

В результате я написал на bash враппер, который выполнялся при подключении по SSH и создавал для каждой SSH-сессии новый docker-контейнер с заданиями. Попутно подтюнил многие сетевые и пользовательские лимиты, а также создал зеркальный soft raid на случай выхода диска из строя. Вероятность крайне низкая, но лучше перестраховаться.

В первый же день стало ясно, что у этого решения есть минус. SSH позволяет выполнять команды неинтерактивно – и несколько пользователей попытались исследовать виртуальный выделенный сервер, выполняя lshw и еще дюжину-другую утилит и скриптов. Это не имело смысла, так как со стороны клиента ответ выполняющихся программ не получить. 

Один из клиентов попробовал запустить sftp-сервер. У него не вышло. Но стало ясно, что хоть учетная запись и не дает root-привилегий и всячески ограничена, ее можно использовать для повышения привилегий, так как пришлось дать права на docker socket. А имея возможность запускать контейнер, можно получить рута 🙂

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

В итоге решил использовать ForceCommand в конфиге sshd – это отключало интерактивные команды. Чтобы пользователям было понятно, что это так, я задал в shell ответ на попытку использовать интерактивную команду: “Этот сервер отклоняет неинтерактивное использование SSH”.

В итоге наш выделенный сервер оказался еще более защищен от возможного вандализма. И конечно, сами контейнеры были ограничены по ресурсам – как по объему аллоцирования оперативной памяти, так и по возможностям процессора и скорости записи на диск.

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

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

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

Не обошлось и без пасхалки 🙂 Оставили на сервере файл в формате .txt с вот таким содержимым:

octopus@ny2024:/home/sweethome$ cat indian_ocean/timor_sea/gift_id.txt
Извини, Марио, твоя принцесса в другом замке
octopus@ny2024:/home/sweethome$

Что за задания на VPS-сервере

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

И да, самые простые задания разбирать не буду, отобрал несколько из них – те, по которым было больше всего вопросов, или просто забавные.

  • Задание № 7
Текст задания
Где-то на сервере спрятан файл “Я твой подарок.txt” – его легко найти, но нужно еще прочитать как-то.

В этот день для пущей сложности не работали команды cat, more, head, tail

Опишу решение.

Находим файл:

octopus@ny2024:/home/sweethome$ find . -name 'Я твой подарок.txt'
./arctic_ocean/Я твой подарок.txt
octopus@ny2024:/home/sweethome$

Вывести содержимое командой cat, конечно же, не удается:

octopus@ny2024:/home/sweethome$ cat ./arctic_ocean/Я твой подарок.txt
если бы всё было так просто, то не было бы так интересно
octopus@ny2024:/home/sweethome$

Но благо, есть масса других способов вывести содержимое текстового файла – именно так некоторые пользователи и сделали:

octopus@ny2024:/home/sweethome$ tac arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ nl arctic_ocean/Я\ твой\ подарок.txt
     1  c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ grep . arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ awk '{print$0}' arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ sed -e '' arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ cut -d'_' -f1 arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ sort arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ uniq arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ perl -ne 'print' arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236
octopus@ny2024:/home/sweethome$ while IFS= read -r line; do echo $line; done < arctic_ocean/Я\ твой\ подарок.txt
c0d3 f02 91f7: 7545236

Утилиты strings и less могли бы быть в этом списке, но отсутствовали в сборке по умолчанию.

  • Задание № 8
Текст задания
Ося очень любит детективные истории, поэтому очередной подарок прятать в зашифрованном файле ему показалось слишком скучно. Придется постараться и распутать эту историю. Начинайте вот с этой папки:

/home/sweethome/secret_path

Удачи 😉

Как и в предыдущем задании, здесь были недоступны cat, more, head и tail.

Итак, заходим на выделенный VDS-сервер, смотрим, что в дире есть файл trail.txt, что можно перевести как “след”. Что ж, пойдем по следу.

octopus@ny2024:/home/sweethome$ tac secret_path/trail.txt 
https://cp.beget.com/shared/t6e7XXZAcpk9vxiQULLw5EldvYZ0j9qG/c2vjcmv0x3fyx2nvzgu.png
Да начнется твой путь...

Переходим в браузере по ссылке и видим QR-код. Переходим по нему и попадаем на суперсекретную страницу.

Что ж. Бинарный код. Ищем в поисковике конвертер из bin в txt и конвертируем.

Получаем ссылку на mp3-файл.

В записи слышны писки. Угадывается характерная прерывистость. Да это же…морзянка!

Вручную 😢 или через приложение, найденное в поисковике, конвертим морзянку в передаваемое сообщение и получаем что-то типа такого:

WAM NUJNA PAPKA NA SERWERE WAR TEMP

Заглядываем в /var/tmp:

octopus@ny2024:/home/sweethome$ ll /var/tmp/
total 32
drwxrwxrwt 1 root root 4096 Dec 20 06:53 ./
drwxr-xr-x 1 root root 4096 Oct  4 02:12 ../
drwxrwxr-x 2 root root 4096 Dec 19 15:44 .ICE-unix/
drwxrwxr-x 2 root root 4096 Dec 19 15:44 .Test-unix/
-rw-rw-r-- 1 root root	0 Dec 19 15:44 .X0-lock
-rw-rw-r-- 1 root root	0 Dec 19 15:44 .X1-lock
-rw-rw-r-- 1 root root	0 Dec 19 15:44 .X1024-lock
-rw-rw-r-- 1 root root	0 Dec 19 15:44 .X1025-lock
drwxrwxr-x 2 root root 4096 Dec 19 15:44 .X11-unix/
drwxrwxr-x 2 root root 4096 Dec 19 15:44 .XIM-unix/
drwxrwxr-x 2 root root 4096 Dec 19 15:24 .font-unix/

Все файлы пустые, кроме одного бинаря.

Ладно. Попробуем запустить его, раз даже x-бит на нем есть:

octopus@ny2024:/var/tmp$ ll ./.font-unix/0
-rwxrwxr-x 1 root root 15960 Dec 19 15:24 ./.font-unix/0*
octopus@ny2024:/var/tmp$  ./.font-unix/0
Поздравляем! Вы успешно прошли все задания.
В качестве вознаграждения вы получаете звание в нашем Telegram-сообществе @beget_chat.
Сообщите в личном сообщении в Telegram, какое звание вы бы хотели.
Помните: звание ограничено 16 символами, должно быть цензурным, не должно никого оскорблять и не должно вводить в заблуждение участников сообщества, например, за счет назначения на должность внутри Бегета.
octopus@ny2024:/var/tmp$

Это задание, наверное, вызвало больше всего ажиотажа – в первую очередь из-за отсутствия cat.

Программ, позволяющих декодировать писки, много. 

Например, как предложил один из пользователей, можно было открыть звуковую дорожку через аудиоредактор:

Другим пользовательским решением стало использование специального софта, заточенного именно на морзянку:

  • Задание № 10
Текст задания
Этот подарок Ося спрятал в файле. Звучит просто, но что делать, если файл скрыт и команды ls/find не работают? На этот вопрос вам и предстоит ответить 🙂

В этот день не были доступны утилиты ls, dir, find, tree.

Итак, файл скрыт. Ни для кого не секрет, что в Linux скрытыми условно считаются файлы, начинающиеся с точки. Их и будем искать.

Основная сложность – найти способ вывести список файлов. Можно нагуглить или задать вопрос в ChatGPT и найти среди вариантов также утилиту vdir, которая едва ли отличается по функциональности от dir. Обе команды выполняются как ls с разными флагами:

https://www.gnu.org/software/coreutils/manual/html_node/vdir-invocation.html#vdir-invocation

https://www.gnu.org/software/coreutils/manual/html_node/dir-invocation.html#dir-invocation

Выводим рекурсивно все файлы, включая начинающиеся с точки, и далее – находим только те, которые начинаются с точки и имеют после точки буквенные символы:

octopus@ny2024:/home/sweethome$ vdir  -aR  | egrep  ' \.[a-z]+'
-rw-rw-r-- 1 root	root     	26 Dec 20 13:21 .bash_history
-rw-r--r-- 1 octopus octopus 	220 Jan  6  2022 .bash_logout
-rw-r--r-- 1 octopus octopus	3771 Jan  6  2022 .bashrc
-rw-r--r-- 1 octopus octopus 	807 Jan  6  2022 .profile
octopus@ny2024:/home/sweethome$

Смотрим эти файлы и находим заветный ключ.

octopus@ny2024:/home/sweethome$ cat .bash_history
y0u2 S3cR3t 1d: 125436424

Кроме такого решения, можно вывести список файлов, начинающихся с точки, пусть и не рекурсивно:

octopus@ny2024:/home/sweethome$ echo .*
. .. .bash_history .bash_logout .bashrc .profile
octopus@ny2024:/home/sweethome$

А что же делали со всем этим наши пользователи? По правде сказать, самое разное.

Кто-то делал немного странные, но работающие конструкции:

octopus@ny2024:/home/sweethome$ grep -rIE "." . | grep . | head

Кто-то листил файлы:

lsattr .*

И запускал всё это рекурсивно, забирая потом только .txt:

lsattr -R . | grep .txt$

Кто-то делал еще проще – вводил cat и два раза нажимал клавишу tab, а увидев список файлов в дире, просматривал всё, начинающееся с точки:

cat [tab 2x]

И конечно, находил заветный ID 🙂

Есть и другой, совершенно замечательный, вариант использовать bash globbing *: зная структуру директорий, можно отгрепать типы файлов, содержащие текст:

octopus@ny2024:/home/sweethome$ file //* | grep "text"

Были и пользователи, которые, попытавшись запустить man, получили ответ, что это минимизированная сборка, и попытались расширить ее до полной команды:

unminimize

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

  • Задание № 15
Текст задания
Ося создал файл (.local/bin/n.pyc), который должен принести радость, но так торопился, что получилось загадочно. 

В этом задании мы изменили привычный формат ID, чтобы было интереснее. Не удивляйтесь 🙂

В этот день не работали команды ls, du, find, tree

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

Как можно догадаться из расширения файла, n.pyc – это скомпилированный байт-код python. Если попробовать запустить, то получим “Отказано в доступе”. Дело в отсутствии прав на запуск, нет x-бита.

Делаем chmod +x или просто запускаем, используя доступный в этот день интерпретатор python3:

octopus@ny2024:/home/sweethome$ .local/bin/n.pyc
bash: .local/bin/n.pyc: Permission denied
 
octopus@ny2024:/home/sweethome$ stat -c %A .local/bin/n.pyc
-rw-rw-r--
 
octopus@ny2024:/home/sweethome$ python3 .local/bin/n.pyc
Traceback (most recent call last):
  File "n.py", line 19, in <module>
RuntimeError: File not found
octopus@ny2024:/home/sweethome$

Получаем новую ошибку: RuntimeError: File not found. Хм. Видимо, программа пытается найти файл и не может.

Для наглядности решения меняем чуть-чуть bash prompt, чтобы он показывал код выхода предыдущей команды:

octopus@ny2024:/home/sweethome$
octopus@ny2024:/home/sweethome$ PS1="$PS1"'[$?] '
octopus@ny2024:/home/sweethome$ [0]
octopus@ny2024:/home/sweethome$ [0] asdf
bash: asdf: command not found
octopus@ny2024:/home/sweethome$ [127] ls
если бы всё было так просто, то не было бы так интересно
octopus@ny2024:/home/sweethome$ [0]

Запускаем strace и получаем большую портянку текста.

octopus@ny2024:/home/sweethome$ [0] strace python3 .local/bin/n.pyc
. . .

Грепаем или сортируем параметрами strace (или и то, и другое):

octopus@ny2024:/home/sweethome$ [1] strace -e openat  python3 .local/bin/n.pyc  |& grep 'Нет такого файла'
openat(AT_FDCWD, "New_Year_vibe", O_RDONLY|O_CLOEXEC) = -1 ENOENT (Нет такого файла или каталога)

Находим название файла New_Year_vibe.

Попробуем создать его вручную:

octopus@ny2024:/home/sweethome$ [1] cd .local/bin/
octopus@ny2024:/home/sweethome/.local/bin$ [0] touch New_Year_vibe

Запускаем n.pyc теперь:

Ура. Поздравление с новым 2024 годом.

Хм, но где ID подарка? Говорили, что он странный, но тут вообще только четыре цифры. Можно и такой попробовать сдать, но, кажется, что-то тут не до конца решено.

Делать нечего, запущу еще раз скрипт.

octopus@ny2024:/home/sweethome/.local/bin$ [0] python3 n.pyc
octopus@ny2024:/home/sweethome/.local/bin$ [71]

Странно. В этот раз не вывел поздравления и выдал ошибку.

Запущу еще раз. 

Вижу, что теперь код выхода изменился. А что там в файле New_Year_vibe?

octopus@ny2024:/home/sweethome/.local/bin$ [71] python3 n.pyc
octopus@ny2024:/home/sweethome/.local/bin$ [37]
octopus@ny2024:/home/sweethome/.local/bin$ [0] stat -c "%A %s %U %G %n" New_Year_vibe
-rw-r--r-- 1 octopus octopus New_Year_vibe
octopus@ny2024:/home/sweethome/.local/bin$ [0] file New_Year_vibe
New_Year_vibe: very short file (no magic)
octopus@ny2024:/home/sweethome/.local/bin$ [0] cat New_Year_vibe
octopus@ny2024:/home/sweethome/.local/bin$ [0]

Снова странно. Кажется, пустота, но размер файла стал отличен от нуля.

Запущу еще и еще, посмотрим, как код выхода будет меняться.

Батюшки. Пикча с поздравлением повторилась. И, кажется, код выхода зациклился.

Что же это за числа в коде выхода. Можно их сложить, но тоже что-то не то выходит. Слишком длинный ответ.

Тут нужно было догадаться, что это могут быть ASCII-символы… Попробую подобрать числа для этих символов.

Да это же решение! Юху.

А вообще, эту задачу можно было бы решить еще несколькими способами 🙂

Один из вариантов – декомпилировать скомпилированный байт-код. В простом виде это можно сделать относительно легко, но надо еще понять, что делает вырвиглазный код внутри.

Уже поздно вечером один из участников довольно точно восстановил исходник и поделился способом решения.

  • Задание № 16
Текст задания
Придется покопаться, чтобы отыскать все символы ID подарка. Включайте внимательность на максимум, чтобы все их распознать, или напишите хитрый скрипт, который поможет в поиске. 

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

Например: {4}, [5]

Цифры из ID расположены раздельно и последовательно.

В этот день были отключены команды grep, perl и more.

Это задание решали дольше всего. В какой-то момент проскочила мысль дать заготовленную подсказку с нужными парными символами ({}, [], ||, \\, //, ()), но пользователи попросили не делать этого.

Задание действительно сложновато за счет запрещенных команд. Но реализовать греп без грепа можно.

Быстро налабать можно какую-нибудь такую конструкцию:

while IFS= read -r line; do [[ $line == *pattern* ]] && echo "$line"; done < file.txt

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

https://ru.wikipedia.org/wiki/Регулярные_выражения#Расширенные_регулярные_выражения_POSIX

https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions

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

Чтобы было интереснее искать ID, я запрятал его в условно середину бинарного файла. А еще – сделал 103 ложных файла, содержащих разные неподходящие подстроки.

В них не было закрывающих парных символов и были дубли цифр.

К примеру:

4 ( 3 ] 8 9 8 8 ] ( 8

Собственно, вот один из вариантов решения:

octopus@ny2024:/home/sweethome$ for FILE in $(find -type f); do while IFS= read -r line; do [[ $line =~ \{[0-9]{1}\} && $line =~ \[[0-9]{1}\] ]] && echo "##################### $FILE" && echo "$line"; done < $FILE; done
##################### ./pacific_ocean/south_china_sea/4fd0c422c2ec6521a3a6d88857f8e5d4
l t 2 tg  v%  #  ,$  ^ = y  6{ 
                               C
l       # C ۛ P% t eF    (D  &   K    ڵ 3 [ Y | ҝ{1} [5] |2| \3\ /6/ (2)
octopus@ny2024:/home/sweethome$

Что здесь происходит?

Мы циклом пробегаем по всем файлам. Ищем все файлы такой командой find -type f и, пробегая по ним, кормим на ввод циклу while путь до них, который перебирает все строчки и матчит по регуляркам:

for FILE in $(find -type f); do
    while IFS= read -r line; do
        [[ $line =~ \{[0-9]{1}\} && $line =~ \[[0-9]{1}\] ]] && echo "##################### $FILE" && echo "$line";
    done < $FILE;
done

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

[[ $line =~ \{[0-9]{1}\} && $line =~ \[[0-9]{1}\] ]] && echo "##################### $FILE" && echo "$line";

Оператор =~ отличается от == тем, что позволяет использовать расширенные регулярные выражения (ERE).

Вот здесь \{  и вот здесь \} экранируем символы фигурных скобок. Далее указываем, что ищем символы цифр между скобок в количестве 1 штука: [0-9]{1}.

Если первое условие в [[ ]] выполнится успешно, то проверим на наличие цифры в квадратных скобках в этой же подстроке.

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

Можно было бы идти дальше и проверить и другие символы по типу () или <>, но для решения задания этого оказалось достаточно.

Очень любопытное решение предоставил один из пользователей сразу после закрытия сервера с заданиями. Он использовал как замену grep-у awk. Взглянуть на это решение можно тут (в скрин всё не поместится🙂).

Итоги

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

Часть пользователей пытались хакнуть принцип заданий или просто уменьшить количество шума, отсекая старые файлы.

Кто-то, пытаясь найти только новые файлы на момент задания, делал так:

find -type f -newermt "2023-12-20" \! -newermt "2023-12-21"

А другие пользователи сравнивали md5sum у файлов, находя среди них такие, которые не имеют один и тот же хеш, – что, конечно, упрощало, к примеру, задание № 17, где нужно было найти ID в напоминающем “Войну и мир” тексте в 50 похожих файлах.

Были и действия, которые проникли в самое сердце. Например, один из пользователей предложил свое задание, закодировав в ASCII-графике вот такой текст:

Поистине, такие реакции растрогают даже самого сурового администратора, навсегда сохраним их в душе ❤️

Что ж, пора переходить к общим итогам по акции.

Немного сухой статистики:

  • Сколько времени понадобилось в среднем на решение каждого задания – если смотреть по скорости отправки ответов, то это заняло от 4 до 10 минут, точную цифру вычислить невозможно, поскольку не все пользователи делились своими успехами и тем, сколько это заняло времени, а на самом сервере этого не отследить.
  • Поиск решения какого задания занял у пользователей меньше всего времени – рекордсменом по скорости решения стало задание № 13, в котором следовало разобраться в запущенных друг от друга процессах, это задание было решено за 1 минуту (а скорее всего, еще быстрее, так как уже через минуту после публикации задания ответ был в чате).
  • Поиск решения какого задания занял у пользователей больше всего времени – таким стало задание № 16, его решали 1 час 8 минут.

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

Получилось здорово! Среди фидбеков есть даже запрос на организацию хакатона и полноценных CTF-соревнований 🙂

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

На этом, пожалуй, всё 🙂

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

Опубликовано: 28.02.2024
11
331