Short-window sign-in mismatch between interactive and non-interactive activity
Description
Identify successful sign-ins where a non-interactive sign-in for the same user occurs within 10 minutes from a different ASN and IP than the interactive sign-in. This pattern can indicate post-compromise token misuse and requires analyst validation.
Query · kql
let starttime = todatetime('{{StartTimeISO}}');
let endtime = todatetime('{{EndTimeISO}}');
let window = 10m;
let interactive =
SigninLogs
| where TimeGenerated between (starttime .. endtime)
| where ResultType == 0
| project
InteractiveTime = TimeGenerated,
UserPrincipalName = tolower(UserPrincipalName),
InteractiveIP = IPAddress,
InteractiveASN = AutonomousSystemNumber,
InteractiveAppDisplayName = AppDisplayName,
InteractiveCorrelationId = CorrelationId;
let nonInteractive =
AADNonInteractiveUserSignInLogs
| where TimeGenerated between (starttime .. endtime)
| where ResultType == 0
| project
NonInteractiveTime = TimeGenerated,
UserPrincipalName = tolower(UserPrincipalName),
NonInteractiveIP = IPAddress,
NonInteractiveASN = AutonomousSystemNumber,
NonInteractiveAppDisplayName = AppDisplayName,
NonInteractiveCorrelationId = CorrelationId;
interactive
| join kind=inner nonInteractive on UserPrincipalName
| where NonInteractiveTime between (InteractiveTime .. (InteractiveTime + window))
| where isnotempty(InteractiveASN) and isnotempty(NonInteractiveASN)
| where InteractiveASN != NonInteractiveASN
| where InteractiveIP != NonInteractiveIP
| extend TimeDeltaSeconds = datetime_diff('second', NonInteractiveTime, InteractiveTime)
| extend AccountName = tostring(split(UserPrincipalName, "@")[0]),
AccountUPNSuffix = tostring(split(UserPrincipalName, "@")[1])
| project
InteractiveTime,
NonInteractiveTime,
TimeDeltaSeconds,
UserPrincipalName,
AccountName,
AccountUPNSuffix,
InteractiveIP,
NonInteractiveIP,
InteractiveASN,
NonInteractiveASN,
InteractiveAppDisplayName,
NonInteractiveAppDisplayName,
InteractiveCorrelationId,
NonInteractiveCorrelationId
| sort by InteractiveTime desc