Содержание статьи
- Разведка. Сканирование портов
- Точка входа. AS-Rep Roasting
- Точка опоры
- Конвертация MSG
- Анализ приложения, использующего вызов CMD
- Анализ приложения со скрытыми функциями
- Выполнение команд через MS SQL Server
- Продвижение
- Первый пользователь — svc_mssql и техника runas
- Второй пользователь — 3v4Si0N и взлом KeePass
- Третий пользователь — Dr.Zaiuss и атака Kerberoasting
- Четвертый пользователь — superfume и password spraying
- Пятый пользователь — jari и декомпиляция .NET
- Шестой пользователь — gibdeon
- Локальное повышение привилегий
- LAPS
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка. Сканирование портов
Добавляем IP-адрес машины в /:
10.10.10.240 pivotapi.htb
И сканируем порты.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(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 ).

Создав простой конвейер на Bash, получим из всех документов поля Creator и Author.
exiftool * | grep "Creator\|Author" | awk '{print $3}'
Откинув сомнительные записи, мы можем составить список из пяти возможных имен пользователей: saif, byron, cairo, Kaorz, alex.
Точка входа. AS-Rep Roasting
Так как на хосте работает Kerberos, мы можем проверить, существует ли какая‑то учетная запись. В этом нам поможет атака AS-Rep 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 .
Но есть одно ограничение: у учетной записи пользователя может быть активирован флаг DONT_REQ_PREAUTH, который означает, что для данной учетной записи не требуется предварительная проверка подлинности Kerberos. Для этого пользователя учетные данные не проверяются и сервер аутентификации генерирует секретный ключ, хешируя пароль пользователя, найденный в базе данных. Получается, мы можем пробрутить хеш и узнать пароль пользователя!
Брутить хеш будем по словарю программой hashcat. При запуске нам нужно передать номер типа хеша (параметр -m), поэтому сначала узнаем его, запросив справку и отфильтровав только нужный нам тип.
hashcat --example | grep krb5asrep -A2 -B2
Искомый номер — 18200. Теперь запускаем перебор, при этом в параметрах указываем перебор по словарю (-a ), тип хеша krb5asrep (-m ), файл с хешем и словарь.
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. было создано для рестарта службы Oracle. Что здесь очень важно — это функция логина, то есть приложение работает с учетными данными.
Во втором сообщении упоминается блокировка службы WinRM и исходящего трафика по протоколам TCP, UDP и ICMP.
Анализ приложения, использующего вызов CMD
Перейдем к анализу третьего файла — исполняемого. Откроем его в любом дизассемблере (я использую IDA Pro) и первым делом глянем список импортируемых функций. Это позволит нам составить первое мнение об этой программе и примерно понять, для чего она нужна.


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

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

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


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

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

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

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


Запустим измененный скрипт, после чего проверим каталог C:\, там нас будет ждать файл с данными, скрипт на 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 .


Обрати внимание на параметры lpUsername и lpPassword, где содержатся имя пользователя и его пароль. Так как это учетные данные для сервера базы данных, попробуем на нем и авторизоваться. Увы, моя первая попытка зайти как svc_oracle: провалилась — сервер ответил, что имя пользователя или пароль неверные.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»

