DriverStudio Remote Control远程调用认证绕过漏洞及其利用研究创建时间:2005-09-14 更新时间:2005-09-17 文章属性:原创 文章提交:cocoruder (frankruder_at_hotmail.com) DriverStudio Remote Control远程调用认证绕过漏洞及其利用研究 author:cocoruder page:http://ruder.cdut.net email:cocoruder@163.com && frankruder@hotmail.com 漏洞名称:DriverStudio Remote Control远程调用认证绕过漏洞 发现者:cocoruder 类型:设计错误 更新时间:14/9/2005 受威胁的系统: >=NuMega.DriverStudio.v2.7 已在如下版本中测试成功: NuMega.DriverStudio.v2.7(windows 2000 sp4|windows xp sp1) NuMega.DriverStudio.v3.0beta2(windows 2000 sp4|windows xp sp1) 未受威胁的系统: 目前未知 厂商: http://www.compuware.com 漏洞描述: SoftICE Driver Suite是一款强大的windows内核级调试软件,有着广泛应用。其默认安装的"DriverStudio Remote Control"服务允许使用客户机的用户/密码认证通过的客户修改本地softice配置,但这个认证可被绕过,使得任意远程攻击者可修改本地softice配置。成功利用此漏洞可获取系统权限。 详细描述: DriverStudio在默认安装的时候在系统中创建一个服务名为"DriverStudio Remote Control"的服务,对应进程名为"DSRSvc.exe",根据我这几天的分析,DSRSvc.exe主要实现了下面几个功能: 1.实现远程更改softice启动方式的rpc调用接口 2.实现远程更改softice配置文件的rpc调用接口 3.实现远程获取本地计算机及DriverStudio信息接口和远程重启计算机接口(这个是通过UDP数据包实现的) 如果远程计算机使用和本地一样的用户名/密码,在bin目录下找到dsconfig.exe,在命令行下输入dsconfig -t ip即可象修改本地配置一样修改远程配置(保存在drivers/winice.dat文件中)。其间采用DCE RPC&NTLM协议通信/认证,分析显示它是把当前用户名/密码发送到远程进行认证的,如果我们自己发送数据包,在NTLM认证的时候使用空认证(NULL Session Login),同样可以认证通过并修改远程softice配置。而禁止系统的空连接仍可认证通过,可见是DriverStudio导致的问题。 另外,向目标机UDP 9110 端口发送如下缓冲区即可导致系统重新启动,这里没有进行任何身份验证。事实上,这是另一个独立的漏洞,偶测试在xp下会弹出重启倒计时的进度条并可cancel,在2000下会直接重启。 02 00 00 00 41 41 41 00 <-00000002为重启命令码 综合利用以上弱点可获取系统权限。 详细利用方法: 由于可以修改softice的配置,依赖softice强大的命令可以完成攻击。"INIT"配置项可配置在softice启动时运行的命令,结合我们可修改softice的启动方式,如果我们把softice设置成Automatic,softice就会随windows一起启动,启动的时候就会运行我们设置的softice命令,如果我们在命令上做些手脚,嘿嘿...事实上,我们拥有了对所有进程的所有内存空间的任意修改权限。但要安全而又通用地获取权限还是很有难度的,我本来想通过修改系统的某些特殊api的返回值来达到操作系统对我们"完全开放"的目的(比如任意ntlm验证都可成功什么的),但对windows核心实在不懂(如果有大牛知道了请告诉我:)),还好,偶想到了个比较好的办法,并在windows 2000 server+DriverStdio2.7上测试成功。 这里又用到了Dsrsvc.exe,它还监听UDP 9110端口,负责处理UDP的命令码(比如重新启动计算机)。任何发送到这个端口的数据包都是由DSStatusServer模块的如下代码处理的 .text:10003F59 push esi .text:10003F5A push edx .text:10003F5B call ??2@YAPAXI@Z ; operator new(uint) .text:10003F60 mov ecx, [esp+138h+len] .text:10003F64 add esp, 4 .text:10003F67 mov esi, eax .text:10003F69 lea eax, [esp+134h+fromlen] .text:10003F6D push eax ; fromlen .text:10003F6E push ebp ; from .text:10003F6F push 0 ; flags .text:10003F71 push ecx ; len .text:10003F72 push esi ; buf .text:10003F73 push edi ; s .text:10003F74 call ds:recvfrom ;recvfrom .text:10003F7A test eax, eax ;<------------modifit! .text:10003F7C jle short loc_10003FA6 .text:10003F7E push esi .text:10003F7F call sub_10003910 修改10003f7a这个地址的代码,改成jmp esi(注意,偶测试过程中发现3.0beta2版本是edi指向buf,因此要改为jmp edi),esi指向ws2_32!recvfrom的buffer,修改好后,我们对UDP 9110端口发送我们的exploit,Dsrsvc.exe接收完就会跳到我们的exploit执行~~ 但是要注意的是,由于DSStatusServer为一动态链接库,10003F7A这个地址在虚拟空间是不好定位的,还好softice强大的命令又帮了我们大忙:),下断点 bpx recvfrom do "eb *esp ff,e6" ;ff,e6为jmp esi机器码 当运行到recvfrom时esp即为返回地址指针,这个返回地址即是上面的10003F7A,为了在实际攻击中避免出现修改到别的地方去了,偶跟了下发现DSStatusServer的recvfrom函数的len参数始终为00000172h,于是 bpx recvfrom if *(esp+c)==00000172 do "eb *esp ff,e6" 中断后恢复运行, bpx recvfrom if *(esp+c)==00000172 do "eb *esp ff,e6;x" 另外由于用到recvfrom函数,需要在配置文件里添加一项, EXP=c:\windows\system32\ws2_32.dll ;这个地方偶是固定写进去的,55,EXP=\SystemRoot\System32\ws2_32.dll居然不行(why?) 远程调用/认证分析: 整个rpc调用过程如下(基与dsconfig -t ip的分析) connect 135 port(local)---->rpc bind(local)---->rpc bind_ack(remote)---->map request(local)---->map response(remote)(返回监听的端口stice_port) ---->connect stice_port(local)---->bind UUID(local)---->bind_ack(remote)---->AUTH(local)(认证,使用空认证)---->request(local)(命令请求) ---->reponse(remote)(返回成功否) 其中涉及两个rpc接口,分别为 UUID:32d90706-b698-4029-b236-e18ebff582b1 负责softice启动方式更改 UUID:10d1800c-af75-4249-b7a2-484dec69ed3a 负责更新winice.dat文件 攻击思路总结: 1.精心构造rpc调用实现修改远程配置文件winice.dat,并把softice启动方式改为Automatic 2.发送UDP重启码至target,并等待重启 3.重启后发送shellcode至UDP 9110端口 (这几天一直在想更好的利用方法,希望有大牛提出更好的利用方法) 测试程序: 1.modifit_config.cpp 2.send_reboot.cpp 3.send_shellcode.cpp (出于责任和安全,这里不公开详细的攻击代码:)) 解决方案: 厂商未提供相应补丁,建议用户禁止并停掉"DriverStudio Remote Control"服务。 致谢: 感谢我的同事们,和zwell. 声明: 本文涉及技术知识仅供仅供安全研究与教学之用,使用者风险自负! |