T1078

Valid Accounts

Adversaries may obtain and abuse credentials of existing accounts as a means of gaining Initial Access, Persistence, Privilege Escalation, or Defense Evasion. Compromised credentials may be used to bypass access controls placed on various resources on systems within the network and may even be used for persistent access to remote systems and externally available services, such as VPNs, Outlook Web Access, network devices, and remote desktop. Compromised credentials may also grant an adversary increased privilege to specific systems or access to restricted areas of the network. Adversaries may choose not to use malware or tools in conjunction with the legitimate access those credentials provide to make it harder to detect their presence. In some cases, adversaries may abuse inactive accounts belonging to individuals who are no longer part of an organization.

Microsoft Sentinel / Defender
kusto
// Detect anomalous logon patterns indicative of compromised valid accounts
let LookbackDays = 14d;
let AnomalyWindow = 1d;
// Baseline: countries/cities seen per user in lookback window
let UserLocationBaseline = SigninLogs
| where TimeGenerated between (ago(LookbackDays) .. ago(AnomalyWindow))
| where ResultType == 0
| summarize BaselineLocations=make_set(Location), BaselineIPs=make_set(IPAddress), BaselineApps=make_set(AppDisplayName) by UserPrincipalName;
// Recent logons to compare against baseline
let RecentLogons = SigninLogs
| where TimeGenerated > ago(AnomalyWindow)
| where ResultType == 0
| project TimeGenerated, UserPrincipalName, IPAddress, Location, AppDisplayName,
         DeviceDetail, AuthenticationRequirement, ConditionalAccessStatus,
         RiskLevelDuringSignIn, RiskLevelAggregated, IsInteractive;
// Join and find anomalies
RecentLogons
| join kind=leftouter UserLocationBaseline on UserPrincipalName
| extend NewLocation = not(Location in (BaselineLocations))
| extend NewIP = not(IPAddress in (BaselineIPs))
| extend NewApp = not(AppDisplayName in (BaselineApps))
| extend AnomalyScore = toint(NewLocation) + toint(NewIP) + toint(NewApp)
         + toint(RiskLevelDuringSignIn in ("high", "medium"))
         + toint(ConditionalAccessStatus == "notApplied")
| where AnomalyScore >= 2 or RiskLevelDuringSignIn == "high"
| project TimeGenerated, UserPrincipalName, IPAddress, Location, AppDisplayName,
         NewLocation, NewIP, NewApp, AnomalyScore,
         RiskLevelDuringSignIn, RiskLevelAggregated,
         ConditionalAccessStatus, AuthenticationRequirement,
         IsInteractive, DeviceDetail
| sort by AnomalyScore desc, TimeGenerated desc
high severity medium confidence

Data Sources

Logon Session: Logon Session Creation User Account: User Account Authentication Azure Active Directory Sign-In Logs

Required Tables

SigninLogs

False Positives

  • Legitimate travel — users accessing resources from new countries or cities during business travel
  • VPN or proxy changes — users switching VPN exit nodes causing IP and apparent location changes
  • New device enrollment — first-time access from a newly provisioned corporate device triggers 'new IP' anomaly
  • After-hours legitimate access — on-call engineers or executives working outside normal hours from home networks
  • Conditional Access policy rollout periods — new CA policies may temporarily show as 'notApplied' during staged deployment

Unlock Pro Content

Get the full detection package for T1078 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections