
Reconhecimento do Active Directory e auditoria de segurança somente leitura via ADWS (net.tcp/9389), em Go
adit é uma ferramenta de reconhecimento de Active Directory e de auditoria de segurança somente leitura, em binário único, que se comunica com um Domain Controller via ADWS (Active Directory Web Services, TCP/9389) em vez de LDAP.
Um adit é a entrada horizontal de uma mina — o caminho silencioso para dentro. Consultar o AD através do ADWS em vez do LDAP/389 significa que o tráfego é WCF net.tcp enquadrado, SOAP em XML binário sobre uma porta incomum, tornando-o muito menos suscetível de ser inspecionado, filtrado ou assinado do que o LDAP clássico — ao mesmo tempo que devolve os mesmos dados do diretório. O adit implementa a pilha completa do protocolo ADWS em Go, sem dependências externas de runtime.
┌────────────┐ net.tcp/9389 ┌──────────────┐
│ adit │ ───────────────▶ │ ADWS on DC │ ──▶ local LDAP
│ (Linux) │ NMF · NNS · │ (port 9389) │
│ │ NBFSE · SOAP └──────────────┘
└────────────┘
adit é uma ferramenta defensiva/de auditoria e de avaliação autorizada. Execute-a apenas contra diretórios que você está autorizado a avaliar.
| Capacidade | Detalhes |
|---|---|
| Transporte | ADWS sobre WCF net.tcp (TCP/9389) — enquadramento MC-NMF, handshake MS-NNS, XML binário MC-NBFS/NBFSE, SOAP WS-Enumeration/WS-Transfer |
| Autenticação | NTLMv2 (sign + seal) e Kerberos (ccache / keytab / senha; GSS selado RFC 4121) |
| Coletores de recon | 31 módulos (veja abaixo) → CSV por módulo |
| Relatórios | Pasta de trabalho XLSX estilizada com múltiplas planilhas + dashboard HTML autocontido (busca/ordenação, badges de severidade, scroll-spy) |
| Auditoria de segurança | 30 regras somente leitura (incl. ADCS ESC1–4/9) → JSON classificado por severidade, também exibido no dashboard |
| Proxy / jump host | HTTP CONNECT, SOCKS5/5h, SOCKS4/4a (com autenticação de proxy + DNS remoto) |
| Paginação | Paginação Pull do WS-Enumeration no lado do servidor, tamanho de página configurável |
| Relatórios offline | Reconstrua XLSX/HTML a partir de CSVs coletados anteriormente, sem necessidade de DC |
| Dependências | Go puro; sem biblioteca LDAP, sem .NET, sem serviços externos |
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) sinaliza ESC1–ESC4/ESC9; laps relata quem pode ler cada senha;
protectedgroups audita Protected Users. Execute adit -list-modules para a
lista atual.
-audit executa 30 regras somente leitura. Os achados carregam um id de regra, severidade, objetos
afetados, evidências e remediação, e são gravados em Adit-Audit.json (e,
quando combinado com -collect, uma seção "Audit Findings" que lidera o
dashboard). O motor nunca lê valores de atributos secretos (LAPS / gMSA /
BitLocker), embora os coletores de recon possam.
| Regra | Severidade | O que sinaliza |
|---|---|---|
| AD-DOM-010 | Crítica | Direitos DCSync (replicação) detidos por um principal não-Tier-0 |
| AD-ACL-001/005/006/007/011–016 | Crítica | Controlo perigoso (GenericAll/Write, WriteDACL/Owner, ForceChangePassword, Write SPN / KeyCredentialLink / member / AllowedToAct) sobre um objeto privilegiado |
| AD-SDH-001/002 | Crítica | Controlo / proprietário inesperado do AdminSDHolder |
| AD-CS-001 | Crítica–Média | ESC1 — o modelo de certificado permite o subject fornecido pelo requerente |
| AD-CS-002 | Crítica–Média | ESC2 — modelo de certificado Any-Purpose / sem EKU |
| AD-CS-003 | Alta–Média | ESC3 — modelo Certificate Request Agent |
| AD-CS-004 | Alta | ESC4 — controlo de acesso fraco num modelo de certificado |
| AD-CS-009 | Alta | ESC9 — o modelo de certificado não tem a extensão de segurança |
| AD-CS-005 | Crítica/Alta | ESC5 — controlo perigoso de um objeto PKI (NTAuthCertificates, CA store, objeto CA) |
| AD-CS-006 | Info | AD CS presente — ESC6/ESC7/ESC8 requerem verificação ao nível do host (não observável via ADWS) |
| AD-DOM-008 | Alta | Encriptação de palavra-passe reversível ativada em todo o domínio |
| AD-USR-001 | Alta | Pré-autenticação Kerberos desativada (suscetível a AS-REP roasting) |
| AD-USR-009 | Alta | A conta usa apenas encriptação DES |
| AD-CMP-006 | Alta | Delegação não restrita num não-DC |
| AD-KCL-001 | Alta | Key Credential (shadow credential) numa conta privilegiada |
| AD-KRB-001 | Alta | A palavra-passe do krbtgt está desatualizada |
| AD-DOM-005 | Média | Machine Account Quota > 0 (qualquer utilizador pode adicionar computadores) |
| AD-USR-002 | Média | Conta de serviço suscetível a Kerberoasting (Alta se privilegiada) |
| AD-USR-005 | Média | PASSWD_NOTREQD definido |
| AD-USR-006 | Média | A palavra-passe da conta privilegiada nunca expira |
| AD-USR-011 | Média | A palavra-passe da conta privilegiada está desatualizada |
| AD-CMP-008 | Média | Delegação restrita baseada em recursos configurada |
| AD-CMP-012 | Média | Sistema operativo legado / não suportado |
| AD-GRP-009 | Média | Principal de segurança externo num grupo privilegiado |
| AD-GRP-020 | Média | Associação privilegiada oculta via primaryGroupID |
| AD-TRU-001/003 | Alta/Média | Confiança sem filtragem de SID / com histórico de SID |
| AD-DNS-003/004 | Média/Baixa | Registo WPAD / ISATAP presente |
| AD-CMP-011 | Baixa | Conta de computador desatualizada |
| AD-INT-005 | Alta | sIDHistory contém um SID privilegiado |
| AD-USR-020 | Alta | Palavra-passe recuperável armazenada em userPassword / unixUserPassword |
| AD-USR-021 | Alta | Possível palavra-passe deixada em description / info / comment (heurística) |
| AD-DOM-012 | Alta/Média | Everyone / Anonymous / Authenticated Users em Pre-Windows 2000 Compatible Access |
Os limiares são ajustáveis: -krbtgt-max-age, -priv-pwd-max-age, -stale-days.
Nota ADCS: ESC1–ESC5 e ESC9 são avaliados a partir de objetos AD via ADWS. ESC6 (
EDITF_ATTRIBUTESUBJECTALTNAME2), ESC7 (ACLs de função da CA) e ESC8 (web enrollment / NTLM relay) residem no registo/endpoints HTTP do host da CA e não são observáveis via ADWS —AD-CS-006sinaliza que existe uma CA para que possam ser verificados no host (por exemplo, com Certipy).
Requer Go 1.26+. Sem outras dependências de compilação.
# 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 deve ser o FQDN real do DC (não o seu IP): o cabeçalho SOAP To do ADWS é
comparado com o endpoint pelo AddressFilter do WCF. Encontre-o com, por exemplo,
nslookup -type=SRV _ldap._tcp.dc._msdcs.<domain> <dc-ip>.
adit -dc <host> -fqdn <dc-fqdn> -d <DOMAIN> -u <user> -p <pass> [flags]