Идём по киберследу: Анализ защищенности Active Directory c помощью утилиты BloodHound — страница 36 из 46

ESC1
, выделяем его и нажимаем на кнопку OK.


Рис. 4.65. Опубликованные шаблоны сертификатов


ESC2

Повторяем действия для создания шаблона сертификатов. Имя нового сертификата –

ESC2
. Во вкладке Subject Name устанавливаем Supply in the request. Переходим во кладку Extensions, выбираем Application Policies и нажимаем на кнопку Edit. У нас есть два варианта: или удалить все значения и оставить поле пустым, или добавить политику Any Purpose. Нажимаем на Apply.


Рис. 4.66. Настройка шаблона сертификата ESC2


Теперь необходимо опубликовать шаблон сертификата.


ESC3

В данном случае потребуется два шаблона сертификата. Создаем копию, как было описано ранее, называем шаблон

ESC3_1
. Переходим во вкладку Extensions и редактируем Application Policies. Нам необходимо удалить все поля и вместо них добавить Certificate Request Agent (рис. 4.67).

Нажимаем на кнопку Apply и закрываем окно. Теперь создадим еще один шаблон сертификата и назовем его

ESC3_2.
Переходим во вкладку Issuance Requirements и выполняем настройку. Установим галочку на This number of authorized signatures. В Policy type required in signature выберем Application policy, а в Application policy – Certificate Request Agent (рис. 4.68).

Нажимаем кнопку Apply и опубликовываем оба шаблона сертификата.


Рис. 4.67. Настройка шаблона сертификата ESC3_1


Рис. 4.68. Настройка шаблона сертификата ESC3_2


ESC4

Создадим еще одну копию шаблона сертификата

User
и назовем его
ESC4
. Перейдем во вкладку Security и выполним следующие настройки: группе
Authenticated
Users
предоставим полные права на данный шаблон, а группе
Domain
Users
добавим права
Write
.


Рис. 4.69. Права ACL для шаблона сертификата ESC4


Нажимаем кнопку Apply, закрываем окно и опубликовываем новый шаблон сертификата.


ESC5

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


ESC6

Для настройки недостатка необходимо запустить командную строку с правами администратора и выполнить следующую команду:

certutil -config "dc.domain.local\domain-DC–CA" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2


Рис. 4.70. Результат выполнения команды


ESC7

Возвращаемся в Certification Authority, вызываем контекстное меню для нашего центра сертификации и выбираем Properties. Переходим во вкладку Security и добавим группу

Domain User,
которой предоставим права Issue and Manage Certificates и
Manage CA
(рис. 4.71).

После добавления прав необходимо перезагрузить центр сертификации.


ESC8

Мы уже установили Web Enrollment, и дополнительные настройки не требуются.


ESC11

В командной строке с правами администратора нужно выполнить команду (рис. 4.72):

certutil -config "dc.domain.local\domain-DC–CA" -setreg "CA\InterfaceFlags" -IF_ENFORCEENCRYPTICERTREQUEST


Рис. 4.71. Добавление прав управления


Рис. 4.72. Удаление флага из настроек


Совет

Можно запустить утилиту certify или certipy и изучить результаты.

Сбор информации

Для сбора информации напишем скрипт на Powershell и назовем его

Get-ADCSInformation.ps1.
Алгоритм скрипта будет следующим:

● Выгрузить из Active Directory все шаблоны сертификатов.

● На основании информации о недостатках в шаблонах сформировать узел шаблона сертификата.

● Получить владельца шаблона сертификата.

● Получить ACL для шаблонов сертификатов.

● Запросить из Active Directory все центры сертификации.

● На основании информации о недостатках центра сертификации сформировать узлы центра сертификации.

● Проверить, в каких центрах сертификации используются шаблоны сертификатов.

Внимание

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

Некоторые комментарии по работе скрипта будут предоставлены в самом коде.

# https://www.sysadmins.lv/blog-en/how-to-convert-pkiexirationperiod-and-pkioverlapperiod-active-directory-attributes.aspx

function Convert-pKIPeriod ([Byte[]]$ByteArray)

{

[array]::Reverse($ByteArray)

$LittleEndianByte = –join ($ByteArray |%{ "{0:x2}" -f $_})

$Value = [Convert]::ToInt64($LittleEndianByte,16) * -.0000001

if (!($Value% 31536000) -and ($Value / 31536000) -ge 1) {[string]($Value / 31536000) + " years"}

elseif (!($Value% 2592000) -and ($Value / 2592000) -ge 1) {[string]($Value / 2592000) + " months"}

elseif (!($Value% 604800) -and ($Value / 604800) -ge 1) {[string]($Value / 604800) + " weeks"}

elseif (!($Value% 86400) -and ($Value / 86400) -ge 1) {[string]($Value / 86400) + " days"}

elseif (!($Value% 3600) -and ($Value / 3600) -ge 1) {[string]($Value / 3600) + " hours"}

else { "0 hours"}

}

function Get-ADCSInfo()

{

# Создаем hashtable для флагов Request Disposition

[flags()] Enum RequestDisposition

{

Pending = 0x00000000

Issue = 0x00000001

Deny = 0x00000002

UserRequestAttribute = 0x00000003

Mask = 0x000000ff

PendingFirst = 0x00000100

}

# Создаем файл отчета

[string]$OutFile = "ADCS_" + $(Get-Date -f ddMMyyyyhhmmss) +".log"

# Получаем имя домена

$DomainObject = [System.DirectoryServices. ActiveDirectory.Domain]::GetCurrentDomain()

$CurrentDomain = ([ADSI]""). distinguishedName

$DomainName = $DomainObject.name.toUpper()

# Выполняем ADSI-запрос для получения всех шаблонов сертификатов

$Objects = [ADSI]"LDAP://CN=Certificate Templates, CN=Public Key Services, CN=Services, CN=Configuration, $CurrentDomain"

$Templates = $Objects.Get_Children()

foreach($template in $templates)

{

# Получаем имя шаблона сертификата

$Name = $Template.properties.name.toUpper()

# Получаем отображаемое имя шаблона сертификата

$DisplayName = $Template.properties.displayname

# Получаем distinguishedname шаблона сертификата

$DN = $Template.properties.distinguishedname

# Получаем guid шаблона сертификата

$ObjectGUID = [guid]$Template.properties.objectGUID. value | select -ExpandProperty Guid

# Получаем размер ключа шаблона сертификата

$KeySize = $Template.properties.'msPKI–Minimal-Key-Size'

# Проверяем, можно ли экспортировать ключ сертификата

if($template.properties.'msPKI-Private-Key-Flag'.value -band "0x00000010")

{

$ExportableKey = "True"

}

else

{

$ExportableKey = "False"

}

# Проверка установки флага Key Archival для ключей

if($template.properties.'msPKI-Private-Key-Flag'.value -band "0x00000001")

{

$RequiresKeyArchival = "True"

}

else

{