UserLogonFailed2: CrowdStrike Failed Logon Event, SubStatus Decoded
Published
One failed sign-in on a Windows host as the Falcon sensor saw it — the account tried, the logon type, the reason as a decimal NTSTATUS code in SubStatus, and for network attempts the address it came from.
Fields that matter in an investigation
| Field | What it tells you |
|---|---|
| 1UserName CrowdStrike queries | The account name that was tried. Many different names from one source is spraying or user enumeration. |
| 2SubStatus CrowdStrike queries | Why it failed, as a decimal NTSTATUS code — 3221225578 is 0xC000006A (wrong password), 3221225572 is 0xC0000064 (no such user), 3221226036 is 0xC0000234 (locked out). |
| 3LogonType CrowdStrike queries | How the logon was attempted, as a number — 2 interactive, 3 network, 10 remote interactive (RDP), 7 unlock, 8 network cleartext. |
| 4RemoteAddressIP4 CrowdStrike queries | For network and remote logons, the address the attempt came from. Empty or local for console attempts. |
| LocalAddressIP4 CrowdStrike queries | The host's own address on the interface that received the attempt. |
| ContextTimeStamp CrowdStrike queries | When the failure happened on the host, as the sensor saw it. Use it for rates and first/last attempt times. |
| 7ComputerName CrowdStrike queries | The host that refused the logon — a domain controller, server or workstation. |
| 8aid CrowdStrike queries | Sensor ID of the host. |
| aip CrowdStrike queries | The host's address as CrowdStrike's cloud saw it, usually its public address — not the attacker's. |
All 5 documented UserLogonFailed2 fields, besides the generic sensor fields
- LocalAddressIP4CrowdStrike queries
- LogonTypeCrowdStrike queries
- RemoteAddressIP4CrowdStrike queries
- SubStatusCrowdStrike queries
- UserNameCrowdStrike queries
Panther's generic schema for all Falcon Data Replicator events adds the sensor and context fields (not every event type fills each one): ComputerName, ConfigBuild, ConfigStateHash, ContextProcessId, ContextThreadId, ContextTimeStamp, Entitlements, FileName, FilePath, InContext, TargetProcessId, TreeId, aid, aip, cid, event_platform, event_simpleName, id, name, timestamp.
What the numbers mean
These fields hold numbers that the Falcon console turns into words. The tables are CrowdStrike's own, from the decoding transforms in its public LogScale content repository, shown as published.
SubStatus source ↗︎
| 0 | Status OK. |
| 32212255660xC000005E | There are currently no logon servers available to service the logon request. |
| 32212255720xC0000064 | User logon with misspelled or bad user account |
| 32212255780xC000006A | User logon with misspelled or bad password |
| 32212255810xC000006D | The cause is either a bad username or authentication information |
| 32212255820xC000006E | Indicates a referenced user name and authentication information are valid, but some user account restriction has prevented successful authentication (such as time-of-day restrictions). |
| 32212255830xC000006F | User logon outside authorized hours |
| 32212255840xC0000070 | User logon from unauthorized workstation |
| 32212255850xC0000071 | User logon with expired password |
| 32212255860xC0000072 | User logon to account disabled by administrator |
| 32212255870xC0000073 | STATUS_NONE_MAPPED |
| 32212256920xC00000DC | Indicates the Sam Server was in the wrong state to perform the desired operation. |
| 32212257790xC0000133 | Clocks between DC and other computer too far out of sync |
| 32212258190xC000015B | The user has not been granted the requested logon type (also called the logon right) at this machine |
| 32212258680xC000018C | The logon request failed because the trust relationship between the primary domain and the trusted domain failed. |
| 32212258740xC0000192 | An attempt was made to logon, but the Netlogon service was not started. |
| 32212258750xC0000193 | User logon with expired account |
| 32212260200xC0000224 | User is required to change password at next logon |
| 32212260210xC0000225 | Evidently a bug in Windows and not a risk |
| 32212260360xC0000234 | User logon with account locked |
| 32212262220xC00002EE | Failure Reason: An Error occurred during Logon |
| 32212265150xC0000413 | Logon Failure: The machine you are logging on to is protected by an authentication firewall. The specified account is not allowed to authenticate to the machine. |
LogonType source ↗︎
| 0 | System |
| 2 | Interactive |
| 3 | Network |
| 4 | Batch |
| 5 | Service |
| 6 | Proxy |
| 7 | Unlock |
| 8 | Network Cleartext |
| 9 | New Credential |
| 10 | Remote Interactive |
| 11 | Cached Interactive |
| 12 | Cached Remote Interactive |
| 13 | Cached Unlock |
What the record looks like
Numbered lines are the fields in the table.
A synthetic record from LogTriage's test corpus, in the shape Falcon Data Replicator writes; every build of this site checks that it uses only fields documented for the event. Real records carry more fields.
What it records
UserLogonFailed2 is the Falcon sensor’s record of a failed sign-in on a Windows host; CrowdStrike’s published queries use it with event_platform=Win. It names the account in UserName, how the logon was attempted in LogonType, why it failed in SubStatus, and — for network and remote attempts — where it came from in RemoteAddressIP4. LocalAddressIP4 is the host’s own address, ContextTimeStamp when the attempt happened on the host, and ComputerName and aid which host refused it.
Both codes are numbers. LogonType uses Windows’s logon type values: 2 interactive, 3 network, 4 batch, 5 service, 7 unlock, 8 network cleartext, 10 remote interactive. SubStatus is the Windows NTSTATUS code written in decimal, which is why it looks like 3221225578. CrowdStrike’s own decoding table uses the values Microsoft documents for event 4625:
| SubStatus (decimal) | Code | Meaning |
|---|---|---|
| 3221225578 | 0xC000006A | The account exists, the password was wrong |
| 3221225572 | 0xC0000064 | No such account |
| 3221226036 | 0xC0000234 | The account is locked out |
| 3221225586 | 0xC0000072 | The account is disabled |
| 3221225584 | 0xC0000070 | Not allowed from this workstation |
| 3221225582 | 0xC000006E | An account restriction applied |
For any other value, paste the number into the error code lookup, which reads decimal NTSTATUS codes.
When it matters
- Brute force. Many
0xC000006Afailures for oneUserNamefrom oneRemoteAddressIP4is password guessing (MITRE ATT&CK T1110.001). CrowdStrike’s own thresholding query starts at more than five failures per host, account, logon type and code. - Password spraying. One source, many accounts, a few attempts each (T1110.003), usually with
0xC0000064mixed in for names that do not exist. - Lockouts.
0xC0000234means the guessing already locked the account; the failures before it show where they came from. - Remote desktop. Don’t rely on
LogonType10 alone: with Network Level Authentication, Windows checks the password before the remote-desktop session starts, and its own failed-logon events record such attempts as network logons (type 3).
How to investigate
- Group failures by
RemoteAddressIP4,UserNameandSubStatus; check public sources against the IP blocklist checker. - Separate brute force (one account) from spraying (many accounts) and from a misconfigured service (one account, one internal address, steady rate around the clock).
- Look for a
UserLogonfor the same account from the same address after the failures — that is the guess that worked. - On a domain controller, failures for many hosts’ users point at domain-wide spraying.
Failures per source, account and reason, with the reason converted to hex as CrowdStrike’s queries do:
#event_simpleName=UserLogonFailed2 event_platform=Win
| SubStatus_hex := format(field=SubStatus, "0x%x")
| groupBy([aid, ComputerName, RemoteAddressIP4, UserName, LogonType, SubStatus_hex], function=[count(as=Failures), min(ContextTimeStamp, as=FirstSeen), max(ContextTimeStamp, as=LastSeen)], limit=max)
| Failures > 5
| sort(Failures, order=desc)
Sources that tried more than ten accounts — spraying — leaving out private ranges:
#event_simpleName=UserLogonFailed2 RemoteAddressIP4=*
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "127.0.0.0/8"])
| groupBy([RemoteAddressIP4], function=[count(as=Failures), count(UserName, distinct=true, as=Accounts), count(aid, distinct=true, as=Hosts)], limit=max)
| Accounts > 10
| sort(Accounts, order=desc)
The same over Falcon Data Replicator data in Splunk (add your index):
sourcetype="crowdstrike:events:sensor" event_simpleName=UserLogonFailed2
| eval SubStatusHex=tostring(tonumber(SubStatus), "hex")
| stats count AS Failures, dc(UserName) AS Accounts, values(SubStatusHex) AS SubStatuses by aid, RemoteAddressIP4, LogonType
| where Failures >= 10
| sort - Failures
The free log analyzer reads Falcon exports in the browser and flags bursts of failed logons per source address.
Where these facts come from
CrowdStrike's event dictionary sits behind the Falcon console login, so the field list above is assembled from public sources that agree with one another, and checked on every build:
- CrowdStrike's own queries (logscale-community-content, public domain): 8 files use UserLogonFailed2, for example Search-ByIPAddress.yaml, TheBasics-19-HelpfulQueryExamples.yaml, Defender-SearchByIPAddress.yaml.
A field counts as documented when Panther or Splunk lists it for this event, or when at least two of CrowdStrike's query files read it from this event alone. The explanations are LogTriage's own.
Related events
- UserLogon
- UserLogonFailed
- UserIdentity
- RemoteBruteForceDetectInfo
- ActiveDirectoryAuthenticationFailure
Detect it
Frequently Asked Questions
- Why is SubStatus a number like 3221225578 instead of 0xC000006A?
- Falcon stores the Windows status code as a plain decimal number. 3221225578 is 0xC000006A, the code for a wrong password, and 3221225572 is 0xC0000064, an account that does not exist. CrowdStrike's own queries convert it with format(field=SubStatus, "0x%x"); in Splunk, tostring(tonumber(SubStatus), "hex") does the same, and the error code lookup accepts the decimal form.
- Is UserLogonFailed2 the same as Windows event 4625?
- It describes the same thing, a failed logon on a Windows host, from the Falcon sensor instead of the Security event log, so you have it even where Windows auditing is off or the log is not collected. CrowdStrike's own decoding of SubStatus uses the values Microsoft documents for event 4625, so the 4625 code pages apply directly.
- Which LogonType values matter most in failed logons?
- Type 3 (network) covers SMB, many remote management tools and remote desktop attempts rejected by Network Level Authentication; type 10 is a remote desktop logon; type 2 is someone at the keyboard; type 8 is a network logon with a cleartext password, as with basic authentication on a web server. Bursts of type 3 or 10 failures from one address are the usual brute-force picture.
- How do I tell password spraying from brute force in UserLogonFailed2?
- Group failures by RemoteAddressIP4. Brute force is many failures against one or a few UserName values, mostly SubStatus 0xC000006A. Spraying is a few attempts each against many accounts from the same source, often mixed with 0xC0000064 for names that do not exist. Then look for a UserLogon from the same address shortly after, which means a guess worked.
Find every UserLogonFailed2 in your own Falcon export
Load a Falcon Data Replicator or event-stream export into the free browser analyzer: suspicious command lines, LSASS access, logon failures, reverse-shell ports and Falcon's own detections are flagged, with event names linked to their pages here. Nothing is uploaded.
Investigating something right now? LogTriage checks every address in the file against threat intelligence and writes the incident report: 10 analyses a month free. The incident pack adds the in-depth AI analysis and files up to 100 MB: 25 analyses for $19, one payment, no subscription. Pricing