В начале октября была обнаружена очередная возможность повышения привилегий с помощью шаблонов сертификатов ADCS - техника ESC15. Уязвимыми являются шаблоны сертификатов с 1-й версией схемы и возможностью указать subjectAltName (SAN) в CSR. Также нужно знать учётные данные пользователя с правами Enroll на уязвимый шаблон.
Одним из встроенных уязвимых шаблонов является WebServer (Version:1 и CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT). По-умолчанию, запрашивать сертификаты, используя этот шаблон, могут только Domain- и Enterprise-администраторы. Но по нашему опыту, пользователи часто меняют права на него, и нередко можно встретить там даже Authenticated Users.
Суть эксплуатации
При наличии у сертификата расширения Application Policies и Extended Key Usage (EKU), домен-контроллер предпочтёт верить EKU из “Application Policies”.
То есть при запросе сертификата, используя уязвимый шаблон, атакующий может добавить EKU “Client Authentication” в поле “Application Policies”, добавить администратора домена в SAN и, получив сертификат, успешно запросить TGT для этого администратора. Получается очень похоже на технику ESC1. Единственное ограничение - это возможность аутентификации только по schannel на LDAP.
Также атакующий может добавить EKU “Certificate Request Agent” в поле “Application Policies” и использовать полученный сертификат для запроса ещё одного, но уже на любого пользователя, как это реализовано в технике ESC3. Либо добавить “Code Signing” в “Application Policies” - и использовать сертификат для подписи файлов.
Для эксплуатации можно использовать утилиту certipy (PR ещё не заапрувлен) либо PSCertificateEnrollment.
Как детектировать
Для детектирования уязвимых шаблонов можно использовать событие с EventID 4898 (лучше включить флаг EDITF_AUDITCERTTEMPLATELOAD), абстрактно запрос выглядит так:
EventID:4898 AND TemplateContent:"CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT" AND TemplateSchemaVersion:1
Также можно воспользоваться обновленной в рамках PR командой find утилиты certipy, либо LDAP запросом:
Get-ADObject -LDAPFilter '(&(objectclass=pkicertificatetemplate)(!(mspki-enrollment-flag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-ra-signature=*)))(mspki-template-schema-version=1)(mspki-certificate-name-flag:1.2.840.113556.1.4.804:=1))' -SearchBase 'CN=Configuration,DC=test,DC=local' -Properties DisplayNameПри использовании утилиты certipy, в атрибутах запроса события 4887 будет специфичное содержание.

Полагаться на это при детектировании запроса нельзя, так как это необязательное поле в CSR. Например, при добавлении Application Policies в поле атрибутов мы увидим имя шаблона и OID добавленной политики:
CertificateTemplate:WebServer ApplicationPolicies:1.3.6.1.4.1.311.20.2.1
Если запросить сертификат c SAN, то выглядеть это будет уже следующим образом:
CertificateTemplate:WebServer SAN:upn=administrator@test.local ApplicationPolicies:1.3.6.1.5.5.7.3.2
Если есть возможность получать события из БД ADCS, то там подобные запросы выглядят так:

Посмотреть, как это выглядит в БД, можно с помощью certutil:
certutil.exe -v -view -restrict "RequestID=230" -out Request.RequestID,Request.RawRequest,Request.RequestAttributes,CertificateTemplate,RawCertificateЧто делать после обнаружения уязвимых шаблонов
Есть несколько вариантов действий:
Удалить неиспользуемые шаблоны или отключить их. Можно сделать это, используя скрипт ESC15.ps1 и Unpublish-SchemaV1Templates.ps1
Клонировать шаблон, если он необходим. При клонировании, версия схемы нового шаблона автоматически повысится до 2ой и новый шаблон не будет уявзимым к данной технике.
Заполнить атрибут msPKI-Certificate-Application-Policy необходимыми для шаблона EKU из атрибута pKIExtendedKeyUsage, используя скрипт Remediate-ESC15.ps1. В этом случае, при запросе сертификата, CA добавит в Application Policy сертификата EKU из шаблона - и атакующий не сможет добавить свои EKU из запроса.
Этот способ не сработает для шаблонов, у которых атрибуты msPKI-Certificate-Application-Policy и pKIExtendedKeyUsage специально выставлены в Null, например SubCA, CA, CrossCA. Следить за тем, кто может выпускать сертификаты, используя подобные шаблоны, нужно особенно внимательно.
- Если вы уверены, что данное расширение вам не нужно, то можно отключить добавление Application Policies к сертификату:
certutil -setreg policy\DisableExtensionList +1.3.6.1.4.1.311.21.10Но в любом случае необходимо проверить выпущенные сертификаты с использованием уязвимых шаблонов.