Pass the Hash
Adversaries may 'pass the hash' using stolen password hashes to move laterally within an environment, bypassing normal system access controls. Pass the hash (PtH) is a method of authenticating as a user without having access to the user's cleartext password. This method bypasses standard authentication steps that require a cleartext password, moving directly into the portion of the authentication that uses the password hash. When performing PtH, valid password hashes for the account being used are captured using a Credential Access technique. Captured hashes are used with PtH to authenticate as that user. Once authenticated, PtH may be used to perform actions on local or remote systems. Adversaries may also use stolen password hashes to perform 'overpass the hash,' using the NTLM hash to create a valid Kerberos ticket for further lateral movement. Threat actors including APT28, APT32, APT41, Wizard Spider, FIN13, Chimera, and Kimsuky have all operationalized PtH using tools such as Mimikatz, Cobalt Strike, Invoke-SMBExec, Impacket, and CrackMapExec.
let ExcludedAccounts = dynamic([
"ANONYMOUS LOGON", "IUSR", "DWM-1", "DWM-2", "UMFD-0", "UMFD-1",
"Window Manager", "Font Driver Host", "LOCAL SERVICE", "NETWORK SERVICE"
]);
// Branch 1: NTLM Network Logon (LogonType 3) to remote systems — classic PtH authentication pattern
SecurityEvent
| where TimeGenerated > ago(24h)
| where EventID == 4624
| where LogonType == 3
| where AuthenticationPackageName =~ "NTLM"
| where AccountName !endswith "$"
| where AccountName !in~ (ExcludedAccounts)
| where IpAddress != "-" and IpAddress !in ("::1", "127.0.0.1", "")
| extend DetectionBranch = "NTLM_Network_Logon_PtH"
| extend ElevatedAccount = (ElevatedToken == "%%1842")
| extend NtlmVersion = LmPackageName
| project TimeGenerated, Computer, EventID, AccountName, AccountDomain,
IpAddress, WorkstationName, LogonType, AuthenticationPackageName,
NtlmVersion, DetectionBranch, ElevatedAccount
| union (
// Branch 2: NewCredentials logon (LogonType 9) with NTLM — Mimikatz sekurlsa::pth /netonly signature
// This logon type appears on the SOURCE machine when a process is spawned with injected credentials
SecurityEvent
| where TimeGenerated > ago(24h)
| where EventID == 4624
| where LogonType == 9
| where AuthenticationPackageName =~ "NTLM"
| where AccountName !endswith "$"
| where AccountName !in~ (ExcludedAccounts)
| extend DetectionBranch = "NewCredentials_Mimikatz_PtH"
| extend ElevatedAccount = false
| extend NtlmVersion = LmPackageName
| project TimeGenerated, Computer, EventID, AccountName, AccountDomain,
IpAddress = "", WorkstationName, LogonType, AuthenticationPackageName,
NtlmVersion, DetectionBranch, ElevatedAccount
)
| union (
// Branch 3: Suspicious LSASS process access — credential theft step preceding PtH
// Access masks: 0x1010=VM_READ|QUERY_LIMITED, 0x1438=VM_READ|QUERY|VM_OP|DUP_HANDLE
DeviceEvents
| where Timestamp > ago(24h)
| where ActionType == "OpenProcessApiCall"
| where FileName =~ "lsass.exe"
| where InitiatingProcessFileName !in~ (
"MsMpEng.exe", "Taskmgr.exe", "procexp.exe", "procexp64.exe",
"perfmon.exe", "WmiPrvSE.exe", "SecurityHealthService.exe",
"svchost.exe", "csrss.exe", "wininit.exe", "lsm.exe"
)
| where RequestedPermissions in ("0x1010", "0x1438", "0x143a", "0x40", "0x1fffff")
| extend DetectionBranch = "LSASS_Credential_Access_PrePtH"
| extend ElevatedAccount = true
| extend NtlmVersion = RequestedPermissions
| project TimeGenerated = Timestamp, Computer = DeviceName, EventID = 10,
AccountName, AccountDomain = "",
IpAddress = "", WorkstationName = InitiatingProcessFileName,
LogonType = -1, AuthenticationPackageName = "LSASS_ACCESS",
NtlmVersion, DetectionBranch, ElevatedAccount
)
| sort by TimeGenerated desc Data Sources
Required Tables
False Positives
- Legitimate IT monitoring and management agents (Datadog, SolarWinds, PRTG) authenticating via NTLM when Kerberos SPN is not properly configured for the monitoring service account
- Backup solutions (Veeam, Commvault, Veritas) using service accounts that fall back to NTLM when accessing remote file shares across domain boundaries or when Kerberos delegation is unavailable
- Vulnerability scanners (Nessus, Qualys, Rapid7) performing credentialed NTLM authentication sweeps across network segments during authorized scan windows
- Legacy applications and services with no Kerberos support that always use NTLM for authentication — particularly common with older line-of-business apps and some industrial control system software
- Cross-domain or cross-forest authentication where no Kerberos trust is established, forcing legitimate NTLM fallback for users accessing resources in untrusted domains
References (11)
- https://attack.mitre.org/techniques/T1550/002/
- https://stealthbits.com/blog/how-to-detect-overpass-the-hash-attacks/
- https://learn.microsoft.com/en-us/windows-server/security/kerberos/ntlm-overview
- https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/network-security-restrict-ntlm-ntlm-authentication-in-this-domain
- https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group
- https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1550.002/T1550.002.md
- https://www.mandiant.com/resources/blog/fin13-a-cybercriminal-threat-actor-focused-on-mexico
- https://www.mandiant.com/resources/reports/apt1-exposing-one-of-chinas-cyber-espionage-units
- https://www.cisa.gov/news-events/cybersecurity-advisories/aa20-301a
- https://github.com/SecureAuthCorp/impacket
- https://github.com/Kevin-Robertson/Invoke-TheHash
Unlock Pro Content
Get the full detection package for T1550.002 including response playbook, investigation guide, and atomic red team tests.