
Reconnaissance Active Directory et audit de sécurité en lecture seule via ADWS (net.tcp/9389), en Go
adit est un outil d'audit de sécurité en lecture seule et de reconnaissance Active Directory 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 encadré 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 signé que le LDAP classique — tout en renvoyant les mêmes données d'annuaire. adit implémente la pile de protocoles ADWS complète en Go, sans dépendances d'exécution externes.
┌────────────┐ 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 gravité, scroll-spy) |
| Audit de sécurité | 30 règles en lecture seule (dont ADCS ESC1–4/9) → JSON classé par gravité, é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 collectés précédemment, sans DC nécessaire |
| Dépendances | Go pur ; aucune bibliothèque LDAP, aucun .NET, aucun service externe |
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 obtenir la
liste actuelle.
-audit exécute 30 règles en lecture seule. Les constats portent un identifiant de règle, une gravité, les objets
concernés, les preuves et les remédiations, 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 le demandeur |
| 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 ne possède pas l'extension de sécurité |
| AD-CS-005 | Critique/Élevé | ESC5 — contrôle dangereux d'un objet PKI (NTAuthCertificates, magasin de 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é |
| AD-USR-020 | Élevé | Mot de passe récupérable stocké dans userPassword / unixUserPassword |
| AD-USR-021 | Élevé | Mot de passe possiblement laissé dans description / info / comment (heuristique) |
| AD-DOM-012 | Élevé/Moyen | Everyone / Anonymous / Authenticated Users dans Pre-Windows 2000 Compatible Access |
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 de rôle 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