
Active-Directory-Reconnaissance und schreibgeschütztes Sicherheitsaudit über ADWS (net.tcp/9389), in Go
adit ist ein Single-Binary-Tool für Active-Directory-Aufklärung und schreibgeschütztes Security-Audit, das über ADWS (Active Directory Web Services, TCP/9389) statt über LDAP mit einem Domain Controller kommuniziert.
Ein adit ist der horizontale Eingang zu einer Mine — der leise Weg hinein. AD über
ADWS statt über LDAP/389 abzufragen bedeutet, dass der Datenverkehr WCF-net.tcp-gerahmt ist,
binäres XML-SOAP über einen ungewöhnlichen Port, sodass er weit weniger wahrscheinlich
untersucht, gefiltert oder signaturbasiert erkannt wird als klassisches LDAP — während
dennoch dieselben Verzeichnisdaten zurückgegeben werden. adit implementiert den vollständigen
ADWS-Protokollstapel in Go, ohne externe Laufzeitabhängigkeiten.
┌────────────┐ net.tcp/9389 ┌──────────────┐
│ adit │ ───────────────▶ │ ADWS on DC │ ──▶ local LDAP
│ (Linux) │ NMF · NNS · │ (port 9389) │
│ │ NBFSE · SOAP └──────────────┘
└────────────┘
adit ist ein defensives/Audit- und autorisiertes Assessment-Tool. Führe es nur gegen Verzeichnisse aus, für deren Assessment du autorisiert bist.
| Fähigkeit | Details |
|---|---|
| Transport | ADWS über WCF net.tcp (TCP/9389) — MC-NMF-Framing, MS-NNS-Handshake, MC-NBFS/NBFSE Binary XML, WS-Enumeration/WS-Transfer SOAP |
| Authentifizierung | NTLMv2 (Sign + Seal) und Kerberos (ccache / keytab / Passwort; RFC 4121 versiegeltes GSS) |
| Recon-Collectors | 31 Module (siehe unten) → CSV pro Modul |
| Reporting | Gestylte mehrblättrige XLSX-Arbeitsmappe + eigenständiges HTML-Dashboard (Suche/Sortierung, Schweregrad-Badges, Scroll-Spy) |
| Security-Audit | 27 schreibgeschützte Regeln (inkl. ADCS ESC1–4/9) → nach Schweregrad sortiertes JSON, auch im Dashboard dargestellt |
| Proxy / Jump Host | HTTP CONNECT, SOCKS5/5h, SOCKS4/4a (mit Proxy-Auth + Remote-DNS) |
| Paging | Serverseitiges WS-Enumeration-Pull-Paging, konfigurierbare Seitengröße |
| Offline-Reporting | XLSX/HTML aus zuvor gesammelten CSVs neu erstellen, kein DC erforderlich |
| Abhängigkeiten | Reines Go; keine LDAP-Bibliothek, kein .NET, keine externen Dienste |
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) markiert ESC1–ESC4/ESC9; laps berichtet, wer jedes Passwort lesen kann;
protectedgroups auditiert Protected Users. Führe adit -list-modules für die
aktuelle Liste aus.
-audit führt 27 schreibgeschützte Regeln aus. Findings tragen eine Regel-ID, Schweregrad, betroffene
Objekte, Belege und Behebung und werden nach Adit-Audit.json geschrieben (und,
wenn mit -collect kombiniert, ein Abschnitt „Audit Findings", der das
Dashboard anführt). Die Engine liest niemals geheime Attributwerte (LAPS / gMSA /
BitLocker), obwohl die Recon-Collectors dies können.
| Regel | Schweregrad | Was sie markiert |
|---|---|---|
| AD-DOM-010 | Critical | DCSync-(Replikations-)Rechte, die von einem Nicht-Tier-0-Prinzipal gehalten werden |
| AD-ACL-001/005/006/007/011–016 | Critical | Gefährliche Kontrolle (GenericAll/Write, WriteDACL/Owner, ForceChangePassword, Write SPN / KeyCredentialLink / member / AllowedToAct) über ein privilegiertes Objekt |
| AD-SDH-001/002 | Critical | Unerwartete Kontrolle / Eigentümer von AdminSDHolder |
| AD-CS-001 | Critical–Medium | ESC1 — Zertifikatvorlage erlaubt vom Antragsteller gelieferten Subject |
| AD-CS-002 | Critical–Medium | ESC2 — Any-Purpose / Zertifikatvorlage ohne EKU |
| AD-CS-003 | High–Medium | ESC3 — Certificate Request Agent-Vorlage |
| AD-CS-004 | High | ESC4 — schwache Zugriffskontrolle auf einer Zertifikatvorlage |
| AD-CS-009 | High | ESC9 — Zertifikatvorlage fehlt die Security-Erweiterung |
| AD-CS-005 | Critical/High | ESC5 — gefährliche Kontrolle über ein PKI-Objekt (NTAuthCertificates, CA-Store, CA-Objekt) |
| AD-CS-006 | Info | AD CS vorhanden — ESC6/ESC7/ESC8 erfordern Verifikation auf Host-Ebene (über ADWS nicht beobachtbar) |
| AD-DOM-008 | High | Umkehrbare Passwortverschlüsselung domänenweit aktiviert |
| AD-USR-001 | High | Kerberos-Pre-Auth deaktiviert (AS-REP roastable) |
| AD-USR-009 | High | Konto verwendet nur DES-Verschlüsselung |
| AD-CMP-006 | High | Unconstrained Delegation auf einem Nicht-DC |
| AD-KCL-001 | High | Key Credential (Shadow Credential) auf einem privilegierten Konto |
| AD-KRB-001 | High | krbtgt-Passwort ist veraltet |
| AD-DOM-005 | Medium | Machine Account Quota > 0 (jeder Benutzer kann Computer beitreten lassen) |
| AD-USR-002 | Medium | Kerberoastable Service-Konto (High, wenn privilegiert) |
| AD-USR-005 | Medium | PASSWD_NOTREQD gesetzt |
| AD-USR-006 | Medium | Passwort eines privilegierten Kontos läuft nie ab |
| AD-USR-011 | Medium | Passwort eines privilegierten Kontos ist veraltet |
| AD-CMP-008 | Medium | Resource-based Constrained Delegation konfiguriert |
| AD-CMP-012 | Medium | Legacy-/nicht unterstütztes Betriebssystem |
| AD-GRP-009 | Medium | Foreign Security Principal in einer privilegierten Gruppe |
| AD-GRP-020 | Medium | Versteckte privilegierte Mitgliedschaft über primaryGroupID |
| AD-TRU-001/003 | High/Medium | Trust ohne SID-Filterung / mit SID-History |
| AD-DNS-003/004 | Medium/Low | WPAD-/ISATAP-Eintrag vorhanden |
| AD-CMP-011 | Low | Veraltetes Computerkonto |
| AD-INT-005 | High | sIDHistory enthält eine privilegierte SID |
Schwellenwerte sind anpassbar: -krbtgt-max-age, -priv-pwd-max-age, -stale-days.
ADCS-Hinweis: ESC1–ESC5 und ESC9 werden aus AD-Objekten über ADWS bewertet. ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2), ESC7 (CA-Rollen-ACLs) und ESC8 (Web- Enrollment / NTLM-Relay) liegen in der Registry/den HTTP-Endpunkten des CA-Hosts und sind über ADWS nicht beobachtbar —AD-CS-006markiert, dass eine CA existiert, damit sie auf dem Host verifiziert werden können (z. B. mit Certipy).
Erfordert Go 1.26+. Keine weiteren Build-Abhängigkeiten.
# 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 muss der echte FQDN des DCs sein (nicht seine IP): Der ADWS-SOAP-To-Header wird
von WCFs AddressFilter gegen den Endpunkt abgeglichen. Finde ihn z. B. mit
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