The Incident That Made Me Question My Sanity
I was knee-deep in forensic analysis on a Sunday morning. The attacker had moved from a user workstation to a domain controller in under 12 minutes. How?
The logs showed the attacker authenticating to the domain controller with a service account's NTLM hash - no password, just the hash. The account wasn't in Domain Admins, so nobody had ever looked at it. But years earlier it had been nested into a group that sat inside the domain's built-in Administrators group. On a DC, that's all you need.
Pass-the-Hash was already well documented when I started in IT. It's 2026, and we're still seeing it in production environments. Not because it's difficult to prevent - because organizations haven't actually implemented the controls they've had available for years.
Why Pass-the-Hash Works in 2026
Pass-the-Hash (PtH) is not a vulnerability. It's how NTLM works: the NT hash is the secret. NTLM authentication proves you know the hash, so if an attacker steals the hash, they can authenticate as you without ever knowing the password.
Two things follow from that, and most guidance only mentions the first:
- Restricting NTLM shrinks the attack surface - fewer places accept a raw hash.
- It doesn't make stolen hashes useless. The same NT hash (or the account's AES keys) can be used to request a Kerberos ticket - "overpass-the-hash." So you also have to stop the hashes being stolen in the first place, and limit where privileged credentials are exposed.
Let me break down where attackers get hashes - and what actually stops each one.
The Three Ways Attackers Get NTLM Hashes
1. Credential Dumping from Memory
When someone logs on interactively - at the console, over RDP, via a service or scheduled task - Windows keeps their NT hash (and Kerberos keys) in the LSASS process so it can do single sign-on. That's true whether the logon itself used NTLM or Kerberos. Anyone with local admin rights on that machine can read LSASS with Mimikatz or a dozen similar tools. (LM hashes aren't stored by default on anything since Windows Vista.)
What actually stops this:
- Credential Guard: Moves the secrets LSASS protects into an isolated, virtualization-based container that even a local admin can't read. Enabled by default on many new Windows 11 installs - verify it rather than assume.
- LSA protection (RunAsPPL): Runs LSASS as a protected process so standard dumping tools can't open it.
- Keep privileged accounts off lower-tier machines: A Domain Admin who never logs on to a workstation can't have their hash stolen from one. This is what AD tiering is for.
- Protected Users group for admins: Members don't have their NT hash cached for NTLM, can't use NTLM at all, and get 4-hour Kerberos tickets.
- Restrict local administrator rights: Dumping LSASS requires admin on the box. A phished standard user can't do it.
2. Capturing Authentication on the Network
NT hashes aren't sent over the network - NTLM sends a challenge-response instead (often called Net-NTLMv2). Attackers get those by poisoning LLMNR/NBT-NS name resolution (Responder) or by coercing a server to authenticate to them. A captured response can't be passed like a hash, but it can be cracked offline if the password is weak, or relayed in real time to another server.
What actually stops this:
- Disable LLMNR and NetBIOS over TCP/IP: Removes the easiest way to trick machines into authenticating to an attacker.
- Require SMB signing: Relayed SMB sessions fail signing checks.
- Require LDAP signing and channel binding on DCs: Stops relaying to LDAP - the classic path to domain compromise.
- Extended Protection for Authentication on web services like ADCS web enrollment and Exchange.
3. Pulling Them from the Domain Database
With replication rights (DCSync) or a copy of ntds.dit - from a DC, a DC backup, or a volume shadow copy - an attacker gets every hash in the domain at once, including KRBTGT (which enables Golden Tickets).
What actually stops this:
- Audit who holds replication rights on the domain root - it should be DCs, and your Entra Connect
MSOL_account if you use password hash sync, and nobody else. - Treat DC backups and backup servers as Tier 0.
- Alert on DCSync: Event ID 4662 with replication rights requested by a non-DC account (see The Event IDs That Actually Matter).
- If it happens anyway: reset KRBTGT twice, 10+ hours apart, and rotate every privileged and service account password.
Don't Forget Local Accounts
The most common PtH I see isn't a domain account at all. It's the local Administrator account with the same password on every machine - dump it from one workstation and you're admin on all of them. Two controls close this:
- LAPS gives every machine a unique, rotating local admin password.
- "Deny access to this computer from the network" (and "Deny log on through Remote Desktop Services") for the built-in Local account and member of Administrators group principal (S-1-5-114). Local admins can still log on at the console; they just can't be used remotely.
The Modern Windows Environment Isn't Safe by Default
Microsoft has announced NTLM's deprecation and has already removed NTLMv1 from the newest Windows releases, but in the environments I actually work in:
- NTLM is still enabled on Windows 10/11 and Windows Server for backward compatibility
- Active Directory accepts NTLM unless you explicitly restrict it
- No default Group Policy restricts it for you
Here's how I approach it on engagements.
Restricting NTLM in Practice
Step 1: Audit Current Usage
Before restricting anything, you need to know what's using NTLM. Turn on NTLM auditing via Group Policy (Computer Configuration → Policies → Windows Settings → Security Settings → Local Policies → Security Options):
- Network security: Restrict NTLM: Audit NTLM authentication in this domain → Enable all (apply to domain controllers)
- Network security: Restrict NTLM: Audit Incoming NTLM Traffic → Enable auditing for all accounts
- Network security: Restrict NTLM: Outgoing NTLM traffic to remote servers → Audit all
Events land in Applications and Services Logs → Microsoft → Windows → NTLM → Operational. On DCs, event 8004 shows each NTLM authentication, including which server the client was connecting to - that's your dependency list.
Let this run for at least a few weeks, including a month-end. The dependencies that bite you are the ones that only run occasionally.
Step 2: Kill LM and NTLMv1 (Quick Win)
This part is low-risk in almost every environment, and it removes the weakest, most crackable responses. Same Security Options location:
- Network security: Do not store LAN Manager hash value on next password change → Enabled
- Network security: LAN Manager authentication level → Send NTLMv2 response only. Refuse LM & NTLM
- Network security: Minimum session security for NTLM SSP (clients and servers) → Require NTLMv2 session security, Require 128-bit encryption
Be clear about what this does and doesn't do. It stops LM and NTLMv1. It does not stop Pass-the-Hash - PtH works fine over NTLMv2. Actually restricting NTLM is Step 3.
Step 3: Restrict NTLM, Starting With Privileged Accounts
You don't have to turn NTLM off for the whole domain at once. The highest-value, lowest-risk move comes first:
- Put Tier 0 admin accounts in Protected Users. They can no longer use NTLM anywhere - so a stolen admin hash can't be passed over NTLM. Test first: Protected Users members can't use delegation or offline cached logons, and get 4-hour tickets.
- Then restrict domain-wide using Network security: Restrict NTLM: NTLM authentication in this domain on your DCs - start with "Deny for domain accounts to domain servers," and use Add server exceptions in this domain for the dependencies your audit found.
- Fix the dependencies instead of living with exceptions forever: connections by IP address instead of name, missing SPNs, and non-domain devices are the usual culprits.
Step 4: Cut the Network Paths
You can't block "NTLM" at a firewall - it rides inside SMB, HTTP, LDAP and other protocols. What you can do is remove the paths lateral movement depends on:
- Block SMB (445) and RDP between workstations with Windows Firewall. Workstations almost never need to talk to each other, and this single rule breaks a huge amount of lateral movement.
- Disable LLMNR ("Turn off multicast name resolution") and NetBIOS over TCP/IP.
- Require SMB signing on all systems, and LDAP signing plus channel binding on DCs.
- Never expose SMB (445) or NetBIOS (137-139) to the internet, and block them from untrusted network segments.
What I Actually Recommend for Each Environment Type
Small Environments (< 500 Users)
- Week 1: Turn on NTLM auditing. Disable LLMNR/NetBIOS. Kill LM/NTLMv1. Put admin accounts in Protected Users (after testing).
- Weeks 2-3: Deploy LAPS and the S-1-5-114 network logon restriction. Enable Credential Guard and LSA protection. Require SMB signing. Block workstation-to-workstation SMB/RDP.
- Weeks 4-6: Review the NTLM audit data, fix dependencies, then restrict NTLM on the DCs with exceptions.
Medium Environments (500-5,000 Users)
- Weeks 1-4: NTLM auditing, application inventory, and the quick wins above.
- Weeks 5-8: LAPS, Credential Guard and firewall rules across the fleet. PAWs for Tier 0 admins.
- Weeks 9-12: Isolate legacy applications that genuinely need NTLM on their own segment, then restrict NTLM domain-wide with documented exceptions.
Large Enterprises (> 5,000 Users)
- Months 1-2: Audit and application inventory. Quick wins (LLMNR, NTLMv1, Protected Users for Tier 0).
- Months 3-4: Credential Guard, LAPS and network restrictions in pilot groups, then broad rollout.
- Months 5-6+: Restrict NTLM tier by tier, starting with Tier 0, with monitoring for failures at each stage.
The Real Problem Isn't Technology - It's Prioritization
I've seen environments with:
- Modern Entra ID Conditional Access policies
- LAPS deployed everywhere
- AD tiering on paper
And still: Domain Admins logging on to workstations, Credential Guard off, and NTLM accepted everywhere.
The attacker doesn't care about your cool technology. They only need one place where a privileged hash is exposed and one place that will accept it.
Key Takeaways
Pass-the-Hash still works in 2026 because hashes are still easy to steal and NTLM is still accepted almost everywhere.
- Stop the theft: Credential Guard, LSA protection, and keeping privileged accounts off lower-tier machines
- Stop the reuse: LAPS, the S-1-5-114 restriction, Protected Users, and restricting NTLM
- You can do all of it with existing Microsoft controls - no new tools required
- Restricting NTLM will surface dependencies. Audit first, fix them, then enforce