针对UAC安全的研究与思考

简要概述

9月24日亚洲知名安全技术峰会SyScan在北京召开。在大会上Instruder做了《深入思考UAC背后的安全问题》演讲。会后笔者针对这一议题做了详细分析与测试,就UAC提升用户权限的的问题做了总结与分析。

研究背景

现在WIN7操作系统以经大量普及,UAC的安全机制以成为渗透过程中最为明显的绊脚石,UAC会使大量渗透工具失效,木马无法运行,如何突破UAC的层层防护是一直以来研究的重点。
研究目的

经过学习与研究应该实现,在当前用户权限下,绕过UAC提示直接运行程序,并可以实现修改启动项,释放文件到系统目录等功能,而这一过程必须在用户没有任意察觉的情况下完成。

研究方案

白名单机制

从用户账户控制对权限进行保护的基本过程可以看到,在用户以管理员权限运行程序的 过程中,用户账户控制在向用户进行提权询问前,将会先查询本地系统中的白名单以决定是 否直接放行,因此,白名单机制是用户账户控制中的一个重要部分。用户账户控制限制着程 序使用高级权限才能进行的操作,但是,这样的机制同样也会对系统本身的程序造成影响,微软也不希望系统程序的运行也询问用户,因为他们本身是安全的。因此,微软则在 UAC 中添加了白名单机制,即在系统中记录有一张表单,对于表单中的系统程序,将不限 制其直接提升到管理员权限。系统中的白名单程序有多个,其中,msconfig、taskmgr、perfmon、cleanmgr 等平时常用的程序都在其中。

实现直接提权

比较常用的利用系统程序的方法是利用系统动态加载 DLL的特性,在系统中还有一份名单为 KnownDlls,当一个程序需要动态加载 DLL 的时候,会先在这份名单之中进行查找,如果找到则加载相应路径的DLL 文件,如果没有找到则依照当前目录、 System32 目录的顺序进行查找,因此如果能找到一个程序动态调用的 DLL 文件不在KnownDlls 中,而在 System32 下面,则可以伪造一个相应的 DLL,来实现借助其他程序来 执行需要的操作。在所有白名单程序中,正好有这样一个程序,即 sysprep.exe,它的位置为 System32/sysprep/,而它在启动时,会动态加载一个 CRYPTBASE.DLL,这个 DLL 在 System32 下面,因此 sysprep.exe 会在当前目录寻找的时候加载失败,继而转到 System32 目录查找, 试着临时生成一个假的 CRYPTBASE.DLL 放在 sysprep 文件夹下,在 sysprep.exe启动时,将加载假的 CRYPTBASE.DLL,从而执行我们需要的操作。sysprep.exe 加载假 CRYPTBASE.DLL线程注入白名单中的程序全部都在系统目录当中,因此要把生成的假 DLL 复制到程序目录中, 将会由于权限问题而触发 UAC,这样便失效了。因此,需要特别的方法来把假 DLL 给复制到系统目录内,并且不会触发系统的权限控制。这一步的操作也需要系统白名单的程序来实现,选用的程序为EXPLORER进程,首先使用远程线程的方法把DLL注入到EXPLORER进程,然后再通过EXPLORER把CRYPTBASE.DLL复制到指定目录UAC不会提示。所有操作完成后启动sysprep.exe我们的DLL就会被加载,从而绕过成功。但这个方法缺点也很明显,在注入EXPLORER进程时,杀毒软件已经开始关注了。

SyScan大会中的方法

与传统方法也有类似之处,议题作者Instruder采用的方法也是白名单的方法但又有不同之处,颇为巧妙,作者使用的方法为利用操作系统自己的升级程序WUSA.EXE,读取释放文件,这个过程是不会触发UAC的,利用这个机制可以轻松突破UAC限制,下面我们一步一步演示实现,首先把wusa.exe找出来,此文件位于 c:windowssyswow64目录如图1所示。

图1

找到这个文件后,运行一下,看一下它的具体使用方法,具体情况如图2所示。

图2

找到WUSA.EXE后我们还要找一个 MSU的文件用来做测试用,我从自己电脑中随便搜索一些MSU文件出来如图3所示。
 

图3

到目前为至准备工具基本就需了,我们来做实验,使用WUSA.EXE把一个MSU文件释放一下,看能否成功,实验方法如下,复制一个MSU文件到D:TEMP目录,然后在CMD下切换目录到c:windowssyswow64,最后运行wusa.exe d: empmsu.msu /extract:d: emp 这时看到一个很快的进度一闪而过,我比较愚钝没能抓下图来,去D:TEMP目录看一下是什么情况如图4所示。
 

图4

可以看出文件以成功释放,这样很好,下一步继续实验,把释放目录修改一下,直接释放到系统目录WINDOWS下,看会如何表现,执行wusa.exe d: empmsu.msu /extract:c:windows
结果很理想,成功释放而且没有触发UAC提示,而我此时的UAC设置如图5所示。
 

图5

到目前为至我们可以考虑一些邪恶的事情了,比如释放一些木马病毒DLL劫持的文件到系统目录这样子,不会触发UAC程序,同时木马与病毒也会开机启动了,再继续向下实验吧目前思路上是没问题了,那么要考虑的是MSU文件了,这个文件看一下是有微软数字签名的如图6、7所示。
 

图6、7

问题随之而来,WUSA.EXE会对MSU文件进行签名校验吗?这个我们可以通过破坏数字签名来验证一下,使用16进制编辑工具把MSU文件随便添加几个字节如图8所示。
 

图8

现在数字签名以经被破解,无效了,如图9所示。
 

图9

清理之前释放的文件后,再运行一下进行释放检测,看下结果,呵呵结果非常理想,依然成功释放,这说明 WUSA.EXE对MSU文件是没有签名校验的,我们可以随便伪造MSU文件了。

取代MSU文件

经过一系列的测试,已经知道,只要搞定MSU文件就成大功告成了,msu 文件扩展名与 Windows 更新独立安装程序相关联。msu 文件中包含以下内容:
 
 Windows Update 元数据,此元数据描述了 .msu 文件包含的每个更新包。一个或多个 .cab 文件,每个 .cab 文件代表一个更新。一个 .xml 文件,此 .xml 文件对 .msu 更新包进行描述。
 
看起来还是蛮复杂的样子,呵呵能不能偷偷懒,想其它方法进行绕过呢,微软的工具对自己的文件格式兼容性,应该是不错的,既然是文件包,那就测试微软的CAB包。继续实验,把MSU文件,换成CAB文件测试,结果很理想,依然可以成功,那么我们的后续工作就很简单了,只要把想释放的文件压缩到CAB包,再利用上述方法就可以成功释放了,而且整个过程非常安逸,不会有UAC提示。

此外作者也提供了其实利用方法,总体来看,并不复杂,只要掌握绕过原理,其实现过程都是可以实现的,由于时间关系,没有一一试验,有兴趣的朋友可以自行测试一下。