利用HTTP协议和IE的漏洞在其他计算机上运行一个程序
作者:星轨(oRbIt)
E_Mail :inte2000@163.com
我们每天都使用网络浏览五彩缤纷、动感十足的网页,查询需要的信息,你是否想过这些都是嵌入的脚本代码的功劳呢?如果没有这些脚本代码,网页就只是静态的图片和文字的组合,看起来索然无味,网络的魅力顿失。但是,和任何其他事情一样,嵌入网页的脚本代码也有两面性:一方面,网络工程师可以通过脚本编程为网页带来很多匪夷所思的效果,制作出既漂亮又功能强大的网页;另一方面,别有用心的人也能利用这些代码给你的系统带来危害。一些网站故意将这些恶意代码嵌入网页,搜集访问者的信息,将其网址设为IE的默认打开页面,甚至锁定访问者的注册表,在访问者的计算机上植入木马程序等等。这些恶意脚本代码往往隐蔽执行,在访问者毫无觉察的情况下完成操作,所以具有很大的危害性。
具有破坏性的恶意脚本代码通常也被称为脚本病毒,脚本病毒不是可执行程序,它只是一段程序的代码序列,通常是VB Script,因为VB Script功能强大并且有Windows操作系统的脚本调试器支持,使用它编制的恶意脚本代码往往破坏力巨大。脚本病毒通常可以分为两类,一类是单纯的脚本代码,它的所有功能都在脚本代码中实现,通过在宿主计算机上直接执行脚本代码达到破坏目的。这一类病毒通常是嵌入到网页内欺骗宿主计算机执行或使用Html格式的邮件发送给宿主计算机,欺骗宿主计算机的使用者打开邮件,从而执行病毒代码。另一类脚本病毒是脚本代码和可执行文件相结合的复合型脚本病毒,执行破坏作用的主体是可执行文件,脚本代码只是起到传播和植入作用。这一类型的脚本病毒主要是通过发送电子邮件到宿主计算机,欺骗宿主计算机的使用者打开邮件,通过嵌入Html格式邮件内的脚本代码执行附件中隐藏的病毒体。但是也可以嵌入网页中,利用HTTP协议和IE的漏洞在网页浏览者的计算机上执行,本文就是介绍这样一种方法。
要想在宿主计算机上执行一个程序,首先要将程序文件植入到宿主计算机。正常情况下脚本代码是没有访问宿主计算机的权限的,但是利用HTTP协议和IE的漏洞却可以做到这一点。HTTP协议支持在网页中埋入媒体文件,并且可以扩充媒体文件的类型,但只是根据文件的扩展名称判断媒体文件类型,并没有对媒体文件的合法性(是否真的是这种类型的媒体文件)进行验证,这就给了我们可乘之机--将我们的可执行程序伪装成合法的媒体文件欺骗HTTP协议,使HTTP协议将其当成媒体文件传输。但是怎么利用这一点呢?具体讲就是如何找到这个已经下载到宿主计算机上的文件呢?这就要用到IE浏览器的一个漏洞了,IE在浏览一个网页时会将网页中嵌入的媒体文件都下载到一个临时目录中,这个临时目录的位置是固定的,在保存文件时会使用网页中指定的文件的原始名称,如果该目录中已经存在同名的文件,就在文件名后面添加“[1]”、“[2]”等以示区别。根据这些“规律”我们就可以编写嵌入网页中的脚本代码在浏览器的缓存目录中找到我们的程序。
原理虽然简单,但是还有很多问题需要考虑,首先是如何欺骗放病毒软件。将可执行程序文件的扩展名改成bmp、jpg、gif等媒体文件类型的扩展名并不难,却很难逃过防病毒软件的侦察,很多防病毒软件是通过查看文件的头结构来判断文件类型的,所以简单的改名字是很容易被识破的。不过正所谓“道高一尺,魔高一仗”,我们可以伪造一个头结构来骗过这类防病毒软件。通常我们采用bmp位图文件来伪装可知行程序,伪造一个合法的位图文件头结构,将可执行文件作为位图数据嵌入位图文件。之所以选择伪装成bmp位图文件格式是因为bmp位图文件头结构简单,容易伪造,很多软件都是利用bmp文件伪装自己或隐藏信息。位图文件有一个长度为14个字节的文件头结构和一个长度为40字节的位图信息头结构,使用C++语言可作如下描述:
typedef struct tagBmpFileHeader //位图文件头结构
{
char bfSign[2]; //文件特征,一般是标志“BM”
unsigned long bfSize;
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned long bfOffBits;
}BmpFileHeader;
typedef struct tagBmpInfoHeader //位图信息头结构 (Windows 风格)
{
unsigned long biSize; //信息结构的大小,40,这个字段必须正确填写
long biWidth;//位图的宽度
long biHeight;//位图的高度
unsigned short biPlanes;
unsigned short biBitCount; //颜色深度
unsigned long biCompression;
unsigned long biSizeImage;//位图数据的大小
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
}BmpInfoHeader;
文件头结构的bfSign必须是“BM”,bfSize是整个位图文件的大小,bfOffBits对于24位位图就是文件头结构加位图信息头结构的大小,对于使用调色版的位图文件还要跨过调色版区域,一般可以随便填写,防病毒软件通常不检查这个字段,bfReserved1和bfReserved2必须是0。位图信息头结构的biSize必须是40,biBitCount通常选择24,因为24位位图计算大小比较简单。biSizeImage 由biWidth和biHeight以及biBitCount字段共同决定,可以根据可执行文件的大小适当的填写,但是要保证biWidth*biHeight*biBitCount / 8稍大于可执行文件的大小,在计算biSizeImage还要注意位图文件的数据每行按4字节对齐,适当的选择biWidth和biHeight,使计算出来的biSizeImage稍大于可执行文件的大小,多出来的部分可以用随机数字填充。
骗过浏览器和防病毒软件之后要做的事情就是找到我们的假bmp位图文件,将可执行文件从位图文件中还原并执行。IE在浏览网页时会将网页中嵌入的媒体文件下载到一个缓存目录中,这个缓存目录可以从注册表中得到,其位置是:
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Cache
使用脚本对象WScript.Shell的RegRead方法可以很方便地得到这个目录,这样就可以找到我们的假位图文件,当然为了防止缓存目录中存在重名文件的问题,可以为我们的假位图文件适当地取一个长一点的比较怪异的名字。找到浏览器自动下载的假位图文件之后就可以从假位图文件中还原出我们的可执行程序,不过在IE的缓存目录中直接操作文件会引起Windows系统的警告,所以还要将伪装的位图文件复制到系统的临时目录中执行还原操作。直接操作二进制文件并不是VB Script的特长,并且通过Scripting.FileSystemObject对象操作二进制文件会引起防病毒软件的警觉,但是使用Scripting.FileSystemObject操作文本文件一般不会引起防病毒软件的注意,所以我们可以结合Win-DOS的批处理文件和DEBUG命令巧妙地解决这个问题。Win-DOS批处理文件是一个由DOS命令组成的文本文件,类似于Unix/Linux的Shell程序,其文件扩展名为.bat,我们生成的这个批处理文件要完成以下几个任务:将假位图文件从IE缓存目录拷贝到Windows的临时目录中,从假位图文件中还原出可执行文件,删除临时文件,将还原出的可执行程序拷贝到Windows的系统目录中,删除临时目录中的假位图文件以及最后运行还原出的可执行程序。只有还原出可执行文件的操作麻烦一点,其他的操作都可以用copy和del命令完成,所以我在下一段重点讲解如何不使用Scripting.FileSystemObject对象从假位图文件中还原可执行文件的操作。
还原可执行文件需要另外一个DOS命令:Debug,Debug是一个功能强大的调试工具,它有很多子命令,可以将二进制文件映射到内存中,也可以将内存中的数据写入文件,我们就利用这个特性完成可执行程序文件的还原工作。Debug命令的w子命令可以将二进制文件在内存中的映射的部分或全部写回到文件中,使用w子命令时BX寄存器存放要写入数据大小的高16位,CX寄存器存放写入数据大小的低16位,这个写入数据的大小就是我们嵌入假位图文件中的可执行文件的大小。使用w子命令要指定写入数据开始位置的偏移量,也就是要跳过假位图文件的头结构和位图信息头结构。现在举一个例子,假设嵌入假位图文件的可执行文件大小是143562字节,换算成16进制就是230C9H,位图头结构加位图信息头结构共54个字节,换算成16进制就是36H,这时Debug命令序列可以这样写:
debug ..\假位图文件的位置\fakefile.bmp //装入假位图文件
-rbx
-2 //显示BX寄存器的值并修改成2
-rcx
-30C9 //显示CX寄存器的值并修改成30C9
-w136 //从36H处开始写回文件
-q //退出Debug命令
此时假位图文件fakefile.bmp的大小是143562字节,其内容就是可执行文件,将其更名为fakefile.exe并拷贝到系统目录就可以执行了。
以上就是对这种方法的完整描述,可以看出来,这是一种非常危险的方法,网页制作者可以不经允许在访问者的计算机上执行非法程序,甚至可以使用Del,Deltree,Format等DOS命令破坏用户的文件系统。虽然这种方法设计的很巧妙,能够骗过防病毒软件,貌似很厉害,其实也很容易防范。该方法的重点在脚本代码方面,只要卸载Windows的脚本调试器就可以阻断脚本代码的执行,如果是Windows 95/98.Me的用户,可以将Windows 的Command目录下的Deltree.com、Format.com、Debug.com、Fdisk.exe这几个命令程序改个文件名就可以防范脚本代码通过Win-DOS的批处理文件执行这些命令。