Решения второго тура root.yandex.ru

А вот и разбор полетов второго тура Олимпиады сисадминов (ссылка на разбор первого тура). Второй тур немного отличался в деталях от первого - образ был зашифрован на ключе, а не на пароле, вместо Ubuntu Server был CentOS 6.3. В остальном все практически соответствовало первому туру. После развертывания нужно было запустить и организовать OpenVPN соединение по сертификату к серверу проверки заданий. В случае успеха команда получала хэш, который капитан команды должен был ввести на страничке команды. Побеждают те команды, которые раньше всех решат больше всех задач.

Вопросы и решения:

Цитата:
Задание 1
Программа, которая не компилируется, даст вам подсказку…

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

Цитата:
Задание 2
Кто-то сломал наш замечательный сайт на Drupal. Пожалуйста, восстановите его. Все, что осталось от БД, находится в /root/drupal/.

Задача похожа на аналогичную из первого тура, только теперь файлы Drupal и его база данных были полностью удалены. В каталоге находились бинарные логи последних операций с MySQL. Сам MySQL также был неправильно сконфигурирован - указан неправильный пользователь. С бинарными логами была небольшая подстава - их было пять штук, причем первый не применялся (обращение к несуществующей базе), а в пятом удалялись данные и полностью удалялась база drupal. Поэтому нужно было осторожно восстанавливать базу, дабы не затереть ее снова. На сайте в итоге создавались три материала, которые проверял сервер проверок. Мы немного провозились с этим заданием, так как в нашей виртуалке было мало выделено памяти, которую Apache полностью выжрал. В результате этого сервер проверок срезался из-за таймаута и некоторое время отдавал отрицательный ответ на правильно решенную задачу.

Цитата:
Задание 3
Василий Пупкин забыл пароль к своему секретному файлу, однако, он точно помнит, что набирал пароль на NumPad-е. Пожалуйста, помогите ему восстановить важные данные.

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

Цитата:
Задание 4
Мы не уверены, что вы помните про LILO, но c GRUB'ом вы точно должны быть знакомы. Что еще важно для загрузки системы?

В /boot лежал лишний initramfs, если его распаковать (формат .cpio.gz), то в корне полученного каталога будет лежать файл с ключом.

Цитата:
Задание 5
Настройте web-сервер, который бы отдавал текущее время по https с точностью до минуты в формате YYYY-MM-DD-HH-MM по адресу https://<ВашIPвVPN>/time
Content-Type должен быть text/plain, а часовой пояс: MSK (UTC+4).

Эту задачу делал не я, но ее решили простым самописным скриптом. Из подробностей выяснилось, что файл time отдавал nginx, причем этот файл обновлялся bash-скриптом каждые 2 секунды.

Цитата:
Задание 6
Необходимо возвращать все то, что отправлено на порт 31337/tcp.

Ну это совсем элементарно - еще никто не забыл про сетевую кошку?

Цитата:
Задание 7
Настройте DNS-server так, чтобы он
1. возвращал 127.0.0.(X*2) в ответ на любой A-запрос на разрешение имени X.root.yandex.net, где X: 0..127
2. 'root' на TXT-запросы для тех же имен узлов

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

Цитата:
Задание 8
Настройте правила firewall для входящих TCP соединений следующим образом:
1. При попытке подключения на порт 9999 ответных пакетов отправляться не должно
2. При попытке подключения на порт 8888 в ответ должен отправляться пакет icmp: port unreachable
3. Входящие соединения на порт 7777 должны успешно устанавливаться только в том случае, если соединение инициируется с порта, больше либо равного 7777. В противном случае в ответ должен
отправляться пакет icmp: port unreachable

Эту задачу решали колдуны iptables :). Три команды iptables и дело в шляпе (подробностей уже никто не помнит).

Цитата:
Задание 9
Мы где-то потеряли жесткий диск. Или даже несколько.

Это была интересная для меня задача. По долгу службы мне часто приходилось восстанавливать данные именно в таких условиях. cfdisk показывал, что в системе три раздела - один под корень, второй - для подкачки, а третий являлся группой томов LVM. Сначала нужно было выполнить автообнаружение LVM (vgchange -a y), после чего находились еще три тома. При детальном изучении оказалось, что это развалившийся массив RAID5 на основе MDADM. Самого mdadm в системе не было (пакет предварительно намеренно был удален), автоматически массив не собирался. Нужно было вручную собрать массив командой mdadm -A (причем поднимались только два диска из трех) и смонтировать его. В корне раздела находился файл с хэшем.

Цитата:
Задание 10
Пару дней назад мы обнаружили рутовую ssh-сессию с неизвестного IP. Мы оборвали соединение и отключили сервер от сети.

Эта задача была очень выматывающей для нас. По статистике, большинство команд решило эту задачу в последнюю очередь. Эту задачу мы решили только на следующее утро, полностью измотав себя, да и то только с подсказки Civilian. Закончили одиннадцатыми.

Насчет SSH-сессии и неизвестного IP - пыль в глаза. Ее не было. Не зная об этом, мы сперва начали бороздить лог-файлы, запускали антируткиты, потом принялись сличать временные метки, обнаружили, что был изменен файл /etc/aliases.db, кинулись по ложному следу к почтовому серверу (была догадка, что злоумышленник каким-то образом мог воздействовать на систему через него). От отчаяния дошли до того, начали смотреть журналы SELinux. Безрезультатно.

А решение было простым. Нужно было зайти в single-режим (или загрузиться с LiveCD) и внимательно посмотреть на каталог /usr. В нем был каталог /usr/p0wned, внутри которого - файл с ключом и руткит kbeast, замаскированный под модуль ядра intel.ko. Также в системе был инит-скрипт, который подгружал этот модуль в процессе загрузки.

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