![]() |
![]() |
How to full admin privileges in a power user a/c
Placing Windows user accounts in the Power Users security group is a common
approach IT organizations take to get users into a least-privilege environment
while avoiding the many pains of truly running as a limited user. The Power
Users group is able to install software, manage power and time-zone settings,
and install ActiveX controls, actions that limited Users are denied.
What many administrators fail to realize, however, is that this power comes at
the price of true limited-user security. Many articles, including this Microsoft
Knowledge Base article and this blog post by Microsoft security specialist
Jesper Johansen, point out that a user that belongs to the Power Users group can
easily elevate themselves to fully-privileged administrators, but I was unable
to find a detailed description of the elevation mechanisms they refer to. I
therefore decided to investigate.
Before I could start the investigation, I had to define the problem. In the
absence of a security flaw such as a buffer overflow privilege escalation is
possible only if an account can configure arbitrary code to execute in the
context of a more-privileged account. The default accounts that have more
privilege than Power Users include Administrators and the Local System account,
in which several Windows service processes run. Thus, if a Power Users member
can modify a file executed by one of these accounts, configure one of their
executables to load an arbitrary DLL, or add an executable auto-start to these
accounts, they can obtain full administrative privileges.
My first step was to see what files and directories to which the Power Users
group has write access, but that limited users do not. The systems I considered
were stock Windows 2000 Professional SP4, Windows XP SP2, and Windows Vista. I'm
not going to bother looking at server systems because the most common Power
Users scenario is on a workstation.
The brute force method of seeing what file system objects Power Users can modify
requires visiting each file and directory and examining its permissions,
something that’s clearly not practical. The command-line Cacls utility that
Windows includes dumps security descriptors, but I’ve never bothered learning
Security Descriptor Description Language (SDDL) and parsing the output would
require writing a script. The AccessEnum utility that Bryce wrote seemed
promising and it can also look at Registry security, but it’s aimed at showing
potential permissions weaknesses, not the accesses available to particular
accounts. Further, I knew that I’d also need to examine the security applied to
Windows services.
I concluded that I had to write a new utility for the job, so I created
AccessChk. You pass AccessChk an account or group name and a file system path,
Registry key, or Windows service name, and it reports the effective accesses the
account or group has for the object, taking into consideration the account’s
group memberships. For example, if the Mark account had access to a file, but
Mark belongs to the Developers group that is explicitly denied access, then
AccessChk would show Mark as having no access.
In order to make the output easy to read AccessChk prints ‘W’ next to the object
name if an account has any permissions that would allow it to modify an object,
and ‘R’ if an account can read the object’s data or status. Various switches
cause AccessChk to recurse into subdirectories or Registry subkeys and the –v
switch has it report the specific accesses available to the account. A switch I
added specifically to seek out objects for which an account has write access is
–w.
Armed with this new tool I was ready to start investigating. My first target was
a Windows XP SP2 VMWare installation that has no installed applications other
than the VMWare Tools. The first command I executed was:
accesschk –ws “power users” c:\windows
This shows all the files and directories under the \Windows directory that the
Power Users group can modify. Of course, many of the files under \Windows are
part of the operating system or Windows services and therefore execute in the
Local System account. AccessChk reported that Power Users can modify most of the
directories under \Windows, which allows member users to create files in those
directories. Thus, a member of the Power Users group can create files in the
\Windows and \Windows\System32 directory, which is a common requirement of
poorly written legacy applications. In addition, Power Users needs to be able to
create files in the \Windows\Downloaded Program Files directory so that they can
install ActiveX controls, since Internet Explorer saves them to that directory.
However, simply creating a file in these directories is not a path to privilege
elevation.
Despite the fact that Power Users can create files underneath \Windows and most
of its subdirectories, Windows configures default security permissions on most
files contained in these directories so that only members of the Administrators
group and the Local System account have write access. Exceptions include the
font files (.fon), many system log files (.log), some help files (.chm),
pictures and audio clips (.jpg, .gif, and .wmv) and installation files (.inf),
but none of these files can be modified or replaced to gain administrative
privilege. The device drivers in \Windows\System32\Drivers would allow easy
escalation, but Power Users doesn’t have write access to any of them.
I did see a number of .exe’s and .dll’s in the list, though, so I examined them
for possible exploits. Most of the executables for which Power Users has write
access are interactive utilities or run with reduced privileges. Unless you can
trick an administrator into logging into the system interactively, these can’t
be used to elevate. But there’s one glaring exception: ntoskrnl.exe:
That’s right, Power Users can replace or modify Windows’ core operating system
file. Five seconds after the file is modified, however, Windows File Protection
(WFP) will replace it with a backup copy it retrieves, in most cases, from
\Windows\System32\Dllcache. Power Users doesn’t have write access to files in
Dllcache so it can’t subvert the backup copy. But members of the Power Users
group can circumvent WFP by writing a simple program that replaces the file,
flushes the modified data to disk, then reboots the system before WFP takes
action.
I verified that this approach works, but the question remained of how this
vulnerability can be used to elevate privilege. The answer is as easy as using a
disassembler to find the function that Windows uses for privilege checks,
SeSinglePrivilegeCheck, and patching its entry point in the on-disk image so
that it always returns TRUE, which is the result code that indicates that a user
has the privilege being checked for. Once a user is running on a kernel modified
in this manner they will appear to have all privileges, including Load Driver,
Take Ownership, and Create Token, to name just a few of the privileges that they
can easily leverage to take full administrative control of a system. Although
64-bit Windows XP prevents kernel tampering with PatchGuard, few enterprises are
running on 64-bit Windows.
Replacing Ntoksrnl.exe isn’t the only way to punch through to administrative
privilege via the \Windows directory, however. At least one of the DLLs for
which default permissions allow modification by Power User, Schedsvc.dll, runs
as a Windows service in the Local System account. Schedsvc.dll is the DLL that
implements the Windows Task Scheduler service. Windows can operate successfully
without the service so Power Users can replace the DLL with an arbitrary DLL,
such as one that simply adds their account to the Local Administrators group. Of
course, WFP protects this file as well so replacing it requires the use of the
WFP-bypass technique I’ve described.
I’d already identified several elevation vectors, but continued my investigation
by looking at Power Users access to the \Program Files directory where I found
default permissions similar to those in the \Windows directory. Power Users can
create subdirectories under \Program Files, but can’t modify most of the
preinstalled Windows components. Again, the exceptions, like Windows Messenger
(\Program Files\Messenger\Msmgs.exe) and Windows Media Player (\Program
Files\Windows Media Player\Wmplayer.exe) run interactively.
That doesn’t mean that \Program Files doesn’t have potential holes. When I
examined the most recent output I saw that Power Users can modify any file or
directory created in \Program Files subsequent to those created during the base
Windows install. On my test system \Program Files\Vmware\Vmware
Tools\Vmwareservice.exe, the image file for the Vmware Windows service that runs
in the Local System account, was such a file. Another somewhat ironic example is
Microsoft Windows Defender Beta 2, which installs its service executable in
\Program Files\Windows Defender with default security settings. Replacing these
service image files is a quick path to administrator privilege and is even
easier than replacing files in the \Windows directory because WFP doesn’t meddle
with replacements.
Next I turned my attention to the Registry by running this command:
accesschk –swk “power users” hklm
The output list was enormous because Power Users has write access to the vast
majority of the HKLM\Software key. The first area I studied for possible
elevations was the HKLM\System key, because write access to many settings
beneath it, such as the Windows service and driver configuration keys in
HKLM\System\CurrentControlSet\Services, would permit trivial subversion of the
Local System account. The analysis revealed that Power Users doesn’t have write
access to anything significant under that key.
Most of the Power Users-writeable areas under the other major branch of HKLM,
Software, related to Internet Explorer, Explorer and its file associations, and
power management configuration. Power Users also has write access to
HKLM\Software\Microsoft\Windows\CurrentVersion\Run, allowing them to configure
arbitrary executables to run whenever someone logs on interactively, but
exploiting this requires a user with administrative privilege to log onto the
system interactively (which, depending on the system, may never happen, or
happen infrequently). And just as for the \Program Files directory, Power Users
has default write access to non-Windows subkeys of HKLM\Software, meaning that
third-party applications that configure executable code paths in their
system-wide Registry keys could open security holes. VMWare, the only
application installed on the system, did not.
The remaining area of exploration was Windows services. The only service
permissions AccessChk considers to be write accesses are SERVICE_CHANGE_CONFIG
and WRITE_DAC. A user with SERVICE_CHANGE_CONFIG can configure an arbitrary
executable to launch when a service starts and given WRITE_DAC they can modify
the permissions on a service to grant themselves SERVICE_CHANGE_CONFIG access.
AccessChk revealed the following on my stock Windows XP SP2 system:
I next ran PsService to see the account in which the DcomLaunch service
executes:
Thus, members of the Power Users group can simply change the image path of
DComLauncher to point at their own image, reboot the system, and enjoy
administrative privileges.
There can potentially be other services that introduce exploits in their
security. The default permissions Windows sets on services created by
third-party applications do not allow Power Users write access, but some third
party applications might configure custom permissions to allow them to do so. In
fact, on my production 64-bit Windows XP installation AccessChk reveals a hole
that not only Power Users can use to elevate themselves, but that limited users
can as well:
I’d now finished the major phase of my investigation and just confirmed what
everyone has been saying: a determined member of the Power Users group can
fairly easily make themselves full administrator using exploits in the operating
system and ones created by third-party applications.
My final step was to see how Microsoft’s approach to the Power Users account has
evolved over time. This 1999 Microsoft Knowledge Base article documents the
famous screen-saver elevation vulnerability that existed on Windows NT 4, but
Microsoft closed that hole before the release of Windows 2000. The KB article
also shows that Microsoft was apparently unaware of other vulnerabilities that
likely existed. Windows 2000 SP4 also includes holes, but is actually slightly
more secure than the default Windows XP SP2 configuration: Power Users don’t
have write access to Ntoskrnl.exe or the Task Scheduler image file, but instead
of write-access to the DComLauncher service they can subvert the WMI service,
which also runs in the Local System account.
Windows XP SP1 added more Power Users weaknesses, including write access to
critical system files like Svchost.exe, the Windows service hosting process, and
additional services, WMI and SSDPSRV, with exploitable permissions. Several
services even allowed limited users to elevate as described in this Microsoft KB
article from March of this year.
Microsoft’s newest operating system, Windows Vista, closes down all the
vulnerabilities I’ve described by neutering Power Users so that it behaves
identically to limited Users. Microsoft has thus closed the door on Power Users
in order to force IT staffs into securing their systems by moving users into
limited Users accounts or into administrative accounts where they must
acknowledge end-user control over their systems.
The bottom line is that while Microsoft could fix the vulnerabilities I found in
my investigation, they can’t prevent third-party applications from introducing
new ones while at the same time preserving the ability of Power Users to install
applications and ActiveX controls. The lesson is that as an IT administrator you
shouldn’t fool yourself into thinking that the Power Users group is a secure
compromise on the way to running as limited user.
Thanks to http://www.sysinternals.com/blog/2006/05/power-in-power-users.html for this how-to.