6.2.9 Map Active Directory attack paths
Strategy map | Master Notes | Operational index | Cheatsheets
Build identity, object-right, host-access and session maps. A graph relationship is a candidate until its effective permission, destination and current state are checked.
Speedrun blocks: 10; Block 13 route fundamentals first. Documented methods: 7.
Examples are hypothetical study material. Apply commands only to an assigned scope during the later practice phase. A method is enabled by its prerequisites; its presence here does not establish a vulnerability or practical mastery.
6.2.9.1 First pass: tools and findings
Use the branch matching the current host, identity and observed result. Tool output supplies leads; the linked procedure verifies and uses the exact condition.
6.2.9.1.1 Resolve domain, DC, DNS and clock first
Use the current domain identity or the supported query context; wrong naming/transport can look like a bad password.
whoami /all
whoami /upn
nltest /dsgetdc:DOMAIN
w32tm /query /status
- If Domain/DC preflight works: Enumerate users/groups/SPNs and collect supported directory relationships. → Enumerate directory objects with native, LDAP and PowerView approaches.
- Otherwise: KDC timeout, name failure or skew: repair that dependency before judging credentials. → Establish domain identity, DC, DNS, time and route.
6.2.9.1.2 Collect a BloodHound directory baseline with SharpHound
Use a collector compatible with the BloodHound version. DCOnly is a directory baseline, not proof of all host/session edges.
.\SharpHound.exe --CollectionMethods DCOnly --OutputDirectory .\bh --ZipFileName domain-dconly.zip
- If A useful object-control edge: Resolve the controlled trustee, target object and effective ACE. → Validate effective directory-object control.
- If A host/session edge: Check destination rights and session freshness independently. → Validate host access and volatile session candidates.
- If An account with an SPN: Check the actual account/SPN and ticket-request conditions. → Identify service accounts and SPNs worth investigating.
- Otherwise: Collection is blocked or incomplete: query the relevant objects manually. → Enumerate directory objects with native, LDAP and PowerView approaches.
6.2.9.2 Discovery workflow
Start with a known domain identity or a directory query context; useful group, object-right and session edges are not assumed.
Follow these observations into a method; the detailed recognition routes below show synthetic output and the checks still needed.
- Resolve identity, realm, DC, DNS, clock and route first: Establish domain identity, DC, DNS, time and route.
- Enumerate objects, group nesting and relevant shares with a supported client: Enumerate directory objects with native, LDAP and PowerView approaches; Read domain shares, SYSVOL and NETLOGON for useful artifacts.
- Associate SPNs and effective ACEs with actual accounts and object types: Identify service accounts and SPNs worth investigating; Validate effective directory-object control.
- Check host-specific rights and session freshness, then validate graph paths edge by edge: Validate host access and volatile session candidates; Collect focused BloodHound data and validate an attack path.
PowerView examples require a reviewed compatible script in the current authenticated directory context. Check the loaded copy rather than mixing legacy/fork parameter names; the directory-mapping entry includes native, ADSI and LDAP alternatives.
Import-Module .\PowerView.ps1
Get-Command -Module PowerView
Decision rule: an observed clue opens a candidate. Choose it only after the missing conditions are verified; a failed check rules out that context, while unavailable evidence stays inconclusive.
6.2.9.3 Method families
- Domain context and directory objects: Establish domain identity, DC, DNS, time and route, Enumerate directory objects with native, LDAP and PowerView approaches.
- Artifacts and service identities: Read domain shares, SYSVOL and NETLOGON for useful artifacts, Identify service accounts and SPNs worth investigating.
- Effective rights, host access and path ranking: Validate effective directory-object control, Validate host access and volatile session candidates, Collect focused BloodHound data and validate an attack path.
6.2.9.4 Choose a method
| Method | Recognition clue | Required access | Enabling conditions | Resulting capability |
|---|---|---|---|---|
| Establish domain identity, DC, DNS, time and route | Domain credentials or a domain-joined foothold | A known domain identity or a directory endpoint that permits the selected anonymous query | Correct realm/domain and account qualification; reachable DC/services, usable DNS and acceptable clock skew | A verified domain context and working directory/authentication preflight |
| Enumerate directory objects with native, LDAP and PowerView approaches | A directory bind or domain-joined identity can read relevant objects | A known domain identity or a directory endpoint that permits the selected anonymous query | Correct search base and authentication transport; object/attribute visibility and compatible local utilities | User, group, computer, trust and policy relationships for attack-path hypotheses |
| Read domain shares, SYSVOL and NETLOGON for useful artifacts | A valid domain identity and accessible file services | A known domain identity or a directory endpoint that permits the selected anonymous query | Reachable SMB plus share/object read rights in the chosen identity context | Policy/scripts/configuration and typed credential or host clues |
| Identify service accounts and SPNs worth investigating | User-owned SPNs or service-account clues | A known domain identity or a directory endpoint that permits the selected anonymous query | Directory visibility and correct service/account association; roasting requires the additional authentication and encryption conditions | A prioritized service-account and roast candidate list |
| Validate effective directory-object control | An ACL/graph edge names GenericAll, GenericWrite, WriteDacl, WriteOwner or an extended/property right | A known domain identity or a directory endpoint that permits the selected anonymous query | Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation | A verified object-control primitive suitable for a named identity transition |
| Validate host access and volatile session candidates | Group-to-host access edges or a privileged user's possible session | A known domain identity or a directory endpoint that permits the selected anonymous query | Reachable destination service and its actual authorization; session evidence must be current and collection rights sufficient | Verified service access or a prioritized host/session hypothesis |
| Collect focused BloodHound data and validate an attack path | Directory relationships are too broad for manual comparison or a candidate chain needs ranking | A known domain identity or a directory endpoint that permits the selected anonymous query | Compatible collector/deployment, explicit scope, directory rights and separate permission/connectivity for host/session collection | A ranked chain of independently testable relationships |
6.2.9.5 Establish domain identity, DC, DNS, time and route
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Operational procedure | Operational procedure | Quick sheet
6.2.9.5.1 Purpose and result
A verified domain context and working directory/authentication preflight.
6.2.9.5.2 Recognition clues
Domain credentials or a domain-joined foothold.
6.2.9.5.2.1 Find the clue from your starting access
Where to investigate: Start with the session identity and known credential scope; discover the realm/DC and inspect DNS, time and routes.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Correct realm/domain and account qualification; reachable DC/services, usable DNS and acceptable clock skew
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Record represented identity, realm, selected DC, resolver, clock and real source route.
Failure/next check: Wrong domain, KDC timeout, clock skew and account denial are distinct failures. Do not repeatedly change passwords to fix a route problem.
whoami /all
whoami /upn
nltest /dsgetdc:DOMAIN
w32tm /query /status
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
UPN: USER@DOMAIN
DC: \\DC_HOST
Domain name: DOMAIN
Clock source/status: inspect
Recognize this detail: The named realm/DC and actual identity establish where directory/authentication checks must run.
Still missing before method selection: Check DC/service reachability, resolver/SPN naming and clock compatibility, not merely the password.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | A normal bind/ticket request works in the intended realm: continue domain mapping. |
| Ruled out in this context | The credential belongs only to the target-local account: reject the assumed domain identity. |
| Inconclusive | DC lookup/time failure leaves domain authentication untested. |
If you do not yet have this clue: start with Validate known passwords and context-specific reuse.
6.2.9.5.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Correct realm/domain and account qualification; reachable DC/services, usable DNS and acceptable clock skew.
6.2.9.5.4 Discover and verify prerequisites
whoami /all
whoami /upn
nltest /dsgetdc:DOMAIN
w32tm /query /status
6.2.9.5.5 Why it works
Local process identity, network credential context and domain naming are separate. Kerberos depends on service names, time and KDC connectivity in addition to a valid password.
6.2.9.5.6 Execute and choose variants
6.2.9.5.6.1.1 Domain-joined Windows source
whoami /all
echo %USERDNSDOMAIN%
echo %USERDOMAIN%
echo %LOGONSERVER%
nltest /dsgetdc:DOMAIN
nltest /dclist:DOMAIN
w32tm /query /status
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
Resolve-DnsName -Type SRV _ldap._tcp.dc._msdcs.DOMAIN
Resolve-DnsName -Type SRV _kerberos._tcp.DOMAIN
Decisive output: domain FQDN, DC FQDN/IP, current user SID/groups, DNS SRV answers and a plausible time source.
USERDOMAINcan be a NetBIOS label; prefer the DNS domain for LDAP/Kerberos.
6.2.9.5.6.1.2 Kali/off-domain source
dig +short SRV _ldap._tcp.dc._msdcs.DOMAIN @DC_IP
dig +short SRV _kerberos._tcp.DOMAIN @DC_IP
nxc smb DC_IP -d DOMAIN -u USER -p 'PASSWORD'
ldapsearch -x -LLL -H ldap://DC_HOST:389 -s base -b '' \
defaultNamingContext configurationNamingContext rootDomainNamingContext dnsHostName
RootDSE is a directory-server metadata object. Reading it can reveal naming contexts even when anonymous subtree searches are denied. Convert
corp.exampletoDC=corp,DC=example; do not guess the base DN when RootDSE can supply it.
6.2.9.5.6.1.2.1 Remote Windows session and double-hop caveat
whoami /all
klist
dir \\DC_HOST\SYSVOL
A supplied credential may create the remote session without being delegated onward to the DC. If local identity commands work but access to a second host fails, distinguish a WinRM/PowerShell remoting credential-delegation problem from invalid credentials. An interactive RDP session, explicit credentials, /netonly network credentials or an off-domain LDAP client may create a different context; always record which identity is used locally and over the network.
IDENTITY MAP: USER/COMPUTER -> DIRECT + NESTED GROUPS -> DIRECTORY RIGHTS
HOST MAP: COMPUTER -> OS/ROLE -> LOCAL/REMOTE-ACCESS RIGHTS -> SESSIONS
ROUTE MAP: SOURCE -> DNS/KDC/DC/HOST -> REQUIRED PORT/SERVICE
LEAD MAP: EVIDENCE -> HYPOTHESIS -> MINIMUM VALIDATION -> NEXT BLOCK
Authentication, authorization, reachability and session presence are independent. A valid LDAP bind does not prove share access; SMB administration on one host does not prove directory privilege; a session edge does not prove retrievable credentials.
AS-REQ/AS-REP: user proves knowledge of long-term key -> receives TGT
TGS-REQ/TGS-REP: TGT requests SERVICE/HOST -> receives service ticket
AP-REQ: client presents service ticket -> service authenticates client
AUTHORIZATION: target service still evaluates the represented identity/claims
Before changing credentials or tools:
getent hosts DC_HOST
nc -nvz DC_IP 88
date -u
w32tm /query /status
klist
Record domain FQDN/realm, DC FQDN/IP, source DNS, current time, KDC route and exact target SPN. IP connectivity does not replace hostname/SPN correctness.
6.2.9.5.7 Worked example — hypothetical
Observation: a valid domain password fails in a ticket-based client. Test: inspect DC naming, DNS, route and time. Illustrative output: the KDC is unreachable through the current route. Interpretation: fix transport before judging the credential.
6.2.9.5.8 Verify the result
Record represented identity, realm, selected DC, resolver, clock and real source route.
6.2.9.5.9 Failure and fallback
Wrong domain, KDC timeout, clock skew and account denial are distinct failures. Do not repeatedly change passwords to fix a route problem.
6.2.9.5.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| A directory bind or domain-joined identity can read relevant objects | Correct search base and authentication transport; object/attribute visibility and compatible local utilities | §6.2.9.6 — Enumerate directory objects with native, LDAP and PowerView approaches |
| An IP connection works while hostname/Kerberos access fails | Reachable correct resolver/KDC path, matching target SPN/hostname, realm configuration and acceptable time | §6.1.3.18 — Preserve DNS, Kerberos names and time across a pivot |
| A credential appears valid but the destination's usable access is unknown | Real source-to-service route, correct identity context and protocol-specific execution/logon rights | §6.4.4.5 — Match route, destination service and effective authorization |
6.2.9.6 Enumerate directory objects with native, LDAP and PowerView approaches
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Operational procedure | Operational procedure | Operational procedure | Operational procedure | Quick sheet
6.2.9.6.1 Purpose and result
User, group, computer, trust and policy relationships for attack-path hypotheses.
6.2.9.6.2 Recognition clues
A directory bind or domain-joined identity can read relevant objects.
6.2.9.6.2.1 Find the clue from your starting access
Where to investigate: Use the available built-in/LDAP interface from the verified domain context; inspect one useful user/group before broad graph assumptions.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Correct search base and authentication transport; object/attribute visibility and compatible local utilities
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Retain object identifiers, group relationships and actual visibility; distinguish directory facts from inferred execution access.
Failure/next check: Missing RSAT/PowerView does not block built-in ADSI or LDAP. Signing/TLS policy requires a compatible authenticated transport.
net user USER /domain
net group "GROUP" /domain
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
Account: USER
Global group memberships: GROUP
Group members: CONTROLLED_USER
Recognize this detail: Account/group membership supplies a relationship to investigate; nested membership and effective destination rights remain separate.
Still missing before method selection: Verify object SID/type, nesting and the exact right granted to that principal.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | The membership resolves to a currently effective object/service right: follow that route. |
| Ruled out in this context | The same-named group belongs to another domain or grants no intended right: reject the assumed relationship. |
| Inconclusive | Partial visibility or nesting not yet expanded leaves effective membership unresolved. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.6.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Correct search base and authentication transport; object/attribute visibility and compatible local utilities.
6.2.9.6.4 Discover and verify prerequisites
net user /domain
net group /domain
6.2.9.6.5 Why it works
Tools expose the same directory through different interfaces. Group nesting, object types, primary groups and protected attributes affect how relationships translate into effective rights.
6.2.9.6.6 Execute and choose variants
Native Windows baselineWindows context: native commands first; RSAT only when installed.
net user /domain
net user USER /domain
net group /domain
net group "Domain Admins" /domain
net group "GROUP" /domain
net accounts /domain
nltest /domain_trusts /all_trusts
net view /domain
net view \\DC_HOST
These commands are broadly available but provide partial views. Expand interesting users and groups individually, trace nested groups rather than assuming memberOf is complete, and retain SIDs when names can collide across domains.
6.2.9.6.6.1 RSAT ActiveDirectory module, only when installed
Get-Command -Module ActiveDirectory
Get-ADDomain
Get-ADForest
Get-ADDomainController -Filter *
Get-ADUser -Filter * -Properties Enabled,Description,MemberOf,ServicePrincipalName,UserPrincipalName,PasswordLastSet,LastLogonDate,AdminCount
Get-ADGroup -Filter * -Properties GroupScope,GroupCategory,Members,Description
Get-ADGroupMember -Identity 'GROUP' -Recursive
Get-ADComputer -Filter * -Properties DNSHostName,OperatingSystem,OperatingSystemVersion,ServicePrincipalName,TrustedForDelegation,LastLogonDate
Get-ADTrust -Filter *
Get-AD* cmdlets require the RSAT ActiveDirectory module. Its absence on a client is normal; use ADSI, LDAP, PowerView or an off-domain client.
Built-in ADSI/DirectorySearcher fallbackWindows/.NET directory queries without RSAT; use the current network identity and correct base.
For automatic, explicitly scoped inventory, run the AD surface helpers with an explicit DC/domain. Collection runs by default, prints a bounded findings summary and saves a unique private evidence directory; -Preview displays checks without connecting. The helper preserves query failures, candidate clues, account-context limits and linked manual-validation handoffs without requesting roast material or changing directory objects.
For repeated queries, define LDAPSearch once inline, then use its purpose-labelled calls. The transparent one-off procedure below remains useful when no helper is loaded.
$root = [ADSI]'LDAP://RootDSE'
$base = [ADSI]("LDAP://" + $root.defaultNamingContext)
$searcher = New-Object System.DirectoryServices.DirectorySearcher($base)
$searcher.PageSize = 1000
$searcher.PropertiesToLoad.AddRange(@('samaccountname','userprincipalname','objectsid','memberof','serviceprincipalname','description','useraccountcontrol','pwdlastset','lastlogontimestamp'))
$searcher.Filter = '(&(objectCategory=person)(objectClass=user))'
$searcher.FindAll() | ForEach-Object { $_.Properties }
Change only the filter and requested attributes for another object class:
6.2.9.6.6.2 Groups
# Groups
$searcher.Filter = '(objectCategory=group)'
$searcher.PropertiesToLoad.Clear()
$searcher.PropertiesToLoad.AddRange(@('samaccountname','objectsid','member','grouptype','description'))
$searcher.FindAll() | ForEach-Object { $_.Properties }
6.2.9.6.6.3 Computers
# Computers
$searcher.Filter = '(objectCategory=computer)'
$searcher.PropertiesToLoad.Clear()
$searcher.PropertiesToLoad.AddRange(@('dnshostname','operatingsystem','operatingsystemversion','serviceprincipalname','useraccountcontrol','lastlogontimestamp'))
$searcher.FindAll() | ForEach-Object { $_.Properties }
PageSize = 1000asks for paged results; without paging, the server's result-size limit can silently produce an incomplete inventory. LDAP filters are data selection, not proof of access or exploitability.
Authenticated LDAP from KaliDirectory connectivity and a supported authenticated query context; check base, filter and paging.
6.2.9.6.6.3.1 Discover the naming context
ldapsearch -x -LLL -H ldap://DC_HOST:389 -s base -b '' \
defaultNamingContext configurationNamingContext rootDomainNamingContext dnsHostName
6.2.9.6.6.3.2 Identify domain principals and their memberships Users, groups and computers
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-E pr=1000/noprompt -b 'DC=DOMAIN,DC=TLD' \
'(&(objectCategory=person)(objectClass=user))' \
sAMAccountName userPrincipalName objectSid userAccountControl memberOf description servicePrincipalName pwdLastSet lastLogonTimestamp adminCount
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-E pr=1000/noprompt -b 'DC=DOMAIN,DC=TLD' \
'(objectCategory=group)' sAMAccountName objectSid member groupType description
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-E pr=1000/noprompt -b 'DC=DOMAIN,DC=TLD' \
'(objectCategory=computer)' dNSHostName operatingSystem operatingSystemVersion servicePrincipalName userAccountControl lastLogonTimestamp
6.2.9.6.6.3.2.1 SPNs, trusts and GPO/OU context
# SPN-bearing accounts: mapping only; do not request tickets in this block.
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-E pr=1000/noprompt -b 'DC=DOMAIN,DC=TLD' \
'(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))' \
sAMAccountName servicePrincipalName memberOf userAccountControl pwdLastSet
# Trusted-domain objects
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-b 'DC=DOMAIN,DC=TLD' '(objectClass=trustedDomain)' \
cn securityIdentifier trustDirection trustType trustAttributes
# OUs and GPO containers; correlate links before inferring host effect.
ldapsearch -x -LLL -H ldap://DC_HOST:389 -D 'USER@DOMAIN' -W \
-E pr=1000/noprompt -b 'DC=DOMAIN,DC=TLD' \
'(|(objectClass=organizationalUnit)(objectClass=groupPolicyContainer))' \
distinguishedName displayName name gPLink gPOptions
6.2.9.6.6.3.3 LDAP failure router
| Result | Interpretation | Next action |
|---|---|---|
Invalid credentials (49) | Bind identity/secret/context failed; subcodes may refine the cause | Recheck UPN vs DOMAIN\USER, account state and exact secret; do not infer authorization |
Strong(er) authentication required / confidentiality required | Server policy rejects that bind/transport | Use the permitted LDAPS/StartTLS or Kerberos/SASL path; do not disable protections |
Size limit exceeded or suspiciously round count | Search is incomplete | Add paged results and narrow the base/filter |
| Referral/partial results | Search crossed a naming-context boundary | Query the referred domain/partition or compatible Global Catalog deliberately |
| Bind succeeds, search empty | Wrong base/filter, ACL filtering or genuinely no matches | Verify RootDSE base, test a known object and request fewer attributes |
| Works by IP, Kerberos fails | Route exists but name/SPN/DNS/time path is wrong | Use DC FQDN, AD DNS, correct realm and synchronized time |
PowerView: convenient manual breadthReviewed compatible PowerView loaded in the intended directory authentication context.
Import-Module .\PowerView.ps1
Get-Command -Module PowerView
Get-Domain
Get-DomainController
Get-DomainTrust
Get-DomainUser | Select-Object samaccountname,userprincipalname,description,memberof,serviceprincipalname
Get-DomainGroup
Get-DomainGroupMember -Identity 'GROUP' -Recurse
Get-DomainComputer | Select-Object dnshostname,operatingsystem,operatingsystemversion
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof
The original PowerSploit repository is archived. Course examples and forks may use legacy aliases such as Get-NetUser, Get-NetGroup, Get-NetComputer or Get-NetDomainTrust. Inspect Get-Command/Get-Help for the exact copy present rather than mixing generations.
NEW PASSWORD/HASH/KEY/TICKET
-> VERIFY TYPE, CLIENT, REALM, VALIDITY
-> AUTHENTICATE THROUGH ONE COMPATIBLE SERVICE
-> CONFIRM IDENTITY
-> REPEAT GROUP/ACL/SHARE/HOST/SESSION/ROUTE MAPPING
Do not overwrite the old state. Record which source produced the material and which protocol accepted it.
6.2.9.6.7 Worked example — hypothetical
Observation: a group appears to grant useful access. Test: enumerate its membership and nesting with the available native/LDAP method. Illustrative output: the controlled user is included through another group. Interpretation: validate the resulting destination/object right.
6.2.9.6.8 Verify the result
Retain object identifiers, group relationships and actual visibility; distinguish directory facts from inferred execution access.
6.2.9.6.9 Failure and fallback
Missing RSAT/PowerView does not block built-in ADSI or LDAP. Signing/TLS policy requires a compatible authenticated transport.
6.2.9.6.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| An ACL/graph edge names GenericAll, GenericWrite, WriteDacl, WriteOwner or an extended/property right | Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation | §6.2.9.9 — Validate effective directory-object control |
| Group-to-host access edges or a privileged user's possible session | Reachable destination service and its actual authorization; session evidence must be current and collection rights sufficient | §6.2.9.10 — Validate host access and volatile session candidates |
| A user-owned SPN and a useful service-account relationship | A valid domain authentication/TGT context, reachable KDC, target SPN and a feasible password/encryption candidate strategy | §6.3.11.11 — Request a selected service ticket for offline service-account recovery |
| Directory relationships are too broad for manual comparison or a candidate chain needs ranking | Compatible collector/deployment, explicit scope, directory rights and separate permission/connectivity for host/session collection | §6.2.9.11 — Collect focused BloodHound data and validate an attack path |
| User-owned SPNs or service-account clues | Directory visibility and correct service/account association; roasting requires the additional authentication and encryption conditions | §6.2.9.8 — Identify service accounts and SPNs worth investigating |
| A known user or directory flag indicates Kerberos preauthentication is disabled | Account with preauthentication disabled, KDC reachability and a supported returned encryption type; no-password and authenticated-discovery contexts differ | §6.3.11.10 — Request AS-REP material for an account without preauthentication |
| A useful linked GPO has a potentially controllable directory or SYSVOL component | Effective rights on the necessary GPO components, applicable target scope/filtering, writable policy artifact and a privileged refresh trigger | §6.3.11.19 — Conditional: trace GPO control to privileged policy consumption |
| Delegation configuration or computer-object write suggests a Kerberos impersonation path | Exact delegation type; required service/machine identity and key; allowed target/SPN; account flags and KDC policy permit the flow | §6.3.11.20 — Conditional: use a validated delegation or RBCD relationship |
| A CA/template configuration exposes a plausible certificate identity transition | Effective enrollment/template/CA rights and the exact vulnerable settings; issuance requirements, identity mapping and authentication route must all permit the path | §6.3.11.21 — Conditional: validate an AD CS enrollment-to-authentication path |
6.2.9.7 Read domain shares, SYSVOL and NETLOGON for useful artifacts
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Quick sheet
6.2.9.7.1 Purpose and result
Policy/scripts/configuration and typed credential or host clues.
6.2.9.7.2 Recognition clues
A valid domain identity and accessible file services.
6.2.9.7.2.1 Find the clue from your starting access
Where to investigate: Enumerate the DC/known file-server shares and inspect relevant SYSVOL/NETLOGON paths under the accepted domain identity.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Reachable SMB plus share/object read rights in the chosen identity context
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Prove read access and actual artifact content; keep recovered real secrets private.
Failure/next check: Share listing denial does not necessarily deny a known share path, and login success does not guarantee object read access.
net view \\DC_HOST
dir \\DOMAIN\SYSVOL
dir \\DOMAIN\NETLOGON
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
NETLOGON contains LOGIN_SCRIPT
Readable script references SERVICE_ACCOUNT and CONFIG_PATH
Recognize this detail: A real domain-readable script gives concrete identity/path leads for credential and host investigation.
Still missing before method selection: Verify readable artifact content, whether any secret is current and what account/service it belongs to.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | The artifact yields a typed usable credential or access clue: follow that specific transition. |
| Ruled out in this context | The script only contains non-sensitive public settings: reject a credential-disclosure inference. |
| Inconclusive | Share listing denial without a known-path read test does not settle object access. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.7.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Reachable SMB plus share/object read rights in the chosen identity context.
6.2.9.7.4 Discover and verify prerequisites
dir \\DOMAIN\SYSVOL
dir \\DOMAIN\NETLOGON
6.2.9.7.5 Why it works
Domain-readable scripts and policy artifacts can disclose paths, service accounts or historical secrets. A script's presence does not prove that its credentials are current or that it runs with high privilege.
6.2.9.7.6 Execute and choose variants
6.2.9.7.6.1.1 Inventory, then test the object
net view \\DC_HOST
dir \\DC_HOST\SYSVOL
dir \\DC_HOST\NETLOGON
nxc smb DC_IP -d DOMAIN -u USER -p 'PASSWORD' --shares
smbclient -L //DC_IP -U 'DOMAIN/USER'
smbclient //DC_IP/SYSVOL -U 'DOMAIN/USER' -c 'recurse ON; ls'
smbclient //DC_IP/SHARE -U 'DOMAIN/USER'
Inside smbclient, use ls, cd, get FILE and a harmless approved put only when write validation is needed. Share listing, share connection, file read and file write are separate permissions.
Inspect authorized readable policy/logon/deployment paths for scripts, configurations, backups, connection strings and legacy Group Policy Preferences XML containing cpassword. Selectively retrieve relevant files; do not bulk-copy a share merely because it is readable. A discovered secret returns to the credential-classification procedure.
6.2.9.7.7 Worked example — hypothetical
Observation: a readable login script references a backup account. Test: inspect the relevant configuration and validate any recovered secret in context. Illustrative output: a credential opens another share. Interpretation: re-enumerate that identity's available objects.
6.2.9.7.8 Verify the result
Prove read access and actual artifact content; keep recovered real secrets private.
6.2.9.7.9 Failure and fallback
Share listing denial does not necessarily deny a known share path, and login success does not guarantee object read access.
6.2.9.7.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| A secret-like value, key file, stored hash, challenge response or ticket | Artifact provenance and format; possible local/domain/application identity and compatible protocol | §3.1.5 — Classify the artifact and its identity context |
| A password tied to a plausible user and service | Correct local/domain/application identity, reachable compatible service, accepted authentication and account state | §3.1.6 — Validate known passwords and context-specific reuse |
| SMB/RPC endpoints, domain clues or new credentials | Reachable SMB/RPC; anonymous, guest, local or domain context must be explicit; share and filesystem ACLs both matter | §1.2.6 — Enumerate SMB/RPC shares, files and identities |
6.2.9.8 Identify service accounts and SPNs worth investigating
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Quick sheet
6.2.9.8.1 Purpose and result
A prioritized service-account and roast candidate list.
6.2.9.8.2 Recognition clues
User-owned SPNs or service-account clues.
6.2.9.8.2.1 Find the clue from your starting access
Where to investigate: Enumerate servicePrincipalName on user objects and associate each SPN with its owning account and memberships.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Directory visibility and correct service/account association; roasting requires the additional authentication and encryption conditions
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Record SPN, account/object type and relevant privilege relationships before prioritizing recovery.
Failure/next check: An SPN alone proves neither weak password nor destination admin rights. Rank by evidence and potential benefit.
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
samaccountname: SERVICE_USER
serviceprincipalname: HTTP/TARGET_HOST
memberof: GROUP
Recognize this detail: A user-owned service name identifies a potential ticket/password-recovery target whose rights may be useful.
Still missing before method selection: Check actual account type, KDC authentication, encryption type and feasibility; SPN existence alone is not weakness.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | The selected account is requestable and recovery is justified: choose the roast method. |
| Ruled out in this context | The candidate is a strong random machine-account key with no useful recovery rationale: reject the assumed easy-password path. |
| Inconclusive | Unknown ownership or unreadable attributes require a narrower directory query. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.8.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Directory visibility and correct service/account association; roasting requires the additional authentication and encryption conditions.
6.2.9.8.4 Discover and verify prerequisites
setspn -Q */*
6.2.9.8.5 Why it works
An SPN maps a service name to an account key. Computer-account SPNs and user-service-account SPNs have different password characteristics; SPN presence is not a cracked password.
6.2.9.8.6 Execute and choose variants
setspn -Q */*
setspn -L ACCOUNT
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof,useraccountcontrol,pwdlastset
Record account → service class/host/port → groups → password age/encryption/delegation clues → reachable service. An SPN means the account represents a Kerberos service identity; it does not mean the password is weak, the service is reachable or the account is privileged. Ticket acquisition/cracking is Block 11.
6.2.9.8.7 Worked example — hypothetical
Observation: a named user owns an HTTP SPN. Test: inspect account context and request only the selected account's ticket when permitted. Illustrative output: a roastable ticket is obtained. Interpretation: choose the matching offline mode and evaluate feasibility.
6.2.9.8.8 Verify the result
Record SPN, account/object type and relevant privilege relationships before prioritizing recovery.
6.2.9.8.9 Failure and fallback
An SPN alone proves neither weak password nor destination admin rights. Rank by evidence and potential benefit.
6.2.9.8.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| A user-owned SPN and a useful service-account relationship | A valid domain authentication/TGT context, reachable KDC, target SPN and a feasible password/encryption candidate strategy | §6.3.11.11 — Request a selected service ticket for offline service-account recovery |
| A supported stored verifier or converted protected artifact | Correct format/mode, complete salt/context, justified candidates and an available offline tool/backend | §3.1.7 — Recover passwords with feasible dictionary, rule and mask attacks |
| An ACL/graph edge names GenericAll, GenericWrite, WriteDacl, WriteOwner or an extended/property right | Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation | §6.2.9.9 — Validate effective directory-object control |
6.2.9.9 Validate effective directory-object control
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Operational procedure | Quick sheet
6.2.9.9.1 Purpose and result
A verified object-control primitive suitable for a named identity transition.
6.2.9.9.2 Recognition clues
An ACL/graph edge names GenericAll, GenericWrite, WriteDacl, WriteOwner or an extended/property right.
6.2.9.9.2.1 Find the clue from your starting access
Where to investigate: Select a useful user/group/computer/domain object from mapping and resolve its ACE trustees, rights and object-specific scopes.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Verify principal, object SID/type and effective permitted modification; preserve original ACL/state before changes.
Failure/next check: A stale graph, inherited scope mismatch or deny/protected-object behavior can invalidate the edge.
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
SecurityIdentifier: CONTROLLED_GROUP_SID
ActiveDirectoryRights: WriteDacl
Target: TARGET_OBJECT
Recognize this detail: A DACL-control ACE for a possibly controlled trustee opens an intermediate-right candidate.
Still missing before method selection: Resolve the ACE's trustee and group nesting, target object class, GUID and inheritance/deny scope. For password reset, group writes or DACL changes open that exact operation's procedure and check its additional conditions before modifying anything.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | The trustee and exact right apply to the target: select the corresponding object transition. |
| Ruled out in this context | The ACE applies to another object type/trustee or is overridden: reject that edge. |
| Inconclusive | A graph label or unresolved SID does not establish current effective control. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.9.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation.
6.2.9.9.4 Discover and verify prerequisites
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs
6.2.9.9.5 Why it works
Object rights are operation-specific. GenericWrite on a user is not a universal password-reset right; inherited ACEs and protected objects can change applicability.
6.2.9.9.6 Execute and choose variants
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteOwner|ExtendedRight|WriteProperty|Self' } |
Select-Object ObjectDN,SecurityIdentifier,ActiveDirectoryRights,ObjectAceType,AceType,IsInherited,InheritanceType
PowerView normally exposes the trustee as SecurityIdentifier. Resolve that SID and trace controlled direct/nested membership. -ResolveGUIDs resolves operation GUIDs; it does not make every trustee a friendly account name. A blank projected column can mean the selected property is absent, not that an ACE has no trustee.
6.2.9.9.6.1 Compatible copy that actually emits IdentityReference
Use this projection only when inspecting the returned object confirms that the loaded implementation provides IdentityReference.
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteOwner|ExtendedRight|WriteProperty|Self' } |
Select-Object ObjectDN,IdentityReference,ActiveDirectoryRights,ObjectAceType,AceType,IsInherited,InheritanceType
If the value is an unresolved SID, resolve it before applying the rule to a controlled principal.
| Candidate right | Possible transition to validate later | Missing proof now |
|---|---|---|
GenericAll | Broad object modification | Controlled trustee, target object class, applicable deny/inheritance and useful change |
GenericWrite / WriteProperty | Change one or more writable attributes | Exact attribute/object GUID and a transition that consumes it |
WriteOwner | Become owner | Ability to change the DACL afterward and use the resulting right |
WriteDacl | Add an ACE | Effective write-DACL right, planned narrow ACE and restoration |
AllExtendedRights / ForceChangePassword | Extended operation such as reset where applicable | Object class, exact extended right and downstream usefulness |
Self / validated write | Add self/member or another validated attribute where schema permits | Correct validated-write GUID and target type |
| GPO/OU control | Affect linked computers/users | Writable GPO component, effective link/scope, refresh/trigger and target placement |
An ACE is one rule. Effective access depends on trustee/group nesting, allow/deny semantics, inheritance, object-specific GUIDs and security descriptor scope. Do not perform the modification in this mapping block.
Model: controlled principal → effective ACE → target object/type → permitted modification → authentication/authorization effect → cleanup.
Enumerate a target's ACL with resolved GUIDs:
Import-Module .\PowerView.ps1
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteOwner|ExtendedRight' }
Resolve trustees:
ConvertFrom-SID 'S-1-5-21-...'
Get-DomainObject -Identity 'S-1-5-21-...' | Select-Object samaccountname,objectclass
Common effects require different rights:
| Right/object | Possible controlled effect | Validation needed |
|---|---|---|
GenericAll/password-reset extended right on user | Reset the user's password | Effective trustee, account state, protected-object behavior |
GenericAll or effective member-attribute write on group | Add a controlled principal to the group | Target group, nesting and a refreshed logon token |
GenericWrite/SPN-property write on user | Add a temporary SPN, request a TGS and remove it | Exact property right, duplicate-SPN checks and cleanup |
WriteDacl | Grant a narrower right | Ability to write DACL and restore original ACL |
WriteOwner | Change owner, then possibly DACL | Owner semantics and cleanup |
| Computer-object write | RBCD-related attribute change | Machine account/control, SPN/Kerberos and target service |
6.2.9.9.7 Worked example — hypothetical
Observation: a graph suggests a password-reset edge. Test: resolve the ACE and controlled user's effective membership against the actual target. Illustrative output: the required extended right applies. Interpretation: assess the reset's impact and select the intended transition.
6.2.9.9.8 Verify the result
Verify principal, object SID/type and effective permitted modification; preserve original ACL/state before changes.
6.2.9.9.9 Failure and fallback
A stale graph, inherited scope mismatch or deny/protected-object behavior can invalidate the edge.
6.2.9.9.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| A controlled trustee has the effective password-reset right on a useful account | Exact object/right and account state; the disruptive password change is justified within the assigned lab objective | §6.3.11.15 — Reset a target account password through a validated directory right |
| A group member-attribute write or equivalent effective right | Exact target group, controlled principal, useful resulting right and a fresh token/logon context | §6.3.11.16 — Add a controlled identity to a group through effective membership rights |
| Effective WriteOwner or WriteDacl on a useful directory object | Correct object/ACE semantics, permission to perform the required intermediate change and a preserved original ACL/owner | §6.3.11.17 — Convert ownership or DACL control into a narrower useful right |
| A principal has the relevant effective replication rights at the domain naming context | Required replication extended rights, DC RPC connectivity and correct domain identity; access to a member server is insufficient | §6.3.11.18 — Use validated directory replication rights for bounded credential proof |
6.2.9.10 Validate host access and volatile session candidates
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Operational procedure | Quick sheet
6.2.9.10.1 Purpose and result
Verified service access or a prioritized host/session hypothesis.
6.2.9.10.2 Recognition clues
Group-to-host access edges or a privileged user's possible session.
6.2.9.10.2.1 Find the clue from your starting access
Where to investigate: Correlate directory group/session relationships with a specific host's service and local access policy, rather than treating all host edges as administrator access.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Reachable destination service and its actual authorization; session evidence must be current and collection rights sufficient
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Record the destination-specific successful action and freshness/limits of session evidence.
Failure/next check: Collection denial is not proof that no sessions exist; a valid credential is not proof of every host-access method.
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
SMB authentication: accepted
SHARE: READ
RDP/WinRM/WMI authorization: not established
Recognize this detail: A permitted SMB action identifies a host capability; it does not establish RDP/WinRM/SCM rights. Investigate sessions only with a supported, permitted remote query.
Still missing before method selection: Verify actual group effectiveness, service/logon rights, session freshness and collection visibility.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | The intended host service accepts the account and action: use that particular access form. |
| Ruled out in this context | RDP membership does not grant the proposed service-creation right: reject that method. |
| Inconclusive | Denied session enumeration is a visibility limit, not proof that no useful sessions exist. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.10.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Reachable destination service and its actual authorization; session evidence must be current and collection rights sufficient.
6.2.9.10.4 Discover and verify prerequisites
whoami /groups
net localgroup Administrators
6.2.9.10.5 Why it works
Local admin, RDP, WinRM and share-read relationships grant different capabilities. A historical session does not guarantee current credential material or the right to read it.
6.2.9.10.6 Execute and choose variants
Find-LocalAdminAccess
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD'
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
Find-LocalAdminAccess is a broad candidate generator and can be noisy or blocked by firewall/RPC controls. Validate a selected host with the service you may actually use. NetExec's (Pwn3d!) indicates administrative SMB context according to that tool; it does not establish RDP, WinRM, WMI/DCOM or directory rights. RDP, WinRM, SMB/service control and WMI/DCOM each have different ports, services, policies and authorization.
Get-NetSession -ComputerName COMPUTER -Verbose
Get-NetLoggedon -ComputerName COMPUTER
PsLoggedOn.exe \\COMPUTER
Get-NetSession relies on workstation/session enumeration APIs that modern Windows may restrict. PsLoggedOn combines Registry profile evidence with NetSessionEnum; remote Registry access and sufficient rights are relevant, and querying can itself create a network-session entry. Therefore:
- empty/denied is inconclusive, not proof of no users;
- a session is a time-sensitive observation, not a durable ACL;
- a session matters only if the current identity can reach/control that host and a later credential/ticket technique applies;
- session presence does not prove credentials are resident, accessible or reusable.
6.2.9.10.7 Worked example — hypothetical
Observation: a graph marks a user as able to RDP to a host. Test: validate the reachable RDP service and effective logon right. Illustrative output: RDP works but remote service creation is denied. Interpretation: retain the actual access form and inspect that host's new opportunities.
6.2.9.10.8 Verify the result
Record the destination-specific successful action and freshness/limits of session evidence.
6.2.9.10.9 Failure and fallback
Collection denial is not proof that no sessions exist; a valid credential is not proof of every host-access method.
6.2.9.10.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| RDP is reachable and the identity may have remote-interactive logon rights | Allowed account/session policy and compatible client/NLA/TLS; hash-based Restricted Admin has additional supported-policy/admin requirements | §6.4.4.13 — Obtain an authorized RDP interactive session |
| A WinRM listener and a candidate endpoint-authorized account | Reachable HTTP(S) listener, accepted authentication and endpoint/session configuration permissions; hash/ticket support depends on client/context | §6.4.4.12 — Use WinRM, WinRS or PowerShell remoting |
| A controlled Windows host may hold useful logged-on identities | Required process/host privileges, useful sessions and compatible architecture; PPL/Credential Guard/protection may prevent access or remove material | §6.3.11.5 — Obtain accessible live logon-session credential material |
6.2.9.11 Collect focused BloodHound data and validate an attack path
Blocks: 10; Block 13 route fundamentals first. Operational procedure | Operational procedure | Quick sheet
6.2.9.11.1 Purpose and result
A ranked chain of independently testable relationships.
6.2.9.11.2 Recognition clues
Directory relationships are too broad for manual comparison or a candidate chain needs ranking.
6.2.9.11.2.1 Find the clue from your starting access
Where to investigate: Inspect focused collected relationships and the collector's scope/freshness before following a displayed path.
Discovery action — reference example:
Access/context: A known domain identity or a directory endpoint that permits the selected anonymous query
Conditions, effects and verification
Requires: Compatible collector/deployment, explicit scope, directory rights and separate permission/connectivity for host/session collection
Action class: Directory reads and selected host/session collection; collection causes network activity.
Stop/verify: Validate every useful edge against current directory/host evidence and identify the transition each one enables.
Failure/next check: Collector/version incompatibility and partial data are tool/visibility failures. They do not prove the environment lacks a path.
In BloodHound: locate the controlled principal; inspect the exact edge, source object, destination and collection age.
Resolve its underlying group/ACL/service evidence with the corresponding manual method.
Illustrative evidence — synthetic, abbreviated:
The excerpt may combine command fields with labelled observations from the preceding investigation; it is not a real-target transcript or a promise of exact tool formatting.
Graph path: CONTROLLED_GROUP -> WriteDacl -> TARGET_USER
Collection scope: directory only
Host/session data: not collected
Recognize this detail: The directory edge supplies a candidate intermediate right; missing host/session evidence cannot be invented from the graph.
Still missing before method selection: Collect with a version-compatible SharpHound/BloodHound collector, then validate the selected edge. Resolve group nesting and effective ACEs for object control; test destination rights and session freshness for host/session edges.
| Outcome after checking | Example and next decision |
|---|---|
| Enabled after validation | Every relevant edge is current and enabled: rank the connected path against alternatives. |
| Ruled out in this context | One edge is stale or ineffective: reject that chain in its current form. |
| Inconclusive | A missing edge in partial collection leaves capability unknown, not absent. |
If you do not yet have this clue: start with Establish domain identity, DC, DNS, time and route.
6.2.9.11.3 Prerequisites
Starting access: A known domain identity or a directory endpoint that permits the selected anonymous query. Required conditions: Compatible collector/deployment, explicit scope, directory rights and separate permission/connectivity for host/session collection.
6.2.9.11.4 Discover and verify prerequisites
SharpHound.exe --help
6.2.9.11.5 Why it works
BloodHound models collected relationships, which may be stale or incomplete. Directory-only collection and host/session collection answer different questions and have different contact/rights requirements.
6.2.9.11.6 Execute and choose variants
6.2.9.11.6.1.1 Current SharpHound CE
Low-noise directory baseline that avoids contacting every workstation:
.\SharpHound.exe --CollectionMethods DCOnly --OutputDirectory .\bh --ZipFileName domain-dconly.zip
Add host facts only when they can answer the next question:
.\SharpHound.exe --CollectionMethods LocalGroup --ComputerFile .\candidate-hosts.txt --OutputDirectory .\bh --ZipFileName candidate-localgroups.zip
.\SharpHound.exe --CollectionMethods Session --ComputerFile .\candidate-hosts.txt --Loop --LoopDuration 00:10:00 --OutputDirectory .\bh --ZipFileName candidate-sessions.zip
SharpHound with no collection flag uses its broader default, including directory data plus local-group/session attempts. All performs every supported method; it is not the first response to an unanswered narrow question. Import the output ZIP into a compatible BloodHound CE deployment and verify node/edge counts and ingestion errors.
6.2.9.11.6.1.1.1 Collector variants and compatibility
# Inspect the actual collector before using copied syntax.
.\SharpHound.exe --help
For the current Kali CE collector, use the noninteractive directory-first command below. Legacy bloodhound-python is not its CE command/schema.
# Legacy/course PowerShell collector; use only with a compatible legacy deployment.
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory .\bh -ZipFileName legacy.zip
Use the collector version intended for the BloodHound deployment. bloodhound-python, legacy SharpHound PowerShell and current SharpHound CE are alternatives with different schemas/features, not interchangeable command spellings.
6.2.9.11.6.1.2 Noninteractive Kali first pass
Use one valid domain identity and scoped DC/SMB connectivity. Start in a fresh private directory so graph output and reports do not mix identities. DOMAIN is the DNS domain; DOMAIN_NETBIOS is its short name, DC_HOST the DC FQDN, and TARGET one approved SMB host. No menu input is required.
mkdir -p ~/oscp/work/TARGET/evidence/ad-first-pass
cd ~/oscp/work/TARGET/evidence/ad-first-pass
bloodhound-ce-python -d DOMAIN -u USER -p 'PASSWORD' -dc DC_HOST -ns DC_IP -c DCOnly --disable-autogc --zip
ldapdomaindump -u 'DOMAIN_NETBIOS\USER' -p 'PASSWORD' -o ldap-inventory ldap://DC_IP
bloodyAD --host DC_HOST --dc-ip DC_IP -d DOMAIN -u USER -p 'PASSWORD' get writable --detail --partition DOMAIN > writable.txt
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares --no-admin-check --log shares.log
Choose: the graph covers groups, trusts, object properties, ACLs and containers; ldapdomaindump adds readable inventory; bloodyAD reports domain-partition effective writable attributes/security descriptors/child classes; NetExec checks the selected host's shares. Skip redundant inventory when the graph already answers the question.
Version gate: the NetExec line requires help documenting
--file-write-check(leave it off) and--no-admin-check. Its default opens existing share roots with access masks, without creating files. The latter skips SCM administration probing. The bloodyAD line requires--partitionsupport. Local tool databases, arguments and output contain private information.Interpret:
DCOnlybypasses member-computer enumeration, not all DC/GC/DNS discovery. LDAP inventory can follow referrals. A writable-rights result is not a write; an SMB access-mask result is not proof of actual file creation. No remote command, password change, LDAP modification, certificate enrollment or roasting feature is selected here. Logons and audit events still occur.
6.2.9.11.6.1.2.1 Older NetExec with --no-write-check, including v1.4.0
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares --no-write-check --log shares.log
Use this only when installed help supports the older flag. Bare --shares in that release creates/deletes temporary artifacts. This form skips write testing, but the old login path can still probe SCM permissions. Filtering displayed shares to READ is not a substitute for disabling the write test.
Do not use linWinPwn --auto as a substitute for this selection: its automatic chain has additional attack behavior. Its menu-based all,LoggedOn collector adds host RPC and remote-registry access that can trigger RemoteRegistry startup. The direct baseline also removes the wrapper's startup Nmap scan and conditional password-repair prompts. Authentication-method fallback can cause multiple authentication exchanges; stop and diagnose a failed credential rather than repeatedly running all collectors.
Sources: BloodHound.py CE, ldapdomaindump, bloodyAD writable query, NetExec share enumeration. A future tool/dependency version needs renewed behavior checks; these commands are reference material, not a claim of target execution or explicit OffSec tool endorsement.
6.2.9.11.6.1.3 Analyze in this order
- Mark only identities/hosts actually controlled. A low-privilege session on a host does not make the host itself fully owned.
- Inspect the controlled principal's direct and nested group memberships and outbound object-control edges.
- Inspect reachable computers where it has local admin, RDP, WinRM/DCOM or other applicable rights.
- Inspect high-value goals and shortest paths only as hypothesis generation.
- Classify each selected edge:
- directory/static-ish: group, ACL, GPO, OU, trust;
- host-derived: local group or user right;
- volatile: session;
- route-dependent: the required host/service must be reachable now.
- Reproduce the minimum important relationship manually before handing it to Block 11 or 12.
ID | CONTROLLED PRINCIPAL | RELATIONSHIP | TARGET | SOURCE EVIDENCE
| EFFECTIVE? | ROUTE/SERVICE | VOLATILITY | EXPECTED TRANSITION
| MINIMUM VALIDATION | STATUS | NEXT BLOCK
Rank candidates by:
- confidence that the relationship is effective;
- deterministic value of the resulting identity/access;
- route and service availability;
- stability versus volatile session timing;
- reversibility and impact;
- number of unsupported assumptions.
Prefer a validated readable share/credential clue or direct object right over a multi-edge path built from stale sessions and unreachable hosts.
6.2.9.11.7 Worked example — hypothetical
Observation: collection finds a short path from a controlled group to a privileged account. Test: validate each effective ACL and destination service edge manually. Illustrative output: one edge is stale. Interpretation: reject that chain and rank another with current evidence.
6.2.9.11.8 Verify the result
Validate every useful edge against current directory/host evidence and identify the transition each one enables.
6.2.9.11.9 Failure and fallback
Collector/version incompatibility and partial data are tool/visibility failures. They do not prove the environment lacks a path.
6.2.9.11.10 Continue from the interpreted result
| Observed result | Check before proceeding | Next numbered section |
|---|---|---|
| An ACL/graph edge names GenericAll, GenericWrite, WriteDacl, WriteOwner or an extended/property right | Effective trustee membership, target object/type, inheritance/deny behavior and the exact permitted operation | §6.2.9.9 — Validate effective directory-object control |
| Group-to-host access edges or a privileged user's possible session | Reachable destination service and its actual authorization; session evidence must be current and collection rights sufficient | §6.2.9.10 — Validate host access and volatile session candidates |
| Several hosts, identities, routes or competing hypotheses need coordination | Explicit scope/objective and a record of observations, unknowns and available capabilities | §8.1.5 — Maintain state and select the next evidence-producing test |
6.2.9.12 Sources and shared concepts
Supplied PEN-200 Ch 22 pp705–760. The live Hexdump AD module currently contains no substantive lesson; use the course and linked Microsoft/SpecterOps sources.
Commands and their adjacent variant conditions are synchronized extracts of the linked operational procedures. Those procedures own complete execution details; this guide owns method selection, explanations and worked reasoning. Tool availability on the learner's Kali or a target must be checked in that environment.
Recognition interpretation: Microsoft account-control flags and PowerView user-query documentation. Parameter names can differ between legacy documentation and the loaded script; the illustrated bit test avoids ambiguous preauthentication switch names.