2008年3月8日星期六

网页传播的木马原理以及对策 - 自由飞翔


网页传播的木马原理以及对策 - 自由飞翔(wqf2) - CSDNBlog
大家在浏览网页的时候,一不小心就会中木马。有的人很疑惑:“我又没有运行一些不不认识的程序,怎么会感染木马呢?”。其实按照现在的木马技术,根本不需要你主动运行它,只需利用操作系统的不安全的地方,通过浏览网页的过程自动注入的。请看下文。

一、网页木马或病毒传播机理:

我总结了一下,大概有以下几步骤:

1、下载木马程序。
这里使用Microsoft.XMLHTTP对象和ADODB.Stream对象将网站上事先放好的木马可执行文件(exe或dll形式的com组件)下载到本地。Microsoft.XMLHTTP对象负责获取木马文件内容,ADODB.Stream对象负责存盘。这种方法,我们开发Linkworks.net中所用到的Ajax技术已经用到了,我不多说了。

2、放置木马程序到指定的目录、伪装木马程序为系统文件

这里调用Scripting.FileSystemObject 组件将下载的木马程序拷贝到指定的目录。
这两个组件完成的功能一样,都是对文件,文件夹进行拷贝,删除,移动,重命名等操作。

我挑出了一些方法,大家看一下,一旦在脚本中调用这些方法,就可以在你机器上任意位置埋藏木马。

//列举驱动器
IDriveCollection* Drives();

//判断驱动器是否存在
VARIANT_BOOL DriveExists([in] BSTR DriveSpec);

//判断文件是否存在
VARIANT_BOOL FileExists([in] BSTR FileSpec);

//判断目录是否存在
VARIANT_BOOL FolderExists([in] BSTR FolderSpec);

//获取特殊路径(如系统路径,临时路径。。。)
IFolder* GetSpecialFolder([in] SpecialFolderConst SpecialFolder);

//删除文件
void DeleteFile([in] BSTR FileSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);

//删除目录
void DeleteFolder([in] BSTR FolderSpec, [in, optional, defaultvalue(0)] VARIANT_BOOL Force);

//移动文件
void MoveFile([in] BSTR Source,[in] BSTR Destination);

//移动目录
void MoveFolder([in] BSTR Source, [in] BSTR Destination);

//拷贝文件
void CopyFile([in] BSTR Source, [in] BSTR Destination, [in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

//拷贝目录
void CopyFolder([in] BSTR Source,[in] BSTR Destination,[in, optional, defaultvalue(-1)] VARIANT_BOOL OverWriteFiles);

//创建目录
IFolder* CreateFolder([in] BSTR Path);

//创建文本文件
ITextStream* CreateTextFile([in] BSTR FileName,[in, optional, defaultvalue(-1)] VARIANT_BOOL Overwrite, [in, optional, defaultvalue(0)] VARIANT_BOOL Unicode);

//打开文本文件
ITextStream* OpenTextFile([in] BSTR FileName,[in, optional, defaultvalue(1)] IOMode IOMode, [in, optional, defaultvalue(0)] Tristate Format);

//获取标准的输入输出流
ITextStream* GetStandardStream([in] StandardStreamTypes StandardStreamType,[in, optional, defaultvalue(0)] VARIANT_BOOL Unicode);

3、注入木马,获取计算机的控制权
对于木马的形式是dll的com组件的,一般木马作者会将这种com组件做成“Shell扩展”、“浏览器插件”、“浏览器辅助对象”、“地址栏挂钩”、“网络协议劫持插件”、“网络协议过滤插件”,“office的Addin程序”等等形式。这里就需要修改注册表的操作了。脚本程序可以通过调用WScript.Shell对象的RegRead、RegWrite、RegDelete方法来实现注册表的操作。

对于木马形式是exe的,那就有很多方法进行注入了
1) 调用WScript.Shell对象的Run或Exec方法来直接执行exe程序.
2) 调用Shell.Application对象的Open或Explore方法来执行exe程序。
3) 调用WScript.Shell对象的RegRead、RegWrite、RegDelete方法将exe文件设置为开机自动启动。自启动的程序有多种多样,这里暂不扩展。
4) 调用WScript.Shell对象的CreateShortcut方法创建一个快捷方式,放到开始菜单中的启动目录里。以便下次开机运行。
5) 调用Scripting.FileSystemObject对象的CreateTextFile方法创建一个批处理文件、vbs文件、js文件等可执行的脚本文件来运行exe。

二、对策

首先vb脚本或javascript脚本的运行,虽然可以在IE中被禁用,但这样会导致目前大多数网站的浏览不正确,这显然不是我们所希望的。
如果我们能阻止脚本程序对本机的文件操作、目录操作、注册表操作、程序运行等进行控制,那自然可以起到阻止木马入侵的功能。
我们先分析一下以上关键的com对象:

Scripting.FileSystemObject 是由系统目录中的scrrun.dll实现
WScript.Shell 是由系统目录中的wshom.ocx实现
Shell.Application 是由系统目录中的SHELL32.dll实现

因此我们可以 写一个批处理文件,将这三个不安全的组件进行卸载,批处理文件内容如下:

regsvr32 /u /s %SystemRoot%\system32\SHELL32.dll
regsvr32 /u /s %SystemRoot%\system32\wshom.ocx
regsvr32 /u /s %SystemRoot%\system32\scrrun.dll

当这几个com组件卸载后,恶意脚本就无法进行文件,注册表操作以及运行程序了,想注入自然不可能了。

三、影响

scrrun.dll,wshom.ocx,SHELL32.dll这几个组件基本都是给脚本调用的,我们常见的脚本又大多在网页中,只要我们自己的程序不去调用这些组件,那基本没什么问题了。
不过我也发现了个别情况,比如Visual Studio .Net 2003开发工具,它创建一个工程时,所使用的工程模板中用到了脚本,并使用了Scripting.FileSystemObject对象,因而会出现创建工程失败的问题。还有Office 2003里,也会用到这个组件,但不影响正常使用。
不过不要紧,敬请关注我的博客http://blog.csdn.net/wqf2,我会抽时间贴出一个完美的解决办法。

没有评论: