Event ID 4768 Windows Security log

Event ID 4768: Kerberos TGT Requested — Who Authenticated, From Where

Published

A domain controller was asked for a Kerberos ticket-granting ticket — the event names the account, the client address the request came from, and whether the KDC issued the ticket or refused it with a result code.

Logged on: Domain controllers only — Microsoft states "This event generates only on domain controllers" and lists Active Directory domain controller as the required server role.

Microsoft's title

4768(S,F): A Kerberos authentication ticket (TGT) was requested.

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

Fields that matter in an investigation

FieldXML / SentinelWhat it tells you
Account Name TargetUserName The account the TGT was requested for — the identity being authenticated. Computer account names end with a $ character.
Supplied Realm Name TargetDomainName The Kerberos realm the account belongs to; Microsoft notes it can appear as a NETBIOS name, a lowercase full domain name or an uppercase full domain name, so normalise before grouping.
User ID TargetSid SID of the account the ticket was requested for; Microsoft documents NULL SID as the value shown in 4768 Failure events, so a resolved SID here means the request reached a real account.
Service Name ServiceName The service the request was sent to — typically krbtgt for TGT requests, and typically the format krbtgt/REALM_NAME in failure events.
Client Address IpAddress IP address of the computer from which the TGT request was received; formats include IPv4, IPv6, ::ffff:IPv4_address and ::1 for localhost.
Client Port IpPort Source port of the client connection that carried the TGT request; 0 for local (localhost) requests.
Result Code Status Hexadecimal result of the TGT issue operation. 0x0 (KDC_ERR_NONE) is success; anything else is a failure, for example 0x6 when the username doesn't exist.
Ticket Options TicketOptions Hexadecimal set of Kerberos ticket flags — Microsoft's example 0x40810010 decodes to Forwardable, Renewable, Canonicalize, Renewable-ok.
Ticket Encryption Type TicketEncryptionType Encryption type of the ticket involved in the request; Microsoft's encryption-type table maps 0x12 to AES256-CTS-HMAC-SHA1-96.

What it records

Event 4768 is the Kerberos authentication service writing down a ticket-granting ticket request. Microsoft’s description is blunt about scope: “This event generates every time Key Distribution Center issues a Kerberos Ticket Granting Ticket (TGT)” and “This event generates only on domain controllers.” It belongs to the Audit Kerberos Authentication Service subcategory, and the required server role is Active Directory domain controller.

Success and failure share the event ID. The deciding field is Result Code: “If TGT issue fails then you will see Failure event with Result Code field not equal to ‘0x0’.” Microsoft’s table starts at 0x0 (KDC_ERR_NONE, no error) and runs through 0x6 KDC_ERR_C_PRINCIPAL_UNKNOWN, “Client not found in Kerberos database”, whose documented cause is “The username doesn’t exist”, 0x7 for an unknown server principal and 0x8 for duplicate principal entries.

There is one gap you have to know about: “This event doesn’t generate for Result Codes: 0x10 and 0x18. Event ‘4771: Kerberos pre-authentication failed.’ generates instead.” So the classic wrong-password Kerberos failure, 0x18, never appears here — look for it in 4771. Account-state refusals such as 0x12 and 0x17 are not excluded, so they can surface as 4768 failures.

Around the result code sit the identity and network fields: Account Name, Supplied Realm Name, User ID, Service Name (normally krbtgt, and typically krbtgt/REALM_NAME on failures), Client Address and Client Port. Ticket Options is a hexadecimal flag set — Microsoft decodes 0x40810010 as Forwardable, Renewable, Canonicalize, Renewable-ok. Certificate-based requests populate Certificate Issuer Name, Certificate Serial Number and Certificate Thumbprint; Microsoft’s older sample shows them filled in with issuer contoso-DC01-CA-1, while the current sample leaves them empty.

Microsoft also notes an update: “Windows Server 2016 and later OSs will display an updated version of Event 4768 after getting the January 14th, 2025 or later Security Cumulative Update.” The updated version adds encryption-type detail — MSDS-SupportedEncryptionTypes and Available Keys for the account, the service and the domain controller, plus Advertized Etypes and a Response ticket hash.

When it matters

PatternReading
Many failures with Result Code 0x6 from one Client AddressNames that do not exist — account enumeration, the Kerberos cousin of 0xC0000064
Failures with 0x12 for one accountThe account itself is barred from logging on
Failures with 0x17 on a service accountPassword expired on an identity that should have been rotated under control
No 4768 failures but a run of 4771Pre-authentication failures (0x18 / 0x10) by design go to 4771
A successful 4768 for a sensitive account from a Client Address it has never usedA TGT was issued to someone at a new location — check the 4624 on the destination
Successful 4768 immediately after a burst of 4771 for the same accountA guessed password that finally worked

How to investigate

Start on the domain controllers with failed TGT requests grouped by source, because one client address touching many account names is the enumeration and spraying shape:

SecurityEvent
| where TimeGenerated > ago(24h)
| where EventID == 4768
| where Status !~ "0x0"
| extend ClientIp = replace_string(IpAddress, "::ffff:", "")
| summarize Failures = count(), Accounts = dcount(TargetUserName),
            AccountList = make_set(TargetUserName, 20), Codes = make_set(Status, 10),
            FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated)
    by ClientIp, Computer
| order by Accounts desc, Failures desc

Then ask the question that changes severity — did any of those sources get a ticket afterwards?

let badReq = SecurityEvent
    | where TimeGenerated > ago(24h) and EventID == 4768 and Status !~ "0x0"
    | extend ClientIp = replace_string(IpAddress, "::ffff:", "")
    | summarize Failures = count(), LastFail = max(TimeGenerated) by ClientIp, TargetUserName;
SecurityEvent
| where TimeGenerated > ago(24h) and EventID == 4768 and Status =~ "0x0"
| extend ClientIp = replace_string(IpAddress, "::ffff:", "")
| join kind=inner badReq on ClientIp, TargetUserName
| where TimeGenerated > LastFail
| project TimeGenerated, Computer, TargetUserName, TargetDomainName, ClientIp, IpPort,
          ServiceName, TargetSid, Failures
| order by TimeGenerated asc

Novelty is the cheapest anomaly on this event — an account that has never requested a TGT from this address before:

let seen = SecurityEvent
    | where TimeGenerated between (ago(30d) .. ago(1d))
    | where EventID == 4768
    | extend ClientIp = replace_string(IpAddress, "::ffff:", "")
    | distinct TargetUserName, ClientIp;
SecurityEvent
| where TimeGenerated > ago(1d) and EventID == 4768 and Status =~ "0x0"
| extend ClientIp = replace_string(IpAddress, "::ffff:", "")
| join kind=leftanti seen on TargetUserName, ClientIp
| project TimeGenerated, Computer, TargetUserName, TargetDomainName, ClientIp, ServiceName
| order by TimeGenerated asc

Note the limits of the table: PreAuthType, TicketOptions and TicketEncryptionType live only in the event XML, not as SecurityEvent columns, so read those from the raw event on the DC.

From a hit, pivot outward. 4771 on the same DC covers the pre-authentication failures this event omits, 4776 covers NTLM credential validation, 4740 tells you if the account locked out, and 4769 shows which services the resulting TGT was then used to request tickets for. On the destination host, 4624 shows the session the ticket produced and 4672 whether it carried administrator privileges. If the failures look like spraying, the Windows 4625 password-spray rule covers the same grouping on the logon-failure side. Without a SIEM, export the DC 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 4672 Special privileges assigned to new logon.
  • Event ID 4740 A user account was locked out.
  • Event ID 4769 A Kerberos service ticket was requested.
  • Event ID 4771 Kerberos pre-authentication failed.
  • Event ID 4776 The computer attempted to validate the credentials for an account.
  • 0x6 The domain controller could not find the requested account in its database — the name does not exist, and a run of these from one source is account enumeration.
  • 0x12 The domain controller refused the ticket request because the account itself is barred from logging on — Microsoft's examples are an account that is disabled, expired or locked out — rather than because of anything about the password.
  • 0x17 The domain controller refused the ticket request because the account's password has expired and has to be changed before Kerberos will issue a ticket — routine for people, but a problem worth chasing when it hits service accounts or comes from an address you do not recognise.
  • 0x18 The domain controller rejected the pre-authentication data sent with a ticket request — Microsoft's listed cause is that the wrong password was provided; repeated 0x18 events for one account are a brute-force indicator.
  • 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.

Detect it

MITRE ATT&CK: T1110T1110.003T1078T1558

Frequently Asked Questions

Why do I see no 4768 for an account that is failing with a bad password?
Because Microsoft routes two result codes to a different event. The documentation states "This event doesn't generate for Result Codes: 0x10 and 0x18. Event '4771: Kerberos pre-authentication failed.' generates instead." Wrong-password pre-authentication failures therefore show up as 4771 with Status 0x18, not as a 4768 failure.
Why is User ID shown as a NULL SID?
Microsoft documents NULL SID as the value that "shows in 4768 Failure events" for both User ID and Service ID. If the request failed before the KDC resolved the principal, there is no SID to log, so pivot on Account Name, Supplied Realm Name and Client Address instead of on the SID.
Will 4768 appear on the member server the user connected to?
No. The documentation says the event generates only on domain controllers, and the required server role is Active Directory domain controller. The session created on the target machine is recorded there as 4624; use the account name, time and client address to line the two up.
Why does Client Address look like "::ffff:10.0.0.12"?
Microsoft lists "::ffff:IPv4_address" as one of the documented formats for Client Address, alongside plain IPv4, IPv6 and ::1 for localhost. In Log Analytics the SecurityEvent IpAddress column carries the same string, so strip the ::ffff: prefix before comparing against IPv4 values or joining to other tables.

Find every 4768 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.