为了避免让用户运行为真正的受限用户而带来的麻烦,公司里往往采取把Windows用户帐号放到Power Users安全组的通用做法,把用户放到一个最小特权的环境中。Power Users用户组可以安装软件,管理电源和时区设置,并且能安装ActiveX控件——这些操作对于受限用户是无法做到的。然而,这个权力是以牺牲了真正受限用户的安全性为代价的。许多文章都指出Power Users组的成员可以把自己提升到拥有全部特权的管理员,但是我还没有找到一篇详细说明这种提升机制的文章,于是打算自己来调查一番。你可以从http://www.sysinternals.com/blog/2006/05/power-in-power-users.html看到这篇详细的调查报告。
总的来说,我发现虽然Power Users可以在Windows目录下创建文件,但是Windows配置了缺省的安全权限以便只有Administrators组的成员和Local System账号对它们有写入权限。但这里有一个醒目的例外:ntoskrnl.exe。没错,Power Users组可以替换或修改这个Windows核心OS文件,但在文件被修改5秒钟后,Windows文件保护(WFP)会把它替换为一个备份的副本。然而Power Users组的成员可以编写一个简单的程序去替换这个文件并越过WFP,在把修改的数据写入磁盘后,在WFP采取行动前就重新启动系统。
但那些人是如何利用这个漏洞来提升特权的呢?答案就是通过SeSinglePrivilegeCheck,Windows使用这个函数来检查特权。用户只需要把函数的接入点修改为磁盘上的镜像,使它总是返回True来指示用户已经拥有了要检查的特权。一旦用户运行在以这种方式修改的内核上,那么显然他会拥有所有的特权,包括Load Driver、Take Ownership和Create Token等,用户可以简单地从所获取的系统管理权中得到这些利益。
替换ntoskrnl.exe并不是通过Windows目录攫取管理特权的唯一途径。schedsvc.dll的缺省权限也是允许Power User组的成员修改的。Schedsvc.dll是实现Windows Task Scheduler服务的DLL。Power Users组的成员可以把这个DLL替换为一个任意的DLL,比如只把这个用户账号添加到Local Administrators组中的一个DLL。
接着,我检查了Power Users对Program Files目录的访问权,并且发现Power Users可以修改Program Files文件夹里,自从Windows安装过程中所创建的那些文件和文件夹之后创建的任何文件或文件夹。替换这些服务镜像文件正是通往管理员特权的快速通道。
在检查Windows服务时,我发现拥有SERVICE_CHANGE_CONFIG写入权限的用户可以任意配置一个可执行文件在服务启动时运行,如果有了WRITE_DAC访问权,他们就可以修改服务上的这些权限并给自己授予SERVICE_CHANGE_CONFIG的访问权。我还发现Power Users拥有DComLaunch的写入权,它可以提供启动DCOM服务以及从强大的Local System账号下执行的权力。因此,Power Users只需要修改DComLaunch的镜像路径指向他们自己的镜像,重新启动系统,就可以尽情地享用管理特权了。Windows设置在第三方应用程序所创建的服务上的缺省权限并不允许Power Users进行写入访问,但是某些第三方的应用程序可能会配置自定义的权限允许他们这么做。
在微软最新的操作系统,Windows Vista关闭了上述经由中立Power Users组所带来的所有漏洞,使它的运作类似于受限用户。但是微软无法阻止第三方的应用程序带来新的漏洞。我们从中受到的教训就是,作为一名IT管理员,你无法欺骗自己想当然地认为Power Users组是运行为受限用户的安全折衷。
