
Инструмент малошумного перечисления безопасности Active Directory с использованием нативных интерфейсов ADSI/COM. Перечисляет ACL, делегирование, доверительные связи, ADCS, цели Kerberoast и пути атак без использования .NET или PowerShell, формируя вывод, совместимый с BloodHound.
# Kestrel
[](https://github.com/ssteelfactor-oss/Kestrel/actions/workflows/build.yml)
[](LICENSE)
[](#)
[](#)
> ### BloodHound показывает вам путь. Kestrel показывает то, что уже внутри.
Все строят карту одного и того же: пути атаки — *кто может добраться до Domain Admin.* Это правильный вопрос, и инструменты, отвечающие на него, превосходны. Но граф «кто до кого может добраться» слеп к целому классу проблем, потому что некоторые из худших вещей в Active Directory — вовсе не путь.
Это бэкдор, вваренный в атрибут. Сертификат, который продолжает аутентифицировать ещё долго после смены пароля. Разрешение, вписанное в саму схему, так что каждый созданный с этого момента объект молча его наследует. Удалённая учётная запись, право вернуть которую кто-то тихо сохранил за собой. Объект, скрытый от перечисления единственным deny-read ACE.
**Ничто из этого не является ребром в графе. Всё это прямо сейчас лежит в вашем каталоге.** Kestrel читает это — с помощью нативных вызовов Windows, обычных прав доменного пользователя, без сервера, без Python, без агента, и со столь сдержанным следом на контроллере домена, что он [задокументирован событие за событием](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md).
Один `.exe`. Одна команда. Всё ниже.
---
## Вы смотрели не в ту сторону
Наступательная экосистема для AD — SharpHound, impacket, Certipy и граф за ними — великолепна, и все они смотрят на одну и ту же поверхность: достижимость. Kestrel смотрит на три измерения, которые эта поверхность выразить не может.
- **Время.** Граф — это снимок. Kestrel читает метаданные репликации — *когда* изменился атрибут Tier-0 и *какой DC* стал источником этого изменения. Право DCSync, выданное прошлой ночью, — это не та же находка, что право, существующее годами, и только одно из них означает, что вас атакуют прямо сейчас.
- **Персистентность в атрибуте, а не в ребре.** Shadow credentials, SID history, reanimate-tombstones, бэкдоры в `defaultSecurityDescriptor` схемы, скрытые объекты, deny-ACE `OWNER RIGHTS`, ключи AD FS DKM. Инструменты для графов не собирают это, потому что здесь нет ребра, которое можно нарисовать.
- **Защитная позиция, вывернутая наизнанку.** Не «кто может атаковать», а «что не защищено» — учётная запись Tier-0 вне своего периметра, учётная запись синхронизации со случайным RID, которую никто не пометил, политика блокировки, которая никогда не ограничивает перебор.
Дело не в том, что Kestrel быстрее графа. Он отвечает на вопросы, которые граф задать не может.
---
## Каждый грех AD — в одном нативном exe
| Син | Что находит Kestrel | Флаг(и) |
|-----|-------------------|---------|
| **Репликация и делегирование** | Права DCSync (кто *может* реплицировать — без фактической репликации), неограниченное / ограниченное / RBCD / S4U делегирование | `--acl` · `--delegation` |
| **Злоупотребление сертификатами** | AD CS ESC1–5/9, мошеннический CA в хранилище NTAuth, долгоживущая персистентность через сертификаты, **ACL ключа AD FS DKM — предусловие Golden SAML** | `--adcs` · `--adfs` |
| **Персистентность в атрибутах** | Теневые учётные данные, инъекция истории SID, **права на реанимацию tombstone**, **скрытые объекты**, **бэкдоры `defaultSecurityDescriptor` в схеме**, осиротевший `adminCount` | `--shadowcreds` · `--sidhistory` · `--acl` · `--schema` · `--adminsdholder` |
| **Открытые и поддающиеся взлому учётные данные** | GPP `cpassword`, секреты `unattend`/`sysprep` и пароли скриптов в SYSVOL, учётные записи, уязвимые к Kerberoasting и AS-REP roasting, пробелы в покрытии LAPS | `--gpp` · `--roast` · `--laps` |
| **Междоменные и гибридные связи** | Внешние субъекты в привилегированных группах, **учётные записи синхронизации Entra Connect с меткой Tier-0**, состояние доверия, **учётные записи компьютеров, созданные через MachineAccountQuota** (`mS-DS-CreatorSID`) | `--groups` · `--trust` · `--machines` |
| **Состояние и разведка** | Политика паролей / PSO, возраст `krbtgt`, настройки GPO для LLMNR / NBT-NS / WDigest / NTLMv1, читатели gMSA, устаревшие компьютеры, топология делегирования | `--pwdpolicy` · `--policy` · `--gmsa` · `--stale` |
| **Археология** | **Осиротевшие опасные ACE** (право, принадлежащее удалённому субъекту — SID не разрешается ни в кого), **устаревшие привилегированные учётные записи** (забытые, с избыточными правами, с древним паролем) | `--archaeology` |
| **Укрепление домена** | Флаги `dSHeuristics` для анонимного LDAP / исключения AdminSDHolder, широкое членство в Pre-Windows 2000 Compatible Access | `--hardening` |
| **Состояние сервисов** *(читается из AD, без пакетов к сервису)* | **Эскалация Exchange-to-DA и EOL**, **захват контейнера SCCM и карта сайта**, **отравление зоны ADIDNS** (Authenticated Users могут создавать записи) | `--exchange` · `--sccm` · `--dns` |
Два десятка с лишним проверок, которые обычно разбросаны по дюжине скриптов и двум языкам. Здесь они — один бинарник, и всё заканчивается единым вердиктом, отсортированным по критичности.
---
## Одна строка
```
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. Красный, синий, фиолетовый.
- **Красный / серый** — перечисление механизмов персистентности и делегирования, которые пропускает граф, экспорт напрямую в BloodHound CE OpenGraph (`--opengraph`) для объединения с вашей существующей коллекцией, или переход от любого субъекта (`--from`).
- **Синий** — приоритизированный список устранённых находок; `--diff` относительно снимка прошлой недели, чтобы поймать то, что *изменилось*; и инструмент, чей точный детектируемый след опубликован, чтобы вы могли внести его в белый список и настроить свои оповещения вокруг него.
- **Фиолетовый** — один артефакт, который обе стороны читают одинаково. Красный находит, синий исправляет, все указывают на один и тот же номер строки.
## Детектируемый по замыслу
Kestrel работает только на чтение. Он никогда не пишет в каталог, никогда не реплицирует, никогда не требует `SeSecurityPrivilege`, никогда не обращается к облаку. Чтение *кто может* выполнять DCSync выглядит в сетевом трафике совершенно не так, как *выполнение* DCSync — никакого DRSUAPI, никакой сигнатуры репликации `4662`. Каждый выполняемый им запрос и каждое событие, которое он может (и не может) сгенерировать, каталогизированы в **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)**. Аудитор, который рассказывает защитнику, как именно его поймать, — это не противоречие, это и есть весь смысл.
---
## Быстрый старт
**Возьмите сборку.** Каждый успешный запуск CI публикует артефакт `Kestrel.exe` — скачайте его на вкладке [Actions](https://github.com/ssteelfactor-oss/Kestrel/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, гигиена owner/inheritance/canonical, скрытые объекты, reanimate-tombstones |
| `--groups` | Транзитивное привилегированное членство + внешние субъекты безопасности |
| `--delegation` | Unconstrained / constrained / 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` | Учётные записи, уязвимые к Kerberoasting + AS-REP roasting |
| `--shadowcreds` | Теневые учётные данные (`msDS-KeyCredentialLink`) |
| `--sidhistory` | Инъекция `sIDHistory` (привилегированная / внешняя) |
| `--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) |
| `--archaeology` | Осиротевшие опасные ACE (мёртвый владелец, живое право) + устаревшие привилегированные учётные записи |
| `--hardening` | Флаги усиления защиты домена: `dSHeuristics` anon-access / исключение SDProp + Pre-Windows 2000 Compatible Access |
| `--exchange` | Состояние Exchange: версия/EOL + эскалация Exchange-to-DA (WriteDACL на домене) *(сервис; по выбору)* |
| `--sccm` | Состояние SCCM/MECM: ACL контейнера `System Management` + management-point / site map *(сервис; по выбору)* |
| `--dns` | Интегрированный в AD DNS (ADIDNS): DACL CreateChild зоны + wpad/isatap/wildcard + DnsAdmins *(сервис; по выбору)* |
**Состояние сервисов** (`--exchange` · `--sccm` · `--dns`) включается по выбору и **не** входит в `--all`; запустите `--services` для всего слоя. Находки теперь несут теги техник **MITRE ATT&CK**.
**Вывод и совместимость:** `--report <file>` (`.html` / `.json` / `.yaml`) · `--opengraph <file>` (BloodHound CE) · `--diff <snapshot.json>` · `--verbose`.
---
## Инварианты дизайна
Это обещания, а не предпочтения — причины, по которым безопасно запускать в продакшене. Нарушение любого из них является уязвимостью безопасности (см. [SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)).
- **Только чтение** — никогда не создаёт, не изменяет и не удаляет объекты каталога. Только события чтения/доступа, никогда события изменения.
- **Обычный доменный пользователь** — без повышения привилегий, без `SeSecurityPrivilege`, маски безопасности только DACL.
- **Без репликации** — определяет, кто *может* выполнять DCSync; сам никогда не вызывает DRSUAPI.
- **Только каталог и SYSVOL** — никаких RPC/SMB к хостам-членам.
- **Без обхода защиты** — без фрагментации запросов, без игр со временем, без подмены журналов. См. [FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/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** | ✅ | **Пассивный слой оценки состояния сервисов: Exchange · SCCM · ADIDNS · усиление защиты домена · теги MITRE ATT&CK** |
| **v1.2** | ✅ | **Археология AD: осиротевшие опасные ACE + устаревшие привилегированные учётные записи** |
| v1.3 | 🔲 | Гибридный шов (Entra Connect / Seamless SSO) · nTDSConnection / предусловие DCShadow |
---
## Документация
- **[FOOTPRINT.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/FOOTPRINT.md)** — точный след LDAP / SYSVOL, который оставляет каждое сканирование, и события контроллера домена, которые оно генерирует (и не может генерировать).
- **[SECURITY.md](https://github.com/ssteelfactor-oss/kestrel/blob/main/SECURITY.md)** — сообщение об уязвимостях, область охвата и инварианты дизайна как проверяемые гарантии.
- **[LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE)** — Apache 2.0.
## Связанные проекты
Родительский проект: [NetEnum](https://github.com/ssteelfactor-oss/NetEnum) — перечисление AD через ADSI / COM / LDAP.
## Автор
[@ssteelfactor-oss](https://github.com/ssteelfactor-oss) — исследования в области безопасности и внутреннее устройство COM / Windows.
## Лицензия
Лицензировано под **Apache License 2.0** — см. [LICENSE](https://github.com/ssteelfactor-oss/kestrel/blob/main/LICENSE). Предоставляется «как есть», без гарантий; запускайте только против каталогов, которые вы уполномочены проверять.