Detection rules › Kusto
User login from different countries within 3 hours (Uses Authentication Normalization)
This query searches for successful user logins from different countries within 3 hours. To use this analytics rule, make sure you have deployed the ASIM normalization parsers
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Initial Access |
Telemetry coverage
Rule body
id: 09ec8fa2-b25f-4696-bfae-05a7b85d7b9e
name: User login from different countries within 3 hours (Uses Authentication Normalization)
description: |
'This query searches for successful user logins from different countries within 3 hours.
To use this analytics rule, make sure you have deployed the [ASIM normalization parsers](https://aka.ms/ASimAuthentication)'
severity: High
requiredDataConnectors: []
queryFrequency: 3h
queryPeriod: 3h
triggerOperator: gt
triggerThreshold: 0
tactics:
- InitialAccess
relevantTechniques:
- T1078
tags:
- Id: 2954d424-f786-4677-9ffc-c24c44c6e7d5
version: 1.0.0
- Schema: ASIMAuthentication
SchemaVersion: 0.1.0
query: |
let timeframe = ago(3h);
let threshold = 2;
imAuthentication
| where TimeGenerated > timeframe
| where EventType == 'Logon'
and EventResult == 'Success'
| where isnotempty(SrcGeoCountry)
| summarize
StartTime = min(TimeGenerated)
, EndTime = max(TimeGenerated)
, Vendors = make_set(EventVendor, 128)
, Products = make_set(EventProduct, 128)
, NumOfCountries = dcount(SrcGeoCountry)
, Countries = make_set(SrcGeoCountry, 128)
by TargetUserId, TargetUsername, TargetUserType
| where NumOfCountries >= threshold
| where TargetUserType !in ("Application", "Service", "System", "Other", "Machine", "ServicePrincipal")
| extend
Name = iif(
TargetUsername contains "@"
, tostring(split(TargetUsername, '@', 0)[0])
, TargetUsername
),
UPNSuffix = iif(
TargetUsername contains "@"
, tostring(split(TargetUsername, '@', 1)[0])
, ""
)
entityMappings:
- entityType: Account
fieldMappings:
- identifier: FullName
columnName: TargetUserName
- identifier: Name
columnName: Name
- identifier: UPNSuffix
columnName: UPNSuffix
version: 1.2.5
kind: Scheduled
metadata:
source:
kind: Community
author:
name: Ofer Shezaf
support:
tier: Community
categories:
domains: [ "Security - Network" ]
Stages and Predicates
Parameters
let timeframe = ago(3h);
let threshold = 2;
Stage 1: source
imAuthentication
Stage 2: where
| where TimeGenerated > timeframe
Stage 3: where
| where EventType == 'Logon'
and EventResult == 'Success'
Stage 4: where
| where isnotempty(SrcGeoCountry)
Stage 5: summarize
| summarize
StartTime = min(TimeGenerated)
, EndTime = max(TimeGenerated)
, Vendors = make_set(EventVendor, 128)
, Products = make_set(EventProduct, 128)
, NumOfCountries = dcount(SrcGeoCountry)
, Countries = make_set(SrcGeoCountry, 128)
by TargetUserId, TargetUsername, TargetUserType
Stage 6: where
| where NumOfCountries >= threshold
Stage 7: where
| where TargetUserType !in ("Application", "Service", "System", "Other", "Machine", "ServicePrincipal")
Stage 8: extend
| extend
Name = iif(
TargetUsername contains "@"
, tostring(split(TargetUsername, '@', 0)[0])
, TargetUsername
),
UPNSuffix = iif(
TargetUsername contains "@"
, tostring(split(TargetUsername, '@', 1)[0])
, ""
)
Exclusions
The rule actively suppresses these predicates.
| Field | Kind | Excluded values | Search |
|---|---|---|---|
TargetUserType | in | Application, Machine, Other, Service, ServicePrincipal, System | excludes:TargetUserType |
Indicators
These rows show field, operator, and value matches.
| Field | Kind | Values | Search |
|---|---|---|---|
EventResult | eq |
| field:"EventResult" kind:eq value:"Success" |
EventType | eq |
| field:"ElevatedToken" kind:eq value:"Logon" |
NumOfCountries | ge |
| field:"NumOfCountries" kind:ge value:"2" |
SrcGeoCountry | is_not_null | field:"SrcGeoCountry" kind:is_not_null | |
TimeGenerated | cross_field_compare |
| field:"TimeGenerated" kind:cross_field_compare value:"timeframe" |
Output fields
These fields are emitted when the rule matches.
| Field | Source |
|---|---|
Countries | summarize |
EndTime | summarize |
NumOfCountries | summarize |
Products | summarize |
StartTime | summarize |
TargetUserId | summarize |
TargetUserType | summarize |
TargetUsername | summarize |
Vendors | summarize |
Name | extend |
UPNSuffix | extend |