Не обновлениями едиными: как получить привилегии администратора домена без эксплуатации уязвимостей

Всем привет. Я чуть больше полутора лет занимаюсь внутренним пентестом. И вроде бы уже многое знаю, но всегда кажется, что этого недостаточно и хочется знать больше. Когда часто делаешь похожую работу, привыкаешь к одним и тем же действиям, инструментам, и нет идей, что бы еще попробовать. Иногда я черпаю вдохновение в отчетах своих коллег, но всегда интересно почитать о том, как работают и что используют другие команды. А раз это интересно мне, может, это интересно кому-то еще. Мы c командой решили тоже поделиться несколькими интересными киллчейнами. В этой статье я расскажу о последовательности шагов, которая привела к получению привилегий администратора домена в компании, в которой «почти все безопасно».

Краткое описание — на схеме.

Подробнее — под катом.

Схема атаки Источник: пресс-служба «Инфосистемы Джет»Схема атаки Источник: пресс-служба «Инфосистемы Джет»

Внимание! Данная статья носит исключительно информационный характер и предназначена для образовательных целей.

После подключения к локальной сети первым делом я смотрю сетевой трафик. В этот раз моих любимых LLMNR и NBNS нет (о LLMNR и NBNS Spoofing можно почитать здесь: https://habr.com/ru/company/jetinfosystems/blog/449278/), зато есть сообщения DHCPv6 Solicit, значит, можно притвориться DHCPv6-сервером (главное — делать это аккуратно, а то заказчик может расстроиться). Для этого я использую инструмент mitm6.py (https://github.com/dirkjanm/mitm6). Я люблю сочетать его с атакой NTLM Relay.

Почему аккуратно и что может пойти не так

Если кратко, то по умолчанию DNS-сервер с адресом IPv6 является более приоритетным, чем сервер с адресом IPv4. Когда хост получит по протоколу DHCPv6 адрес DNS-сервера (IP-адрес атакующего), все запросы пойдут к этому DNS-серверу. И если он на любой запрос будет отвечать своим IP-адресом, то может сломаться взаимодействие между различными сервисами. Например, если какой-то сервис ходит к базе данных по имени, а не по IP-адресу, он уйдет не туда. Я рекомендую указывать, на какие запросы будет отвечать DNS-сервер. Для этого задаю параметр -d в утилите mitm6.py.

Схема атаки:

1. Жертва по умолчанию периодически рассылает сообщения с запросом DHCPv6 настроек.

2. Атакующий отвечает жертве: назначает IPv6-адрес и указывает в качестве DNS-сервера свой IPv6-адрес.

3. Жертва хочет обратиться к какому-то хосту по DNS-имени, обращается к поддельному DNS-серверу. Например, жертва ищет wpad.doman.local.

4. Атакующий отвечает на DNS-запрос своим IPv4-адресом.

5. Жертва обращается к хосту атакующего (это может быть http, smb, ldap и др.).

6. Атакующий проводит атаку NTLM Relay на цель.

В качестве целей атаки я использовала хосты, на которых нет подписи на SMB. Список таких хостов можно составить с помощью команды crackmapexec smb 192.168.0.0/24 --gen-relay-list relaylist.txt. Запустила ntlmrelayx.py с параметром --socks., затем запустила mitm6.py. Как результат — множество запросов на получение DHCPv6-адреса, DNS-запросов и затем обращений к моему хосту. И — ура, мне повезло! В результате атаки я получила SMB-сессии пользователя DOMAIN\DIM, который является локальным администратором на нескольких хостах. (SMB-сессия — это всплывающее окно: Socks-сервер в ntlmrelayx.py умеет удерживать соединения. Затем можно подключаться к этому соединению, не имея пароля пользователя. Пока соединение удерживается, вы можете использовать различные утилиты для конкретного протокола. Но как только соединение оборвется, доступ будет потерян.) Конечно, еще были перехвачены NTLMv2-хэши паролей многих пользователей, их я поставила на перебор. К сожалению, пароль DIM не удалось получить, но сбрутился пароль другой учетной записи. Ее я использовала для запуска bloodhound.py.

Что такое Bloodhound

Если совсем просто: коллекторы bloodhound собирают информацию о доменах — домены, пользователи, группы, компьютеры, права доступа. Потом результаты можно изучить в графическом интерфейсе Bloodhound: посмотреть членов групп, кто где локальный администратор, построить путь до администратора домена. Подробнее можно почитать в документации https://bloodhound.readthedocs.io/en/latest/index.html.

Полученные SMB-сессии Источник: пресс-служба «Инфосистемы Джет»Полученные SMB-сессии Источник: пресс-служба «Инфосистемы Джет»

Для того, чтобы использовать полученные SMB-сессии, необходимо отредактировать конфигурацию утилиты proxychains4, которая позволяет запускать различные утилиты через прокси. В файл /etc/proxychains необходимо добавить строку socks4 127.0.0.1 1080, чтобы использовать sokcs-прокси, поднятый ntlmrelay.py.

Чаще всего я использую полученную сессию для выгрузки учетных данных из реестра (из базы SAM и LSA). Для этого использую secretsdump.py. Таким образом можно получить NTLM-хеши локальных пользователей, в том числе локального администратора, которые затем можно использовать для атак Pass-The-Hash или побрутить их. Из LSA можно получить DCC2-хеши пользователей, которые ранее заходили на устройство. Брутятся эти хэши долго, но когда ничего другого нет, это тоже неплохо. А если повезет, то из LSA можно достать пароли учетных записей, от имени которых запускаются сервисы (однажды так я получила пароль администратора домена).

И в этот раз, используя proxychains4 и secretsdump.py, я получила учетные данные из реестра на хосте с именем SERVER1. С использованием NTLM-хеша локального администратора аутентифицироваться не удалось, так как ему запрещено аутентифицироваться по сети. Но был получен NTLM-хеш учетки компьютера SERVER1. С использованием этого хеша можно провести атаку Silver Ticket.

Получение учетных данных из реестра хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»Получение учетных данных из реестра хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»

В Bloodhound я посмотрела, кто же является локальным администратором на SERVER1, и выбрала пользователя docsvision.

Список администраторов хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»Список администраторов хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»

После этого, используя ticketer.py и NTLM-хэш учетной записи компьютера SERVER1, я создала TGS для пользователя docvision. Далее использовала crackmapexec с модулем lsassy: с полученным билетом я прошла аутентификацию на хосте SERVER1 и получила учетные данные из оперативной памяти процесса LSASS.EXE. Был получен NTLM-хэш УЗ docvision. Можно использовать его для Pass-the-hash и попробовать продвинуться дальше.

Получение хешей паролей из памяти процесса lsass хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»Получение хешей паролей из памяти процесса lsass хоста SERVER1 Источник: пресс-служба «Инфосистемы Джет»

Следующий шаг — определить, на каких хостах пользователь docvision является локальным администратором. В этом опять поможет Bloodhound. Нашла четыре хоста — есть шансы на продвижение.

Список хостов, на которых docsvision является администратором Источник: пресс-служба «Инфосистемы Джет»Список хостов, на которых docsvision является администратором Источник: пресс-служба «Инфосистемы Джет»

Я провела атаку Pass-the-hash на эти хосты и снова получила учетные данные из оперативной памяти процесса LSASS.EXE. На хосте SERVER2 обнаружила в открытом виде пароли пользователей SERVER2\user2 и DOMAIN\adm. Пользователь DOMAIN\adm является администратором домена. С помощью crackmapexec проверила его учетные данные и получила Logon failed. Выяснила, что он изменил пароль несколько часов назад. Как же это обидно!

Получение паролей из памяти процесса LSASS на хосте SERVER2 Источник: пресс-служба «Инфосистемы Джет»Получение паролей из памяти процесса LSASS на хосте SERVER2 Источник: пресс-служба «Инфосистемы Джет»

Я предположила, что на хосте SERVER2 осталась сессия пользователя adm, подключилась к хосту по протоколу RDP. Для подключения использовала УЗ SERVER2\user2 — он оказался локальным администратором. С помощью PsExec.exe я открыла cmd от имени NT AUTHORYTY\Система. Это нужно для корректной работы mimikatz.exe. Затем с помощью модуля token-утилиты mimikatz посмотрела список токенов. Ура, повезло! Есть токен adm! С помощью команды token: elevate /domainadmin я выполнила имперсонацию токена доступа пользователя adm.

Token impersonation Источник: пресс-служба «Инфосистемы Джет»Token impersonation Источник: пресс-служба «Инфосистемы Джет»

После этого я провела атаку dcsync и получила NTLM-хэш пароля пользователя adm.

Атака DCSYNC Источник: пресс-служба «Инфосистемы Джет»Атака DCSYNC Источник: пресс-служба «Инфосистемы Джет»

Используя полученный NTLM-хэш пароля пользователя adm, я провела атаку Pass-the-hash на хост dc-office.domain.ru и с помощью crackmapexec с модулем lsassy получила в открытом виде пароль пользователя DOMAIN\infosec_domain, который тоже является администратором домена. Так как по условиям проведения работ я не скрывалась, то для своего удобства после подключения по протоколу RDP к контроллеру домена я создала и добавила в группы «Администраторы домена» и «Администраторы предприятия» УЗ пользователя Jet1. Почему-то заходить на контроллер домена по RDP — мое любимое действие. В этот момент я чувствую себя крутой :)

Получение паролей из памяти процесса LSASS на контроллере домена Источник: пресс-служба «Инфосистемы Джет»Получение паролей из памяти процесса LSASS на контроллере домена Источник: пресс-служба «Инфосистемы Джет» Подключение по RDP к контроллеру домена Источник: пресс-служба «Инфосистемы Джет»Подключение по RDP к контроллеру домена Источник: пресс-служба «Инфосистемы Джет»

Как вы могли заметить, для получения привилегий администратора домена не были использованы какие-то уязвимости в ОС Windows или другом ПО. Я использовала некорректные конфигурации и особенности протоколов. Конечно, и отсутствие антивируса на нужном мне хосте помогло. Какой вывод можно сделать? «Не обновлениями едиными»: важно не только обновлять ПО, но и использовать best practices в настройках используемого ПО.

Для устранения недостатков, которые привели к получению привилегий администратора домена, необходимо:

  • Отключить IPv6 на всех интерфейсах всех устройств (так как в этой компании протокол IPv6 не используется). Это поможет защититься от атаки с подменой DNS-сервера.

  • Включить обязательную подпись SMB. Это поможет защититься от атаки NTLM Relay.

  • Установить антивирусное ПО на все хосты. Это поможет защититься от запуска вредоносных утилит вроде mimikatz.exe.

  • Также можно добавить администраторов домена в группу Protected Users («Защищенные пользователи»). Но стоит протестировать эту функцию перед применением. Или можно запретить администраторам домена заходить на хосты, не являющиеся контроллерами домена (использовать типовую архитектуру).

В своей работе я осуществляю взломы ради того, чтобы компании стали еще более защищенными: мои атаки — во благо. А еще в нашей команде есть те, кто занимается отлавливанием «дыр» и недопущением подобных ситуаций. Нам нравится делиться тем, что мы знаем. Если хотите узнать, как защититься от хакеров, приходите на большой кибертренинг CyberCamp в сентябре. Будут практикумы для команд численностью от трех до пяти человек. А если хотите просто послушать обучающие доклады — регистрируйтесь как зритель. Участие бесплатное.

1ce7f4dcdcbf1436f587341c69047a41.jpegИрина Беляева

старший консультант по информационной безопасности Центра информационной безопасности «Инфосистемы Джет»

© Habrahabr.ru