Перейти к основному содержимому
  1. Posts/

ProvingGrounds - Hutch

Write-Up Windows ActiveDirectory ProvingGrounds Evil-Winrm BloodHound Ldapsearch Crackmapexec Kerbrute LDAP LASP
breach.zone
Автор
breach.zone
Оглавление

Из описания машины следует, что основным вектором атаки является LDAP. Это ключевой аспект, на который стоит обратить внимание в ходе анализа. Кроме того, в описании указано, что сложность оценивается как Hard согласно рейтингу сообщества. Однако я с этим не полностью согласен — на мой взгляд, уровень сложности ближе к Medium. В процессе дальнейшего разбора вы поймёте почему: для успешного взлома машины не потребуется использование сложных трюков или узкоспециализированных знаний. Все действия выполняются с помощью стандартного набора инструментов пентестера.

NMAP
#

Начинем со стандартного сканирование доступных портов:

nmap -v -Pn -T4 -p- 192.168.193.122

Результат:

NMAP scan 1
NMAP init scan

Теперь просканируем только эти порты более детально:

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

Результат:

NMAP scan 2
NMAP detailed scan

LDAP
#

В результатах сканирование обращаем внимание на LDAP (порт 3268). Как упоминалось ранее, основной вектор атаки для данной машины — это именно LDAP.

ldapsearch
#

Пробуем получить полезную информацию из LDAP c помощью ldapsearch.

ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec"

Вывод команды будет довольно большой, часть вывода на примере ниже:

LDAP 1
LDAP exmaple output

На скриншоте выше вы можете увидеть информацию о нескольких пользователях в домене. Давайте позапускаем команду несколько раз с разными grep, чтобы убрать все лишнее:

ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec" | grep description
LDAP Password
Clear text password in the LDAP

А вот и первый “низко висящий фрукт”. Теперь нужно определить, какому пользователю принадлежит этот пароль. Чтобы не искать его вручную среди всех пользователей, где в поле description указан данный пароль, можно использовать команду grep с выводом 40 строк до и 40 после совпадения

ldapsearch -x -H ldap://192.168.193.122 -b "DC=hutch,DC=offsec" | grep -A 40 -B 40 CrabSharkJellyfish192
LDAP Login & Password
Clear text password in the LDAP for login

Password spraying attack
#

Итак, на данный момент мы имеем пару логин:пароль для пользователя [email protected], а также список логинов других пользователей.

NOTE: Каждый раз, когда мы находим новый пароль, имеет смысл провести password spraying атаку на другие известные нам логины.

Но перед тем, как это делать надо проверить 2 вещи:

  • Проверить, что с найденым логином и паролем можно залогиниться в систему и он рабочий.
  • Проверить политику паролей в домене, чтобы определить сколько попыток ввода неправильного пароля допустимо до блокировки учетной записи.
Если вы проводите реальный пентест, получение информации о политике паролей является обязательным шагом. Без этой информации вы рискуете заблокировать учетные записи реальных пользователей в домене при выполнении таких техник, как password spray, credential stuffing или brute force.

Password policy
#

Мы можем сделать два действия за раз:

crackmapexec smb 192.168.193.122 -u fmcsorley -p 'CrabSharkJellyfish192' --pass-pol
Password policy
Password policy

На скриншоте выше мы видим, что порог неправильных вводов пароля не настроен и мы можем смело двигаться дальше к следующему этапу - password spraying attack.

kerbrute
#

Ранее мы уже выгрузили список учетных записей, теперь сохраним их в файл users.txt и сделаем password spraying найденого пароля с помощью утилиты kerbrute.

kerbrute passwordspray -d hutch.offsec --dc 192.168.193.122 users.txt 'CrabSharkJellyfish192'
kerbrute
Password spraying

Как мы видим, данный пароль используется только для одного пользователя fmcsorley и password spraying не принес новых доступов. Мы должны были попробовать, это является неотъемлимой частью методологии пентеста.

Intermediate results
#

Промежуточные итоги таковы, что мы знаем только одну пару логин:пароль и теперь пришло время попробовать получить больше информации о домене.

Privileges escalation
#

Мой подход к решению этой задачи отличается от официального. Официальный write-up предлагает использовать WebDAV для получения первоначального шелла на машину и последующего поиска путей для эскалации привилегий. Этот метод основывается на внимательности и использовании базовых возможностей без привлечения дополнительных инструментов.

Однако я хочу предложить более интересный и универсальный подход, который вы сможете применять не только в этом случае, но и для работы с другими машинами в будущем.

BloodHound
#

Мы будем использовать инструмент BloodHound для получения всей информации о домене и поиска кратчайшего пути до доменного админа.

Для тех кто не знаком с BloodHound,то рекомендую к просмотру видео ниже. В Яндекс.Браузере можете включить перевод видео с озвучкой.

Installation
#

Я запускаю BloodHound в Docker с использованием Docker Compose. Подробная инструкция по установке доступна по официальной ссылке.

После запуска BloodHound, ему необходимо предоставить данные о домене. Для их сбора можно использовать разные инструменты. Официальная документация рекомендует их собственные коллекторы, например SharpHound.exe.

Однако, так как у нас пока нет шелла на целевой машине, вместо Windows-версии коллектора мы будем использовать Python-версию. Это позволяет собирать необходимые данные удаленно, что особенно полезно на этапе предварительного анализа домена.

dirkjanm/BloodHound.py

A Python based ingestor for BloodHound

Python
2008
333
Обратите внимание, что для BloodHound CE (Community Edition) нужно использовать bloodhound.py из Git ветки 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
bloodhound.py

В результате в директории с bloodhound.py появятся файлы json, которые далее надо будет загрузить в BloodHound использую UI.

bloodhound json
bloodhound json

BloodHound UI
#

После загрузки json файлов в BloodHound и их обработки, мы можем начать исследовать домен и взаимосвязи между различными ролями. Но давайте сразу перейдем к делу и построим путь от пользователя fmcsorley до доменного админа.

После загрузки файлов формата JSON в BloodHound и завершения их обработки, мы можем приступить к анализу домена и исследованию взаимосвязей между различными объектами.

Однако, чтобы не откладывать ключевые действия, сразу построим путь повышения привилегий от пользователя fmcsorley до доменного администратора. Для этого:

  • Откройте вкладку Explore -> Pathfinding в интерфейсе BloodHound.
  • Укажите пользователя fmcsorley как начальную точку и группу Domain Admins в качестве целевой.
  • BloodHound автоматически построит цепочку действий, которая показывает, какие ресурсы и привилегии нужно использовать или обойти, чтобы достичь уровня доменного администратора.
bloodhound path
bloodhound path

Как видно на скришноте пользователь fmcsorley обладает правами ReadLAPSPassword.

The user [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
#

Используя pyLAPS

./pyLAPS.py --action get -d "hutch.offsec" -u "fmcsorley" -p "CrabSharkJellyfish192"
pyLAPS
pyLAPS

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
ldapsearch LAPS
ldapsearch LAPS

Admin password
#

Итак мы получили пароль админа в открытом виде и таким образом повысили привелегии.

NOTE: В вашем случае пароль будет отличаться, потому что LAPS их ротирует.

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'
evil-winrm
evil-winrm

И заберем флаги:

proof
proof

Conclusion
#

Давайте еще раз кратко пробежимся по тому, что мы сделали:

  • С помощью nmap определили, что есть открытый порт на котором висит LDAP.
  • Используя ldapsearch нашли пароль от учетки обычного пользователя в поле description.
  • Попробовали сделать password spraying на другие учетные записи с найденым паролем, но неудачно.
  • Используя учетку обычного пользователя с помощью BloodHound выявили путь для эскалации привелегий.
  • Получили пароль админа в открытом виде.
  • Используя evil-winrm получили shell на машину с админскими правами и забрали флаги.

Возвращаясь к тому, с чего я начал эту статью, а именно к сложности данной машины. Другие пользователи оценивают ее, как Hard. Я думаю, что дело в том, что они не использовали BloodHound и застряли на этапе эскалации привелегий. Но даже если вы первый раз слышите про LAPS, то использую BloodHound вы бы о нем узнали и смогли продвинуться дальше.

Подписывайтесь на мой Telegram канал Breach_Zone и твиттер Breach_Zone!