HTB Search. Обходим AMSI в PowerShell Web Access при пентесте машины на Windows
Наша цель — машина Search с площадки Hack The Box. Ее уровень сложности — hard.
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts:
И запускаем сканирование портов.
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
У нас есть целая куча открытых портов:
На хосте работает много служб. Первым делом проверяем SMB и DNS, но они ничего не дают. Остается только веб. Так как на порте 443 используется протокол HTTPS, сразу обратим внимание на его сертификат. Поле commonName содержит доменные имена, для которых действителен данный сертификат. Nmap показывает эти настройки в результатах сканирования, что позволяет нам быстро определить используемое имя. Добавляем его в файл /etc/hosts:
Изучая сайт, обращаем внимание на список сотрудников.
Так как на хосте работает Kerberos, мы можем проверить, существует ли какая‑то учетная запись. В этом нам поможет атака ASRep Roasting. Смысл в том, что мы посылаем на сервер аутентификации анонимный запрос для предоставления определенному пользователю доступа к какой‑либо услуге. На что сервер отвечает одним из трех действий:
Но сперва составим список пользователей. С помощью следующего кода мы можем составить все возможные комбинации имени пользователя:
Сохраним список в файл и выполним проверку с помощью kerbrute. Для этого используем опцию renum и укажем адрес (--dc), домен (-d) и список с вероятными именами учетных записей.
Все сканирование заняло примерно секунду, а мы получаем три существующих аккаунта. С помощью скрипта GetNPUsers.py из пакета impacket применяем к полученным именам ASRep Roasting в надежде получить зашифрованный пароль пользователя. Но безуспешно.
Потратив очень много времени на поиск дальнейшего пути, я нашел на сайте фотографию http://search.htb/images/slide_2.jpg каких‑то записей.
При увеличении картинки стало понятно, что это список дел, среди которых есть такая строчка: «Send password to Hope Sharp».
Проверяем это имя и узнаем, что такой аккаунт в системе есть.
Теперь мы можем проверить и указанный пароль с помощью CrackMapExec.
Теперь логично пойти на SMB и посмотреть, что расположено на доступных ресурсах.
Походив по разным каталогам, ничего интересного не обнаруживаем. Из необычного — лишь директория RedirectedFolders$, которая выводит нас на домашние каталоги всех пользователей. Продвинуться дальше это не помогает, но можно получить имена всех пользователей.
В итоге получаем большой список пользователей. Сохранить в файл только имена можно такой командой:
Выполняем с ним все те же операции, но ни к чему не приходим. Однако мы не попробовали одного...
Реализация протокола Kerberos в Windows использует имена участников службы (SPN), чтобы определить, какую учетную запись задействовать для шифрования билета службы. В Active Directory существует два варианта SPN: SPN на основе хоста и произвольные SPN. Первый вариант SPN связан с учетной записью компьютера домена, а второй обычно (но не всегда) — с учеткой пользователя домена.
Проще говоря, если запросить билет, он будет зашифрован паролем учетной записи, SPN которой был предоставлен. И если мы получим билет, мы сможем его просто пробрутиь, чтобы узнать пароль учетки!
Автоматизация запроса имен SPN, а затем еще и билетов выполнена в скрипте GetUserSPNs из набора impacket. Для его использования достаточно указать опцию -request.
И есть одна учетная запись, которую мы можем попытаться захватить, — web_svc. Вот только билет получить не удается, потому что время на хостах значительно отличается (а в Kerberos эта разница не должна превышать пяти минут). Синхронизировать время на локальном хосте нам поможет протокол NTP:
Теперь повторяем запрос билета и получаем хеш!
Сразу закидываем его в hashcat и указываем режим 13100 (параметр -m):
Получаем пароль пользователя и запускаем спрей по всем учетным записям. Высока вероятность, что он будет использован еще где‑то.
Как я и предполагал, мы забираем еще одну учетку. В домашнем каталоге пользователя на рабочем столе есть файл XLSX, который мы скачиваем на локальную машину командой get.
Открываем файл с учетными данными и видим скрытый столбец С.
Раздвинуть столбцы не выходит, так как лист документа защищен паролем от изменения.
Но такую защиту можно легко снять. Откроем документ как архив и найдем в нем настройки для нужного листа. У нас это второй лист, поэтому нужен файл sheet2.xml.
В этом файле находим и удаляем следующую строку, это поле sheetProtection.
Пересохраняем файл и открываем документ. Готово: защиты больше нет. Раздвигаем столбец С и получаем список паролей.
Теперь нужно проверить их валидность. Для этого выбираем и сохраняем в файл с паролями столбец C, а в файл с именами учетных записей — столбец D. После этого перебираем их с помощью уже применявшегося CrackMapExec, только с опцией --no-bruteforce. С этой опцией CME не будет перебирать все возможные сочетания. Вместо этого он использует для первого имени первый пароль из списка, для второго — второй и так далее.
В итоге мы получаем еще одного пользователя — Sierra.Frye. А на рабочем столе этого юзера есть первый флаг.
Просматривая остальные каталоги пользователя, вроде документов и загрузок, находим сертификаты.
Сертификат можно просто открыть и просмотреть, для этого я изменил расширение на .crt. Но у нас запросили пароль.
Эти пароли брутятся, а для их извлечения существует целый пакет скриптов 2john (уже есть в Kali Linux). Нам нужен pfx2john.py, который в качестве аргумента принимает только путь к файлу.
Отправляем на перебор в программу John The Ripper и спустя некоторое время получаем пароль.
Теперь открываем сертификат и смотрим его данные.
Это сертификат для веб‑приложения. Чтобы его использовать, мы должны добавить его в хранилище сертификатов браузера (Settings → Privacy & Security → Security → View certificate).
Теперь осталось найти сервис, для которого нужен сертификат. Я попробовал что‑то вроде search.research.htb, research.search.htb, а также поля из самого серта, но все безуспешно. Тогда я попробовал использовать имя файла сертификата. С адреса https://search.htb/staff/ произошел редирект на https://search.htb/staff/en-US/logon.aspx.
PowerShell Web Access — это фича, при помощи которой можно управлять сервером удаленно через браузер при помощи PowerShell. Авторизуемся от имени пользователя Sierra.Frye и получим консоль PowerShell.
Затем я попробовал прокинуть реверс‑шелл для PowerShell, но мне помешал AMSI.
Antimalware Scan Interface (AMSI) — это компонент Microsoft Windows, который обеспечивает более глубокую проверку встроенных служб сценариев. Продвинутое вредоносное ПО уклоняется от традиционных методов проверки с помощью замаскированных или зашифрованных сценариев. Такое вредоносное ПО часто загружается непосредственно в память, поэтому не использует файлы на устройстве. AMSI — это интерфейс, через который приложения и службы отправляют запросы на проверку установленному на компьютере антивирусу.
Но мы можем запатчить AMSI, чтобы наш код не уходил на проверку. Этот метод я взял из курса OSEP, он заключается в изменении адресов заголовков amsiContext (контекст, в котором происходит сканирование). В этом варианте мы будем «занулять» указатель.
Подробнее про обход AMSI — в статье «F#ck AMSI! Как обходят Anti-Malware Scan Interface при заражении Windows».
Первым делом мы получаем все типы, определенные в этой сборке, и ищем AmsiUtils.
Теперь получаем его поля, из которых выбираем amsiContext.
Затем — адрес, по которому хранится значение.
И записываем по данному адресу 0.
Теперь можно ввести строку 'amsiutils', чтобы проверить работу AMSI. Но PowerShell просто выведет ее вместо того, чтобы заблокировать. Это говорит о том, что AMSI больше нам не помешает.
Повторяем наш реверс‑шелл и получаем бэкконнект.
В системе очень много пользователей, поэтому для быстрого и удобного сбора информации и ее дальнейшего анализа будем использовать BloodHound. BloodHound использует графы для выявления скрытых и часто непреднамеренных взаимосвязей в среде Active Directory. Его можно использовать, чтобы легко идентифицировать очень сложные пути атаки, которые иначе было бы невозможно быстро идентифицировать.
Изначально саму нагрузку, реализованную на PowerShell или C#, нужно было запускать на целевом хосте. Но есть и версия на Python, которую можно использовать прямо с Linux. Загрузим BloodHound с GitHub и установим:
А теперь соберем информацию с целевого хоста, благо это не займет много времени. В параметрах указываем учетные данные для подключения, адрес хоста и тип собираемой информации — всю (параметр -c, значение all).
В логах видим, сколько доменов, лесов и компьютеров было найдено, сколько пользователей и групп получено. В результате работы BloodHound в текущей директории будет создано несколько файлов. Для работы с ними нам нужно установить СУБД Neo4j и графическую оснастку bloodhound для отрисовки графов связей.
Запустим Neo4j командой sudo neo4j console. После сообщения об успешном старте зайдем на http://localhost:7474/ через браузер. Нам сразу предложат установить пароль. После установки пароля запустим BloodHound (команда bloodhound в командной строке) и авторизуемся с только что установленным паролем. Откроется пустое окошко — закинем в него полученные от BloodHound файлы с кодом на Python. Затем выберем опцию поиска путей для повышения привилегий и получим маленький граф.
Первым делом у нас должна быть учетная запись BD-ADFS-GMSA.SEARCH.HTB. Поскольку у нее есть право GenericAll для учетки TRISTAN.DAVIES, мы можем манипулировать параметрами подконтрольного пользователя, вплоть до смены пароля. А уже этот пользователь является администратором. Имя учетной записи наталкивает на мысль о MSA.
Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем таких учетных записей полностью управляет Active Directory. Для них автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней.
Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля. Для этого написан инструмент gMSADumper. Используем его:
У нас есть хеш пароля учетной записи! Попробуем создать сессию этого пользователя. Не указываем пароль явно, вместо этого загружаем его msDS-ManagedPassword.
Теперь по нашему плану сменим пароль второго пользователя (я поставлю ralfpass).
Проверяем новый пароль с помощью CME.
И создаем новую сессию, теперь привилегированную.
Мы работаем как администратор, в качестве подтверждения читаем флаг рута.
- Кибер новости: the Matrix
- Хакинг: /me Hacker
- Кодинг: Minor Code
- IT Бункер : Бункер Айтишника