What is Brute Force Attack?
A brute force attack is password guessing at scale: a tool submits candidate passwords, or encryption keys, until one works. Online guessing against a login leaves a failure record for every attempt (Windows events 4625 and 4771, Entra ID error 50126), so a SOC catches it by counting failures per account and per source.
Definition
- Brute Force Attack
- A brute force attack is password guessing at scale: a tool submits candidate passwords, or encryption keys, until one works. Online guessing against a login leaves a failure record for every attempt (Windows events 4625 and 4771, Entra ID error 50126), so a SOC catches it by counting failures per account and per source.
How Brute Force Attack Works
Every variant keeps asking a login page whether a password is right. What changes is where the guesses come from and how they are spread across accounts, and that is what decides which pattern you look for in the logs.
Types of brute force attacks
| Variant | Where the guesses come from | What it looks like in the logs |
|---|---|---|
| Simple (exhaustive) | Every combination of a character set, shortest first | Many failures on one account, often until lockout |
| Dictionary | Wordlists of common and leaked passwords | Same shape as simple, with far fewer attempts before a hit |
| Hybrid | Dictionary words with rules applied, so Summer becomes Summer2026! | Same shape again; only the guess list changes |
| Password spraying | One or a few common passwords tried across many accounts | One or two failures per account, many accounts, one source or a small pool |
| Credential stuffing | Username and password pairs leaked from other breaches | Many accounts, about one try each, many source IPs, plenty of usernames that do not exist |
| Reverse | One known password against a long list of usernames | Indistinguishable from spraying |
| Rainbow table | Precomputed hash chains | Nothing at all: it runs offline against stolen hashes |
MITRE ATT&CK v20 files all of it under T1110 Brute Force, in the Credential Access tactic, with four sub-techniques: password guessing (.001), password cracking (.002), password spraying (.003) and credential stuffing (.004).
The split that matters to a SOC is online versus offline. Online guessing hits a live service (RDP, SSH, a VPN portal, Outlook on the web, an Entra ID sign-in) and every miss is written to a log you can collect. Offline cracking runs against hashes the attacker already stole, from a copy of NTDS.dit or a dump of LSASS memory, with hashcat or John the Ripper on their own hardware. No lockout applies and you see nothing until the cracked password gets used. To catch cracking, hunt for the hash theft that comes before it.
One wrong password, three different logs
Where a failed guess gets recorded depends on which protocol checked it. Take a wrong password for the domain user j.ortega:
| Where the guess lands | Record | Field that says why it failed | Written on |
|---|---|---|---|
| RDP or SMB to a server, NTLM | Event 4625, plus 4776 for a domain account | SubStatus 0xC000006A (bad password) or 0xC0000064 (no such user) | 4625 on the target server, 4776 on the domain controller |
| A Kerberos logon on a domain-joined machine | Event 4771 | Failure Code 0x18, KDC_ERR_PREAUTH_FAILED (wrong password) | Domain controllers only |
| Microsoft 365 or any app behind Entra ID | A SigninLogs row | ResultType "50126" (invalid username or password) | Entra ID, exported to Sentinel or Log Analytics |
Lockout changes the codes again. Once the account crosses its threshold, 4625 carries Status 0xC0000234 (account locked out), the domain controller writes 4740 with the Caller Computer Name the failures came from, and Entra ID returns 50053. Microsoft uses that one code for two different things: an account locked after too many bad passwords, and a sign-in blocked because the IP address has a record of malicious activity. A username that does not exist in Active Directory never reaches 4771 at all; the domain controller logs it as 4768 with result code 0x6.
No single code is an alert. Microsoft tells you to expect some 50126 errors because people mistype passwords, and its 4625 guidance flags 0xC0000064 as a possible sign of user enumeration "especially if you get several of these events in a row". The signal is in the ratios: failures per account, accounts per source, the share of usernames that do not exist, and whether a run of failures ends in a success. Keep the lockout threshold in mind as well. Windows security baselines suggest 10 invalid attempts, so eight or nine failures per account per window is exactly where a careful attacker parks.
A real campaign: the GRU's Kubernetes cluster
In July 2021 NSA, CISA, the FBI and the UK's NCSC published a joint advisory on GRU military unit 26165 (85th GTsSS, which vendors track as APT28, Fancy Bear or Strontium). From mid-2019 through early 2021 the unit used a Kubernetes cluster to run distributed brute force and password spraying against hundreds of government and private organizations. Much of it was aimed at organizations on Microsoft Office 365, but the cluster also hit on-premises mail servers over HTTP(S), IMAP(S), POP3 and NTLM, and routed its attempts through Tor and commercial VPN services. Valid credentials were then paired with two Exchange vulnerabilities, CVE-2020-0688 and CVE-2020-17144, which require an authenticated user, for remote code execution.
Microsoft had reported on the same actor's tooling in September 2020, in a post the advisory cites. In brute-force mode a targeted account typically saw over 300 authentication attempts per hour for several hours or days. In spray mode it saw about four per hour for days or weeks, nearly every attempt from a different IP, drawn from a pool of roughly 1,100 addresses, most of them Tor.
The advisory itself warns that the indicators can be changed easily, so blocking its list of node IPs was never going to be the control. And a rule that counts failures per source IP misses spray mode entirely, because each IP sends a single attempt. Count per account and per user agent too: the advisory lists truncated User-Agent strings, such as one ending in Chrome/70., as detection opportunities.
A simulated case
Simulated example generated by SOCSimulator Research. Users, hosts, IP addresses and times are invented; event IDs, field names and codes are Microsoft's.
TimeGenerated Log Account Source IP Code
03:10:04 4625 on TS01 administrator 203.0.113.77 SubStatus 0xc000006a
03:10:05 4625 on TS01 admin 203.0.113.77 SubStatus 0xc0000064
03:10:07 4625 on TS01 backup 203.0.113.77 SubStatus 0xc0000064
03:10:08 4625 on TS01 administrator 203.0.113.77 SubStatus 0xc000006a
... 212 more 4625 rows from 203.0.113.77 by 03:24
03:12:40 SigninLogs j.ortega@... 203.0.113.77 ResultType 50126
03:12:58 SigninLogs m.silva@... 203.0.113.77 ResultType 50126
03:13:15 SigninLogs a.keane@... 203.0.113.77 ResultType 50126
... 38 more 50126 rows, one per user, by 03:29
03:31:22 SigninLogs m.silva@... 203.0.113.77 ResultType 0Read the reasons before the counts. Half of the 4625 rows say 0xc0000064: the tool is trying names that do not exist here (admin, backup), so this is a generic wordlist aimed at an exposed RDP host, not someone who knows your directory. The Entra ID rows are different. They try 41 real users once each from the same address, which is spraying, and that is the half that worked: m.silva signs in with ResultType 0 from the same IP 18 minutes after her single failure. Treat it as a compromised account. Revoke her sessions, reset the password, check AuthenticationRequirement on the success to see whether MFA was ever asked for (see MFA), and close RDP on TS01 to the internet. The brute force investigation playbook walks the full triage.
Detecting it with KQL
The first query puts the three logs into one shape and scores each source address over the last hour.
// Failed password checks from 4625, 4771 and Entra ID, scored per source IP
let window = 1h;
let ntlm = SecurityEvent
| where TimeGenerated > ago(window) and EventID == 4625
| extend Reason = case(SubStatus =~ "0xc000006a", "bad password",
SubStatus =~ "0xc0000064", "no such user",
Status =~ "0xc0000234", "locked out", "other")
| project TimeGenerated, Log = "4625", User = tolower(TargetUserName), IP = IpAddress, Reason;
let kerberos = SecurityEvent
| where TimeGenerated > ago(window) and EventID == 4771 and Status =~ "0x18"
| project TimeGenerated, Log = "4771", User = tolower(TargetUserName),
IP = replace_string(IpAddress, "::ffff:", ""), Reason = "bad password";
let entra = SigninLogs
| where TimeGenerated > ago(window) and ResultType in ("50126", "50053")
| project TimeGenerated, Log = "Entra", User = tolower(tostring(split(UserPrincipalName, "@")[0])),
IP = IPAddress, Reason = iff(ResultType == "50126", "bad password", "locked or IP blocked");
union ntlm, kerberos, entra
| summarize Attempts = count(), Accounts = dcount(User), Logs = make_set(Log),
Reasons = make_set(Reason), First = min(TimeGenerated), Last = max(TimeGenerated) by IP
| extend PerAccount = round(1.0 * Attempts / Accounts, 1)
| where Attempts >= 20
| order by Attempts descA high PerAccount with one to three accounts is classic guessing against a target. A PerAccount near 1 across dozens of accounts is spraying. "no such user" dominating Reasons points to a generic list or stuffing. The second query checks what decides severity, whether any source that failed at volume also got in.
// Sources with 10+ Entra ID password failures in the last hour that also signed in
let window = 1h;
let noisy = SigninLogs
| where TimeGenerated > ago(window) and ResultType == "50126"
| summarize Failures = count(), Accounts = dcount(UserPrincipalName),
FirstFail = min(TimeGenerated) by IPAddress
| where Failures >= 10;
SigninLogs
| where TimeGenerated > ago(window) and ResultType == "0"
| join kind=inner noisy on IPAddress
| where TimeGenerated > FirstFail
| project TimeGenerated, UserPrincipalName, IPAddress, Failures, Accounts,
AuthenticationRequirement, AppDisplayNameBoth queries follow Microsoft's documented SecurityEvent and SigninLogs schemas (EventID is an integer; Status, SubStatus and ResultType are strings) and have not been run against a live workspace by SOCSimulator. Set the thresholds from your own baseline: a VPN concentrator or a shared NAT address can produce 20 honest failures in an hour.
Prevention
The joint advisory's mitigations line up with what the logs show:
- MFA with strong factors. A guessed password stops being enough on its own.
- Lockout and time-outs that grow with each failure. They slow guessing down to the point where it stops paying. Microsoft notes that a threshold of 10 cuts help-desk calls but does not prevent a denial-of-service attack, where someone locks accounts out on purpose.
- Banned-password checks at password change, so
Summer2026!never gets set. - No legacy protocols that cannot do MFA. The GRU cluster guessed over IMAP(S) and POP3 as well as HTTPS, and the advisory says to disable protocols that use weak authentication or do not support MFA.
- Deny Tor and commercial VPN exits to mail portals and remote access where that traffic is not normal for your users.
Brute Force Attack in SOC Operations
Most failed-logon alerts on a queue are noise: a user with caps lock on, a service still holding last month's password, a phone retrying an old mail profile every few minutes. The work is separating those from guessing, and that starts with three questions. How many accounts does the source touch? How many of the usernames exist? Did any run of failures end in a success? A service account failing 400 times from one internal server is a broken configuration, and the fix is a ticket to whoever owns it. Forty real users failing once each from a hosting provider, followed by a success, is an incident: revoke sessions, reset the password, check for a new MFA method or mailbox rule, and search the source address across every other log you have. Write down which log the evidence came from. A 4771 on a domain controller and a 50126 in Entra ID describe the same wrong password, but they point to different exposed surfaces and different owners for the fix.
Practice Brute Force Attack in a Real SOC
SOCSimulator provides hands-on training with realistic SIEM, XDR, and Firewall interfaces. Build real analyst skills investigating brute force attack scenarios with zero consequences, free.
Frequently Asked Questions
- What is an example of a brute force attack?
- The best documented recent case is the GRU campaign that NSA, CISA, the FBI and the UK's NCSC exposed in July 2021. From mid-2019 into early 2021, GRU unit 26165 (APT28) used a Kubernetes cluster, routed through Tor and VPN services, to guess and spray passwords against hundreds of organizations, many of them on Office 365, then used the valid logins to exploit Exchange servers.
- What is the difference between brute force and credential stuffing?
- Brute force guesses: it generates passwords or pulls them from a wordlist. Credential stuffing replays username and password pairs already leaked from another site, betting that people reuse passwords. In the logs, guessing piles failures onto a few accounts, while stuffing spreads about one attempt per account across many accounts and source IPs, with a high share of usernames that do not exist. ATT&CK files both under T1110.
- Do brute force attacks still work?
- Yes, wherever a password is the only check. The GRU campaign ran from 2019 into 2021 against Office 365 and on-premises mail, and the 2021 advisory judged it almost certainly still ongoing. Accounts without MFA, legacy protocols such as IMAP and POP3 that cannot ask for a second factor, and RDP exposed to the internet are where guessing keeps paying off.
Sources
- MITRE ATT&CK v20: T1110 Brute Force
- MITRE ATT&CK v20: T1110.001 Password Guessing (APT28 procedure examples)
- NSA, CISA, FBI and NCSC: Russian GRU Conducting Global Brute Force Campaign to Compromise Enterprise and Cloud Environments (July 2021)
- Microsoft Threat Intelligence: STRONTIUM, detecting new patterns in credential harvesting (September 2020)
- Microsoft Learn: 4625(F) An account failed to log on
- Microsoft Learn: 4771(F) Kerberos pre-authentication failed
- Microsoft Learn: 4768(S, F) A Kerberos authentication ticket (TGT) was requested
- Microsoft Learn: 4776(S, F) The computer attempted to validate the credentials for an account
- Microsoft Learn: 4740(S) A user account was locked out
- Microsoft Learn: Account lockout threshold
- Microsoft Learn: Microsoft Entra authentication and authorization error codes
- Azure Monitor Logs reference: SecurityEvent table
- Azure Monitor Logs reference: SigninLogs table
Related Terms
Password spraying is an attack that tries one common password, such as Spring2026!, against many acc...
Credential stuffing is an automated attack in which an adversary takes large lists of username-and-p...
MFA (multi-factor authentication) is a sign-in check that asks for two or more different kinds of pr...
Privilege escalation is an attacker gaining rights they were never given, after they already have a ...
Lateral movement is the attack phase where adversaries expand access from an initial foothold to add...
Phishing is a social engineering attack delivered via email, SMS, voice calls, or other channels tha...
UEBA (user and entity behavior analytics) builds a baseline of normal activity for each user, host, ...
Security Information and Event Management (SIEM) is a platform that aggregates, normalizes, and corr...
More Threats Terms
Related SOC Training Resources
Event ID 4625: Failed Logon, Codes & Queries
Event ID 4625 explained: every Status/SubStatus failure code, TP/FP triage logic, and SPL/KQL/Lucene detection queries. ā¦
Read more Event IDEvent 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 TechniqueBrute Force (T1110): Detection Training
Brute Force covers any guess-driven path to credentials: classic password guessing, password spraying a few common passwā¦
Read more Career PathThreat Hunter Career Guide: Salary & Skills
Threat Hunters do not wait for alerts. You develop hypotheses based on threat intelligence and adversary behavior modelsā¦
Read more Career PathIncident Responder Career Guide: Salary & Skills
Incident Responders lead the technical response when confirmed breaches happen. You coordinate containment, run forensicā¦
Read more Career PathSOC 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 ComparisonSOCSimulator vs Hack The Box: Comparison
Different tools for different career paths. SOCSimulator trains defensive analysts. Hack The Box trains offensive securiā¦
Read more ToolSIEM Training Console: SOCSimulator
The SIEM console in SOCSimulator replicates the workflow of enterprise platforms like Splunk Enterprise Security, Microsā¦
Read more ToolFirewall Training Console: SOCSimulator
The Firewall console in SOCSimulator replicates the log analysis experience of enterprise platforms like Palo Alto Netwoā¦
Read more TechniqueMITRE ATT&CKĀ® Techniques: Detection Training Library
Browse all MITRE ATT&CKĀ® techniques with detection strategies and example alerts.
Read more Career PathCybersecurity Career Paths: 2026 Guide
Explore SOC analyst career paths with salary data, required skills, and certification roadmaps.
Read more PlaybookSOC Investigation Playbooks: Step-by-Step Guides
Practitioner investigation playbooks with decision trees and real SIEM queries.
Read more