| Attribute | Details |
|---|---|
| Technique ID | MISCONFIG-016 |
| MITRE ATT&CK v18.1 | T1556 - Modify Authentication Process |
| Tactic | Privilege Escalation / Persistence |
| Platforms | Multi-Env (Windows AD, Entra ID, Azure, M365) |
| Severity | Critical |
| Technique Status | ACTIVE |
| Last Verified | 2026-01-10 |
| Affected Versions | All versions (configuration oversight) |
| Patched In | N/A (Configuration-based, requires monitoring setup) |
| Author | SERVTEP – Artur Pchelnikau |
Concept: Privileged accounts (Global Admins, Domain Admins, Exchange Online Admins, Security Admins) are high-value targets for adversaries seeking to maintain persistence and escalate privileges. Organizations often fail to implement dedicated monitoring, alerting, and logging for these accounts. Consequently, attackers can compromise privileged accounts and operate undetected for weeks or months while performing authentication persistence techniques (e.g., golden ticket generation, OAuth token theft, conditional access policy manipulation) without triggering any alerts.
Attack Surface: Lack of real-time sign-in monitoring for privileged accounts, no Conditional Access policies restricting privileged admin access, absent or misconfigured audit logging, no alert rules for unusual privileged operations, no dedicated Privileged Identity Management (PIM) or Just-In-Time (JIT) access controls.
Business Impact: Undetected compromise of administrative accounts enabling wholesale infrastructure takeover, data exfiltration, ransomware deployment, and persistent backdoor installation. Once an attacker controls a Global Admin or Domain Admin account, they have unrestricted access to all tenant resources, can disable security controls, forge golden tickets, and establish long-term persistence.
Technical Context: Privilege escalation and persistence via compromised privileged accounts are stealthy by nature—if not monitored explicitly, the attack is invisible. Attack detection window: typically weeks to months if monitoring is absent.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 1.1.1 | Ensure Privileged Identity Management is Enabled for Entra ID Roles |
| CIS Benchmark | 1.1.3 | Ensure that Privileged Identity Management Alert for Azure Roles is Configured |
| DISA STIG | V-226554 | Entra ID must enforce monitoring of privileged account access |
| CISA SCuBA | CA-7(1) | Control Access Sessions – Privileged accounts must have real-time monitoring |
| NIST 800-53 | AC-2(1) | Account Management – Privileged accounts require separate monitoring |
| NIST 800-53 | AU-2 | Audit Events – Privileged account activity must be logged |
| NIST 800-53 | SI-4(1) | Information System Monitoring – Continuous monitoring of administrative access |
| GDPR | Art. 5(1)(f) | Accountability – Organizations must demonstrate monitoring of privileged access |
| DORA | Art. 8 | Third-Party Risk – Admin account monitoring is critical operational resilience |
| NIS2 | Art. 21 | Cyber Risk Management – Privileged account monitoring is mandatory |
| ISO 27001 | A.9.1 | User Access Management – All privileged accounts must be monitored |
| ISO 27001 | A.12.4 | Logging – Audit logs for privileged operations must be centralized and retained |
| ISO 27005 | Risk Scenario | “Undetected compromise of privileged account due to missing monitoring” |
Supported Versions:
Tools for Monitoring Setup:
PowerShell (Entra ID):
# Check if PIM is enabled
Connect-MgGraph -Scopes "RoleManagement.Read.Directory"
Get-MgRoleManagementDirectoryRoleEligibilitySchedule | Select-Object -First 5
# If empty, PIM is not configured for admin roles
if (-not (Get-MgRoleManagementDirectoryRoleEligibilitySchedule)) {
Write-Host "[-] CRITICAL: PIM not configured for admin role assignments" -ForegroundColor Red
}
Azure CLI:
# Check if Sentinel is deployed and monitoring admin activities
az sentinel list --resource-group <rg> --workspace-name <workspace>
# Check if Analytics Rules exist for privileged account monitoring
az sentinel alert-rule list --resource-group <rg> --workspace-name <workspace> \
| grep -i "privileged\|admin\|authentication"
Manual Check (Azure Portal):
Supported Versions: Entra ID, Azure, M365 all versions
Objective: Ensure all admin operations are logged and forwarded to Sentinel.
Manual Steps (Entra ID Admin Center):
AAD-Audit-Logs-to-SentinelManual Steps (Unified Audit Log / M365):
Objective: Set up automated detection for unusual admin sign-ins.
Manual Steps (Sentinel):
Objective: Detect when non-admin users attempt to perform admin operations.
KQL Query (for manual implementation):
AuditLogs
| where OperationName contains "Add" and OperationName contains "role" and OperationName contains "assignment"
| where Result == "success"
| extend TargetUser = TargetResources[0].displayName
| extend InitiatedBy = InitiatedBy.user.userPrincipalName
| where not(InitiatedBy in ("admin@company.com", "serviceaccount@company.com"))
| project TimeGenerated, InitiatedBy, OperationName, TargetUser, Result
Manual Steps (Sentinel):
Objective: Automatically disable compromised admin accounts pending investigation.
PowerShell (Azure Automation Runbook):
# This runbook will be triggered by Sentinel alert
# It disables the potentially compromised admin account
param(
[Parameter(Mandatory = $true)]
[string]$AdminUserPrincipalName
)
# Connect to Azure
Connect-AzAccount -Identity
# Disable the admin account
try {
$user = Get-AzADUser -UserPrincipalName $AdminUserPrincipalName
# Disable the account
Update-AzADUser -ObjectId $user.Id -Enabled $false
Write-Output "[+] Disabled admin account: $AdminUserPrincipalName"
# Send alert email
Send-NotificationEmail -To "securityteam@company.com" `
-Subject "ALERT: Disabled admin account due to suspicious activity" `
-Body "Admin account $AdminUserPrincipalName has been automatically disabled pending investigation."
exit 0
} catch {
Write-Error "[-] Failed to disable account: $_"
exit 1
}
Manual Setup (Automation Account):
Objective: Require extra authentication factors and device compliance for admin sign-ins.
Manual Steps (Conditional Access):
Enforce MFA for AdminsSupported Versions: Windows Server 2016-2025
Objective: Configure Active Directory to log all admin operations.
Group Policy (Server 2016-2019):
gpupdate /force on domain controllersPowerShell (Server 2022+):
# Enable advanced audit policies for domain controllers
# Credential validation
auditpol /set /subcategory:"Credential Validation" /success:enable /failure:enable
# User account management
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
# Group membership (to track admin group changes)
auditpol /set /subcategory:"Distribution Group Management" /success:enable /failure:enable
# Sensitive privilege use
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable
# Verify configuration
auditpol /get /category:* /v
Objective: Centralize Windows event logs for correlation and analysis.
Using Windows Event Forwarding (WEF):
# Create WEF subscription to forward logs to collector
wecutil cs <subscription_XML_file>
# Install Splunk UF
splunk add forward-server <splunk-indexer>:9997 -auth admin:password
# Configure to forward security logs
splunk add monitor "C:\Windows\System32\winevt\Logs\Security.evtx" -auth admin:password
PowerShell / Splunk Search:
# Splunk search: Detect Domain Admin activity
index=windows source="WinEventLog:Security" EventCode=4672 Account_Name!=SYSTEM AND Account_Name!="Window Manager"
| stats count by Account_Name, Computer, src_ip
| where count > 5
Windows Event ID Reference:
Manual Steps (Entra ID Admin Center):
Manual Steps (PowerShell):
Connect-MgGraph -Scopes "RoleManagement.ReadWrite.Directory"
# Enable PIM activation requirement for Global Admin role
$role = Get-MgDirectoryRole -Filter "displayName eq 'Global Administrator'"
Update-MgRoleManagementDirectoryRoleEligibilityScheduleRequest -RoleDefinitionId $role.Id `
-PrincipalId "<user_id>" `
-RequireMFA $true `
-ApprovalRequired $true
Manual Steps (Entra ID):
Enforce MFA for AdminsManual Steps (PowerShell):
# Enforce MFA registration for admins
New-MgPolicyAdminConsentRequestPolicy -IsAdminConsentRequestEnabled $true
Manual Steps (Sentinel):
Manual Steps:
Manual Steps:
Action 2: Enable Azure Defender for Identity (for On-Premises AD Monitoring)
Manual Steps:
Action 3: Create Custom Detection Rules in Sentinel
KQL Query Template:
# Detect privilege escalation by non-standard users
AuditLogs
| where OperationName contains "Add" and OperationName contains "role"
| where not(InitiatedBy.user.userPrincipalName in ("admin1@company.com", "admin2@company.com"))
| extend TargetUser = TargetResources[0].displayName
| project TimeGenerated, InitiatedBy.user.userPrincipalName as Initiator, TargetUser, Result
Regular Admin Audits: Monthly review of all admin role assignments.
PowerShell Script (Monthly Audit):
Connect-MgGraph -Scopes "RoleManagement.Read.Directory"
# List all global admins
$globalAdminRole = Get-MgDirectoryRole -Filter "displayName eq 'Global Administrator'"
Get-MgDirectoryRoleMember -DirectoryRoleId $globalAdminRole.Id | Select-Object -Property DisplayName, UserPrincipalName
Segregation of Duties: No single user should hold multiple high-privilege roles.
# Check if Sentinel is receiving admin logs
az sentinel list --resource-group <rg> --workspace-name <workspace> | jq '.[] | .kind'
# Should output: "Scheduled" or "NRT" (Near Real-Time) for analytics rules
Expected Output (If Monitoring Active):
[
"Scheduled",
"NRT",
"Scheduled"
]
Query 1: Detect Unusual Admin Sign-Ins (Geographic Anomaly)
SigninLogs
| where tolower(UserPrincipalName) in ("admin1@company.com", "admin2@company.com")
| where ResultType == 0
| extend Location = parse_json(LocationDetails)
| summarize by Location.countryOrRegion, TimeGenerated, UserPrincipalName
| where Location.countryOrRegion !in ("United States", "France", "Germany") // Set to org's normal countries
What This Detects:
Query 2: Privilege Escalation via Unexpected Role Assignment
AuditLogs
| where OperationName == "Add member to role"
| where Result == "success"
| extend Initiator = InitiatedBy.user.userPrincipalName
| extend TargetUser = TargetResources[0].displayName
| extend Role = TargetResources[0].modifiedProperties[0].newValue
| where not(Initiator in ("admin1@company.com", "changemanagement@company.com"))
What This Detects:
Query 3: Detect Suspicious OAuth Consent by Admin Accounts
AuditLogs
| where OperationName == "Consent to application"
| where InitiatedBy.user.userPrincipalName in (
// List of known admin accounts
"admin1@company.com", "admin2@company.com"
)
| where TargetResources[0].displayName !in ("Microsoft Graph", "Office 365 Management API")
What This Detects:
| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Initial Access | [IA-PHISH-001] Device Code Phishing | Attacker compromises privileged user account |
| 2 | Privilege Escalation | T1547 / T1556 | Attacker elevates or maintains admin access |
| 3 | Current Step | [MISCONFIG-016] | Organization fails to detect admin activity |
| 4 | Persistence | Golden Ticket / OAuth Token Theft | Attacker establishes persistent backdoor |
| 5 | Impact | Ransomware / Data Exfiltration | Attacker operates undetected for weeks |