xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
添加文章 Xcon English Version

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.
声明:
   本文涉及技术知识仅供仅供安全研究与教学之用,使用者风险自负!