Query Details
//Detects when a user has a medium or high risk sign in followed by that user successfully registering MFA on another user within 4 hours
//This may detect an adversary registering MFA on behalf of your users using a compromised admin account
//Data connector required for this query - Azure Active Directory - Signin Logs
//Data connector required for this query - Azure Active Directory - Audit Logs
SigninLogs
| where RiskLevelDuringSignIn in~ ("medium", "high")
| project
['Risky Signin Time']=TimeGenerated,
UserPrincipalName,
SigninIP=IPAddress,
RiskLevelDuringSignIn,
RiskEventTypes,
SigninResult=ResultType
| join kind=inner (
AuditLogs
| where OperationName == "Admin registered security info" and Result == "success"
| extend Actor = tostring(parse_json(tostring(InitiatedBy.user)).userPrincipalName)
| extend Target = tostring(TargetResources[0].userPrincipalName)
| project
['MFA Change Time']=TimeGenerated,
OperationName,
ResultReason,
Actor,
Target,
TargetResources
)
on $left.UserPrincipalName == $right.Actor
| where ['MFA Change Time'] between (['Risky Signin Time'] .. timespan(4h))
| project
['Risky Signin Time'],
['MFA Change Time'],
Actor,
Target,
SigninIP,
SigninResult,
OperationName,
ResultReason,
TargetResourcesThis query detects when a user has a medium or high risk sign-in event, followed by that user successfully registering multi-factor authentication (MFA) on another user within 4 hours. It is used to identify potential adversaries who may be registering MFA on behalf of your users using a compromised admin account. The query requires data connectors for Azure Active Directory - Signin Logs and Azure Active Directory - Audit Logs. It retrieves information such as the risky sign-in time, user principal name, sign-in IP address, risk level during sign-in, risk event types, sign-in result, MFA change time, operation name, result reason, actor, target, and target resources.

Matt Zorich
Released: August 30, 2023
Tables
Keywords
Operators