探索黑客技术攻防,实战研究与安全创新

导航菜单

首发超星阅览器特殊 URI远程溢出漏洞

“超星阅览器”的名字在国内几乎可以与微软的 Word、Adobe公司的 PDF相媲美。国内很多电子图书的格式多半都会是  PDG格式,也就是“超星阅览器”支持的文件格式。PDG格式是一种可以将图片、文字整合在一起,便于用户阅读查看的文件格式。

“超星阅览器”采用 PDG格式,将大量的文件资料保存为电子图书供用户使用。同时,“超星阅览器”有一个非常庞大的网上电子图书库,这就为喜欢阅读的网民提供了丰富的图书资源。为此,在国内很多高等院校以及科研院所中,都会采用“超星阅览器”作为资料查看阅读软件。在过去的几年里,“超星阅览器”被发现存在大量的安全漏洞。其中,大部分的漏洞都集中于“超星阅览器”自带的 ActiveX控件。这些漏洞可以直接造成 IE浏览器发生溢出并执行任意代码,一时间,“超星阅览器”的安全漏洞被恶意攻击者制作成了网页木马程序到处散播,影响十分恶劣。后来,“超星阅览器”的开发者意识到了安全问题的严重性,将“超星阅览器”的代码利用 Delphi语言重新书写了一遍(以前的“超星阅览器”是由 VC开发的),原因可能有两个:一是Delphi的开发简便,某些安全机制好一些;二是去除带有安全隐患的那些ActiveX控件,增强软件的安全性。这个最新开发出来的“超星阅览器”就是我们今天故事的主角“超星阅览器 4.01”。

在以前我发布“超星阅览器”的安全漏洞时,我曾保留过一些安全漏洞的信息,当我看到“超星阅览器”最新的版本“超星阅览器4.01”时,我便有了想要再次测试一下的想法。这里就带领读者一起来做一个安全测试,让我们检测一下最新版本的“超星阅览器 4.01”是不是如同想象中那样安全。

本次测试的环境首先给大家明确一下,操作系统选用的是Windows XP SP3,在该系统下安装了“超星阅览器 4.01”,系统自带浏览器为 IE6。如图 1所示。

QQ截图20160908145258.png

现在,让我们使用“超星阅览器 4.01”随意打开一个 PDG文件,如图 2所示。

QQ截图20160908145327.png

此刻,我这里打开的  PDG文件名叫“p.pdg”,我们注意到一个细节,当“超星阅览器 4.01”打开“p.pdg”文件之后,“超星阅览器4.01”的地址栏处显示出一个非常特殊的  URI:book://ssreader/e0?url=C:\Documentsand  Settings\Administrator\桌面\p.pdg&pagenum=1&pagetype=0。

“URI”的意思大家都知道,简单地理解,可以认为就是一个“地址”。

“超星阅览器 4.01”在读取某一个PDG文件的时候,其实从某种意义上讲,它的工作原理就类似于我们常常使用的  IE浏览器,PDG文件就相当于一个网页文件。于是,“超星阅览器 4.01”就像  IE浏览器一样,利用某一个“网址”来打开某一个 PDG文件,这个“网址”就是我们在图  2中看到的那个  URI。

与 IE浏览器不同,“超星阅览器  4.01”的 URI是以“book:”开头的。这意味着,“book:”这个协议是由“超星阅览器 4.01”来负责解析的。我们可以做一个简单的测试,我们打开  Windows系统自带的“运行”窗口,在其中键入“book:”,如图 3所示。

QQ截图20160908145524.png

这个时候,我们点击“确定”按钮,你就会发现系统自动打开了“超星阅览器 4.01”,这也就证明了我们前面的话题。回过头再次看一看图2中的URI:

book://ssreader/e0?url=C:\Documentsand  Settings\Administrator\桌面\p.pdg&pagenum=1&pagetype=0。

“book:”协议后是一个特殊的字符串“ssreader/e0?url=”,这段字符串的意思我们暂时可以不去思考,关键的是后面的“C:\Documents and Settings\Administrator\桌面\p.pdg”。这一段字符串代表的是被我们打开的“ p.pdg”文件的完整路径。这种结构的 URI使得我们产生了一个想法。既然URI中存在文件的完整路径,那么,我们就可以从这里入手,来测试一下软件在处理过长的文件路径时会不会发生典型的缓冲区溢出漏洞。

现在,编写一段测试用的URI如下:

book://ssreader/e0?url=C:\Documents and Settings\Administrator\桌面\ p

p p p p p p p p p  p p p p p p p p p p p p p p  p p p p p p p p p p p p p p  p p

p p p p p p p p p  p p p p p p p p p p p p p p  p p p p p p p p p p p p p p  p p

p p p p p p p p p  p p p p p p p p p p p p p p  p p p p p p p p p p p p p p  p p

p p p p p p p  p p p p p p p p p p p  p p p.pdg&pagenum=1&pagetype=0。

这里我们将“p.pdg”文件名的长度故意加长(注意长度要尽可能长一些,多于 1024个字节)。复制这段  URI到  Windows系统中的“运行”窗口中,回车。你会发现“超星阅览器 4.01”没有发生任何变化。

难道说我们的测试是错误的,“超星阅览器  4.01”没有存在缓冲区溢出漏洞?其实,Windows的“运行”窗口对我们所输入的字符串长度是有限制的,我们过长的  URI被系统限制自动割断了。为了充分测试“超星阅览器 4.01”,我们应该将上述的 URI放入到“超星阅览器4.01”的地址栏中去测试。如图 4所示。

 

QQ截图20160908145710.png

将我们的测试用 URI复制到“超星阅览器  4.01”的地址栏中后,点击“超星阅览器 4.01”地址栏最右侧的那个箭头或者直接回车,你会发现在那一瞬间,“超星阅览器 4.01”的界面竟然崩溃消失了!

连忙结合 Ollydbg程序,监视“超星阅览器4.01 ”的进程“Ssreader.exe”,我们最终看到了“超星阅览器 4.01”发生崩溃的原因,如图 5所示。

QQ截图20160908145742.png

图中的内存地址不可读错误是我们常见的一种缓冲区溢出错误提示,如果读者朋友将图 5中的内存地址  0x702E6867,转换成字母,你就会发现这个内存地址其实就是“p.hg”的十六进制表达式。这是我后来测试时输入的 PDG文件名称的一部分。

在 Ollydbg监视到“超星阅览器  4.01”发生溢出错误的时候,我们还注意到一个细节,如图 6所示。

QQ截图20160908145808.png

溢出发生时,程序栈中保存着过长 URI的地址,即图中0x0012ECB4这里,这是非常重要的一个信息。因为我们需要控制“超星阅览器 4.01”在溢出发生时跳转到我们的  shellcode上去执行,而我们的 shellcode就放置在  URI中。为此,我们现在的思路就是用一个“特殊内存地址”,这个内存地址上的指令应该是类似“pop  xx,pop xx,retn”这样(xx代表寄存器),经过两次  pop指令,栈中指向URI的内存地址就会被作为“超星阅览器  4.01”在溢出发生后跳向的内存地址。“特殊内存地址”的寻找其实也很简单,我们利用  Ollydbg在挂接“超星阅览器  4.01”后,利用“可执行模块”功能(快捷键Alt+E),可以看到此刻“超星阅览器 4.01”所有的模块信息,如图  7所示。

QQ截图20160908145844.png

我们选择一个系统的库文件,双击该行,Ollydbg就会打开该库文件的反汇编代码窗口,如图 8所示。

QQ截图20160908145912.png

在其中,我们就可以一行一行查看有没有符合我们要求的类似“pop  xx,pop xx,retn”这样的地址。将该地址与 shellcode结合在一起构造 URI地址,该  URI的结构应该是这样:book://ssreader/e0?url=随意填充字符+跳转指令四个字节+覆盖用的特殊内存地址+ shellcode这里需要简单解释一下“跳转指令四个字节”,当“超星阅览器4.01”溢出时,它首先跳转到“特殊内存地址”执行“pop xx,pop xx,retn”指令,之后就会跳入到URI存放的内存地址上,可是,此刻CPU所处的内存地址正好是  URI中“特殊内存地址”的前四个字节,为此,我们将命令 CPU执行一个跳转,跳过“特殊内存地址”这四个字节去执行后面的  shellcode,目的是为了不要破坏“特殊内存地址”。好了,现在将该特殊 URI放入到“超星阅览器  4.01”的地址栏中回车,我们的 shellcode成功执行了(这里为了演示  shellcode指令代码为“66 66”),如图 9所示。

QQ截图20160908145958.png

漏洞至此好像已经完全介绍了完了,但是,大家请注意,如果该漏洞只能是我们输入到“超星阅览器 4.01”的地址栏中回车来触发,那么就相当于自己给自己运行 shellcode,意义不大。要是我们能够将它变为远程触发,那该漏洞的威力就大多了!要想实现这个目的很简单,我们编写一个网页文件就可以实现,其代码大致如下:

<a  href=book://ssreader/e0?url=特殊的内容  &pagenum=1&pagetype=0

target=_blank >触发漏洞</a>


这段网页代码很简单,我们借助超级链接的功能来实现调用特殊URI,系统在解析该  URI时会自动调用用户系统中的“超星阅览器4.01”,如此一来,我们就实现了远程触发“超星阅览器  4.01”的缓冲区溢出漏洞!

真是没有想到,“超星阅览器  4.01”在升级之后还是没有逃脱安全漏洞的威胁。一个原本看似只是本地才能触发的缓冲区溢出漏洞,在我们的研究和调试下却成为了一个远程溢出漏洞,恶意攻击者只需要编写一个网页,利用超级链接构造特殊 URI,再加上一些欺骗的话,如“点击这里查看新书内容”。此刻,安装了“超星阅览器  4.01”的用户一旦点击该超级链接,他的系统就会在不知不觉中被安装上木马程序,危害极大。

说到这里,我想起以前我其实已经公布了这个漏洞,但是那个时候我没有说明怎样远程利用,“超星阅览器  4.01”的开发者可能因此没有重视这个漏洞的存在,现在我想应该赶紧修正了。该漏洞在某种意义上讲,是一个经典的远程溢出漏洞,与过去曾出现的一个  realplay漏洞类似。

其实,除了这种远程利用该漏洞的方法,我们也可以实现文件传播式的漏洞触发方法。“超星阅览器  4.01”支持一种叫做“书签管理器”的功能,如图 10所示。

QQ截图20160908150110.png

这个叫做“书签管理器”的功能窗口中,我们看到有一个按钮上显示着“导入书签备份”。这其实就是一个将用户保存好的书签列表文件导入“超星阅览器 4.01”中成为书签。而“超星阅览器 4.01”的书签列表备份文件是以 XML语言组织的文件,其内容大致如下:

<EortBookMarkDateTime="2011-02-12 13:34:45"><T0Item="a"

ame="1"

Type="1"

ookName="1"

URL="book://ssreader/e0?url=F:\1.pdg"

talPageNum="1"

PageNumber="1"

sdir="False"
te="2011-02-12 PM 01:31:10" Time="2011-02-12  PM 0" SSNum="0"
isitTimes="0"
weagebeginlocation="0"
webpageendlocation="0"
InsertPageNumber="1"
PageType="1"
BookNote="
无
"
Reverse=""/></ExportBookMark>


在上面这个书签列表备份文件中可以找到一个叫做“URL”的标签,通过这个标签我们分析出来,“超星阅览器  4.01”的书签列表备份文件中包含了关于一个 PDG文件名称、书签建立时间等等信息。而这其中的“PDG文件名称”就是一个非常好的利用点。我们可以将前面我们创建出来的测试用  URI放置到“超星阅览器4.01”的书签列表备份文件中,作为“URL”参数的数值,即修改上面的书签列表备份文件内容为:

<ExportBookMarkDateTime="2011-02-12 13:34:45"><T0Item="a"

ame="1"

BookName="1"

RL="ok://ssreaer/e0?url=F:\111111111111.pdg1.pdg1.pdg1.pdg1.pd

g1.pdg1.pdg1.pdg1.pdg2.pdg2.pdg2.pdg2.pdg2.pdg2.pdg2.pdg2.pdg2.pd

g2.pdg3.pdg3.pdg3.pdg3.pdg3.pdg3.pdg3.pdg3.pdg3.pdg3.pdg4.pdg4.pd

g4.pdg4.pdg4.pdg4.pdg4.pdg4.pdg4.pdg4.pdg5.pdg5.pdg5.pdg5.pdg5.pd

g5.pdg5.pdg5.pdg5.pdg5.pdg6.pdg6.pdg6.pdg6.pdg6.pdg6.pdg6.pdg6.pd

g6.pdg6.pdgw.pdgj.pdgg.pdgffffxxxxdg7sssssssssssssssssssssssssssssssss

sssssssssssssss.pdg" Type="1"TotalPageNum="1" PageNumber="1"

isdir="False"  Date="2011-02-12  PM  01:31:10" Time="2011-02-12  PM

0"

SSNum="0"

VisitTimes="0"

webpagebeginlocation="0"
webpageendlocation="0"
InsertPageNumber="1"
PageType="1"
BookNote="无" Reverse=""/></ExportBookMark>

保存上面的代码为“ 0.XML”文件,这就是一个“超星阅览器4.01”的书签列表备份文件。然后,将这个文件发送给受害者,告诉他导入这个书签列表文件,他就可以看到很多电子图书。受害者不注意将该书签列表文件导入“超星阅览器 4.01”,他的“超星阅览器 4.01”的“书签”菜单中就会多出一个叫做“a”的书签,如图 11所示。

QQ截图20160908150255.png

一旦受害者点击该书签,他就会直接触发漏洞,最终被恶意植入木马程序,成为恶意攻击者一个新的“肉鸡”。过程只是几秒钟而已,受害者可能也许只会觉得软件崩溃了,最终删除这个“没有用”的书签。最后,“超星阅览器  4.01”的漏洞已经被我们发现了一个,但是问题还不仅仅限于此,还有很多危害极大的安全漏洞,有一个漏洞的发现更是匪夷所思,关于这些漏洞我将在以后的文章中逐步公布出来。这个漏洞已经汇报超星官方,也得到了确认,本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。