RDP Failed Logon Burst From Single Source
Flags a burst of failed interactive RDP logons (Event ID 4625, LogonType 10) from a single source address — the exact pattern behind the RDP and VPN brute-force alerts I've triaged repeatedly.
Rule
title: RDP Failed Logon Burst From Single Source
id: b1c8199a-818e-4895-8427-f11040fc9204
status: experimental
description: |
Detects repeated failed RDP logons (Event ID 4625, LogonType 10) from a
single source IP within a short window — the classic externally-exposed
RDP brute-force / password-spray precursor.
references:
- https://inksec.io/investigations/2026-02-11-soc176-rdp-brute-force-detected/
author: Tate Pannam (inksec)
date: 2026-07-12
logsource:
product: windows
service: security
detection:
selection:
EventID: 4625
LogonType: 10
condition: selection
falsepositives:
- RDP gateways or jump hosts that NAT many users behind one source IP
- A user with an expired password retrying from a saved RDP session
level: high
tags:
- attack.credential_access
- attack.t1110.001
Aggregated as a Sigma v2 event-count correlation — the base rule alone is too noisy to page on:
title: RDP Failed Logon Burst - Correlation
id: a246db52-9481-4b0f-b2cd-fab43b3b8080
correlation:
type: event_count
rules:
- b1c8199a-818e-4895-8427-f11040fc9204
group-by:
- IpAddress
timespan: 5m
condition:
gte: 10
Why this rule
I’ve triaged this exact pattern more than once on live alerts — SOC-176 (RDP brute force) and SOC-210 (VPN brute force) were both bursts of failed authentications from a single external address. In both cases the deciding questions were the same: did any logon from that source eventually succeed (4624), and is the source known-bad? The correlation window and threshold here are set so the alert fires while those questions still matter.
Tuning notes
- Threshold: 10 failures / 5 minutes catches tooling (Hydra, NLBrute) comfortably; a patient attacker doing low-and-slow spray needs a companion rule with a 24h window and a distinct-
TargetUserNamecount instead. - Enrich, don’t just fire: pair with a lookup on the source IP (AbuseIPDB / TI feed). Every true positive I’ve handled came from an address already flagged.
- The follow-up query that decides the verdict: search 4624 with
LogonType 10from the sameIpAddressin the following hour. Success after a burst upgrades this from “attempt” to incident.
Validation
Replayed against the SOC-176 alert data: 30+ failed logons from one source in under 5 minutes — fires on the first 10 within ~40 seconds. No fire on baseline traffic from an RDP jump host, provided the gateway exclusion list is populated.