2 Windows Vista如何以SYSTEM权限启动进程(图)

查看WinSta0窗口站的安全权限
前面的内容隐藏了这样一个事实,为什么Local SYSTEM进程有能力加入到WinSta0窗口站?
大家可以回想一下,在Windows 2000/XP下,只有以Local SYSTEM运行的服务,可以选择“允许服务与桌面交互” 。这实际上就是让该服务运行在WinSta0窗口站里,而不是运行在默认的Service-0X0-3e7$窗口站里 。
但是为什么以其他帐户身份运行服务,不能选择这个选项?甚至连以当前登录帐户身份运行的服务都不行?例如当前以Admin用户帐户身份登录到系统,而系统中存在着一个服务,也以Admin身份运行 。
这里我们可以查看一下WinSta0窗口站的安全权限 。可以用Process Explorer,或者调试工具(例如Windbg)进行查看 。
1. 用Windbg查看WinSta0的ACL
这里首先介绍用Windbg查看WinSta0窗口站的安全权限(更加完整) 。
由于Windows Vista默认禁用Kernel Debug,所以必须运行以下命令手动打开Kernel Debug选项:
bcdedit -debug on
盆盆评注:注意,如果安装了Demon Tools之类的工具,请不要打开Kernel Debug的选项,以免产生冲突 。
下图是利用Windbg所dump出来的WinSta0安全描述符的完整记录:

我们主要关心日志中最后三个棕色加粗显示的结果:Local System帐户拥有0x000f037f权限组合;Administrators组帐户拥有0x00020166权限组合;还有一个SACL的ACE为S-1-16-4096 。
0x000f037f和0x00020166,看上去甚是古怪,但搞开发的兄弟应该很容易理解,这实际上是安全权限的组合掩码 。
咱IT Pro不需要理解这到底是什么意义,只需要知道0x000f037f代表拥有WinSta0的所有可能权限;而0x00020166代表拥有大多数可能的权限,但是无法读取屏幕内容 。
还有一个SACL的ACE为S-1-16-4096 。这又是什么意思?
嘻嘻,这里就要请大家参考MVP小青蛙s兄弟的大作《Windows Vista UIPI和窗口消息的故事》 。原来在Windows Vista里,每个安全对象,包括窗口站,都有MIC等级的概念 。这里可以看到WinSta0窗口站的MIC等级就是S-1-16-4096,实际上就是Low Integrity Level 。当然在盆盆的多篇拙作里也曾经多次提及,例如《Windows Vista有趣的标签SID》 。
WinSta0窗口站的MIC级别为什么会是低级?这可能是为了方便IE浏览器这样的Low MIC进程也能够读写WinSta0里的内容 。
2. 用Process Explorer查看WinSta0的ACL
用Windbg查看WinSta0的ACL,可以得到比较丰富的信息,但是有一点小缺点,无法查看当前登录帐户的权限(相当于查看无用户登录时的WinSta0的安全权限) 。
所以这里借助Process Explorer进行查看 。
随便找到一个用户进程,查看其打开的句柄,可以发现其中有/Sessions/1/Windows/WindowStations/WinSta0这样的句柄,查看其安全权限 。
可以看到当前登录帐户(本例是Admin)没有访问WinSta0的权限,如附图所示 。

除了SYSTEM之外,还有一个古怪帐户S-1-5-5-0-148836具有所有可能的权限,如附图所示 。

S-1-5-5-0-148836实际上就是Admin登录会话的SID 。这样的结果非常有趣,WinSta0的权限是授予Admin的一次登录实例(登录会话),而不是Admin这个安全主体本身,很有意义 。其实道理很简单,登录会话是经过LSA验证的一次登录实例,Windows可以信任 。而以Admin身份运行的进程,并不一定都是由Admin这个用户触发的,还有可能是以Admin身份运行的服务,从WinSta0的ACL可以看出,这些服务无法访问WinSta0,尽管它们的身份就是登录用户本身!
Process Explorer虽然可以看到完整的安全描述符信息,也可以看到更详细的权限 。但是有两个小缺点,一是无法显示WinSta0的MIC级别,而是只显示所谓的常规权限,而没有显示针对窗口站的特定权限 。可能Mark Russinovich还没有来得及更新,抑或这位大牛认为这太简单了,认为大家很容易理解,不想再修改了 。

推荐阅读