Skip to main content
4768SecurityAccount LogonSecurity tier 1

Event ID 4768: A Kerberos authentication ticket (TGT) was requested

Event ID 4768 records a Kerberos TGT request, the first authentication step of any domain logon. Only domain controllers write it, which makes it the authoritative record of where a logon began even when the client is not onboarded. Read the Result Code, the Pre-Authentication Type and the Client Address together.

Event 4768 Fields

FieldWhat it tells youSimulated value
TargetUserNameThe account for which the TGT was requested. Computer accounts end with a $ character.a.chen
TargetDomainNameThe Kerberos realm the client claimed for the account; arrives as NETBIOS name, lowercase or uppercase FQDN depending on the client.corp.socsimulator.example
TargetSidSID of the account for which the TGT was requested. Shows NULL SID in failure events.S-1-5-21-424242-603855
ServiceNameThe service the request was sent to; krbtgt for TGT requests, krbtgt/REALM in failure events.krbtgt
ServiceSidSID of the krbtgt service account, the built-in S-1-5-21-DOMAIN-502 principal. NULL SID in failure events.S-1-5-21-424242-502
IpAddressIP address the TGT request was received from. Formats: IPv4 or IPv6, IPv4-mapped ::ffff:a.b.c.d, or ::1 for local requests on the DC.::ffff:198.51.100.202
IpPortSource port of the client connection; 0 for local requests. Values between 1 and 1023 indicate a well-known port was used as source.42248
TicketOptionsRequested ticket flags in hex; 0x40810010 (Forwardable, Renewable, Canonicalize, Renewable-ok) is the common Windows client value.0x40810010
StatusHex result of the TGT issue operation; 0x0 on success, otherwise a Kerberos error code such as 0x6, 0x12 or 0x25.0x0
TicketEncryptionTypeCipher suite of the issued TGT; 0x12 (AES256) and 0x11 (AES128) expected, 0x17 is RC4, 0xFFFFFFFF appears in failure events.0x12
PreAuthTypeNumeric pre-authentication type used in the request; 2 is the normal encrypted timestamp, 0 means no pre-authentication, 15 to 17 are smart card, 138 is Kerberos Armoring.15
CertIssuerNameCertification authority that issued the smart card certificate; populated only for PKINIT logons.corp-DC01-CA-1
CertSerialNumberSerial number of the smart card certificate used for the request, when applicable.89C4302399EDC704BCB9C89416589F705F4DAB
CertThumbprintThumbprint of the smart card certificate used for the request, when applicable.78201D21D25F2509A9895008B085B17E768B9A13

Decode Event 4768 Codes

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

Example Event 4768 Log

A representative Security entry for Event 4768, 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>4768</EventID>
    <Version>0</Version>
    <Level>0</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8020000000000000</Keywords>
    <TimeCreated SystemTime="2025-10-26T19:56:11.000Z" />
    <EventRecordID>567777</EventRecordID>
    <Channel>Security</Channel>
    <Computer>WS-SIM-001.corp.socsimulator.example</Computer>
    <Security />
  </System>
  <EventData>
    <Data Name="TargetUserName">a.chen</Data>
    <Data Name="TargetDomainName">corp.socsimulator.example</Data>
    <Data Name="TargetSid">S-1-5-21-424242-603855</Data>
    <Data Name="ServiceName">krbtgt</Data>
    <Data Name="ServiceSid">S-1-5-21-424242-502</Data>
    <Data Name="IpAddress">::ffff:198.51.100.202</Data>
    <Data Name="IpPort">42248</Data>
    <Data Name="TicketOptions">0x40810010</Data>
    <Data Name="Status">0x0</Data>
    <Data Name="TicketEncryptionType">0x12</Data>
    <Data Name="PreAuthType">15</Data>
    <Data Name="CertIssuerName">corp-DC01-CA-1</Data>
    <Data Name="CertSerialNumber">89C4302399EDC704BCB9C89416589F705F4DAB</Data>
    <Data Name="CertThumbprint">78201D21D25F2509A9895008B085B17E768B9A13</Data>
  </EventData>
</Event>

Detecting Event 4768

TGT requested without pre-authentication (AS-REP roasting in progress)

Successful requests with Pre-Authentication Type 0. Join against your list of accounts with the no-preauth flag; any account not on it, or any Client Address that is not the legacy system the flag was set for, is the finding. Lucene is the base filter; sort and enrich in Kibana.

index=wineventlog EventCode=4768 Pre_Authentication_Type=0 Result_Code=0x0
| rex field=Client_Address "^(::ffff:)?(?<src_ip>[0-9a-fA-F:.]+)$"
| stats count min(_time) as first_seen max(_time) as last_seen values(src_ip) as sources by Account_Name
| lookup no_preauth_accounts.csv Account_Name OUTPUT expected_source
| where isnull(expected_source) OR mvcount(sources) > 1 OR NOT match(sources, expected_source)

One client address requesting TGTs for many distinct accounts (enumeration or spray)

Counts distinct Account Name values per normalized source in a short window, keeping the 0x6 versus 0x0 split so you can see enumeration turn into validated logons. Exclude your DCs and monitoring probes before tuning the threshold. Lucene is the base filter; aggregate in your SIEM.

index=wineventlog EventCode=4768
| rex field=Client_Address "^(::ffff:)?(?<src_ip>[0-9a-fA-F:.]+)$"
| bucket _time span=10m
| stats dc(Account_Name) as distinct_accounts count(eval(Result_Code="0x6")) as unknown_users count(eval(Result_Code="0x0")) as successes values(Account_Name) as accounts by _time, src_ip
| where distinct_accounts >= 15
| sort - distinct_accounts

Result Code 0x12 clusters that mark a lockout tail

Finds accounts refused as revoked several times from one source in a short window, then pulls the 4771 pre-authentication failures from the same source in the preceding 15 minutes so the guessing phase is on the same screen as the lockout. Lucene is the base filter; run the sequence join in your SIEM.

index=wineventlog (EventCode=4768 Result_Code=0x12) OR (EventCode=4771 Failure_Code=0x18)
| rex field=Client_Address "^(::ffff:)?(?<src_ip>[0-9a-fA-F:.]+)$"
| transaction Account_Name src_ip maxspan=15m startswith=(EventCode=4771) endswith=(EventCode=4768)
| where eventcount >= 5
| table _time, Account_Name, src_ip, eventcount, duration

TGT requests from a client address outside the expected estate

Normalizes Client Address and tests it against the internal ranges. Replace the CIDR list with your own address plan, and expect VPN pools and cloud-hosted DCs to need their own entries. Elastic's source.ip is already normalized, so the Lucene range works without prefix handling.

index=wineventlog EventCode=4768
| rex field=Client_Address "^(::ffff:)?(?<src_ip>[0-9a-fA-F:.]+)$"
| where src_ip!="::1" AND NOT cidrmatch("10.0.0.0/8", src_ip) AND NOT cidrmatch("172.16.0.0/12", src_ip) AND NOT cidrmatch("192.168.0.0/16", src_ip)
| stats count values(Account_Name) as accounts values(Result_Code) as results by src_ip
| sort - count

First-seen account-to-source pairing against a 30-day baseline

Compares today's successful TGT requests with the account-to-address pairs seen in the previous 30 days, scoped to a privileged account list so the output stays reviewable. Lucene cannot express the baseline diff; the query returns the raw pairs for a scheduled aggregation or an ML job.

index=wineventlog EventCode=4768 Result_Code=0x0 earliest=-30d
| rex field=Client_Address "^(::ffff:)?(?<src_ip>[0-9a-fA-F:.]+)$"
| lookup privileged_accounts.csv Account_Name OUTPUT is_privileged
| where is_privileged="true"
| stats min(_time) as first_seen max(_time) as last_seen count by Account_Name, src_ip
| where first_seen >= relative_time(now(), "-1d@d")
| convert ctime(first_seen) ctime(last_seen)

What Triggers Event 4768

Event ID 4768 belongs to the Audit Kerberos Authentication Service subcategory and fires on the domain controller whose KDC answered a Kerberos AS-REQ, the very first message a client sends when it wants a Ticket Granting Ticket. Nothing else produces it. A workstation, a member server, a Linux box joined with SSSD, a Mac bound to the domain: none of them log this event locally, because none of them run a KDC. It generates only on domain controllers, and Microsoft documents it as (S, F): a success audit when the TGT was issued, a failure audit when it was not.

That placement is the whole reason the event matters to a SOC. When a user unlocks a laptop, opens Outlook, or a script authenticates with a service account, the KDC sees the AS exchange whether or not the endpoint ships its own logs anywhere. An estate that has onboarded only its Windows servers still gets a complete record of who requested a TGT, for which realm, from which IP address, because that record is written on DC01, not on the laptop. Onboarding every domain controller (all of them, not just the PDC emulator, since any DC can service the AS exchange) is therefore a precondition for using this event at all. Miss one DC and you have a hole shaped like every client that happens to sit in that DC's site.

The account side is straightforward. Account Name is the principal that asked for the ticket, with computer accounts ending in a dollar sign. Supplied Realm Name is the Kerberos realm the client claimed, which can arrive as CONTOSO, contoso.local, or CONTOSO.LOCAL depending on who sent it. User ID is the SID, and Microsoft notes it shows as NULL SID in failure events, so a null User ID next to a non-zero Result Code is not corruption, it is how a rejected AS-REQ looks. Service Name is almost always krbtgt (or krbtgt/REALM on failures) because the AS exchange is by definition a request to the ticket-granting service. Ticket Options carries the requested flags, with 0x40810010 (Forwardable, Renewable, Canonicalize, Renewable-ok) the dominant value from Windows clients.

Pre-Authentication Type: The Field That Finds AS-REP Roasting

Pre-Authentication Type is the single most useful field on this page and the one general Kerberos references gloss over. Kerberos pre-authentication exists so the KDC can refuse to hand out an encrypted AS-REP to anyone who merely knows a username. Microsoft's table lists the values you will meet in an Active Directory domain:

  • 0: logon without pre-authentication. The client sent no proof of identity and the KDC answered anyway.
  • 2: PA-ENC-TIMESTAMP, an encrypted timestamp. This is the normal type for standard password authentication and should dominate your volume.
  • 15, 16 and 17: PA-PK-AS-REP_OLD, PA-PK-AS-REQ and PA-PK-AS-REP, the smart card and certificate (PKINIT) path.
  • 20: PA-SVR-REFERRAL-INFO, used in KDC referral tickets.
  • 138: PA-ENCRYPTED-CHALLENGE, Kerberos Armoring (FAST), available from Windows Server 2012 DCs and Windows 8 clients.
  • 11 and 19 (PA-ETYPE-INFO, PA-ETYPE-INFO2) are KDC-to-client hints that Microsoft says it has never observed in an AD environment.

Type 0 is the AS-REP roasting signal. An account with the "Do not require Kerberos preauthentication" flag set (UF_DONT_REQUIRE_PREAUTH) lets anyone who can reach a DC request its TGT unauthenticated. The AS-REP that comes back contains material encrypted with the account's password-derived key, which tools like Rubeus, Impacket's GetNPUsers.py and the hashcat 18200 mode crack offline at leisure. The domain controller sees exactly one thing during that attack: a successful 4768, Result Code 0x0, Pre-Authentication Type 0, Client Address set to whichever host ran the tool. No failure, no lockout, no 4771. If your detection logic only watches failures, this technique is invisible to it.

Microsoft's own monitoring recommendation is blunt: all accounts should use pre-authentication, and a value of 0 should be investigated. The operational refinement is to combine the field with the account's real flag state. A type 0 request for an account that genuinely has pre-authentication disabled is the attack in progress or a legacy application doing something it should not; a type 0 request for an account that does not have the flag should not be possible and points at a misread or an unusual client. Either way, the list of accounts carrying that flag should be short enough to know by name, and every 4768 with type 0 against one of them deserves a ticket.

Two other Pre-Authentication Type checks are cheap and worth running. Where smart cards are mandatory, a value that is not 15 (or 16 and 17) for those accounts means the policy is being bypassed with a password. Where Kerberos Armoring is enforced domain-wide, anything other than 138 is a client outside the policy.

Result Codes and What They Mean During Triage

Result Code is 0x0 when the TGT was issued. Anything else is a failure audit, and the codes you will actually see in an AS exchange are a short list:

  • 0x6, KDC_ERR_C_PRINCIPAL_UNKNOWN: the username does not exist in the Kerberos database. One of these is a typo. Dozens from one Client Address in a few minutes is account enumeration, and Microsoft names it as such.
  • 0x7, KDC_ERR_S_PRINCIPAL_UNKNOWN: the server principal could not be found. Rare on a pure TGT request; usually a naming or SPN problem, not an attacker.
  • 0xC, KDC_ERR_POLICY: a logon restriction on the account blocked the request, typically workstation restrictions, a smart card requirement, or logon hours.
  • 0x12, KDC_ERR_CLIENT_REVOKED: the account is disabled, expired, or locked out. Microsoft describes it as "explicit disabling or other restrictions in place on the account".
  • 0x17, KDC_ERR_KEY_EXPIRED: the password has expired and must be changed.
  • 0x1F, KRB_AP_ERR_BAD_INTEGRITY: an integrity check on a decrypted field failed, which can be network noise or tampering.
  • 0x25, KRB_AP_ERR_SKEW: the client's clock differs from the KDC by more than the "Maximum tolerance for computer clock synchronization" policy, five minutes by default.

The code that trips analysts up is 0x12. It is not a bad-password code. A cluster of 0x12 against one account after a run of pre-authentication failures means the lockout threshold has already been crossed and the KDC is now refusing everything, so the interesting events are the ones just before the cluster started. A steady trickle of 0x12 for a disabled account, every few minutes from the same Client Address, is almost always a scheduled task or a mapped drive nobody cleaned up after offboarding. A 0x12 for an account that should be enabled and is not locked out is worth a call to the identity team, because something changed the account state.

0x25 is operational until it is not. A single host drifting past the skew tolerance produces a burst of 0x25 for every user on it until w32time catches up. A 0x25 from a Client Address that has never authenticated before, against several accounts, can be a tool with the wrong clock, which is a useful tell precisely because attackers rarely bother to sync time on a foothold.

Why 4768 and 4771 Split the Failure Story

The most common failure of all, the wrong password, does not appear in this event. Microsoft states that 4768 does not generate for Result Codes 0x10 (PADATA type not supported, the smart card certificate case) and 0x18 (KDC_ERR_PREAUTH_FAILED, wrong password); event 4771, Kerberos pre-authentication failed, is written instead. The logic is that pre-authentication happens before the KDC decides whether to issue a ticket. If the encrypted timestamp does not decrypt, the request never reaches the ticket-issuing step, so the failure is a pre-authentication failure, not a ticket-issue failure.

For a SOC this means brute force against Kerberos is a two-event problem. The guesses land in 4771 with 0x18. The moment the account locks, the same source starts producing 4768 with 0x12, because a locked account is refused before the timestamp is even checked. Any query that counts only 4768 failures will see the lockout tail and miss the guessing; any query that counts only 4771 will see the guessing and miss confirmation that it worked long enough to lock the account. The enumeration phase that precedes both (which usernames exist) lives entirely in 4768 as 0x6, because an unknown principal has no key to pre-authenticate with. Build the timeline across both events, keyed on Client Address.

Client Address and the ::ffff: Gotcha

Client Address is the IP address of the computer from which the TGT request was received. It is the login-origin pivot for this event, and it is populated for every request that crossed the network, which makes it more reliable than the WorkstationName field on endpoint logon events that can be blank or attacker-controlled. Microsoft documents three formats: a plain IPv4 or IPv6 address, an IPv4-mapped IPv6 address of the form ::ffff:10.0.0.12, and ::1 for localhost.

The mapped form is the one that breaks queries. Windows DCs log IPv4 clients as ::ffff:a.b.c.d in the raw event, so a naive IpAddress == "10.0.0.12" filter matches nothing, a CIDR function fed the raw string errors out, and an allow-list join on a clean IPv4 column silently produces zero matches. Normalize the field before you do anything else: strip the ::ffff: prefix in the query (every example below does this), or normalize at ingest. Elastic's Windows Security integration already writes the cleaned value to source.ip, which is why the Lucene queries here prefer that field. Splunk's Windows TA surfaces the raw string as Client_Address; Microsoft Sentinel's SecurityEvent table keeps it as IpAddress.

Two Client Address patterns Microsoft calls out are worth standing rules. Requests where the value is ::1 are local authentication on the DC itself, so any Account Name in that set that is not permitted to log on to domain controllers is a violation. And requests where Client Port is above 0 but below 1024 used a well-known port as the source, which normal Windows clients do not do.

True Positive vs False Positive

The benign floor for 4768 is enormous. Every domain user produces one at the start of the day and again whenever a TGT expires (ten hours by default), every computer account produces them on boot and on service restarts, and every DC produces them for other DCs. Successes with Pre-Authentication Type 2 from a Client Address inside the corporate range are the water the SOC swims in, and no rule should page on them.

What makes a true positive is a combination, never a single field. Pre-Authentication Type 0 on an account known to carry the no-preauth flag, from a Client Address that is a workstation rather than the legacy application server the flag was set for, is a real AS-REP roasting attempt. A single Client Address requesting TGTs for many distinct Account Names inside a short window, with a mix of 0x6 and 0x0, is enumeration followed by validation, whatever the source claims to be. A privileged account's first ever TGT request from a Client Address it has never used, especially a VPN pool address or a jump host outside its tier, is the one to escalate before waiting for volume.

The false positives cluster around infrastructure. A new DHCP scope or a VPN concentrator migration shifts every user's Client Address at once, which floods a first-seen rule for a day. A monitoring platform that authenticates as a service account from every probe node looks like one account requesting from many addresses. A domain-joined Linux host with an old SSSD configuration can request without pre-authentication or with a non-2 type and is a config bug, not an intrusion, though it still needs fixing because it is exactly the gap an attacker would prefer you leave open. Clock skew (0x25) after a VM snapshot restore is noise; the same code from an address with no asset record is not.

A Triage Scenario

A Tuesday at 14:20 the analyst on shift gets a low-severity alert from the type 0 rule: one 4768, Result Code 0x0, Pre-Authentication Type 0, Account Name svc_legacyfax, Client Address ::ffff:10.40.7.213. The account is on the known no-preauth list, so the rule fires at low priority by design. The analyst strips the prefix, resolves 10.40.7.213 to a marketing laptop, and that is already wrong, because svc_legacyfax is only ever used from the fax gateway at 10.20.1.50.

Widening to every 4768 from 10.40.7.213 in the last hour turns up the shape of the thing: at 14:11 to 14:14, forty-one requests with Result Code 0x6 against names like admin, backup, helpdesk and svc_sql, then six 0x0 successes with Pre-Authentication Type 2 for real user accounts, then the single type 0 request. That is a username list being validated, followed by a credential the attacker already had being confirmed, followed by an AS-REP roast against the one account whose flag makes it crackable offline. Pulling 4771 for the same address shows no 0x18 at all; nothing was guessed, which fits a tool that only tests what it knows and roasts what it can.

The laptop goes to containment, svc_legacyfax gets a long random password and the pre-authentication flag re-enabled with the fax vendor on the phone, and the six validated user credentials are reset. The whole picture came from one domain controller's Security log and one normalized Client Address. The laptop itself had never been onboarded to the SIEM.

MITRE ATT&CK® Techniques

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

Practice Investigating Event 4768

Reading about a kerberos authentication ticket (tgt) was requested is one thing. Working the detection inside a live console is another. These free SOCSimulator operations cover the attack techniques Event 4768 helps you detect:

Start investigating free

Frequently Asked Questions

What is the difference between event ID 4768 and 4769?
4768 is the AS exchange: a client asks the KDC for a Ticket Granting Ticket and proves who it is with pre-authentication. 4769 is the later TGS exchange, where a client that already holds a TGT asks for a service ticket. 4768 answers who authenticated and from where; 4769 answers what services that session then requested.
What does pre-authentication type 0 mean in event 4768?
It means the TGT was requested without any pre-authentication, which is only possible for accounts with "Do not require Kerberos preauthentication" set. The KDC returns an AS-REP encrypted with the account's key, which can be cracked offline. A type 0 request is the primary log signal for AS-REP roasting (MITRE T1558.004).
Why is there no 0x18 result code in event 4768?
Because a wrong password fails during pre-authentication, before the KDC reaches the ticket-issue step. Microsoft documents that 4768 does not generate for result codes 0x10 and 0x18; event 4771 (Kerberos pre-authentication failed) is written instead. Bad-password brute force therefore lives in 4771, while the lockout that follows shows up in 4768 as 0x12.
What does result code 0x12 mean in event ID 4768?
0x12 is KDC_ERR_CLIENT_REVOKED: the account's credentials are refused because it is disabled, expired, or locked out. A cluster of 0x12 events after a run of 4771 failures is the post-lockout tail, so the attack itself is in the events just before the cluster began.
Why does the client address in event 4768 start with ::ffff:?
Domain controllers log IPv4 clients as IPv4-mapped IPv6 addresses, so 10.0.0.12 appears as ::ffff:10.0.0.12. Filters, CIDR functions and allow-list joins on the raw string will miss it. Strip the prefix in the query or normalize it at ingest; Elastic's Windows Security integration already writes the clean value to source.ip.

Sources

“Event description (generates only on domain controllers, Audit Kerberos Authentication Service subcategory), the statement that result codes 0x10 and 0x18 generate 4771 instead, field descriptions including the ::ffff: Client Address formats, Table 3 TGT/TGS issue error codes, Table 5 Kerberos Pre-Authentication types, and the security monitoring recommendations for Pre-Authentication Type 0 and Client Address.”

“The Audit Kerberos Authentication Service subcategory that must be enabled (Success and Failure) on domain controllers for 4768 to be written.”

“T1558.004 AS-REP Roasting: adversaries request AS-REP messages for accounts with Kerberos pre-authentication disabled and crack the returned material offline; ATT&CK's own detection guidance points at 4768 with Pre-Authentication Type 0.”

“Microsoft Sentinel's SecurityEvent table exposes the 4768 event data as TargetUserName, IpAddress, PreAuthType, Status and TicketEncryptionType columns, which the KQL queries on this page use.”

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
Event ID

Event ID 4776: NTLM Credential Check, Codes & Queries

Event ID 4776 is NTLM credential validation on the DC or local host. Decode 0xC000006A, trace Source Workstation, run SP…

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

Steal or Forge Kerberos Tickets (T1558): Detection Training

This technique subverts Kerberos by stealing tickets from memory or forging them from domain secrets, enabling Pass-the-…

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
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