- A+
—— Chris Doman and Tom Lancaster (普华永道)
首先看下Scanbox脚本的程序框架
当恶意脚本被插入到网站页面进而被用户访问时,脚本被浏览器本地解析,程序流程可抽象成【图1】所示几个模块。
【图2】中scanbox.info对象记录包括当前页面头部的一些基本信息,同时也包含屏幕分辨率、操作系统、语言等主机信息。
这个没什么好说的,没有引入Base64类库,所以用原生JS实现的Base64编码。
通信模块是通过两个函数实现的,一个是get函数,一个是post函数,也就是http请求的常用方法,实现将窃取的信息回传给攻击者后台的服务器。get函数是创建一个image对象,通过设置src属性实现get请求;post函数是创建一个form表单,通过设置input元素,加密后调用submit()提交实现post。这也是Javascript实现与后台通信的方便之处。
同样利用image对象采用GET方式向后台传递数据,数据传输前使用加密模块(Base64)加密。通过setInterval函数设置定时器,以一定时间间隔向服务器报活。
第1号(pluginid=1)插件的功能是获取操作系统安装的软件列表,方法是通过res://协议。res协议是IE浏览器预定义的协议,可以分析所有符合Win32PE格式的文件的资源文件。如下【图6】所示:
上图是通过PE文件查看工具ResourceEditor查看explorer.exe的位图资源文件,然而这种功能利用IE浏览器也能实现,如下:
进而可以利用创建image对象,将image对象的src属性设置为通过res协议访问某个特定PE文件的资源文件的URL,再利用image的onload和onerror事件判断image对象是否成功加载,等效于判断image对象的src属性对应的res协议是否访问成功,从而判断某个特定应用程序是否安装在受害者主机。如下图:
但Scanbox并不是采用这种方式进行判断的,而是创建ActiveXObject(“Microsoft.XMLDOM”)对象,解析XML文档中的res协议实现的。下图中调用validateXML函数前构造的XML格式串如红色标记:
接下来调用validateXML进行验证,原理是创建ActiveXObject对象解析。通过对错误码特征的匹配来判断XML文档中利用res协议访问的PE文件是否存在,进而判断主机是否安装特定的应用程序。
下图为Scanbox源码中枚举的应用程序列表的一部分,可以发现Scanbox重点关注主机是否安装安全防护类软件,为后期进一步实施攻击收集了重要信息。
第3号(pluginid=3)插件的功能是判断Flash版本信息,原理是调用ActiveXObject()与flash相关的对象,从而获取flash版本。
第5号(pluginid=5)插件的功能是获取Office版本信息,原理同上也是创建ActiveXObject对象,获取版本号
第6号(pluginid=6)插件的功能是判断是否安装AdobeReader,原理同上
这份不完整的Scanbox源码中并没有找到监听键盘敲击的记录,但网上报道的重点多在于此,无奈笔者根据Scanbox中插件调用的模式自行补充了键盘记录模块。其实用Javascript实现键盘记录网上已有成形的代码,而且实现方法都是一致的,就是利用document.onkeydown和document.onkeypress两个事件,如下:
这里只介绍了目前能发现的Scanbox源码中的插件,不过从插件的编号来看,还有不少插件并没有出现在这份源码中,因此笔者只能分析至此。
如果网站页面存在存储式XSS漏洞,或者通过其它渗透手段将Scanbox植入含有登陆框的页面进而被用户访问加载执行就会造成很严重的后果。用户登录时输入的密码都会随着键盘监听模块的记录而回传给攻击者后台,而且是明文的。
笔者在后端写了几个简单的PHP脚本作为Scanbox回传数据的目标,解码Base64后将键盘记录保存在本地txt文件中。
下面来对特定网站后台登录页面植入Scanbox恶意脚本,观察页面被加载后的行为。
如下图所示,键盘记录回传数据会写入本地文件
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫