T1098.005

Device Registration

Adversaries may register a device to an adversary-controlled account to establish persistence or escalate privileges. Devices may be registered in an MFA system (Duo, Okta) to bypass multi-factor authentication requirements, or registered in a device management system (Entra ID, Intune) to access sensitive data while bypassing conditional access policies. APT29 has enrolled attacker-controlled devices into compromised Azure AD tenants. Tools like AADInternals can automate device registration to Entra ID. Adversaries may also exploit self-enrollment workflows that require only a username and password for dormant or first-device scenarios.

Microsoft Sentinel / Defender
kusto
// T1098.005 - Device Registration Detection
// Detects suspicious device registrations in Entra ID / Azure AD
let SuspiciousDeviceRegistration = AuditLogs
| where TimeGenerated > ago(24h)
| where OperationName in (
    "Add device",
    "Register device",
    "Add registered owner to device",
    "Add registered users to device",
    "Update device",
    "Enroll device"
  )
| where Result =~ "success"
| extend
    InitiatedByUPN = tostring(InitiatedBy.user.userPrincipalName),
    InitiatedByIP = tostring(InitiatedBy.user.ipAddress),
    InitiatedByAppId = tostring(InitiatedBy.app.appId),
    InitiatedByAppName = tostring(InitiatedBy.app.displayName),
    DeviceDisplayName = tostring(TargetResources[0].displayName),
    DeviceId = tostring(TargetResources[0].id),
    ModifiedProps = TargetResources[0].modifiedProperties
| extend DeviceOS = tostring(parse_json(tostring(ModifiedProps))[0].newValue)
| project
    TimeGenerated,
    OperationName,
    InitiatedByUPN,
    InitiatedByIP,
    InitiatedByAppId,
    InitiatedByAppName,
    DeviceDisplayName,
    DeviceId,
    Result,
    Category,
    CorrelationId;
let RecentSignins = SigninLogs
| where TimeGenerated > ago(24h)
| where ResultType == 0
| project
    SigninTime = TimeGenerated,
    SigninUPN = UserPrincipalName,
    SigninIP = IPAddress,
    SigninAppDisplayName = AppDisplayName,
    SigninCountry = LocationDetails.countryOrRegion,
    SigninRiskLevel = RiskLevelDuringSignIn,
    SigninRiskState = RiskState,
    IsInteractive;
SuspiciousDeviceRegistration
| join kind=leftouter (
    RecentSignins
    | where SigninRiskLevel in ("high", "medium") or SigninRiskState in ("atRisk", "confirmedCompromised")
  ) on $left.InitiatedByUPN == $right.SigninUPN
| union (
    // Also catch bulk/rapid device registrations from same user or IP
    SuspiciousDeviceRegistration
    | summarize
        DeviceCount = count(),
        DeviceNames = make_set(DeviceDisplayName),
        OperationNames = make_set(OperationName),
        FirstSeen = min(TimeGenerated),
        LastSeen = max(TimeGenerated)
      by InitiatedByUPN, InitiatedByIP, bin(TimeGenerated, 1h)
    | where DeviceCount >= 3
    | extend AlertReason = strcat("Bulk device registration: ", tostring(DeviceCount), " devices in 1 hour")
  )
| extend SuspiciousIndicators = dynamic([])
| extend SuspiciousIndicators = iff(isnotempty(SigninRiskLevel) and SigninRiskLevel in ("high","medium"), array_concat(SuspiciousIndicators, dynamic(["risky-signin"])), SuspiciousIndicators)
| extend SuspiciousIndicators = iff(isnotempty(InitiatedByAppId) and InitiatedByAppName !in ("Microsoft Intune", "Microsoft Azure Active Directory Connect", "Microsoft Intune Enrollment", "Azure Active Directory"), array_concat(SuspiciousIndicators, dynamic(["unexpected-app"])), SuspiciousIndicators)
| sort by TimeGenerated desc
high severity medium confidence

Data Sources

Azure AD Audit Logs Azure AD Sign-in Logs Identity: User Account

Required Tables

AuditLogs SigninLogs

False Positives

  • IT administrators bulk-enrolling corporate devices during device refresh cycles or new employee onboarding
  • Automated device enrollment workflows via Microsoft Intune Autopilot or SCCM co-management
  • Users registering personal devices under a BYOD policy, especially after password resets
  • Microsoft Entra joined virtual machines provisioned by DevOps pipelines or cloud infrastructure teams

Unlock Pro Content

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

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections