Содержание статьи
- Разведка. Сканирование портов
- Точка входа. 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»