Dreaming
Solve the riddle that dreams have woven.
TryHackMe: Прохождение комнаты Dreaming.
Комната посвящена царству Снов (The Dreaming) из комикса про Песочного человека (The Sandman). Главный герой это собственно сам Песочный человек, так же известный как Морфей (Morpheus). Оба имения является соответственно отсылками к одноименному фольклорному персонажу западноевропейской культуры и к греческому богу сновидений. Другими персонажами комнаты являются старшая сестра Морфея – Смерть (Death) и Люсьен (Lucien), глава библиотеки из царства Снов, который в свою очередь является отсылкой на библиотекаря из романа “Лилит” Джорджа Макдональда.

What is the Lucien Flag?
Просканируем с помощью nmap
все порты (-p-
) цели в ускоренном режиме (-T4
):

Находим только два открытых порта, ssh и http. Посмотрим что там на 80 порту. Увы, это лишь стандартная заглушка сервера apache. Попробуем просканировать директории и для этого воспользуемся gobuster
:

На сервере имеется некое скрытое приложение, посмотрим что там. Внутри оказывается CMS Pluck.
Проверим на exploit-db какие уязвимости существуют для данной CMS. К сожалению, все интересные эксплоиты требуют наличия прав администратора. Прямо с заглавной страницы можно перейти на форму аутентификации в админ панель. Остается только подобрать пароль, благо предполагается что пользователь у системы только один и нам не нужно гадать ещё и с именем админа.
Если изучить login.php
, то можно обнаружить, что Pluck использует классическую защиту от брутфорса пароля, она блокирует доступ на 5 минут после 5 неверных попыток:
Пароль будем брутфорсить с помощью hydra
. Поскольку логин не требуется, пропустим его -l ''
, в качестве словаря паролей возьмём известный rockyou.txt
.
Если у вас в системе нет словарей, то их можно скачать с репозитория SecLists. В Linux дистрибутивах Parrot и Kali они предустановлены в
/usr/share/wordlist
.
Так же укажем, что за раз будем пробовать по 5 паролей -t 5
, после чего ожидать 303 секунды -W 303
. Это необходимо для обхода автоматической блокировки.
Страница авторизации посылает данные в виде POST запроса, укажем для hydra
модуль для работы с подобными запросами (http-post-form
).
Для строки запроса заполним адрес: /app/pluck-4.7.13/login.php
, тело запроса: cont1=^PASS^&bogus=&submit=Log+in
, ну и F:incorrect
означает что hydra
будет искать в ответе текст “incorrect” и при его наличии понимать, что пароль неверен.
Подробнее узнать о синтаксисе строки запроса соответствующей post-запросам можно в справке:
hydra -U http-post-form
.

После получения пароля можем воспользоваться ранее найденным эксплоитом:
Эксплоит загружает на сервер крайне удобный веб-шелл p0wny@shell. Для начала, просто осмотримся:
Сразу же находим флаги которые нам нужно получить, так же отмечаем что у пользователя death
доступен для запуска некий скрипт getDreams.py
, а у пользователя morpheus
возможно прочесть файлы: kingdom
и restore.py
. Рассмотрим скрипт restore.py
:
=
=
Скрипт выполняет бекап файла kingdom
. Вероятно это происходит по расписанию, но к сожалению мы не имеем доступа к конечному файлу, чтобы посмотреть отметки времени либо глянуть cron задачи пользователя. Просто отметим это для себя на будущее.
Теперь нужно подумать, какие уязвимости имеются в системе. p0wny@shell имеет удобную функцию загрузки файлов посредством встроенной команды upload
. Загрузим на машину LinPEAS, скрипт который ищет возможные пути эскалации привилегий на linux машине. Далее установим обратное соединение, для этого на своей машине запустим netcat в режиме ожидания подключения на 7777 порту:
а в p0wny@shell организуем подключение к нашей машине:
; | |
После удачного соединения можем запустить только что загруженный linpeas. Одно из мест к которому он привлечет внимание, это наличие двух файлов в обычно пустой директории /opt
: getDreams.py
и test.py
.
Взглянем на первый файл, это скрипт принадлежащий пользователю death
:
# MySQL credentials
=
=
=
# Connect to the MySQL database
=
# Create a cursor object to execute SQL queries
=
# Construct the MySQL query to fetch dreamer and dream columns from dreams table
=
# Execute the query
# Fetch all the dreamer and dream information
=
# Loop through the results and echo the information using subprocess
, =
= f
=
# Handle any errors that might occur during the database connection or query execution
# Close the cursor and connection
# Call the function to echo the dreamer and dream information
Данный код довольно прост, идёт подключение к базе library
, далее из таблицы dreams
для каждого “спящего” (dreamer
) на экран выводится его “сон” (dream
). Но важная деталь, вывод производится путем вызова внешней команды echo
. Запомним этот факт.
Ну и судя по всему, это тот же файл, что и с домашней директории пользователя, с той лишь разницей, что здесь вырезан пароль для доступа к базе данных.
Теперь изучим второй файл test.py
:
#Todo add myself as a user
=
= #redacted#
=
=
Это простой скрипт который проверяет подключение к Pluck. Но что важнее, здесь указан пароль и он отличается от того, который мы ранее подобрали брутфорсом. Попробуем его использовать для подключения через ssh как пользователь lucien
:
Пароль подошел, вход в систему успешен и получен первый флаг:
What is the Death Flag?
Проверим, какие права имеются у пользователя lucien
:

Оказывается мы можем выполнять скрипт /home/death/getDreams.py
с правами пользователя death
без необходимости указывать её пароль. Попробуем запустить скрипт:

Судя по выводу, это тот самый скрипт который мы рассматривали ранее. Учитывая что он вызывает оболочку и мы можем делать это с правами пользователя death
, для доступа к машине от её имени нужно внедрить в базу данных нашу команду. Попробуем сделать это запустив mysql
. Увы, но у нас нет пароля. Попробуем проверить историю вызовов команд:
|

Нам повезло, в истории остался пароль. Запустим mysql
с данным паролем и внедрим в таблицу нового “спящего” с командой которая отобразит нам оригинальный скрипт getDreams.py
:
mysql> use library
Database mysql> insert into
;
Query OK, 1 row affected
mysql> select * from dreams;
+---------+-------------------------------------+
| dreamer | dream |
+---------+-------------------------------------+
| Alice | Flying in the sky |
| Bob | Exploring ancient ruins |
| Carol | Becoming a successful entrepreneur |
| Dave | Becoming a professional musician |
| h4ck3r | Hack!; cat /home/death/getDreams.py |
+---------+-------------------------------------+
mysql> quit
Bye
Здесь точка с запятой (;) используется как разделитель команд для оболочки, соответственно при выполнении скрипта получится что выполняются две команды последовательно:
;

Мы получили ещё один пароль и попробуем использовать его, чтобы зайти через ssh как пользователь death
. Получилось, вот и второй флаг:
What is the Morpheus Flag?
Ещё раз запустим ранее установленный linpeas.sh
, но в этот раз будучи залогинены как death
:
Из интересного обнаруживаем, что файл /usr/lib/python3.8/shutil.py
, а это часть стандартной библиотеки питона, доступен нам для записи:
В этом месте вспомним про скрипт restore.py
у пользователя morpheus
, он как раз использует данный модуль, а конкретно его функцию copy2()
для копирования файла:
Будем исходить из предположения, что данный скрипт автоматически вызывается через какие-то промежутки времени, таким образом у нас появляется возможность внедрить свой код что будет запущен с правами Морфея. Отредактируем функцию copy2()
добавив в неё копирование файла с флагом в директорию для временных файлов /var/tmp/
:
=
# копируем флаг
return
Теперь осталось подождать в надежде, что скрипт действительно вызывается по расписанию. Через некоторое время мы обнаружим что так и есть, появляется файл /var/tmp/flag.txt
и в нём финальный флаг.
На этом всё, комната пройдена.