Всем привет. Я чуть больше полутора лет занимаюсь внутренним пентестом. И вроде бы уже многое знаю, но всегда кажется, что этого недостаточно и хочется знать больше. Когда часто делаешь похожую работу, привыкаешь к одним и тем же действиям, инструментам, и нет идей, что бы еще попробовать. Иногда я черпаю вдохновение в отчетах своих коллег, но всегда интересно почитать о том, как работают и что используют другие команды. А раз это интересно мне, может, это интересно кому-то еще. Мы 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-сессии, необходимо отредактировать конфигурацию утилиты 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.
В Bloodhound я посмотрела, кто же является локальным администратором на SERVER1, и выбрала пользователя docsvision.
После этого, используя ticketer.py и NTLM-хэш учетной записи компьютера SERVER1, я создала TGS для пользователя docvision. Далее использовала crackmapexec с модулем lsassy: с полученным билетом я прошла аутентификацию на хосте SERVER1 и получила учетные данные из оперативной памяти процесса LSASS.EXE. Был получен NTLM-хэш УЗ docvision. Можно использовать его для Pass-the-hash и попробовать продвинуться дальше.
Следующий шаг — определить, на каких хостах пользователь docvision является локальным администратором. В этом опять поможет Bloodhound. Нашла четыре хоста — есть шансы на продвижение.
Я провела атаку Pass-the-hash на эти хосты и снова получила учетные данные из оперативной памяти процесса LSASS.EXE. На хосте SERVER2 обнаружила в открытом виде пароли пользователей SERVER2\user2 и DOMAIN\adm. Пользователь DOMAIN\adm является администратором домена. С помощью crackmapexec проверила его учетные данные и получила Logon failed. Выяснила, что он изменил пароль несколько часов назад. Как же это обидно!
Я предположила, что на хосте SERVER2 осталась сессия пользователя adm, подключилась к хосту по протоколу RDP. Для подключения использовала УЗ SERVER2\user2 — он оказался локальным администратором. С помощью PsExec.exe я открыла cmd от имени NT AUTHORYTY\Система. Это нужно для корректной работы mimikatz.exe. Затем с помощью модуля token-утилиты mimikatz посмотрела список токенов. Ура, повезло! Есть токен adm! С помощью команды token::elevate /domainadmin я выполнила имперсонацию токена доступа пользователя adm.
После этого я провела атаку dcsync и получила NTLM-хэш пароля пользователя adm.
Используя полученный NTLM-хэш пароля пользователя adm, я провела атаку Pass-the-hash на хост dc-office.domain.ru и с помощью crackmapexec с модулем lsassy получила в открытом виде пароль пользователя DOMAIN\infosec_domain, который тоже является администратором домена. Так как по условиям проведения работ я не скрывалась, то для своего удобства после подключения по протоколу RDP к контроллеру домена я создала и добавила в группы «Администраторы домена» и «Администраторы предприятия» УЗ пользователя Jet1. Почему-то заходить на контроллер домена по RDP — мое любимое действие. В этот момент я чувствую себя крутой :)
Как вы могли заметить, для получения привилегий администратора домена не были использованы какие-то уязвимости в ОС Windows или другом ПО. Я использовала некорректные конфигурации и особенности протоколов. Конечно, и отсутствие антивируса на нужном мне хосте помогло. Какой вывод можно сделать? «Не обновлениями едиными»: важно не только обновлять ПО, но и использовать best practices в настройках используемого ПО.
Для устранения недостатков, которые привели к получению привилегий администратора домена, необходимо:
Отключить IPv6 на всех интерфейсах всех устройств (так как в этой компании протокол IPv6 не используется). Это поможет защититься от атаки с подменой DNS-сервера.
Включить обязательную подпись SMB. Это поможет защититься от атаки NTLM Relay.
Установить антивирусное ПО на все хосты. Это поможет защититься от запуска вредоносных утилит вроде mimikatz.exe.
Также можно добавить администраторов домена в группу Protected Users («Защищенные пользователи»). Но стоит протестировать эту функцию перед применением. Или можно запретить администраторам домена заходить на хосты, не являющиеся контроллерами домена (использовать типовую архитектуру).
В своей работе я осуществляю взломы ради того, чтобы компании стали еще более защищенными: мои атаки — во благо. А еще в нашей команде есть те, кто занимается отлавливанием «дыр» и недопущением подобных ситуаций. Нам нравится делиться тем, что мы знаем. Если хотите узнать, как защититься от хакеров, приходите на большой кибертренинг CyberCamp в сентябре. Будут практикумы для команд численностью от трех до пяти человек. А если хотите просто послушать обучающие доклады — регистрируйтесь как зритель. Участие бесплатное.
Ирина Беляева
старший консультант по информационной безопасности Центра информационной безопасности «Инфосистемы Джет»