
CVE-2026-54121 (Certighost) PoC имперсонации DC в AD CS. Исправленная обработка SAN + повторное использование учётных записей с учётом MAQ.
Рабочий форк PoC-инструмента для CVE-2026-54121, также известного как Certighost. Оригинальное исследование и PoC от @H0j3n и @aniqfakhrul. Подробный анализ:
Этот форк исправляет обработку SAN, из-за которой PKINIT не мог завершиться успешно на центрах сертификации (ЦС), учитывающих запрошенный SAN, делает разбор --target-san более надёжным и перерабатывает логику работы с учётными записями компьютеров, чтобы квота ms-DS-MachineAccountQuota больше не исчерпывалась.
Запускайте от root, так как поддельные службы LDAP и SMB требуют привилегированных портов 389 и 445.
sudo python3 certighost.py -d playground.local -u lowpriv -p 'Password1234' --dc-ip 192.168.1.10
После успешного завершения целевой сертификат (.pfx) и кэш Kerberos (.ccache) записываются в текущий рабочий каталог.
CERTIGHOST$, создаётся при первом запуске) или учётную запись, указанную через --computer-name.cdc, указывающий на контролируемый IP-адрес (через --listener; необязательно, если не указан — определяется автоматически), а также атрибут rmd, содержащий DNS-имя целевого контроллера домена..ccache и NT-хэша.В оригинале SAN сертификата задавался и в расширении subjectAltName запроса CSR, и в атрибуте запроса SAN:dns=, на основе имени узла поддельного компьютера, а не FQDN целевого контроллера домена. На ЦС, который учитывает запрошенный SAN, выданный сертификат содержал dNSHostName поддельной учётной записи, поэтому PKINIT сопоставлял его с неправильным субъектом и завершался с ошибкой:
KDC_ERR_CLIENT_NAME_MISMATCH(Reserved for PKINIT)
Теперь SAN использует dNSHostName целевого контроллера домена (rmd_value / target_dns) — именно по нему PKINIT сопоставляет учётную запись компьютера. Выданный сертификат теперь содержит DNS:<dc>.<domain>, и AS-REQ завершается от имени контроллера домена.
--target-san--target-san теперь принимает любое из значений MEEREEN, MEEREEN$ или FQDN meereen.essos.local (сопоставляется по sAMAccountName или dNSHostName), а не только краткую форму NAME.
Оригинал при каждом запуске создавал новую случайную учётную запись GHOST********$. Поскольку учётные записи компьютеров, созданные через ms-DS-MachineAccountQuota, принадлежат администраторам домена (а не создателю), непривилегированный пользователь не может их удалить, поэтому повторные запуски быстро приводили к исчерпанию квоты (по умолчанию 10) и появлению осиротевших учётных записей.
Этот форк повторно использует одну стабильную учётную запись (CERTIGHOST$, создаётся только если её ещё нет), поэтому квота не растёт и между запусками нечего очищать.
При первом создании учётной записи скрипт выводит предупреждение о том, что она остаётся в AD:
[!] WARNING: computer account CERTIGHOST$ was created and is left in AD.
Учётная запись сохраняется для повторного использования в последующих запусках. Чтобы полностью удалить её, выполните удаление с правами администратора домена (владельца объекта):
Get-ADComputer CERTIGHOST | Remove-ADComputer -Confirm:$false
impacketcryptography, pyasn1, asn1crypto, pycryptodomexТолько для авторизованного тестирования безопасности и образовательных целей. Используйте его только против систем, на тестирование которых у вас есть явное разрешение.