
Kestrel v.1.1.0
Инструмент малошумного перечисления безопасности Active Directory с использованием нативных интерфейсов ADSI/COM. Перечисляет ACL, делегирование, доверительные связи, ADCS, цели Kerberoast и пути атак без использования .NET или PowerShell, формируя вывод, совместимый с BloodHound.
Kestrel
BloodHound показывает путь. Kestrel показывает то, что уже внутри.
Все строят одно и то же: путь атаки — кто может добраться до Domain Admin. Это правильный вопрос, и инструменты, которые на него отвечают, превосходны. Но граф «кто может достичь кого» слеп к целому классу проблем, потому что некоторые из самых опасных вещей в Active Directory — это вовсе не путь.
Это бэкдор, впаянный в атрибут. Сертификат, который продолжает аутентифицировать ещё долго после сброса пароля. Разрешение, вшитое прямо в схему, так что каждый объект, создаваемый отныне, наследует его незаметно. Удалённая учётная запись, право вернуть которую кто-то тихо сохранил. Объект, скрытый от перечисления одним единственным deny-read ACE.
Ничто из этого не является ребром в графе. Всё это прямо сейчас находится в вашем каталоге. Kestrel читает это — нативными вызовами Windows, обычными правами доменного пользователя, без сервера, без Python, без агента, и с настолько сдержанным следом на контроллере домена, что он задокументирован по каждому событию.
Один .exe. Одна команда. Всё нижеперечисленное.
Вы смотрели не в ту сторону
Экосистема атакующих инструментов для AD — SharpHound, impacket, Certipy и граф, стоящий за ними, — превосходна, но все они смотрят на одну и ту же поверхность: достижимость. Kestrel смотрит на три измерения, которые эта поверхность выразить не может.
- Время. Граф — это снимок. Kestrel читает метаданные репликации — когда изменился атрибут Tier-0 и какой контроллер домена был источником. Право DCSync, выданное вчера вечером, — это не та же находка, что существующая годами, и лишь одна из них означает, что вас атакуют прямо сейчас.
- Стойкость в атрибуте, а не в ребре. Теневые учётные данные, SID history, реактивация tombstone-объектов, бэкдоры в схеме через
defaultSecurityDescriptor, скрытые объекты, deny-ACE дляOWNER RIGHTS, ключи DKM AD FS. Графовые инструменты не собирают это, потому что нечего рисовать в виде ребра. - Оборонительная позиция, вывернутая наизнанку. Не «кто может атаковать», а «что не защищено» — учётная запись Tier-0 вне своего silo, учётная запись синхронизации со случайным RID, которую никто не пометил, политика блокировки, которая никогда не ограничивает перебор.
Дело не в том, что Kestrel быстрее графа. Он отвечает на вопросы, которые граф задать не может.
Каждый грех AD — в одном нативном exe
| Грех | Что находит Kestrel | Флаги |
|---|---|---|
| Репликация и делегирование | Права DCSync (кто может реплицировать — без самой репликации), неограниченное / ограниченное делегирование / RBCD / S4U | --acl · --delegation |
| Злоупотребление сертификатами | AD CS ESC1–5/9, мошеннический CA в хранилище NTAuth, долгоживущая сертификатная стойкость, ACL ключа DKM AD FS — предусловие Golden SAML | --adcs · --adfs |
| Стойкость в атрибутах | Теневые учётные данные, внедрение SID history, права на реактивацию tombstone-объектов, скрытые объекты, бэкдоры через defaultSecurityDescriptor в схеме, осиротевшие adminCount | --shadowcreds · --sidhistory · --acl · --schema · --adminsdholder |
| Открытые и взламываемые учётные данные | GPP cpassword, секреты unattend/sysprep и пароли в скриптах по всему SYSVOL, учётные записи, уязвимые для Kerberoast и AS-REP-roast, пробелы покрытия LAPS | --gpp · --roast · --laps |
| Кросс-доменные и гибридные | Foreign principals в привилегированных группах, учётные записи синхронизации Entra Connect, помеченные Tier-0, состояние доверия, учётные записи компьютеров, созданные через MachineAccountQuota (mS-DS-CreatorSID) | --groups · --trust · --machines |
| Позиция и разведка | Политика паролей / PSO, возраст krbtgt, параметры LLMNR / NBT-NS / WDigest / NTLMv1 в GPO, читатели gMSA, устаревшие компьютеры, топология делегирования | --pwdpolicy · --policy · --gmsa · --stale |
Двадцать с лишним проверок, которые обычно разбросаны по дюжине скриптов и двум языкам. Здесь они — один бинарник, и заканчиваются единым вердиктом, отсортированным по критичности.
Одна строка
Kestrel.exe --all --report audit.html
Запустить всё. Получить полный HTML-отчёт. И в самом конце консоли — то, что важнее всего:
═══ Kestrel - Prioritized Findings ═══
CRITICAL DCSync CORP\svc_sql - non-default principal can replicate directory changes (DCSync)
→ fix: remove GetChanges/GetChangesAll from the principal on the domain head (dsacls) unless it is a DC
CRITICAL AD FS CN=... - read access to the DKM key (Golden SAML precondition)
→ fix: remove non-default read ACEs on the DKM object (dsacls) and rotate the token-signing certificate
HIGH Persistence CN=... - object hidden from enumeration via a broad deny-read ACE
→ fix: inspect the hidden object and remove the broad deny-read ACE (dsacls)
[=] 2 critical · 1 high · 0 medium · 0 low
Не стена вывода. Находки, которые имеют значение, ранжированы, и к каждой приложена команда для устранения.
Один exe. Red, blue, purple.
- Red / grey — обнаружение стойкости и делегирования, которые граф упускает, экспорт прямо в BloodHound CE OpenGraph (
--opengraph) для слияния с существующей коллекцией, или начало анализа от любого субъекта (--from). - Blue — приоритезированный список находок с рекомендациями;
--diffсо снимком прошлой недели, чтобы поймать то, что изменилось; и инструмент, чей точный след обнаружения опубликован, чтобы вы могли добавить его в белый список и настроить собственные алерты. - Purple — один артефакт, который обе стороны читают одинаково. Red находит, Blue исправляет, все смотрят на одну и ту же строку.
Обнаруживаемый по замыслу
Kestrel — только чтение. Он никогда не записывает в каталог, никогда не реплицирует, не требует SeSecurityPrivilege, не касается облака. Чтение того, кто может делать DCSync, на уровне трафика совершенно не похоже на выполнение DCSync — ни DRSUAPI, ни сигнатуры репликации 4662. Каждый выполняемый запрос и каждое событие, которое он может (и не может) породить, каталогизированы в FOOTPRINT.md. Аудитор, который рассказывает защитнику, как именно его поймать, — это не противоречие, а весь смысл.
Быстрый старт
Возьмите сборку. Каждый успешный прогон CI публикует артефакт Kestrel.exe — скачайте его со вкладки Actions, тулчейн не нужен.
Или соберите сами. Visual Studio (v143+) или MSBuild:
git clone https://github.com/ssteelfactor-oss/Kestrel.git
cd Kestrel
msbuild Kestrel.vcxproj /p:Configuration=Release /p:Platform=x64
Чистый C, ноль сторонних зависимостей. Сборка /MT — и это один самодостаточный исполняемый файл: положите его на хост, введённый в домен, запустите от имени любого обычного пользователя.
Запустите его.
Kestrel.exe --all --report audit.html # everything, HTML report + ranked findings
Kestrel.exe --acl --adcs --adfs # pick specific checks
Kestrel.exe --paths --from CORP\jdoe # attack paths from one principal
Kestrel.exe --all --diff last-week.json # what changed since the last snapshot
Kestrel.exe --all --opengraph graph.json # export to BloodHound CE OpenGraph
Модули
Запустите --all или выберите любой поднабор. Полная справка: Kestrel.exe --help.
| Флаг | Сканирование |
|---|---|
--acl | Рёбра ACL, права DCSync, гигиена владельца/наследования/канонических имён, скрытые объекты, реактивация tombstone-объектов |
--groups | Транзитивное членство в привилегированных группах + foreign security principals |
--delegation | Неограниченное / ограниченное делегирование / RBCD / S4U2Self |
--paths / --from | Анализ путей атаки до Tier-0 (опционально от заданного субъекта) |
--adcs | Аудит шаблонов сертификатов / CA AD CS (ESC1–5/9) + хранилище NTAuth + срок действия |
--adfs | ACL ключа DKM AD FS (предусловие Golden SAML) |
--schema | Аудит бэкдоров defaultSecurityDescriptor в схеме |
--trust | Состояние доверия домена / леса |
--machines | Учётные записи компьютеров, созданные через MachineAccountQuota (mS-DS-CreatorSID) |
--roast | Учётные записи, уязвимые для Kerberoast и AS-REP-roast |
--shadowcreds | Теневые учётные данные (msDS-KeyCredentialLink) |
--sidhistory | Внедрение sIDHistory (привилегированное / foreign) |
--adminsdholder | Осиротевшие объекты adminCount=1 |
--gpp | Зачистка секретов SYSVOL — GPP cpassword, unattend, учётные данные в скриптах |
--gpolateral | GPO локальные группы → латеральные рёбра (AdminTo / CanRDP / CanPSRemote / ExecuteDCOM) |
--policy | Политика безопасности GPO (LLMNR / NBT-NS / WDigest / NTLMv1) |
--pwdpolicy | Политика паролей / PSO · возраст krbtgt · MachineAccountQuota |
--hygiene | Гигиена учётных данных (PASSWD_NOTREQD / DONT_EXPIRE / обратимые / утечки в описаниях) |
--gmsa | Перечисление читателей паролей gMSA |
--laps | Покрытие LAPS (legacy + Windows LAPS 2023+) |
--stale | Устаревшие компьютеры по lastLogonTimestamp |
--topology | Топология компьютеров через декодирование SPN |
--adws | Обнаружение конечных точек ADWS (9389/TCP на каждом DC) |
Вывод и интеграция: --report <file> (.html / .json / .yaml) · --opengraph <file> (BloodHound CE) · --diff <snapshot.json> · --verbose.
Инварианты дизайна
Это обещания, а не предпочтения — причины, по которым его безопасно запускать в продакшене. Нарушение любого из них — ошибка безопасности (см. SECURITY.md).
- Только чтение — никогда не создаёт, не изменяет и не удаляет объекты каталога. Только события чтения/доступа, никогда — события изменения.
- Обычный доменный пользователь — никакого повышения привилегий, никакого
SeSecurityPrivilege, только DACL-маски безопасности. - Без репликации — обнаруживает, кто может выполнять DCSync; сам никогда не вызывает DRSUAPI.
- Только каталог и SYSVOL — без RPC/SMB к рядовым хостам.
- Без уклонения — никакой фрагментации запросов, никаких игр со временем, никакого вмешательства в логи. См. FOOTPRINT.md.
- Только on-prem — никаких вызовов к Entra / Graph / облаку; он аудирует след, который гибрид оставляет в AD.
- Нативный и автономный — чистый C, ноль сторонних зависимостей, один
.exe.
Дорожная карта
| Версия | Статус | Веха |
|---|---|---|
| v0.13 | ✅ | Оценка условий входа |
| v0.14 | ✅ | Глубина ACL + латеральные рёбра |
| v0.15 | ✅ | Аудит структуры ACL (класс ADeleg) |
| v0.16 | ✅ | Тихая стойкость + глубина SYSVOL / ADCS |
| v0.17 | ✅ | Кросс-доменный + гибридный след |
| v0.18 | ✅ | Чистота запросов + честный след |
| v1.0 | ✅ | Функционально полон: приоритезированные находки + рекомендации, CI, Apache 2.0 |
| v1.1 | 🔲 | Временная шкала · обнаружение rogue-DC / DCShadow · ADIDNS · проход по оборонительной позиции |
Документация
- FOOTPRINT.md — точный след LDAP / SYSVOL, который оставляет каждая проверка, и события на DC, которые она порождает (и не может породить).
- SECURITY.md — порядок сообщений об уязвимостях, область действия и инварианты дизайна как проверяемые гарантии.
- LICENSE — Apache 2.0.
Связанные проекты
Родительский проект: NetEnum — перечисление AD через ADSI / COM / LDAP.
Автор
@ssteelfactor-oss — исследования безопасности и внутренности COM / Windows.
Лицензия
Лицензируется на условиях Apache License 2.0 — см. LICENSE. Предоставляется «как есть», без каких-либо гарантий; запускайте только против каталогов, аудировать которые вы уполномочены.