Why Attackers Love LSASS.exe: A Deep Dive into the Windows Credential Store
After getting SYSTEM, one process stands between you and every credential on the machine. Here's what lives inside it - and what modern Windows does to stop you.
After getting SYSTEM, one process stands between you and every credential on the machine. Hereβs what lives inside it β and what modern Windows does to stop you.
Youβve just popped a shell. You have SYSTEM. The next question is always the same β what credentials can I pull?
The answer lives in one process: lsass.exe. Not because itβs a vulnerability. Because it is literally the Windows credential store, by design. Understanding what lives inside it β and what modern defenses do to protect it β is what separates someone who runs Mimikatz from someone who understands why it sometimes fails.
What is lsass.exe
lsass.exe β Local Security Authority Subsystem Service β is the single process responsible for enforcing Windows security policy. Every login, every token creation, every credential cache on the machine flows through it.
It runs as NT AUTHORITY\SYSTEM (S-1-5-18) and starts during boot under Session 0. It is not optional. If lsass dies, Windows immediately reboots β the OS cannot function without its security authority.
Why attackers care: lsass is the only process authorized to hold NTLM hashes, Kerberos tickets, and sometimes cleartext passwords in memory simultaneously. One successful memory read = credentials for the entire domain.
How LSASS Gets Spawned
lsass doesnβt start from services.exe or explorer.exe. It has a very specific parent β and that parent matters for detection.
LSASS starts very early in the Windows boot sequence as part of the Session 0 initialization.
itβs birth follows:
Press enter or click to view image in full size
Windows Process Tree
- SMSS.exe (Session Manager Subsystem) starts at boot and creates the first system session (Session 0).
- SMSS launches Wininit.exe (Windows Initialization Process).
- Wininit.exe is the direct parent of LSASS. It spawns
lsass.exe, along withservices.exe(Service Control Manager) andlsaiso.exe(if Credential Guard is on). - Once started, LSASS runs indefinitely. If it is terminated or crashes, Windows will immediately trigger a system reboot because the OS cannot function without its security authority.
Privileges and Capabilities it Has
LSASS runs under the NT AUTHORITY\SYSTEM account (the highest possible privilege on a local machine) and possesses near-total control over security-related operations.
Its key βsuperpowersβ includes:
- Security Token Generation: It creates the access tokens that determine exactly what files, folders, and network resources a user can access.
- Credential Handling: It is the only process authorized to handle and cache sensitive material like NTLM hashes, Kerberos tickets (TGTs), and sometimes plaintext passwords for Single Sign-On (SSO).
- Security Policy Enforcement: It enforces password complexity, account lockouts, and user rights (e.g., who can shut down the system or back up files).
- Writing to Security Logs: LSASS is responsible for generating and writing events to the Windows Security Log, such as successful and failed login attempts.
- Memory Isolation (RunAsPPL): On modern Windows, it has the capability to run as a Protected Process Light (PPL). This prevents even other Administrator-level processes from reading its memory or injecting code into it, unless they are also specifically signed and trusted by Microsoft.
Lsass Internal Architecture and Componants
LSASS is not a single tool but a host process for several critical security services and βSecurity Support Providersβ (SSPs) .
These components work together to handle different types of login:
- Security Support Providers (SSPs): These are DLLs loaded into the LSASS process that implement specific authentication protocols:
β Kerberos (kerberos.dll): The primary protocol for Active Directory domain environments.
β MSV1_0 (msv1_0.dll): Handles local interactive logons by checking credentials against the Security Account Manager (SAM) database.
β WDigest: A legacy protocol that can store passwords in plaintext if enabled, making it a favorite target for attackers.
β Schannel: Manages SSL/TLS for secure web and network communication.
- NetLogon Service: Maintains the βsecure channelβ between a local machine and a Domain Controller (DC) to verify domain credentials.
- SAM Service (
SamSs): Manages local user and group information stored in the SAM registry hive.
As an attacker, you donβt care about all of them. You care about three:
Press enter or click to view image in full size
The wdigest story matters.
wdigest was designed for HTTP Digest authentication β a protocol that mathematically requires the plaintext password to function. So Windows stored it. In memory. In lsass. Microsoft disabled wdigest by default in Windows 8.1+ but the registry key still exists:
text
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest
UseLogonCredential = 1 β re-enables cleartext storage
Attackers with admin access can flip this key, wait for a user to re-authenticate, and then pull cleartext from lsass memory.
LSASS As Attackerβs Perspective
After Getting the Shell on victimβs Machine , Always the Same Question β What can i do next ?
Password Dumping ? . Letβs Run Mimikatz .
How Mimikatz Actually Works β The Internals
Mimikatz does not βhackβ anything β it reads lsass memory.
The key insight: Credential structures are not encrypted on the heap by default (before Credential Guard). They sit in plaintext inside lsass memory β Mimikatz just knows where to look.
Press enter or click to view image in full size
Mimikatz Internals with Complete Attack plan.
- Flow:
privilege::debugβ SeDebugPrivilege βOpenProcess(lsass)withPROCESS_VM_READβReadProcessMemoryβ parse the in-memory structures of each auth DLL β extract credentials. - Why
privilege::debugis needed: lsass DACL blocks normal user access β SeDebugPrivilege bypasses the DACL check entirely. - The credential structures are not encrypted on the heap β they sit in plaintext in lsass memory (before Credential Guard).
Why Mimikatz Fails In Modern Systems
Two defenses break the standard Mimikatz flow. They operate at completely different layers.
Press enter or click to view image in full size
1. PPL
PL is not a firewall rule. It is a protection level field inside _EPROCESS β the kernelβs process object. When lsass runs as PPL, the kernel refuses to grant PROCESS_VM_READ access to any process that isnβt also PPL-signed by Microsoft.
OpenProcess(lsass) with SeDebugPrivilege
β
Kernel checks _EPROCESS.Protection field
β
lsass = PsProtectedSignerLsa-Light
β
Access Denied β even from SYSTEM
How to check:
Process Hacker β lsass.exe β right-click β Properties
Look for: Protection: PsProtectedSignerLsa-Light
Bypass: mimidrv.sys β Mimikatzβs own kernel driver. It directly zeroes the Protection field in _EPROCESS at the kernel level. Once stripped, lsass is no longer protected and the standard dump flow works again.
This is exactly why BYOVD exists as an attack class. PPL cannot be defeated from userland β you need ring 0.
2. Credential Guard β The Hard Wall
Credential Guard doesnβt just protect lsass β it moves the credentials out of lsass entirely.
Introduced in Windows 10 with VBS (Virtualization-Based Security), it adds a new process: lsaiso.exe (Isolated LSA). This process runs in VTL1 β a separate trust zone enforced by the hypervisor, completely invisible to ring 0.
VTL0 (normal world) VTL1 (secure world)
βββββββββββββββββββ βββββββββββββββββββ
β lsass.exe β βALPCβ β lsaiso.exe β
β (your target) β β (holds secrets) β
β β β β
β Gets encrypted β β Holds plaintext β
β blobs only β β Kerberos keys β
β β β NTLM hashes β
βββββββββββββββββββ βββββββββββββββββββ
Ring 0 can reach Ring 0 cannot reach
Even with a kernel driver and ring-0 access, you cannot read VTL1 memory. The hypervisor enforces the boundary.
What you get when Credential Guard is active: encrypted blobs inside lsass β useless without the keys that live in VTL1.
The four scenarios where Credential Guard can still be bypassed:
- Physical access / offline attack β boot from external media, extract credentials from offline hive
- Downgrade attack β disable Credential Guard via Group Policy if you have domain admin
- NTLM relay β you donβt need the hash, just relay the authentication challenge
- Cached credentials β domain cached credentials (DCC2) stored in the registry, not protected by CG .
Attack Surface Map β What You Can Still Get
Press enter or click to view image in full size
Other Places Credentials Live
lsass isnβt the only store. When CG blocks you, pivot here:
- SAM hive β local account NTLM hashes. Readable via
SeBackupPrivilegeor VSS shadow copy - DPAPI β browser saved passwords, Wi-Fi keys, certificate private keys
- LSA secrets β service account passwords, cached domain credentials stored in registry
Note: Each of these deserves its own blog. Theyβre listed here so you know where to pivot β not as a dead end.
Lab β See It Yourself
What you need: Process Hacker, Mimikatz, a Windows lab VM without Credential Guard
Lab 1 β Identify lsass protection status
Process Hacker β find lsass.exe β right-click β Properties β General tab
Look for the Protection field. Two possible states:
Protection: None β PPL disabled, standard dump works
Protection: PsProtectedSignerLsa-Light β PPL enabled, need driver
Also check the Modules tab β confirm these are loaded:
msv1_0.dll β NTLM credential store
kerberos.dll β Kerberos ticket store
wdigest.dll β cleartext store (if enabled)
What this proves: You can identify exactly what defenses are active before attempting a dump.
Lab 2 β Check if Credential Guard is running
powershell
Get-ComputerInfo | select *guard*
Or via GUI:
msinfo32 β System Summary β Virtualization-based security
If Credential Guard is active, you will see lsaiso.exe running in Process Hacker. Its presence alone confirms VTL1 is active.
What this proves: You know before touching lsass whether youβll get usable credentials or encrypted blobs.
Lab 3 β Run Mimikatz (lab VM, no Credential Guard)
privilege::debugsekurlsa::logonpasswordssekurlsa::ticketsRead the output carefully. Each credential block tells you which DLL sourced it:
Authentication Id : 0 ; 123456Package : NTLM msv1\_0.dllUsername : AdministratorNTLM : aad3b435b51404eeaad3b435b51404ee
Package : Kerberos kerberos.dll[Ticket info here]What this proves: You can see exactly which SSP stored which credential β and understand why disabling wdigest breaks the cleartext output.
Whatβs Next
Next β Blog 4: BYOVD Explained β How Attackers Use Signed Drivers to Kill EDRs PPL bypass requires a kernel driver. Blog 4 explains exactly how attackers load one β and why a signed vulnerable driver is more dangerous than unsigned malware.