MS08-067 介绍&利用方法

时间:2008-11-17 11:33:59  来源:互联网  作者:  字号:【
漏洞名称:Windows Server服务RPC请求缓冲区溢出漏洞(MS08-067)
  此安全更新解决了服务器服务中一个秘密报告的漏洞。
  如果用户在受影响的系统上收到特制的 RPC 请求,则该漏洞可能允许远程执行代码。 在 Microsoft Windows 2000、Windows XP 和 Windows Server 2003 系统上,攻击者可能未经身份验证即可利用此漏洞运行任意代码。此漏洞可能用于进行蠕虫攻击。 防火墙最佳做法和标准的默认防火墙配置有助于保护网络资源免受从企业外部发起的攻击。
  默认情况下能建立空连接。
  这个漏洞的利用很复杂,这里转一篇文章,大家可以稍微看一下!
  ==以下是转载内容===细节=============================================================
  这个漏洞就不介绍了,已经沸沸扬扬了。
  首先milw0rm上那个exp的编译问题,作者在里面放的些小trick很容易fix,主要麻烦的是midl编译idl文件后,在VC6环境下编译可能出现rcpt库的错误。可能是SDK的版本导致的,云舒用最新的SDK(好像是2008?)编译成功了。
  其次是触发问题,什么权限都不需要,空连接后就能触发。
  ncacn_np:\\\\192.168.152.101[\\pipe\\srvsvc] 直接请求就可以了。
  问题还是出在 NetpwPathCanonicalize() 的第二个参数,这个漏洞非常奇特。
  首先这个参数的长度不能超过 0x207(unicode)
  71BB58F6 81FF 07020000 CMP EDI,207
  71BB58FC ^ 0F87 F447FFFF JA NETAPI32.71BAA0F6 // 如果大于了就直接函数返回了
  71BB5902 ^ E9 1247FFFF     JMP NETAPI32.71BAA019
  然后会走到一个wcscat的地方,这里没有问题,因为空间是足够的
  71BAA019 8D85 E8FBFFFF LEA EAX,DWORD PTR SS:[EBP-418]
  71BAA01F 53              PUSH EBX
  71BAA020 50              PUSH EAX
  71BAA021 FF15 9810BA71 CALL DWORD PTR DS:[<&msvcrt.wcscat>]     ; msvcrt.wcscat
  继续往下会把所有的 "/" 替换为 "\" 这里也无关紧要
  然后就走到出问题的函数
  71BAA05A 8D85 E8FBFFFF LEA EAX,DWORD PTR SS:[EBP-418]
  71BAA060 50              PUSH EAX
  71BAA061 E8 AB020000     CALL NETAPI32.71BAA311

  估计很多人在这里绕晕了,我跟了一晚上,总算搞明白了一点。
  首先是为什么老是会上溢的问题,这个就是这个漏洞的原因所在了。cocoruder在blog上引用了这么一段话:
  There are two copies, the first copy is OK, but when there is another "..\", it will lead to start the another copy (repeat the first copy codes), the second copy firstly does not calculate the base pointer correctly (firstly it is basePointer-2, so the 'JZ' checking in the loop of searching character '\' will never come ture), that lead to get an unexpected stack pointer which is below the base pointer, after the wrong calculation, it starts the second copy and uses the unexpected pointer as the first parameter of function "wcscpy()", therefore, the wrong-calculation memory will be rewritten. The EIP will be controlled in the main function, probably.
  实际上就是在找目录的时候,
  \x\..\yyyyyyyyyyyyy
  会拷贝为 \yyyyyyyyyyyy 中间的 \x\.. 就没有了。
  然后程序会往栈的上面去找 "\" 的存在,但是往往栈低址里没有 "\"的存在,所以就找完了整个栈,上溢了。
  很多同学估计都卡在这个地方了。
  bp 0x71baa398 first copy 第一次拷贝,这里没问题
  71BCDC12 8D46 04       LEA EAX,DWORD PTR DS:[ESI+4]
  71BCDC15 8BCE          MOV ECX,ESI
  71BCDC17 50              PUSH EAX
  71BCDC18 51              PUSH ECX
  71BCDC19 FF15 2C10BA71 CALL DWORD PTR DS:[<&msvcrt.wcscpy>]     ; msvcrt.wcscpy
  此时 si = 0x2e 然后前后判断是否是 \..\
  71BAA363 8D46 FE       LEA EAX,DWORD PTR DS:[ESI-2]
  71BAA366 3BD8          CMP EBX,EAX
  71BAA368 0F85 50380200 JNZ NETAPI32.71BCDBBE
  71BAA36E 8D46 02       LEA EAX,DWORD PTR DS:[ESI+2]
  71BAA371 66:8B10       MOV DX,WORD PTR DS:[EAX]
  71BAA374 66:83FA 2E    CMP DX,2E
  71BAA378 0F85 8A380200 JNZ NETAPI32.71BCDC08
  71BAA37E 8D46 04       LEA EAX,DWORD PTR DS:[ESI+4]
  71BAA381 66:8B18       MOV BX,WORD PTR DS:[EAX]
  71BAA384 66:83FB 5C    CMP BX,5C
  second copy 第二个拷贝,把中间的 \x\.. 弄没了
  71BAA388 /0F85 3D380200 JNZ NETAPI32.71BCDBCB
  71BAA38E |85FF          TEST EDI,EDI
  71BAA390 |0F84 0B630000 JE NETAPI32.71BB06A1
  71BAA396 |50              PUSH EAX
  71BAA397 |57              PUSH EDI
  71BAA398 |FF15 2C10BA71 CALL DWORD PTR DS:[<&msvcrt.wcscpy>]     ; msvcrt.wcscpy
  漏洞代码就是下面这个:
  71BCDBDE 8D47 FE       LEA EAX,DWORD PTR DS:[EDI-2]
  71BCDBE1 66:8338 5C    CMP WORD PTR DS:[EAX],5C
  71BCDBE5 /75 18           JNZ SHORT NETAPI32.71BCDBFF
  71BCDBE7 |66:8B38       MOV DI,WORD PTR DS:[EAX]
  71BCDBEA |8B4D 08       MOV ECX,DWORD PTR SS:[EBP+8]
  71BCDBED |66:83EF 5C    SUB DI,5C
  71BCDBF1 |66:F7DF       NEG DI
  71BCDBF4 |1BFF          SBB EDI,EDI
  71BCDBF6 |F7D7          NOT EDI
  71BCDBF8 |23F8          AND EDI,EAX
  71BCDBFA ^|E9 55C7FDFF     JMP NETAPI32.71BAA354
  71BCDBFF \3B45 08       CMP EAX,DWORD PTR SS:[EBP+8]
  71BCDC02 ^ 74 E3           JE SHORT NETAPI32.71BCDBE7
  71BCDC04 48              DEC EAX
  71BCDC05 48              DEC EAX
  71BCDC06 ^ EB D9           JMP SHORT NETAPI32.71BCDBE1
  试图往栈低址去寻找"\",结果错误计算了开始的地址,导致根本找不到。
  按照cocoruder的说法,在计算错误后,有机会第二次执行第二个 wcscpy ,从而覆盖那个错误计算出的地址。
  不过我没找到能再次执行拷贝的方法,我的整个栈低址几乎就是一片0,每次都上溢了.
  有的机器里也许能够找到那个“\”吧,或者存在一种能够稳定利用的方法。
  使用 \\pipe\browser 好像也有机会控制EIP,可以继续搞搞。
  ==以上是转载内容===细节=============================================================
  ==以下是微软官方发布的消息==========================================================
  解决了如果用户接收到一个精心制作的 RPC 请求在受影响的系统上的可能允许远程代码执行 $ 服务器服务中一个漏洞。
  相信很多Windows用户在今天早些时候已经收到了系统更新通知,您是否会误以为微软的正版验证找到了您?很幸运这个补丁并不会给您的系统造成黑屏,然而更严重的威胁却已经逼近。今天早些时候的微软补丁,是两年来微软第二次打破常规的补丁发布,按照微软的命名习惯,此安全补丁编号“KB958644” (MS08-067)。
  微软日前临时发布了一款补丁软件,修正一个使黑客能够远程控制用户Windows计算机的危急缺陷。
  微软一名安全计划经理克里斯托弗·巴德在一篇博客文章中写道,这一补丁软件修正了Server服务中的一个缺陷,该缺陷影响当前所有得到支持的Windows版本。
  在Windows XP及以前版本的Windows中,该缺陷的危险等级为“危急”;在Windows Vista及以后的版本中,该缺陷的危险等级为“重要”。由于该缺陷会使旧版本Windows上“蠕虫横行”,微软建议用户应当尽快测试和部署这款补丁软件。
  微软在MS08-067号安全公告中警告称,这一缺陷存在于Server服务中,黑客可以利用一个经过特别设计的远程过程调用请求执行任意代码。
  补丁软件管理厂商Shavlik Technologies的一名安全经理詹森·米勒(Jason Miller)表示,微软临时发布补丁软件的原因是,它已经发现了利用该缺陷的攻击。
  巴德表示,利用该缺陷发动攻击的恶意代码名为“TrojanSpy:Win32/Gimmiv.A”和“TrojanSpy:Win32/Gimmiv.A.dll”。他说,微软已经通过“微软恶意件保护中心”发布了相应的恶意件特征代码。
  米勒说,“这一缺陷相当严重,它影响所有版本的Windows操作系统,黑客甚至无需诱惑用户采取什么措施就能够发动攻击。[size=+0]”他最大的担心是,黑客可能开发一款蠕虫病毒,控制大量被感染的计算机。对于希望建立庞大僵尸网络的黑客而言,这简直就是一座金矿。
  在微软施行每月一次安全升级制度以来,这还是第二次打破惯例。上次让微软破例进行安全升级的不定位,是2007年4月的ANI动态光标漏洞,可想而言此次微软补丁升级将会给用户打来严重的威胁。
  攻击者通过发送一个伪装的RPC请求欺骗用户接收,进而会使受攻击系统允许远程执行代码,更严重的是在部分系统上无需认证就能执行任意代码,因此对Windows用户的安全威胁不言而喻。IT专家网强烈建议用户立即更新相关补丁。
  MS08-067漏洞将会影响除Windows Server 2008 Core以外的所有Windows系统,包括:Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本,甚至还包括测试阶段的Windows 7 Pre-Beta。
  ===以上是微软官方发布的消息=========================================================
  金山毒霸反病毒工程师对微软MS08-067漏洞的攻击原理做了详细的解释,“一个未授权的攻击者可以远程触发该漏洞,可以执行Windows Server 2000, Windows XP和 Windows 2003机器上的代码。一般情况下,Windows Vista和Windows Server 2008系统都需要认证。然而,攻击者必定是接触到RPC界面来利用该漏洞进行攻击。在默认的情况下,攻击者是接触不到界面的,因为Windows XP SP2, Windows Vista, and Windows Server 2008系统中防火墙是默认开启的。但当防火墙关闭、防火墙开启但文件、打印机共享开启任意一种情况下都可以暴露RPC界面。”

0

顶一下

0

埋一下

引用地址: