Event ID 4776 Windows Security log

Event ID 4776: NTLM Credential Validation and Its Error Code

Published

An NTLM credential check happened on the machine that holds the account — on a domain controller this is your single view of NTLM authentication attempts for domain accounts, and the Error Code says whether the credentials passed and, if not, why.

Logged on: Only the computer that is authoritative for the provided credentials — the domain controller for domain accounts, the local computer for local accounts. Microsoft notes it does not generate when a domain account logs on locally to a domain controller.

Microsoft's title

4776(S,F): The computer attempted to validate the credentials for an account.

Source: Microsoft's event 4776 documentation · field names checked against it on every build

Fields that matter in an investigation

FieldXML / SentinelWhat it tells you
Authentication Package PackageName The authentication package used for credential validation; Microsoft states it is always "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0" for this event, so its presence simply confirms the validation ran through NTLM rather than Kerberos.
Logon Account TargetUserName The account whose credentials were validated — the identity under attack or in use. It can be a user name, a computer account name such as WIN81$, or a well-known principal such as "Local" or "Local Service".
Source Workstation Workstation The name of the computer from which the logon attempt originated. It is the only origin detail in the event — the destination server and the client IP address are not recorded here.
Error Code Status 0x0 on success; on failure it carries the reason, such as 0xC0000064 (bad username), 0xC000006A (bad password) or 0xC0000234 (account locked). Microsoft: a failed validation produces a Failure event with Error Code not equal to "0x0".

What it records

Event 4776 belongs to the Audit Credential Validation subcategory, and Microsoft’s scope statement is narrow: “This event generates every time that a credential validation occurs using NTLM authentication.” Kerberos activity is logged elsewhere (4768, 4769, 4771), so everything in 4776 was checked by NTLM.

Where the event lands matters as much as what it says: “This event occurs only on the computer that is authoritative for the provided credentials. For domain accounts, the domain controller is authoritative. For local accounts, the local computer is authoritative.” The event names only the source: “It shows only the computer name (Source Workstation) from which the authentication attempt was performed (authentication source). For example, if you authenticate from CLIENT-1 to SERVER-1 using a domain account you’ll see CLIENT-1 in the Source Workstation field.” The destination server is not in the event, and neither is an IP address or a logon type.

Four data fields carry everything: Authentication Package (always MICROSOFT_AUTHENTICATION_PACKAGE_V1_0), Logon Account, Source Workstation and Error Code. Success and failure are both recorded; “If a credential validation attempt fails, you’ll see a Failure event with Error Code parameter value not equal to ‘0x0’.”

Microsoft’s table of the most common error codes:

Error CodeMicrosoft’s description
0x0”No errors.”
0xC0000064”The username you typed does not exist. Bad username.”
0xC000006A”Account logon with misspelled or bad password.”
0xC000006DGeneric logon failure — an invalid username and/or password, or a LAN Manager Authentication Level mismatch between source and target
0xC000006F”Account logon outside authorized hours.”
0xC0000070”Account logon from unauthorized workstation.”
0xC0000071”Account logon with expired password.”
0xC0000072”Account logon to account disabled by administrator.”
0xC0000193”Account logon with expired account.”
0xC0000224Account logon with “Change Password at Next Logon” flagged
0xC0000234”Account logon with account locked.”
0xC0000371”The local account store does not contain secret material for the specified account.”

Two generation quirks are worth remembering: the event “also generates when a workstation unlock event occurs”, and it “does not generate when a domain account logs on locally to a domain controller”. For local account logons Microsoft recommends event 4624 instead, because it “contains more details and is more informative”.

When it matters

Microsoft’s own framing: “The main advantage of this event is that on domain controllers you can see all authentication attempts for domain accounts when NTLM authentication was used.” That makes 4776 the cheapest domain-wide view of NTLM credential guessing.

PatternMicrosoft’s reading
Repeated 0xC0000064 for one source”an indicator of an account enumeration attack, especially relevant for highly critical accounts”
Repeated 0xC000006A for one account”an indicator of a brute-force password attack”
0xC000006F, logon outside authorized hours”Can indicate a compromised account”
0xC0000070, logon from unauthorized workstation”Can indicate a compromised account”
0xC0000072 for a disabled account”an indicator of an account compromise attempt”
0xC0000234, account locked”Can indicate a brute-force password attack”

The monitoring guidance adds targets worth standing queries: high-value Logon Accounts (database and domain administrators, service accounts, domain controller accounts); accounts that should never be used, such as disabled or guest accounts; accounts outside an allowlist; Logon Account plus Source Workstation pairs for out-of-hours use; and account names that break your naming conventions. For a machine that stores local accounts, Microsoft suggests monitoring “for all events where Source Workstation and Computer (where the event was generated and where the credentials are stored) have different values” when a local account should only be used locally.

How to investigate

In Log Analytics the EventData names map to the SecurityEvent columns: TargetUserName is Logon Account, Workstation is Source Workstation, Status is the Error Code, and Computer is the authoritative machine that logged it. Start by grouping failures by source:

SecurityEvent
| where TimeGenerated > ago(24h)
| where EventID == 4776
| where Status !~ "0x0"
| summarize Attempts = count(), Accounts = dcount(TargetUserName),
            AccountList = make_set(TargetUserName, 20), Codes = make_set(Status, 10)
    by Workstation, Computer
| order by Accounts desc, Attempts desc

Many accounts from one Source Workstation is the spray shape; many attempts against one account is brute force. A blank Source Workstation still tells you which authoritative computer saw the traffic.

Then ask the question that sets severity — did the credentials eventually validate?

let badpass = SecurityEvent
    | where TimeGenerated > ago(24h) and EventID == 4776 and Status =~ "0xc000006a"
    | summarize Failures = count(), LastFail = max(TimeGenerated) by TargetUserName, Workstation;
SecurityEvent
| where TimeGenerated > ago(24h) and EventID == 4776 and Status =~ "0x0"
| join kind=inner badpass on TargetUserName, Workstation
| where TimeGenerated > LastFail
| project TimeGenerated, Computer, TargetUserName, Workstation, Failures, LastFail
| order by TimeGenerated asc

On a member server that is authoritative only for its own local accounts, validations whose Source Workstation is a different machine are the pattern Microsoft calls out for local accounts that should stay local:

SecurityEvent
| where TimeGenerated > ago(7d)
| where EventID == 4776
| extend HostShort = tolower(tostring(split(Computer, ".")[0]))
| where isnotempty(Workstation) and tolower(Workstation) != HostShort
| summarize Attempts = count(), Codes = make_set(Status, 10), Sources = make_set(Workstation, 20)
    by Computer, TargetUserName
| order by Attempts desc

Because 4776 holds no IP address or logon type, finish the pivot on the destination: 4625 for the matching failures with Logon Type and Source Network Address, 4624 for a session that was created, 4740 for a lockout that followed, and 4768/4769/4771 for the same account’s Kerberos side on the DC. The Windows 4625 password-spray rule covers the same grouping on the destination events. Without a SIEM, export the Security log as XML from Event Viewer and load it into the free browser log analyzer.

Related events and codes

  • Event ID 4624 An account was successfully logged on.
  • Event ID 4625 An account failed to log on.
  • Event ID 4648 A logon was attempted using explicit credentials.
  • Event ID 4740 A user account was locked out.
  • Event ID 4767 A user account was unlocked.
  • Event ID 4768 A Kerberos authentication ticket (TGT) was requested.
  • Event ID 4769 A Kerberos service ticket was requested.
  • Event ID 4771 Kerberos pre-authentication failed.
  • 0xC000006A The account exists and the password was wrong. One event is a typo; many against one account is brute force; one source failing across many real accounts is password spraying.
  • 0xC0000064 Someone tried to log on with an account name that does not exist. Occasional typos are normal; bursts of invented names from one source are username guessing or spraying with a generic list.
  • 0xC000006D The logon was rejected as invalid without saying which half was wrong — it is the general failure result that event 4625 usually carries in Status, with the real reason in Sub Status.
  • 0xC0000234 The account is locked because the lockout threshold was reached; every further attempt fails with this code until the lockout ends or an administrator unlocks it.

Detect it

MITRE ATT&CK: T1110T1110.001T1110.003T1078

Frequently Asked Questions

Why does event 4776 have no IP address or logon type?
Microsoft documents only four data fields for this event, and the single origin detail is the computer name in Source Workstation — "Information about the destination computer (SERVER-1) isn't presented in this event" either. For the client IP, the logon type and the server that was accessed, pivot to event 4624 or 4625 on the destination machine around the same timestamp.
Does a success (Error Code 0x0) mean someone got in?
It means the authoritative computer validated the NTLM credentials — the password was right. Whether a session was actually created, on which host and by what route is recorded by event 4624 on the computer that was accessed, so confirm there before calling it a successful logon, and check what the session did next.
Why do I see 4776 for accounts ending in $, or named "Local"?
Microsoft states the Logon Account "Can be user name, computer account name or well-known security principal account name", and gives WIN81$, Local and Local Service as examples. Computer-account and well-known-principal validations are normal background traffic; judge them by the Source Workstation and the Error Code rather than the name alone.
When does a domain controller log 4776 instead of Kerberos events?
4776 is written only when credential validation uses NTLM; Kerberos ticket requests appear as events 4768, 4769 and 4771 instead. Microsoft also notes that local logon always uses NTLM when an account logs on to a device where its user account is stored, so local-account activity shows up here on that device.

Find every 4776 in your own logs

Load a Windows Security event export into the free browser analyzer to group events by account, source address and status, with password spraying, brute force and lockout storms flagged. Nothing is uploaded.