
Разведка Active Directory и аудит безопасности в режиме только чтения через ADWS (net.tcp/9389) на Go
adit — это однофайловый инструмент разведки Active Directory и аудита безопасности в режиме только чтения, который взаимодействует с контроллером домена через ADWS (Active Directory Web Services, TCP/9389), а не через LDAP.
adit — это горизонтальный вход в шахту, тихий путь внутрь. Запросы к AD
через ADWS, а не через LDAP/389, означают, что трафик представляет собой
WCF net.tcp с кадрированием, бинарный XML SOAP поверх необычного порта, поэтому
он гораздо реже подвергается инспекции, фильтрации или сигнатурному анализу,
чем классический LDAP, — при этом возвращая те же данные каталога. adit
реализует полный стек протокола ADWS на Go, без внешних зависимостей времени выполнения.
┌────────────┐ net.tcp/9389 ┌──────────────┐
│ adit │ ───────────────▶ │ ADWS on DC │ ──▶ local LDAP
│ (Linux) │ NMF · NNS · │ (port 9389) │
│ │ NBFSE · SOAP └──────────────┘
└────────────┘
adit — это инструмент защитного/аудиторского и авторизованного тестирования. Запускайте его только против каталогов, на аудит которых у вас есть разрешение.
| Возможность | Детали |
|---|---|
| Транспорт | ADWS поверх WCF net.tcp (TCP/9389) — кадрирование MC-NMF, рукопожатие MS-NNS, бинарный XML MC-NBFS/NBFSE, SOAP WS-Enumeration/WS-Transfer |
| Аутентификация | NTLMv2 (sign + seal) и Kerberos (ccache / keytab / пароль; RFC 4121 sealed GSS) |
| Коллекторы разведки | 31 модуль (см. ниже) → CSV по каждому модулю |
| Отчётность | Стилизованная многолистовая книга XLSX + самодостаточная HTML-панель (поиск/сортировка, значки критичности, scroll-spy) |
| Аудит безопасности | 27 правил только для чтения (вкл. ADCS ESC1–4/9) → JSON с ранжированием по критичности, также отображается в панели |
| Прокси / jump-хост | HTTP CONNECT, SOCKS5/5h, SOCKS4/4a (с аутентификацией на прокси + удалённым DNS) |
| Постраничная выдача | Серверная постраничная выдача WS-Enumeration Pull, настраиваемый размер страницы |
| Офлайн-отчётность | Пересборка XLSX/HTML из ранее собранных CSV, контроллер домена не нужен |
| Зависимости | Чистый Go; без библиотеки LDAP, без .NET, без внешних сервисов |
forest, domain, trusts, sites, subnets, schemahistory, dcs,
users, userspns, groups, computers, computerspns, ous, gpos,
gplinks, passwordpolicy, fgpp, dnszones, dnsrecords, kerberoastable,
asreproastable, krbtgt, adcs, cas, laps, protectedgroups,
groupmembers, gmsa, dmsa, printers, bitlocker
ADCS (adcs) помечает ESC1–ESC4/ESC9; laps сообщает, кто может читать каждый пароль;
protectedgroups проводит аудит Protected Users. Запустите adit -list-modules для
актуального списка.
-audit запускает 27 правил только для чтения. Находки содержат id правила, критичность, затронутые
объекты, доказательства и рекомендации по устранению, и записываются в Adit-Audit.json (а
при сочетании с -collect — в раздел "Audit Findings", который возглавляет
панель). Движок никогда не читает значения секретных атрибутов (LAPS / gMSA /
BitLocker), хотя коллекторы разведки могут это делать.
| Правило | Критичность | Что помечает |
|---|---|---|
| AD-DOM-010 | Critical | Права DCSync (репликации) у не-Tier-0 субъекта |
| AD-ACL-001/005/006/007/011–016 | Critical | Опасный контроль (GenericAll/Write, WriteDACL/Owner, ForceChangePassword, Write SPN / KeyCredentialLink / member / AllowedToAct) над привилегированным объектом |
| AD-SDH-001/002 | Critical | Неожиданный контроль / владелец AdminSDHolder |
| AD-CS-001 | Critical–Medium | ESC1 — шаблон сертификата позволяет субъект, указанный заявителем |
| AD-CS-002 | Critical–Medium | ESC2 — шаблон сертификата Any-Purpose / без EKU |
| AD-CS-003 | High–Medium | ESC3 — шаблон Certificate Request Agent |
| AD-CS-004 | High | ESC4 — слабый контроль доступа к шаблону сертификата |
| AD-CS-009 | High | ESC9 — в шаблоне сертификата отсутствует расширение безопасности |
| AD-CS-005 | Critical/High | ESC5 — опасный контроль над объектом PKI (NTAuthCertificates, хранилище CA, объект CA) |
| AD-CS-006 | Info | AD CS присутствует — ESC6/ESC7/ESC8 требуют проверки на уровне хоста (не наблюдаемы через ADWS) |
| AD-DOM-008 | High | Обратимое шифрование паролей включено на уровне домена |
| AD-USR-001 | High | Kerberos pre-auth отключён (AS-REP roastable) |
| AD-USR-009 | High | Учётная запись использует только шифрование DES |
| AD-CMP-006 | High | Неограниченное делегирование на не-DC |
| AD-KCL-001 | High | Key Credential (shadow credential) на привилегированной учётной записи |
| AD-KRB-001 | High | Пароль krbtgt устарел |
| AD-DOM-005 | Medium | Machine Account Quota > 0 (любой пользователь может присоединять компьютеры) |
| AD-USR-002 | Medium | Kerberoastable сервисная учётная запись (High, если привилегированная) |
| AD-USR-005 | Medium | Установлен PASSWD_NOTREQD |
| AD-USR-006 | Medium | Пароль привилегированной учётной записи никогда не истекает |
| AD-USR-011 | Medium | Пароль привилегированной учётной записи устарел |
| AD-CMP-008 | Medium | Настроено resource-based constrained delegation |
| AD-CMP-012 | Medium | Устаревшая / неподдерживаемая операционная система |
| AD-GRP-009 | Medium | Foreign security principal в привилегированной группе |
| AD-GRP-020 | Medium | Скрытое привилегированное членство через primaryGroupID |
| AD-TRU-001/003 | High/Medium | Доверие без SID-фильтрации / с историей SID |
| AD-DNS-003/004 | Medium/Low | Присутствует запись WPAD / ISATAP |
| AD-CMP-011 | Low | Устаревшая учётная запись компьютера |
| AD-INT-005 | High | sIDHistory содержит привилегированный SID |
Пороги настраиваются: -krbtgt-max-age, -priv-pwd-max-age, -stale-days.
Примечание по ADCS: ESC1–ESC5 и ESC9 оцениваются по объектам AD через ADWS. ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2), ESC7 (ACL ролей CA) и ESC8 (веб- enrollment / NTLM relay) находятся в реестре/HTTP-эндпоинтах хоста CA и не наблюдаемы через ADWS —AD-CS-006помечает, что CA существует, чтобы их можно было проверить на хосте (например, с помощью Certipy).
Требуется Go 1.26+. Других зависимостей для сборки нет.
# Build the binary
go build -o adit ./cmd/adit
./adit -version
# …or run without installing
go run ./cmd/adit -h
# Cross-compile release archives for linux/windows/darwin (amd64+arm64) into dist/
bash scripts/build-release.sh
-fqdn должен быть реальным FQDN контроллера домена (не его IP): SOAP-заголовок To в ADWS
сопоставляется с эндпоинтом через AddressFilter в WCF. Найдите его, например,
nslookup -type=SRV _ldap._tcp.dc._msdcs.<domain> <dc-ip>.
adit -dc <host> -fqdn <dc-fqdn> -d <DOMAIN> -u <user> -p <pass> [flags]
# RootDSE handshake only (verifies auth + the full protocol stack)
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass'
# Run every collector -> ./report/CSV-Files/*.csv + Adit-Report.{xlsx,html}
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' \
-collect all -o ./report
# A subset of collectors
adit -dc 10.0.0.10 -fqdn dc01.example.local -d EXAMPLE.LOCAL -u user -p 'pass' \
-collect users,groups,computers,kerberoastable