event_simpleName=UserLogonFailed2 Falcon sensor event

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

FieldWhat 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

{
"timestamp": "1705329180000",
"event_simpleName": "UserLogonFailed2",
"cid": "abc123def456",
"event_platform": "Win",
"aid": "sensor002",
"ComputerName": "DC-01",
"UserName": "Administrator",
"LogonType": 3,
"SubStatus": 3221225578,
"RemoteAddressIP4": "203.0.113.245"
}

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)CodeMeaning
32212255780xC000006AThe account exists, the password was wrong
32212255720xC0000064No such account
32212260360xC0000234The account is locked out
32212255860xC0000072The account is disabled
32212255840xC0000070Not allowed from this workstation
32212255820xC000006EAn 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 0xC000006A failures for one UserName from one RemoteAddressIP4 is 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 0xC0000064 mixed in for names that do not exist.
  • Lockouts. 0xC0000234 means the guessing already locked the account; the failures before it show where they came from.
  • Remote desktop. Don’t rely on LogonType 10 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

  1. Group failures by RemoteAddressIP4, UserName and SubStatus; check public sources against the IP blocklist checker.
  2. Separate brute force (one account) from spraying (many accounts) and from a misconfigured service (one account, one internal address, steady rate around the clock).
  3. Look for a UserLogon for the same account from the same address after the failures — that is the guess that worked.
  4. 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:

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

Detect it

MITRE ATT&CK: T1110.001T1110.003

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