北方天空下

i am not a man of too many faces,the mask i wear is one...

Avatar

关于win7UAC的漏洞

CnBeta上的一则新闻提到win7UAC(默认设置下)存在的一个漏洞:允许一个普通权限的应用程序在不弹出UAC的情况下自动启动一个高权限的进程:
演示工具源码和漏洞细节相关网页

据说作者是在向MS反馈未果的情况下,愤怒的公开了源代码和演示程序,我在7100下试用了后发现这居然是真的。。在还有一个多月就要RTM的情况下,居然爆出这样漏洞,我整个人都“心神不宁”了,于是赶快看了下是怎么回事(不对的地方请拍砖指正):

0. 测试程序Win7Elevate32v2.exe:
a)自身集成一个dll文件作为资源文件捆绑到exe上;
b)包含了一段注入代码RemoteCodeFunc,用于远程注入执行;
c)允许用户自定义期望被提升权限的程序路径,默认是:C:\Windows\system32\cmd.exe

1. 测试程序运行后将注入代码RemoteCodeFunc()写入Explorer进程[标准用户权限]并在Explorer进程地址空间运行起来:方法是:OpenProcess()+WriteProcessMemory()+CreateRemoteThread()

2.注入函数RemoteCodeFunc()开始在Explorer内运行:
a)创建一个Com对象,并试图将测试程序捆绑的dll写入C:\Windows\System32\sysprep\CRYPTBASE.dll;
b)在写入dll的时候自动进行权限提升(因为标准用户权限的Explorer是不能直接写入C:\Windows\System32\sysprep\的,需要管理权限),所以写入成功!
c)使用C:\Windows\System32\sysprep\sysprep.exe创建进程,CommandLine为用户指定程序路径等拼接的字符串

3. sysprep.exe进程创建后会自动提升权限(标准用户->管理员),并加载这个”假CRYPTBASE.dll”, CRYPTBASE.dll做的事:
a)将sysprep.exe进程的CommandLine拆成数组;
b)并将数组成员” C:\Windows\system32\cmd.exe”作为CreateProcess函数的参数,调用CreateProcess创建进程cmd;

4.至此,管理员权限的cmd进程被创建起来,可以为所欲为。

这里有3个关键的点:
1.第2步中创建的Com对象在win7默认支持自动提升权限
2.第3步中sysprep.exe这个系统程序运行时候会自动进行权限提升。
3.sysprep.exe启动加载dll时候会遵循一个规则:如果被加载的dll在系统” Known DLLs”列表中那么就直接从system32目录加载,而这个CRYPTBASE.dll虽然位于System32目录,但它恰恰不在” Known DLLs”中,于是sysprep.exe会优先在自己的当前目录寻找CRYPTBASE.dll,这个测试程序巧妙的在创建sysprep进程前先在它所在的目录填充了一个“假的CRYPTBASE.dll”,这样提升了权限的sysprep加载了这个假dll后就能以高权限运行其中的“代码”,而这些代码是预先定义好的。

备注:前两个特殊机制在这篇文章中都有说明

有兴趣的同学可以试一试这个测试工具,如果把HKEY_CLASSES_ROOT\CLSID\{3ad05575-8857-4850-9277-11b85bdb8e09}\Elevation的Enable改为0,这个工具就不灵了~不过也会带来副作用:不能通过explorer直接在关键目录右键新建、删除文件夹了。

备注:演示工具使用时候请确保win7安装在C盘,因为代码硬编码了部分路径。

Linuxer 微笑飘过

评论已关闭