Захват Active Directory на виртуальной машине с HackTheBox

Hack The Box

В сегодняшней статье я покажу, как пройти путь с нуля до полноценного администратора контроллера домена Active Directory, а поможет нам одна из виртуалок, доступных для взлома на CTF-площадке HackTheBox. Пусть это и не самая сложная машина, но овладеть навыками работы с AD крайне важно, если ты собираешься пентестить корпоративные сети.

Еще по теме: Взлом и защита Active Directory

HackTheBox (HTB) — полузакрытая площадка для хакерских соревнований CTF. Чтобы получить инвайт, нужно пройти небольшое испытание. После этого тебе дадут доступ к десяткам заведомо уязвимых виртуальных машин и ты сможешь прокачивать навыки пентестера. Автор статьи успел потратить немало сил в погоне за высокой строчкой в рейтинговой таблице HTB.

HTB — Active
HTB — Active

Контроллер домена Active Directory — это критически важная составляющая почти любой современной IT-инфраструктуры. Служба каталогов Windows Server всегда была желанным объектом контроля для нарушителей, решивших прочно обустроиться внутри корпоративной сети. Поэтому аспекты обеспечения защиты AD — животрепещущая тема для обсуждения в любой компании исследователей кибербезопасности.

Виртуалка, которую мы будем ломать, называется Active. Ее сложность оценивается сообществом невысоко — 4,6 балла из 10. Вот что нам предстоит проделать с ней:

  • сбор информации о разделяемых SMB-ресурсах (пробуем ряд крутых утилит: smbclient, smbmap, enum4linux, nullinux);
  • разграбление SMB с анонимным доступом для захвата файла конфигураций групповых политик Groups.xml;
  • декрипт GPP-пароля из той самой Groups.xml;
  • получение доступа к внутридоменному аккаунту, атака Kerberoasting (против протокола аутентификации Kerberos), извлечение тикета администратора с помощью коллекции скриптов impacket;
  • наконец, офлайновое восстановление пароля администратора из хеша с помощью Hashcat для окончательного захвата контроллера.

«…Лежа в пещере своей, в три глотки лаял огромный Цербер, и лай громовой оглашал молчаливое царство…»

Разведка

Начальная стадия — сбор информации об объекте исследования для дальнейшего анализа. От качества этой фазы во многом зависит успешность планируемой атаки. Мы соберем необходимые сведения, которые определят вектор проникновения в систему.

Nmap

Следуя хорошему тону, сперва аккуратно «прощупаем» виртуалку на предмет открытых портов с помощью Nmap: пока не используем тяжелую артиллерию — скриптовые обвесы NSE и определение версий запущенных сервисов, иначе время сканирования существенно увеличилось бы. Задаем интенсивность в 5000 пакетов в секунду (имеет смысл, когда работаешь с хостом на Windows, к которому, помимо тебя, одновременно стучится еще сотня-другая пользователей HTB) и на всякий случай запросим отчеты во всех форматах (.nmap, .gnmap, .xml) с помощью флага -oA.

Смотрим отчет.

Значение TTL, равное 128, еще раз подтверждает, что это тачка с Windows.

Много открытых портов, много сервисов. Повысим детализацию и узнаем версии всего того, что запущено, задействовав заодно флаг -sC. Он добавит к сканированию дефолтные скрипты из арсенала NSE.

Nmap позволяет генерировать красивые отчеты в HTML с помощью опции —stylesheet. Для этого только нужно создать подходящий шаблон XSL-таблицы стилей или воспользоваться готовым. К примеру, хороший вариант — nmap-bootstrap-xsl.

По результатам расширенного сканирования заключаем:

  • это контроллер домена Active Directory с именем домена active.htb;
  • ОС — Windows Server 2008 R2 SP1;
  • microsoft-ds? (он же Microsoft Directory Services, или SMB) — сетевые разделяемые ресурсы SMB, в простонародье «SMB-шары» версии 2 на 445-м порте;
  • система аутентификации Kerberos на 88-м порте.

Начнем с очевидного — посмотрим, что скрывает SMB.

Энумерация SMB — порт 445

Об этом можно было бы написать отдельную статью, но здесь мы лишь вкратце рассмотрим софт для срыва покровов с SMB-шар.

NSE (Nmap Scripting Engine)

У всемогущего Nmap есть арсенал скриптов на все случаи жизни. Вытягивание информации об SMB — не исключение. Посмотрим, что есть в его ассортименте из категорий default, version и safe, использовав контекстный поиск по файлам с расширением .nse в Kali Linux.

[/crayon]
Направим безопасные (safe) творения скриптового движка на 445-й порт:

Несмотря на обширный вывод, ничего полезного мы не нашли, только еще раз подтвердили, что это протокол второй версии — SMBv2. Идем дальше.

smbclient

Утилита smbclient служит в Linux для подключения к SMB. Для начала посмотрим, какие SMB-ресурсы есть на хосте. Анонимного (Null Authentication) доступа для этого будет достаточно.

Единственная директория, к которой есть доступ с Null Authentication, — это Replication, реплицированное хранилище, по сути копия системного тома SYSVOL. Это чрезвычайно интересный момент с точки зрения потенциального повышения привилегий в системе, так как SYSVOL содержит файл настроек групповых политик, изначально доступный лишь авторизированным пользователям.

Взглянем на содержимое Replication.

[/crayon]
Чтобы не ходить по вложенным директориям вручную, воспользуемся следующей хитростью: активируем опцию рекурсивного обхода шары, выключим надоедливый промпт, чтобы он не заставлял нас подтверждать каждое действие, и сделаем полный слепок Replication, как показано ниже.

Теперь мы имеем офлайновую копию папки Replication. Вывести список файлов для более наглядного анализа содержимого можно с помощью find.

Пока не будем зарываться дальше, а пройдемся по другим разведывательным утилитам.

smbmap

Вместо smbclient можно использовать smbmap — это более удобный инструмент, который позволяет провернуть то же самое с меньшим числом действий. Сначала просканируем сервер целиком.

[/crayon]
Сразу видим, что нам доступно с текущими правами (в данном случае — Null Authentication), что весьма удобно. Теперь одной командой попросим у smbmap рекурсивный листинг файлов директории Replication.

И в качестве финального штриха забираем понравившийся нам файл (спойлер: это Groups.xml), указав при этом флаг -q, чтобы не смотреть на листинг лишний раз.

Вот еще пара разведскриптов.

  • enum4linux — классика жанра. Эта написанная на Perl софтина немного устарела, но неплохо помогает в сборе информации о Windows и Samba.
  • nullinux.py — обновленная и переписанная на Python альтернатива enum4linux. Делает то же, но красивее и без кучи сообщений об ошибках.

GPP (Group Policy Preferences)

Перейдем к просмотру того, что мы смогли вытащить с SMB.

Средство для управления предпочтениями групповых политик, или Group Policy Preferences (GPP), было представлено в 2008 году в Windows Server и упрощает жизнь администраторам домена. С помощью GPP они могут централизованно управлять параметрами безопасности пользователей и групп по всей своей сети.

Например, админ обнаружил, что пароль локального администратора не соответствует политике безопасности, и решил его изменить. В этом случае новый пароль зашифруется ключом AES-256 и экспортируется в Groups.xml (чтобы не потерять!). Это тот самый файл, который мы захватили вместе с папкой Replication.

Однако в 2012 году сотрудники Microsoft по какой-то причине решили открыто опубликовать тот самый ключ шифрования на MSDN, и с тех пор пароли, установленные с помощью GPP, больше не считаются безопасными. Теперь даже приклеить стикер с таким паролем на монитор кажется меньшим вандализмом — так к нему хотя бы не дотянуться по сети.

Опубликованный на MSDN ключ AES-256 для шифрования паролей из Groups.xml
Опубликованный на MSDN ключ AES-256 для шифрования паролей из Groups.xml

И несмотря на вышедший в 2014 году патч, запрещающий хранить пароли в Groups.xml, в 2019-м все равно остается вероятность наткнуться на ошибки конфигурации такого рода, и эта машина — как раз наш случай.

Поле cpassword содержит пароль пользователя active.htb\SVC_TGS, зашифрованный ключом Microsoft… Уже не секретным ключом Microsoft.

Декрипт cpassword

gpp-decrypt

В Kali Linux есть штатная утилита для расшифровки паролей GPP — gpp-decrypt.

Скрипт на PowerShell

Также есть интересный скрипт для PowerShell, который выполняет ту же задачу. Полную версию ты можешь найти на GitHub, я же использовал только нужный кусочек, взятый из комментариев в блоге автора.

Расшифровываем пароль GPP с помощью скрипта на PowerShell
Расшифровываем пароль GPP с помощью скрипта на PowerShell

В любом случае мы получили авторизационные данные: SVC_TGS:GPPstillStandingStrong2k18.

PrivEsc: Anonymous → SVC_TGS

Получив пользовательский доступ к SMB, заберем первый флаг из \\10.10.10.100\Users.

user.txt

Монтирование SMB

Для более детального изучения содержимого директорий можно монтировать SMB-шару. Для примера возьмем ту же //10.10.10.100/Users.

Монтированный SMB-ресурс в Kali Linux
Монтированный SMB-ресурс в Kali Linux

Получение пользователей AD

Итак, у нас есть аккаунт внутри домена. Можно воспользоваться утилитой ldapsearch для поиска записей о пользователях домена в службе каталога, доступной по протоколу LDAP. Использование фильтра useraccountcontrol:1.2.840.113556.1.4.803: со значением 2 гарантирует, что мы получим информацию только об активных аккаунтах AD.

То же самое можно было получить с помощью коллекции скриптов на Python impacket.

Kerberoasting — порт 88

Одна из техник повышения привилегий в рамках системы аутентификации Kerberos называется Kerberoasting (игра слов: Kerberos + roasting = «прожарка Kerberos»). Она была представлена Тимом Медином на конференции DerbyCon в 2014 году (PDF).

Основная идея атаки: если нужный нам аккаунт (администратор, конечно) ассоциирован с записью SPN (Service Principal Name), мы можем попросить у центра распределения ключей системы Kerberos (KDC, Key Distribution Center) на контроллере соответствующий тикет TGS (Ticket Granting Service), который будет содержать хеш пароля от этого аккаунта.

Если пароль слабый, мы легко восстановим его в офлайне. Это возможно потому, что TGS_REP — ответ Kerberos на такой запрос — будет зашифрован с помощью хеша NTLM-пароля того аккаунта, от имени которого запущен сервис.

Сетевые взаимодействия при подобной атаке отражены на рисунке ниже.

Схема выполнения атаки Kerberoasting
Схема выполнения атаки Kerberoasting

Если любишь такое чтиво, то о Kerberoasting можешь почитать в этих статьях.

Получение SPN пользователей AD

Для перечисления (enumeration) принципалов развернутых сервисов (SPN) можно еще воспользоваться поиском по LDAP.

Или можно при помощи impacket сразу сдампить хеш TGS найденного аккаунта. Для этого есть флаг -request.

Восстановление пароля админа

Восстанавливать прообраз хеша будем с помощью Hashcat. С этой задачей может справиться и John The Ripper версии Jumbo.

Для начала заглянем в шпаргалку по режимам Hashcat и выясним, что нужный нам режим — 13100. Теперь все готово для восстановления пароля.

Успех. Авторизационные данные для привилегированного доступа — Administrator:Ticketmaster1968.

PrivEsc: SVC_TGS → Administrator

Можем забрать последний флаг root.txt из домашней директории администратора с помощью smbmap точно так же, как я показал это ранее, а можем с помощью скрипта psexec.py инициировать суперпользовательскую сессию.

root.txt

На этом все, теперь система полностью под нашим контролем.

Трофей
Трофей

Защита

Что делать, чтобы такого не произошло с твоим настоящим контроллером домена? К сожалению, вектор, по которому осуществляется атака Kerberoasting, использует уязвимость самой архитектуры протокола Kerberos, поэтому наилучшая мера защиты от атак подобного типа — использовать сложные пароли для служебных учетных записей, связанных с Kerberos и SPN. Кроме того, нелишним будет сконфигурировать все сервисы без использования учетных записей с расширенными привилегиями.

Еще по теме: Повышение привилегий в Windows

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся аналитикой компьютерных угроз. Анонсы новых статей в Телеграме.

Добавить комментарий