论坛: 菜鸟乐园 标题: 针对win32缺陷溢出以提升权限 复制本贴地址    
作者: newmyth21 [newmyth21]    论坛用户   登录
针对win32缺陷溢出以提升权限


转载:http://www.hackbase.com

背景:win32消息系统
Windows 操作系统的应用程序全部是通过运用消息来控制的,当按某一个键,一个代表这个状态的消息就送到了当前活动的窗体。当Windows决定一个程序刷新它的客户区,就送一个消息给程序,实际上,应用程序要知道任何事情的发生,都得送一个消息的。这些消息放在队列里,让程序按顺序处理。
 对于控制程序这是一个非常可靠的机制,然而,Win32中控制消息的机制是有缺陷的。一个给定的桌面上的任何程序可以发送消息给同一桌面的任何窗体,而且无视目标程序想不想接收这些消息。没有一个机制来鉴别消息的来源,一个从恶意程序送来的消息无法和Windows内核程序送来的消息区别。考虑到这些消息可以操纵Windows系统并且可以处理它们自身,这种缺乏鉴别可以被我们利用来溢出系统。
概述:
这个例子中,我将溢出网络中一个常用的程序virusscan v4.5.1,系统为Windows2000专业版,由于virusscan程序以本地系统身份运行在我的桌面上,我以客户身份登陆,目标诱骗virusscan运行我的代码来提升我的权限。这只需要简单的几步就能完成。
 1。在virusscan内定位合适的窗体(编辑框最好),以获得窗体句柄。
 2。去掉在编辑框里可能出现的长度限制,这样我可以输入任意数量的数据。
 3。粘贴进一些二进制的执行代码。
  4。强制virusscan执行我的代码。
这实际上非常容易去做,Windows方便地给我们提供了很多需要的功能,我写了一个小程序叫shatter它可以实现这些功能。你将需要一个能拷贝二进制数据到剪贴版的十六进制处理程序(如Ultraedit),以及一个汇编程序(如windbg).
注意:一些病毒扫描程序警告人们在shatter压缩文件中存在win32/beavuh病毒。这不是病毒,扫描程序标示出来也是正确的。这个文件中的代码设计用来打开shell并把它绑定到网络的socket上。一般来说这是个坏事情,所以扫描程序产生一个警告是对的。这个代码就功能上来说是不怀好意的,但扫描程序把它标示为病毒就不正确了。
 Windows消息包括三部分,消息标识和两个参数。发的消息不同参数也不同。因些我们只要考虑四个方面的事情,这使的我们的工作变得简单了,获得消息的窗体句柄,消息,以及两个参数。让我们看看到底如何的简单:
第一步:定位窗体
  我们需要定位某种编辑控件-那些我们能输入资料的控件,不要担心它是否有限制,我们可以改动的。打开virusscan控制台,点第一个按纽'新任务',在对话框的顶端,有个编辑框。现在我们要有一个控件的句柄以便容易的和它联系。如果我们需要windows提供任意窗体的句柄,我们只需问一下就行。打开shatter,重新把它放置个地方以便我们也能看到它下面的virusscan的编辑控件。点一下’get cursor window'-shatter应该在下面的列表框里增加一个项如‘102f2 - Get cursor window’。这是因为我们让windows直接给我们一个光标下的窗体句标。在virusscan上移动光标并按下空格再次触发shatter。shatter应该再次清除列表框,并告诉你目标窗体的句柄--在我的测试中是30270。现在我们可以以程序与窗体相互作用以提升运行权限。让我们粘一些代码进去。
第二步:去除限制
 既然我们有了窗体句柄,我们就可以给控件发送任何消息,它还可以盲目的执行。首选要做的是让我们为代码提供足够的空间。
在shatter内部,在句柄框里输入你的窗体句柄,设置编辑框最大文本长度的消息是EM_SETLIMITTEXT。第一个参数是新的最大文本长度,第二个参数可以忽略。在WPARAM框里输入4,第三个里输入0,按下EM_SETLIMITTEXT发送消息,并且在virusscan编辑框里试图输入一些东西。你不能输入多于4个字符。改变4到FFFFFFFF再次发送消息。现在试图在virusscan编辑框里输入字符,你可以在编辑控件里有4Gb的空间,这可以运行任何冗长的代码。
第三步:注入代码
 接下来,让我们试图在框里粘切一些代码,对了,你可以在框里右点后选择粘贴,但为了讨论还是让我们一步一步来吧,清除virusscan的编辑框,打开notepad程序。输入一些文本到notepad里。拷贝它。回到shatter,我们要给virusscan发送一个‘粘贴板内容’的消息,它是WM_PASTE。这个消息的两个参数都是0,因些设置 WPARAM  到LPARAM为零,leaving the handle the same,点一下WM_PASTE,看看你的文本出现在virusscan的编辑框,再点一次,它现在应该能再现两次。
  OK,that's enough playing,再次清除virusscan编辑框,打开十六进制编辑程序。装入sploit.bin,装入shatter压缩文件。这是一个开远程端口回连的代码。它可以回连到123端口并得到shell的代码,现在是你打开netcat在本地侦听的最好时间了。打开cmd,输入nc -lp 123就不管了。回到我们的ultraedit。拷贝代码到剪贴板,确保我们全部拿到了。回到shatter,再次点WM_PASTE按纽一下。你现在就能看到装入到virusscan编辑框里的全部字符,这就是我们的代码,粘进去就行。
第四步:执行代码
 这一步需要一些操作上的技巧。打开汇编程序,把它绑到avconsol.exe进程中。接下来,查找内存里的foon字符。WinDbg命令是s -a 00000001 10000000 "FOON",但你也可以用不同的汇编程序。记下内存里字符出现的地方,它有可能会出现两次,不要问为什么。两个都行。在我的系统里,代码出现在0x00148c28,如果用的是同一版本,出现的位置不会差的太远。现在关了汇编程序。以guest用户登陆,准备接收本地系统权限。重复第一和第三步,不要忘了用netcat侦听shell.
在这点上,你可能会想绑定汇编是个特许操作。就是的。然而,当写缓冲区溢出时都是一样的,你可以在任何系统中做它。你要做的是确定同一版本的程序在任何系统中内存地址。实际上,你根本不需要那样做。许多应用程序有它们专有的句柄,那么它们产生一个违反访问时,它们只是处理它并不破坏。因些,没有什么能阻止你粘贴上百字节的nops,它只是内存里的反复直到你找到正确的地址和你的执行代码。这个并不高明,但很实用。
最终我们要用的消息是WM_TIMER。这有点不固定也是个危险的消息,因为它包括timer回复功能的地址。如果第二个参数非零。将跳到特定的地址去执行。是的,你读到它是正确的,你可以向任何窗体发送第二参数非零的WM_TIMER 消息,接着执行跳转到的地址。就我所知,这个消息不进入到消息队列,因此应用程序不用忽略它,无聊,无聊,无聊。
因些在shatter里,句柄应该设置到包括代码的virusscan编辑控件。第一个参数可以是任意的,第二个参数必须是512字节或者是我们用到的汇编程序的地址之上,我在代码前使用了1K字节的NOP,所以只能在代码的中间看到它的执行; 点一下WM_TIMER,你的netcat应该能得到一个shell。 WHOAMI 可以揭示你是否已提升了权限。
另一种技术:
 还有另外的途径做我们刚才做的事,应用同样的机制并可能要增加一些难度。EM_GETLINE消息通知编辑控件拷贝它的内容到消息内的指定地址。你可以写任意代码到内存的任意位置?你想方便的溢出?我们已看到如何取掉编辑控件的文本长度限制;当程序依赖于这些限制时会发生什么?当一个程序设定编辑框为16字节,我们可以输入一些gigs,每个人,输入1...2..3..就可以缓冲区溢出,可能堆栈溢出也一样了,由于16字节数据不是从堆里来的,而且,当我们发送WM_TIMER,我们指定的参数和timerID还有其它整个的crap压入到栈里。这并不是不可想象的,我们可以用第三方程序找到这个功能。允许我们直接跳到要溢出的消息。
谈到堆,它是有关这个溢出的另一个重要的事情。一般地,任何程序在内存操作前都会在堆里产生一个对话框;我们的代码地址将会恰当的保留这些空间。以我的经验它很少在两个例子之间移动20字节。静态跳转地址不是个问题,但谁关心呢?发送EM_GETLINE消息,它把你的代码写到指定的位置然后在WM_TIMER中指定同一地址,一个完全没有nop的溢出,多好呀!
 修正问题:
这很容易溢出吧,每个人怎么去做呢?我看有两个快速和不方便的办法,它能破坏很多功能,另有一个冗长的解决办法。我来解释。
 1不允许别人列举窗体
 2不允许消息在不同权限下的两个程序里传送。
 3增加消息来源信息,让程序来决定如何处理消息。
基本上没有简单的解决办法,这就是微软掩盖这个问题的原因。问题是如果我能发现这个缺陷,我保证还有别人也能发现的。他们可能没有告诉他人,接下来他们以一个低权限用户身份进入你的系统,你找不到线索知道他们是怎么得到本地最高权限的。毕竟你有最新的更新补丁,对吧?
附录:为什么会有这个问题
 当微软看到这份说明的拷贝时,他们给我的答复是很清楚这个攻击,他们没有把它列为缺陷。我相信这种观点不正确。微软列出的两点是a.它需要自由的物理访问你的计算机b.它需要在你的机子上运行一些有恶意的代码。我完全同意这两种想定,然而,他们忽略了这一点。拥有一台机子相当容易。这些技术使黑客们用来提升权限的。如果他们能得到guest权限访问机子,这种攻击可以让你以任何帐户来得到本地权限。曾经听说过一个小程序叫hk.exe吧。ERunAsX怎么样, iishack.dll怎么样?这些工具都是在你得到访问权限后用来提升权限的。所有这些都让微软承认有安全漏洞,并且打了补丁。
如果你有一台公司的机子,一般许多的这种机子都会被牢牢的锁着。机子上的用户不能做它授权外的任何事情。如果这机子会受到shatter的攻击,用户就会得到本地权限并且能做它想做的事。更坏的是在终端服务器上。假设公司给它的客户为某种原因提供终端服务。公司不可能为用户提供真实权限。shatter攻击能让这些用户完全控制这个服务器;本地权限比管理员权限高,在共享的服务器上它是个问题。它不需要得到控制台访问。我已成功的运用shatter攻击了几百里外的终端服务器。
简单的情况是微软知道这个缺陷但没法修复。使用win32API的机制自从windowsNT3.51993年七月发布以来相当稳定。微软没法改变它。要停止这种攻击的唯一办法是阻止桌面上的程序以高于登陆用户权限运行。微软相信桌面是个安全界限,它上面的任何窗体都划为不可信的。这是真的。但只对于系统,由于它的缺陷,微软打破了它的规则;在标准桌面上有很多的系统程序以本地权限运行。可以用我的shatter得到验证。
这个问题是不是只存在于win32?
可能吧,对windows来说最强的主流竞争者是Xwindows。X基于相似的底层技术,队列消息都在windowsX之间使用。然而有两点主要不同。首先,各系统的窗体只是个窗体,它就象一张白纸,程序可以在它上面做任何事情。不象win32里每个控件只在授权内的窗体起作用,系统中的控件只是一张图。当你点了控件时,你实际上也点了包含它的窗体,程序来判断鼠标下是否有控件并执行之。第二,也是最重要的,X消息只是个通知,而不是控件消息。你不能只通过发送消息通知某窗体去做什么。你当然不能通知它跳到内存里的某一位置再去执行它。你最能做的就是给它发送一个鼠标点击或者键盘敲击来响应你粘贴的命令--你当然不能通知控件去粘贴剪贴板里的内容。这样,理论上这种攻击也存在针对X的可能性但实际上太难实现。你可能用假的消息注满程序看看它是怎么响应的;你可以发一个破坏了的消息再看看它是怎么响应的。幸运的是可以选择在某一时间如何处理和响应消息,所以上面的工作都能得到很好的处理。


地主 发表时间: 04-04-26 13:31

论坛: 菜鸟乐园

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号