Unconstrained delegation

all objects that have an SPN can be configured for delegation

Delegation process

Разбор по шагам:

  1. Подразумевается, что учетная запись User не является чувствительной к делегированию и не состоит в группе защищенных пользователей (флаг NOT_DELEGATED не активен).

  2. Сначала User, как уже было рассмотрено ранее, получает TGT в результате обмена KRB AS REQ и KRB AS REP сообщениями.

  3. Далее User запрашивает TGS-билет для доступа к Сервису А (KRB TGS REQ).

  4. KDC видит, что у Сервиса А установлен флаг “TRUSTED_FOR_DELEGATION”, разрешающий неограниченную делегацию, и поэтому в ответ User KDC отправляет TGS-билет с флагом ok-as-delegate.

  5. Получив TGS-билет, User обнаруживает флаг ok-as-delegate и понимает, что ему необходимо передать свои учетные данные Сервису А. Для этого User снова обращается к KDC c просьбой выдать ему перенаправляемый (forwarded) TGT.

  6. KDC выполняет необходимые проверки и отправляет User TGT с правом передачи.

  7. User обращается к Сервису А с немного расширенным KRB AP REQ сообщением. Теперь в аутентификаторе содержится не только метка времени и принципал клиента, но и перенаправляемый (forwarded) TGT вместе с сессионным ключом для общения с KDC.

  8. Сервис А извлекает сессионный ключ для общения с User из TGS-билета, расшифровывает аутентификатор, выполняет проверки и сохраняет Forwarded TGT для User вместе с соответствующим указанному билету сессионным ключом.

  9. С использованием полученных аутентификационных данных Сервис А получает TGS-билет к Сервису Б от имени User.

У учетной записи пользователя может быть установлен флаг NOT_DELEGATED в атрибуте UserAccountControl, запрещающий олицетворение указанного пользователя.

По умолчанию флаг NOT_DELEGATED отключен и устанавливается либо при активации опции “Account is sensitive and cannot be delegated”, либо при добавлении пользователя в группу “Protected Users”.

Примечание: среди прочего члены группы “Protected Users” также не могут аутентифицироваться по NTLM, использовать DES или RC4 шифрование в Kerberos, обновлять TGT по истечении 4 часов и кэшировать учетные данные для входа в домен.

Чтобы учетная запись получила право на неограниченное делегирование в атрибуте UserAccountControl указанной учетной записи необходимо установить флаг TRUSTED_FOR_DELEGATION, которому соответствует целочисленное значение 524288. По умолчанию указанный флаг активен только у машинных учетных записей контроллеров домена.

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

Abuse

Search accounts with unconstrained delegation

Вариант 1 - с помощью PowerShell модуля ADSI для работы с Active Directory

Поиск среди всех учетных записей

Вариант 2 - с помощью FindDelegation.py, входящего в Impacket

Поиск среди всех учетных записей

Вариант 3 - PowerView

Поиск среди учетных записей класса компьютер

Поиск среди пользовательских учетных записей

Примечание: существует py-аналог PowerView для Linux

Вариант 4 - Bloodhound

Поиск среди учетных записей класса компьютер:

Поиск среди пользовательских учетных записей:

Вариант 5 - Ldapdomaindump после Relay

Все приведенные выше способы требовали наличия прав пользователя, но также можно провести Relay атаку по протоколу LDAP на контроллер домена с последующим использованием Ldapdomaindump:

Получив административный доступ к серверу с сервисом, обладающим неограниченным делегированием, атакующий может извлечь TGT учетных записей, проходивших аутентификацию к указанному сервису, из памяти процесса lsass.exe сервера.

Осуществить выгрузку можно с помощью Rubeus:

Или при помощи Mimikatz:

Полученные TGT можно использовать для проведения атаки Pass-the-Ticket.

Last updated