Reconnaissance Active Directory et audit de sécurité en lecture seule via ADWS (net.tcp/9389), en Go
adit est un outil de reconnaissance Active Directory et d'audit de sécurité en lecture seule, sous forme de binaire unique, qui communique avec un contrôleur de domaine via ADWS (Active Directory Web Services, TCP/9389) au lieu de LDAP.
Un adit est l'entrée horizontale d'une mine — la voie d'accès discrète. Interroger AD via ADWS plutôt que LDAP/389 signifie que le trafic est encapsulé en WCF net.tcp, du SOAP en XML binaire sur un port peu courant, ce qui le rend bien moins susceptible d'être inspecté, filtré ou signaturé que le LDAP classique — tout en renvoyant les mêmes données d'annuaire. adit implémente la pile de protocole ADWS complète en Go, sans dépendance d'exécution externe.
┌────────────┐ net.tcp/9389 ┌──────────────┐
│ adit │ ───────────────▶ │ ADWS on DC │ ──▶ local LDAP
│ (Linux) │ NMF · NNS · │ (port 9389) │
│ │ NBFSE · SOAP └──────────────┘
└────────────┘
adit est un outil défensif/d'audit et d'évaluation autorisée. Ne l'exécutez que contre des annuaires que vous êtes autorisé à évaluer.
| Capacité | Détails |
|---|---|
| Transport | ADWS sur WCF net.tcp (TCP/9389) — tramage MC-NMF, handshake MS-NNS, XML binaire MC-NBFS/NBFSE, SOAP WS-Enumeration/WS-Transfer |
| Authentification | NTLMv2 (sign + seal) et Kerberos (ccache / keytab / mot de passe ; GSS scellé RFC 4121) |
| Collecteurs de recon | 31 modules (voir ci-dessous) → CSV par module |
| Rapports | Classeur XLSX multi-feuilles stylisé + tableau de bord HTML autonome (recherche/tri, badges de sévérité, scroll-spy) |
| Audit de sécurité | 27 règles en lecture seule (dont ADCS ESC1–4/9) → JSON classé par sévérité, également présenté dans le tableau de bord |
| Proxy / hôte de rebond | HTTP CONNECT, SOCKS5/5h, SOCKS4/4a (avec authentification proxy + DNS distant) |
| Pagination | Pagination Pull WS-Enumeration côté serveur, taille de page configurable |
| Rapports hors ligne | Reconstruire XLSX/HTML à partir de CSV précédemment collectés, sans DC nécessaire |
| Dépendances | Go pur ; pas de bibliothèque LDAP, pas de .NET, pas de services externes |
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) signale ESC1–ESC4/ESC9 ; laps indique qui peut lire chaque mot de passe ; protectedgroups audite les Protected Users. Exécutez adit -list-modules pour la liste actuelle.
-audit exécute 27 règles en lecture seule. Les constats portent un identifiant de règle, une sévérité, les objets affectés, les preuves et la remédiation, et sont écrits dans Adit-Audit.json (et, lorsqu'ils sont combinés avec -collect, une section « Audit Findings » qui figure en tête du tableau de bord). Le moteur ne lit jamais les valeurs des attributs secrets (LAPS / gMSA / BitLocker), même si les collecteurs de recon le peuvent.
| Règle | Sévérité | Ce qu'elle signale |
|---|---|---|
| AD-DOM-010 | Critique | Droits DCSync (réplication) détenus par un principal non-Tier-0 |
| AD-ACL-001/005/006/007/011–016 | Critique | Contrôle dangereux (GenericAll/Write, WriteDACL/Owner, ForceChangePassword, Write SPN / KeyCredentialLink / member / AllowedToAct) sur un objet privilégié |
| AD-SDH-001/002 | Critique | Contrôle / propriétaire inattendu d'AdminSDHolder |
| AD-CS-001 | Critique–Moyen | ESC1 — le modèle de certificat autorise un sujet fourni par l'inscrit |
| AD-CS-002 | Critique–Moyen | ESC2 — modèle de certificat Any-Purpose / sans EKU |
| AD-CS-003 | Élevé–Moyen | ESC3 — modèle Certificate Request Agent |
| AD-CS-004 | Élevé | ESC4 — contrôle d'accès faible sur un modèle de certificat |
| AD-CS-009 | Élevé | ESC9 — le modèle de certificat est dépourvu de l'extension de sécurité |
| AD-CS-005 | Critique/Élevé | ESC5 — contrôle dangereux d'un objet PKI (NTAuthCertificates, magasin CA, objet CA) |
| AD-CS-006 | Info | AD CS présent — ESC6/ESC7/ESC8 nécessitent une vérification au niveau de l'hôte (non observable via ADWS) |
| AD-DOM-008 | Élevé | Chiffrement réversible des mots de passe activé à l'échelle du domaine |
| AD-USR-001 | Élevé | Pré-authentification Kerberos désactivée (AS-REP roastable) |
| AD-USR-009 | Élevé | Le compte utilise uniquement le chiffrement DES |
| AD-CMP-006 | Élevé | Délégation non contrainte sur un non-DC |
| AD-KCL-001 | Élevé | Key Credential (shadow credential) sur un compte privilégié |
| AD-KRB-001 | Élevé | Le mot de passe krbtgt est obsolète |
| AD-DOM-005 | Moyen | Machine Account Quota > 0 (tout utilisateur peut joindre des ordinateurs) |
| AD-USR-002 | Moyen | Compte de service Kerberoastable (Élevé si privilégié) |
| AD-USR-005 | Moyen | PASSWD_NOTREQD défini |
| AD-USR-006 | Moyen | Le mot de passe d'un compte privilégié n'expire jamais |
| AD-USR-011 | Moyen | Le mot de passe d'un compte privilégié est obsolète |
| AD-CMP-008 | Moyen | Délégation contrainte basée sur les ressources configurée |
| AD-CMP-012 | Moyen | Système d'exploitation hérité / non pris en charge |
| AD-GRP-009 | Moyen | Principal de sécurité étranger dans un groupe privilégié |
| AD-GRP-020 | Moyen | Appartenance privilégiée masquée via primaryGroupID |
| AD-TRU-001/003 | Élevé/Moyen | Approbation sans filtrage SID / avec historique SID |
| AD-DNS-003/004 | Moyen/Faible | Enregistrement WPAD / ISATAP présent |
| AD-CMP-011 | Faible | Compte d'ordinateur obsolète |
| AD-INT-005 | Élevé | sIDHistory contient un SID privilégié |
Les seuils sont ajustables : -krbtgt-max-age, -priv-pwd-max-age, -stale-days.
Note ADCS : ESC1–ESC5 et ESC9 sont évalués à partir des objets AD via ADWS. ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2), ESC7 (ACL des rôles CA) et ESC8 (inscription web / relais NTLM) résident dans le registre/les points de terminaison HTTP de l'hôte CA et ne sont pas observables via ADWS —AD-CS-006signale qu'une CA existe afin qu'ils puissent être vérifiés sur l'hôte (par ex. avec Certipy).
Nécessite Go 1.26+. Aucune autre dépendance de compilation.
# 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 doit être le vrai FQDN du DC (pas son IP) : l'en-tête SOAP To d'ADWS est mis en correspondance avec le point de terminaison par l'AddressFilter de WCF. Trouvez-le avec, par ex., 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