Guided lab: forty failures, no lockouts, one success

A password spray that stayed under the lockout threshold and never produced a failed-logon event on the server it was aimed at. Find where the failures were recorded, identify the account that fell, and explain why the dashboard showed nothing.

The call

2026-09-04. The service desk at Marlowe and Fenn Surveyors mentions in passing that three people rang about "your password is about to lock" warnings they did not cause. Nobody was locked out. The failed-logon dashboard, built on event 4625 from member servers, is flat.

Artifact 1: the domain controller

Event 4771 on MARL-DC-02, filtered to one client address. Forty rows in the original; eight shown.

Time      Account Name  Client Address       Failure Code  Pre-Auth Type
07:58:02  c.achterberg  ::ffff:10.59.10.218  0x18          2
07:58:02  j.haldane     ::ffff:10.59.10.218  0x18          2
07:58:03  m.szabo       ::ffff:10.59.10.218  0x18          2
07:58:03  adm.haldane   ::ffff:10.59.10.218  0x18          2
07:58:04  r.ibekwe      ::ffff:10.59.10.218  0x18          2
07:58:04  svc-scan      ::ffff:10.59.10.218  0x18          2
07:58:05  t.navarro     ::ffff:10.59.10.218  0x18          2
07:58:05  p.rourke      ::ffff:10.59.10.218  0x18          2

A second pass of forty follows at 08:31:00, and a third at 09:04:00.

Q1

Is this brute force or a spray, and what in the table decides it? Why does the difference matter to the lockout policy?

Stuck? Where to look

Count attempts per account, not attempts in total.

Show the answer

A spray. Each account appears once per pass: forty accounts, one guess each, then a wait of about half an hour before the next pass. Brute force would be one account and many guesses.

The shape is chosen to defeat lockout. A policy of five bad attempts in thirty minutes never triggers when every account sees one attempt every thirty-three minutes. The three callers saw a warning because their own typo that morning, added to the operator's guesses, brought them close.

0x18 is the Kerberos code for a wrong password. Pre-authentication type 2 is the ordinary encrypted timestamp, so these are normal logon attempts that failed for the most ordinary reason.

Q2

The dashboard watches event 4625 on every member server and showed nothing. The operator was plainly guessing passwords. Where did the failures go?

Stuck? Where to look

Think about which machine actually checks a Kerberos password, and whether the server the operator eventually wants is involved at that stage at all.

Show the answer

In Kerberos the password is checked by the domain controller, when the client asks for a ticket-granting ticket. A wrong password fails there, as event 4771, before any member server has been contacted. No server ever saw a logon attempt, so no server wrote a 4625.

A failed-logon dashboard built only on 4625 from member servers is blind to the most common way passwords are guessed in a domain. The fix is to collect 4771 and 4768 from every domain controller and alert on one source address failing against many accounts.

Artifact 2: the third pass

09:04:17  Event ID 4768  TGT requested       Account: c.achterberg   Client: ::ffff:10.59.10.218   Result: 0x0   Pre-Auth Type: 2
09:04:19  Event ID 4769  Service ticket      Account: c.achterberg   Service: MARL-FS-02$   Client: ::ffff:10.59.10.218
09:04:20  Event ID 4624  Logon (on MARL-FS-02)   Account: c.achterberg   Logon Type: 3   Source Network Address: 10.59.10.218

Q3

Which account fell, on which pass, and what is the first thing the operator did with it? Which of those statements is observed and which is assessed?

Stuck? Where to look

A success looks different from a failure in the event ID as well as the code.

Show the answer

c.achterberg, on the third pass at 09:04:17: a 4768 with result 0x0 from the same client address that produced 120 failures. Two seconds later a service ticket for MARL-FS-02, and a second after that a network logon there.

Observed: a successful TGT request for c.achterberg from 10.59.10.218, then a type 3 logon to MARL-FS-02 from that address. Assessed, with high confidence: the operator guessed the password and used it. It is an assessment because the log cannot show who typed it. c.achterberg sitting at that workstation and logging on correctly at 09:04 would look identical, and the reason you do not believe that is the 120 failures around it, which is context, not proof.

Q4

10.59.10.218 is an internal address. What does that tell you about where this incident actually started, and what can these logs not tell you?

Stuck? Where to look

A spray from inside means something came before the spray.

Show the answer

It tells you the operator already had a foothold. FIN-WS-153 was compromised before 07:58, and the spray is lateral movement, not initial access. The investigation that matters starts on that workstation, earlier that morning or before.

What the logs cannot tell you: which password was tried, which is never recorded, and whether the same guesses were made against anything that does not use your domain controllers: the VPN, the mail service, a cloud identity provider. If one password worked here, check whether c.achterberg used it anywhere else.

What to do with it

Reset c.achterberg's password and revoke sessions, isolate FIN-WS-153, and review what the account read on MARL-FS-02 between 09:04:00 and the reset. Then collect 4771 centrally. The detection is one source address failing against more than ten accounts in five minutes, and it would have fired at 07:58.

Argue underneath

The spray worked because one of forty people had a guessable password. Is the better investment a banned-password list, or the detection above? You can afford one this quarter.

Sources

The scenario above is invented. These are what its real half rests on.

Corrections and additions are welcome: this is a working document. Get in touch, or post a case of your own in the community.

Discussion

Guidelines

Sign in to comment. Corrections and additions are the point: this is a working document.