Skip to main content
4776SecurityAccount LogonSecurity tier 1

Event ID 4776: The computer attempted to validate the credentials for an account

Event ID 4776 is the Windows Security log entry written every time a computer validates an account's credentials over NTLM, under the Audit Credential Validation subcategory. It fires on the machine that owns the account (the domain controller for domain accounts, the local box for local accounts) and reports success or failure through its Error Code field.

What Triggers Event 4776

Event ID 4776 belongs to the Audit Credential Validation subcategory of the Account Logon category, and it is generated every time a credential validation happens through NTLM authentication. The provider is Microsoft-Windows-Security-Auditing, the channel is Security, and the event has existed in this shape since Windows Server 2008 and Vista (event version 0, no later revisions). You need the subcategory enabled for both Success and Failure to get the full picture, and most environments that audit account logon at all already have it on.

The event is deliberately thin. It carries four data values: the authentication package (always MICROSOFT_AUTHENTICATION_PACKAGE_V1_0, so it is a constant rather than a signal), the Logon Account whose credentials were checked, the Source Workstation the request claims to have come from, and the Error Code. Success events carry 0x0. Anything else is a failure and the hex value tells you why.

A few generation rules from Microsoft's own documentation shape how you read volume. The event also fires on workstation unlock, because unlocking a session re-validates the cached credential over NTLM. It does not fire when a domain account logs on locally at a domain controller console. And it only covers NTLM: a Kerberos logon leaves no 4776 behind at all, which is why a domain that has moved most traffic to Kerberos still sees a steady trickle of these events from the corners that have not.

Those corners are predictable. Local account logons always use NTLM, since there is no Kerberos realm for a local SAM account. Anything that authenticates by IP address instead of hostname falls back to NTLM because there is no SPN to request a ticket for. Old SMB clients, some network appliances, printers, RADIUS front-ends, and applications that were coded against LogonUser with a plaintext credential all end up here. Every one of those paths produces a 4776 on the authoritative machine, and that inventory of "who still talks NTLM" is itself a finding worth keeping.

Event 4776 Fields

FieldWhat it tells youSimulated value
PackageNameAuthentication Package in the rendered event. Always MICROSOFT_AUTHENTICATION_PACKAGE_V1_0 for 4776, so it carries no signal on its own.MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
TargetUserNameLogon Account in the rendered event: the account whose credentials were validated. Can be a user, a computer account (WIN81$), or a well-known principal such as Local Service.j.smith
WorkstationSource Workstation in the rendered event: the computer name the logon attempt claims to have originated from. Client-supplied and unverified; can be empty.WS-SIM-001
StatusError Code in the rendered event. 0x0 on success; a non-zero NTSTATUS value (0xC000006A, 0xC0000234, etc.) on failure.0x0
ComputerThe machine that wrote the event, which is the computer authoritative for the account: a domain controller for domain accounts, the local host for local accounts.WS-SIM-001.corp.socsimulator.example

Decode Event 4776 Codes

Click a code to see what it means during triage and when it points at something worth escalating.

Example Event 4776 Log

A representative Security entry for Event 4776, generated deterministically by our telemetry engine so every field holds a realistic, internally consistent value.

Simulated example generated by SOCSimulator Research
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-Security-Auditing" />
    <EventID>4776</EventID>
    <Version>0</Version>
    <Level>0</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8020000000000000</Keywords>
    <TimeCreated SystemTime="2025-08-27T20:22:28.000Z" />
    <EventRecordID>276471</EventRecordID>
    <Channel>Security</Channel>
    <Computer>WS-SIM-001.corp.socsimulator.example</Computer>
    <Security />
  </System>
  <EventData>
    <Data Name="PackageName">MICROSOFT_AUTHENTICATION_PACKAGE_V1_0</Data>
    <Data Name="TargetUserName">j.smith</Data>
    <Data Name="Workstation">WS-SIM-001</Data>
    <Data Name="Status">0x0</Data>
    <Data Name="Computer">WS-SIM-001.corp.socsimulator.example</Data>
  </EventData>
</Event>

Detecting Event 4776

Password spray: many accounts, one Source Workstation, bad password

Lucene is the base filter; aggregate distinct TargetUserName by Workstation in Kibana or your SIEM. Splunk field names follow the Windows TA (Logon_Account, Source_Workstation, Error_Code).

index=wineventlog EventCode=4776 Error_Code=0xC000006A
| bucket _time span=10m
| stats dc(Logon_Account) as sprayed_accounts values(Logon_Account) as accounts count as attempts by _time, Source_Workstation
| where sprayed_accounts >= 10
| sort - sprayed_accounts

Repeated bad passwords against a single privileged account

Feed the privileged list from a lookup or watchlist; the threshold of 5 in 15 minutes is a starting point, tune to your lockout policy.

index=wineventlog EventCode=4776 Error_Code=0xC000006A
| lookup privileged_accounts.csv Account_Name AS Logon_Account OUTPUT is_privileged
| where is_privileged="true"
| bucket _time span=15m
| stats count as bad_passwords values(Source_Workstation) as sources by _time, Logon_Account
| where bad_passwords >= 5

NTLM validation from an unknown or empty Source Workstation

Compare Workstation against your asset inventory. Empty values are common from non-Windows clients, so review by account rather than alerting on empty alone.

index=wineventlog EventCode=4776
| eval Source_Workstation=coalesce(Source_Workstation, "<empty>")
| lookup asset_inventory.csv hostname AS Source_Workstation OUTPUT owner
| where isnull(owner)
| stats count as attempts dc(Logon_Account) as accounts values(Error_Code) as codes by Source_Workstation, host
| sort - attempts

Legacy NTLM hunt: successful 4776 for accounts that should be Kerberos-only

Successful events only (Status 0x0). Target tier-0 admins and service accounts with SPNs; a 30-day baseline turns one-off hits into a downgrade or hash-use lead.

index=wineventlog EventCode=4776 Error_Code=0x0 earliest=-30d
| lookup kerberos_only_accounts.csv Account_Name AS Logon_Account OUTPUT expected_auth
| where expected_auth="kerberos"
| stats count as ntlm_successes dc(Source_Workstation) as distinct_sources values(Source_Workstation) as sources earliest(_time) as first_seen latest(_time) as last_seen by Logon_Account
| sort - ntlm_successes

Lockout precursor: bad-password run that ends in 0xC0000234 or a 4740

SecurityEvent maps both the 4776 Source Workstation and the 4740 Caller Computer Name onto WorkstationName, so one column carries the origin for both events. The SPL twin has to coalesce two field names because the Splunk add-on keeps them apart. Status casing varies by connector, hence tolower().

index=wineventlog (EventCode=4776 OR EventCode=4740)
| eval account=coalesce(Logon_Account, Account_Name), source=coalesce(Source_Workstation, Caller_Computer_Name)
| transaction account maxspan=30m startswith=(EventCode=4776 Error_Code=0xC000006A) endswith=(EventCode=4740 OR Error_Code=0xC0000234)
| where eventcount >= 3
| table _time, account, eventcount, duration, source

Why It Is the NTLM Path, and How It Differs from 4768, 4771 and 4625

Windows records domain authentication on two separate rails. Kerberos authentication is logged on the domain controller as 4768 (a ticket-granting ticket was requested; success or failure with a Kerberos result code) and 4771 (Kerberos pre-authentication failed, which is the Kerberos analogue of a bad password). NTLM authentication is logged as 4776. An account will land on one rail or the other depending on how the client negotiated, never both for the same attempt.

The practical difference is where the useful fields live. 4768 and 4771 carry a Client Address, an IP the DC saw on the wire, plus ticket options and encryption type. 4776 carries only a workstation name that the client supplied in its NTLM AUTHENTICATE message. There is no IP address in 4776. If you need an address for an NTLM attempt, you have to pull it from the 4624 or 4625 on the destination server, where LogonType 3 and AuthenticationPackageName NTLM will match up with the 4776 by account name and timestamp.

That brings up the relationship with 4625. Event 4625 is written by the machine where the logon session was attempted, and it describes the session: logon type, source IP and port, logon process, and a Status/SubStatus pair. Event 4776 is written by the machine that holds the account's password hash, and it describes the credential check. When a user types a wrong domain password into a member server over NTLM, the server writes a 4625 and the domain controller writes a 4776, both for the same failed attempt, each carrying part of the story. When the failing logon is a local account on a workstation, both events land on that same workstation. Neither one is a substitute for the other, and Microsoft explicitly recommends 4624 over 4776 for monitoring local account logons because 4624 has more context.

Where the Event Lands

This is the rule that decides whether your SIEM sees the event at all. Event 4776 is generated only on the computer that is authoritative for the credentials being validated. For a domain account, that is a domain controller. For a local account, that is the workstation or member server whose SAM database holds the account.

For domain accounts the mechanics run through NTLM pass-through authentication. The member server that received the NTLM handshake cannot verify the response itself, so it forwards the challenge and response to a domain controller over its Netlogon secure channel. The DC does the validation and writes the 4776. The member server writes nothing under this event ID, only its own 4624 or 4625. Any DC that holds a secure channel with that server can answer the request, so a single account's NTLM history is spread across every domain controller in the site, and collection has to cover all of them rather than the PDC emulator alone.

For local accounts the event stays on the box. A local administrator logging into a workstation, or an attacker trying local admin passwords against a file server over SMB, produces 4776 on that workstation or file server. If you only forward domain controller logs, you will see none of that, and local account attacks are exactly where NTLM is guaranteed to be in play.

The destination of the authentication is never recorded. Microsoft's example is precise about this: authenticate from CLIENT-1 to SERVER-1 with a domain account and the DC logs Source Workstation CLIENT-1 with no mention of SERVER-1. The target has to be reconstructed from the destination host's own logon events.

The Error Code Table

Every failure carries an NTSTATUS value in Error Code. The codes below are the ones Microsoft documents for this event, and they are the same values that appear as SubStatus in 4625, so an analyst who knows one table knows both.

Error CodeMeaning
0x0No errors, successful validation
0xC0000064The username you typed does not exist (bad username)
0xC000006AAccount logon with misspelled or bad password
0xC000006DGeneric logon failure: bad credentials, or a LAN Manager Authentication Level mismatch between source and target
0xC000006FAccount logon outside authorized hours
0xC0000070Account logon from unauthorized workstation
0xC0000071Account logon with expired password
0xC0000072Account logon to account disabled by administrator
0xC0000193Account logon with expired account
0xC0000224Account logon with "Change Password at Next Logon" flagged
0xC0000234Account logon with account locked
0xC0000371The local account store does not contain secret material for the specified account

For triage the codes fall into three groups. 0xC000006A and 0xC0000234 are the guessing codes: bad password and, once the threshold is crossed, locked account. Their count and their distribution across accounts is what separates a spray from a typo. 0xC0000064 is the enumeration code: a name that does not exist means someone is testing usernames, and a burst of distinct nonexistent names from one workstation is a wordlist being run. The policy-block codes (0xC000006F, 0xC0000070, 0xC0000072, 0xC0000193) mean the password may well have been right but a control stopped the logon; a disabled or expired account that suddenly produces these from a new source is a stronger signal than any single bad password, because someone has a credential they should not have.

0xC000006D deserves a note of its own. It is generic, and in practice it frequently means an NTLM version mismatch (a client offering LM or NTLMv1 to a target that requires NTLMv2) rather than a wrong password. A cluster of 0xC000006D from one old appliance is a hardening ticket, not an incident.

Source Workstation: The Pivot, and Its Limits

Source Workstation is the only outward-pointing field in the event, so every hunt built on 4776 groups by it. The value is a NetBIOS-style computer name, which is convenient when it resolves to a known asset and useless when it does not.

Two limits matter. First, the value is supplied by the client inside the NTLM AUTHENTICATE message. The domain controller does not verify it. Attack tooling can send an empty string, a random name, or the name of a legitimate host it wants to hide behind. Empty Source Workstation is also common in legitimate traffic from non-Windows clients (Linux SMB stacks, network devices, some VPN concentrators) that simply do not populate the field. Empty is therefore not malicious by itself, but a workstation name that does not exist in your asset inventory, or one that changes between attempts against the same account, is worth pulling on.

Second, the field is a name, not an address. Resolving it means matching against the destination host's 4624/4625 (which carries the IP), against DHCP leases, or against your EDR's device inventory. Treat it as a lead that needs corroboration, never as attribution on its own.

True Positive vs False Positive

The benign shapes repeat. Cached credentials on a phone, a mapped drive, or a service after a password rotation produce a slow, regular drip of 0xC000006A for one account from one workstation until someone updates the stored secret. Workstation unlocks produce steady successful 4776s for an account against its own machine. Legacy applications that authenticate by IP produce successful 4776s that look like NTLM downgrade but are simply the application being old. An appliance with the wrong LAN Manager level produces 0xC000006D at fixed intervals forever.

The malicious shapes differ in distribution rather than raw count. Many distinct Logon Account values with 0xC000006A from one Source Workstation inside a short window is a spray. Many 0xC0000064 values from one source is enumeration, often the reconnaissance step before the spray. A single privileged account with repeated 0xC000006A from a workstation that has never authenticated as that account before is targeted guessing. A successful 4776 (0x0) for a tier-0 admin account whose policy says Kerberos-only, from a workstation outside the admin tier, is either a policy gap or credential use by someone who only has the hash; both need a look. And a failure code that says disabled or expired, arriving from a fresh source, means the attacker had a real password and simply arrived too late.

One more pattern worth calling out is 4776 on a member server or workstation where the Logon Account is a local account and Source Workstation is not that same machine. Microsoft's guidance flags exactly this: a local account that should only be used locally, being validated from somewhere else, is lateral movement with a local admin credential until proven otherwise.

A Realistic Triage Scenario

A mid-shift alert fires from a correlation rule: 47 distinct accounts, one Source Workstation named FS-SCAN02, all 0xC000006A, inside eleven minutes, on two of the site's three domain controllers. The analyst pulls the raw events and notes that the account list is alphabetical, that each account got exactly one attempt, and that three of the 47 returned 0xC0000234 instead of 0xC000006A, meaning they were already locked from a previous round.

FS-SCAN02 exists in the asset inventory as a vulnerability scanner appliance. That is a plausible benign source: scanners do authenticate to many hosts. But the scanner's authenticated scans use a dedicated service account, not 47 user accounts, and the scan schedule shows nothing running. The analyst pivots to the destination side and searches 4625 across member servers for the same eleven minutes with AuthenticationPackageName NTLM. The events show up on a single file server, LogonType 3, with an IpAddress that does not belong to FS-SCAN02's known interface. The workstation name was spoofed.

That flips the verdict. The IP belongs to a contractor VLAN. EDR shows an interactive session on that host running a Python process with the SMB library loaded. The case moves to containment with the hostname, the IP, the account list, and the 4776 timestamps as the evidence chain. The three already-locked accounts get a 4740 check to confirm the earlier round, and the correlation rule that caught it gets a note: the Source Workstation field named a real asset and was still wrong.

MITRE ATT&CK® Techniques

Event 4776 telemetry feeds detections for these ATT&CK® techniques:

Practice Investigating Event 4776

Reading about the computer attempted to validate the credentials for an account is one thing. Working the detection inside a live console is another. These free SOCSimulator operations cover the attack techniques Event 4776 helps you detect:

Account Takeover: Impossible-Travel Sign-In

Account Takeover: Impossible-Travel Sign-In

A finance analyst's Microsoft Entra account is accessed without MFA from Moldova 18 minutes after their normal London sign-in. Impossible travel confirmed. The unauthorized session reads the inbox via Graph and adds an external recovery address. Work the Entra audit trail to identify the attacker IP, the compromised mailbox, and the persistence mechanism.

25m·256 tasks
View Operation
Credential Harvesting: The Lookalike Login

Credential Harvesting: The Lookalike Login

Investigate an adversary-in-the-middle (AiTM) credential phishing campaign that lured an employee to a lookalike Microsoft 365 login page. Working entirely from SIEM logs, you will identify the lookalike domain, reconstruct the multi-hop redirect chain through a compromised legitimate site, uncover a secondary phishing wave against another employee, and confirm account takeover in Azure AD sign-in logs via impossible travel and session-token replay. You finish by choosing the containment action that actually evicts an attacker holding a valid session token. Foundational skills for SOC analysts in lookalike-domain analysis and identity-centric incident response.

20m·257 tasks
View Operation
VPN Brute Force: Credential Attack on the Remote-Access Portal

VPN Brute Force: Credential Attack on the Remote-Access Portal

A password-spray campaign targets the Halcyon Freight SSL-VPN portal from two rotating source IPs, submitting credentials across many accounts to stay under per-account lockout thresholds. One account eventually matches. Reconstruct the spray, identify the compromised account and the operator IP that opened the active session, and trace the first move the attacker made over the tunnel.

25m·256 tasks
View Operation
Start investigating free

Frequently Asked Questions

What is event ID 4776?
It is the Security log event written when a computer validates an account's credentials over NTLM. It fires on the authoritative machine for the account (a domain controller for domain accounts, the local computer for local accounts), lists the Logon Account and the Source Workstation, and reports success as Error Code 0x0 or failure as a non-zero NTSTATUS value.
What is the difference between event 4776 and 4625?
4625 is written by the machine where the logon session was attempted and describes the session: logon type, source IP, and Status/SubStatus. 4776 is written by the machine that holds the account's password and describes the NTLM credential check itself, with only a workstation name and an error code. A single failed NTLM logon to a member server usually produces both, one on the server and one on the DC.
Why is Source Workstation blank in event 4776?
The workstation name is supplied by the client in the NTLM AUTHENTICATE message and the domain controller does not verify it. Non-Windows SMB clients, network appliances, and some VPN or RADIUS front-ends leave it empty, and attack tooling can leave it empty or fill it with any name. Recover the real source from the 4624 or 4625 on the destination host, which carries the IP address.
What does error code 0xC000006A mean in event 4776?
0xC000006A is a bad password: the account exists and the NTLM response did not match its stored hash. One or two per account after a password change is stale-credential noise. Many accounts with one 0xC000006A each from a single Source Workstation in a few minutes is a password spray, and repeated hits on one privileged account from an unfamiliar workstation is targeted guessing.
Why am I seeing event 4776 on a workstation and not a domain controller?
Because the account being validated is a local account. 4776 is logged only on the machine that is authoritative for the credential, so local SAM accounts produce it on the workstation or member server that owns them. If the Source Workstation in those events is a different machine, a local account is being used over the network, which Microsoft's monitoring guidance flags as worth investigating.

Sources

“Event description, generation rules (authoritative computer only, workstation unlock, no local DC logon), field descriptions, Error Code table, and Microsoft's security monitoring recommendations for event 4776.”

“Brute Force (T1110) and its password spraying and credential stuffing sub-techniques, the behaviors the 0xC000006A and 0xC0000064 detection queries target.”

“Valid Accounts (T1078), the technique covered by successful NTLM validation of accounts that should be Kerberos-only or of local accounts used over the network.”

“Microsoft Sentinel's SecurityEvent table schema (TargetUserName, WorkstationName, Status, PackageName, Computer), the column names used in the KQL queries on this page.”

Event ID

Event ID 4768 (Kerberos TGT): 0x6, 0x12 Codes & Queries

Event ID 4768 is the Kerberos TGT request. Result codes 0x6, 0x12, 0x17, 0x25, pre-auth type 0 (AS-REP roasting), why 0x…

Read more
Event ID

Event ID 4769: Kerberos Service Ticket, Codes & Queries

Event ID 4769 explained for Kerberoasting detection: Service Name, ticket encryption type 0x17 vs 0x12, failure codes, a…

Read more
Event ID

Event ID 4771: Kerberos Pre-Authentication Failed & How to Detect It

Event ID 4771 fires when a domain controller refuses a Kerberos TGT request. Learn the Status failure codes, spot passwo…

Read more
Glossary

What is Brute Force Attack? SOC Glossary

A brute force attack is password guessing at scale: a tool submits candidate passwords, or encryption keys, until one wo…

Read more
Glossary

What is MFA? SOC Glossary

MFA (multi-factor authentication) is a sign-in check that asks for two or more different kinds of proof before granting …

Read more
Glossary

What is SIEM? SOC Glossary

Security Information and Event Management (SIEM) is a platform that aggregates, normalizes, and correlates log data from…

Read more
Glossary

What is Alert Triage? SOC Glossary

Alert triage is how a SOC sorts each alert: a Tier 1 analyst checks its context and severity, then calls it a true, fals…

Read more
Career Path

SOC Analyst (Tier 1) Career Guide: Salary & Skills

Tier 1 SOC Analysts are the front line. You monitor alert queues, triage incoming detections, classify them as true or f…

Read more
Career Path

SOC Analyst (Tier 2) Career Guide: Salary & Skills

Tier 2 SOC Analysts handle the investigations that Tier 1 escalates. You dig into multi-stage attacks, coordinate contai…

Read more
Technique

Brute Force (T1110): Detection Training

Brute Force covers any guess-driven path to credentials: classic password guessing, password spraying a few common passw…

Read more
Technique

Valid Accounts (T1078): Detection Training

Valid Accounts is among the hardest abuses to spot because nothing is technically broken, the adversary simply authentic…

Read more
Comparison

SOCSimulator vs. LetsDefend: Platform Comparison

SOCSimulator wins on operational realism. You get multi-tool shift simulation with SLA pressure, noise injection, and al…

Read more