fireworm同学的翻译:
原文在http://www.pretentiousname.com/misc/win7_uac_whitelist2.html我只翻译了其中关于原理的一小部分,有兴趣的可以自己去看看。
Win7的UAC与Vista不同,鉴于前作糟糕的设计,为了减少UAC提示的次数,微软已经给予了三组组件绕过UAC启动的特权:
1、某些其他进程可以自动运行并获得高权限,UAC不会提示
这些进程的列表可以在这里找到,如果这些进程被运行,他会直接被赋予高权限而不会出现UAC提示。
Notable missing entries (good thing) are rundll32.exe and mmc.exe.
· 由于这一点,有人发明了rundll32注入提升权限从而绕过UAC的方法,你可以让rundll32通过加载dll来执行你的代码,这样做不会出现UAC提示,也正因为如此,微软把rundll32从进程列表中抹去了,不过,列表中还有大量的进程可以利用,如果你能向windows目录下复制文件,其中几个进程也可以利用。
2、可以创建特定COM对象的进程,运行时不会要求UAC确认。
这里列举的程序可以创建特定的COM对象,并不需要UAC确认,尽管他们自身没有提升特权。只要这些对象被创建了,进程就可以让他们去做某些需要admin权限的事情。比如向System32 或者 Program Files目录下面丢东西。
这些进程看起来是上面列表的一个超集,实际上它包括了windows7所有的可执行文件,并且有微软认证证书。
很让人无语的是,就build7000(甚至包括build7100,也就是RC1)来说,不仅仅是explorer.exe程序可以利用这一特性(愿意的话,你也可以称之为安全漏洞),连Calc.exe,notepad.exe这类程序都可以利用这个特性。微软似乎并没有做什么去最小化攻击,他只是武断地给予了这个特权,不管这个特权会不会被用到,举个例子,你可以打开一个画图软件,把他的“文件”-“打开”对话框当做一个微型的文件管理器来使用,你可以在Program Files里面胡闹(建立一个文件夹,或者重命名)通过这一招,本来会被提示的非微软官方的程序也会被放行,不会出现UAC提示。
3、一些需要权限才能创建的COM对象。
这部分列表的枚举还尚未完成,我们只知道其中包括IFileOperation接口,当然,也有可能所有微软官方的COM对象都难逃此劫。
不过,第三方的COM对象没有办法绕过UAC,就算他被微软的进程启动。
为此,可以利用这个程序来证明,这个程序运行后会以普通未提升权限的进程启动,他直接把自己的部分代码注入到其他程序的内存空间当中,并且让指定的程序去运行它,这个过程利用了普通的API,比如WriteProcessMemory和CreateRemoteThread。
如果目标进程在列表2上,我们的程序可以创建并且控制提升的列表3上的COM对象,没有UAC提示,并且不会让用户得知任何消息。
一般情况下,我们选择explorer作为目标,因为这个程序运行提供windows的任务栏和桌面,但是,其他无关的程序,比如画图和计算器也可以被利用,如果需要,先运行他们,就像这个示例程序一样,目标进程并未提升权限(必须通过代码注入来起作用)。
目标进程可以控制ASLR的关闭,可以是32位或者64位的(不过,ASLR意味着直接代码注入攻击很难,只能考虑远程代码执行漏洞,利用这个漏洞必须写出一个单独的EXE并执行)
现在的潜在问题是静默提升特性,在win7beta版本就默认启用的一个特性,这个特性并不检测需要提权的代码的出处他只检测这段代码运行在哪个进程内而不是特定代码的出处,就像这样,你可以把代码注入explorer或者让explorer去加载你的dll,之后你就可以创建提升后的COM对象并且不为用户所知。
在同一安全级别上,有很多办法让你的代码注入到其他正在运行的进程中,这通常情况下不是个问题,在其它进程中你几乎不能做什么事情,不过静默提升特性改变了这一切。
把你的代码注入到其他进程当中有很多方式,你可以用缓存区溢出漏洞(尽管ASLR做了很多去阻止这一切)或者你可以把自身安装成一个DLL插件,让其他程序加载,就像explorer外壳扩展,示例程序使用了一个众所周知的技术,那就是代码注入,代码注入有一个好处,你不用欺骗其他程序,让他加载你的代码,你只需要把代码压到其他进程当中,并告诉他执行这段代码就够了,这也不是hack行为,所有的一切都是利用文档化的,被支持的API完成的(合法的API包括调试和跨进程通信,这些API无需提权即可使用)