Javascript间谍脚本分析:Web恶意程序Scanbox源码分析与演示

背景

“ScanBox相当危险,它只需在web浏览器上执行Javascript代码即可启动键盘记录窃听,不需要在你的计算机上植入任何恶意程序即可盗取主机信息。” 
                                                                   —— Chris Doman and Tom Lancaster (普华永道)

这份名为Scanbox的恶意代码是具有信息收集和键盘记录等间谍功能的Javascript恶意脚本,适用于IE浏览器。Scanbox具有收集主机基本信息、获取主机安装的应用程序、获取Flash版本、获取Office版本、验证Adobe Reader和键盘记录等功能。

后文将对每一种功能源代码如何实现进行分析。顺便吐槽一下,国内也有不少科技网站对其进行了转载报道,但鲜有针对源码进行分析解读,笔者最终在国外安全人员的个人博客中发现了这份不太完整的(817 lines)源代码。

程序框架

首先看下Scanbox脚本的程序框架

  

 【图1】Scanbox程序框架

当恶意脚本被插入到网站页面进而被用户访问时,脚本被浏览器本地解析,程序流程可抽象成【图1】所示几个模块。

收集基本信息

【图2】收集基本信息源码

【图2】中scanbox.info对象记录包括当前页面头部的一些基本信息,同时也包含屏幕分辨率、操作系统、语言等主机信息。

加密模块

【图3】加密模块源码

这个没什么好说的,没有引入Base64类库,所以用原生JS实现的Base64编码。

通信模块

【图4】通信模块源码

通信模块是通过两个函数实现的,一个是get函数,一个是post函数,也就是http请求的常用方法,实现将窃取的信息回传给攻击者后台的服务器。get函数是创建一个image对象,通过设置src属性实现get请求;post函数是创建一个form表单,通过设置input元素,加密后调用submit()提交实现post。这也是Javascript实现与后台通信的方便之处。

报活模块

【图5】报活模块源码

同样利用image对象采用GET方式向后台传递数据,数据传输前使用加密模块(Base64)加密。通过setInterval函数设置定时器,以一定时间间隔向服务器报活。

插件集合

1、pluginid = 1

第1号(pluginid=1)插件的功能是获取操作系统安装的软件列表,方法是通过res://协议。res协议是IE浏览器预定义的协议,可以分析所有符合Win32 PE格式的文件的资源文件。如下【图6】所示:

【图6】利用ResourceEditor查看资源文件

上图是通过PE文件查看工具ResourceEditor查看explorer.exe的位图资源文件,然而这种功能利用IE浏览器也能实现,如下:

【图7】利用res协议查看资源文件

进而可以利用创建image对象,将image对象的src属性设置为通过res协议访问某个特定PE文件的资源文件的URL,再利用image的onload和onerror事件判断image对象是否成功加载,等效于判断image对象的src属性对应的res协议是否访问成功,从而判断某个特定应用程序是否安装在受害者主机。如下图:

【图8】测试特定应用程序是否安装的一种方法

但Scanbox并不是采用这种方式进行判断的,而是创建ActiveXObject(“Microsoft.XMLDOM”)对象,解析XML文档中的res协议实现的。下图中调用validateXML函数前构造的XML格式串如红色标记:

【图9】构造XML格式文档

接下来调用validateXML进行验证,原理是创建ActiveXObject对象解析。通过对错误码特征的匹配来判断XML文档中利用res协议访问的PE文件是否存在,进而判断主机是否安装特定的应用程序。

【图10】创建ActiveXObject对象加载XML

下图为Scanbox源码中枚举的应用程序列表的一部分,可以发现Scanbox重点关注主机是否安装安全防护类软件,为后期进一步实施攻击收集了重要信息。

【图11】Scanbox枚举的部分应用程序

2、pluginid=3

第3号(pluginid=3)插件的功能是判断Flash版本信息,原理是调用ActiveXObject()与flash相关的对象,从而获取flash版本。

【图12】获取Flash版本

3、pluginid=5

第5号(pluginid=5)插件的功能是获取Office版本信息,原理同上也是创建ActiveXObject对象,获取版本号

【图13】获取Office版本

4、pluginid=6

第6号(pluginid=6)插件的功能是判断是否安装AdobeReader,原理同上

【图14】判断AdobeReader

5、pluginid=21

这份不完整的Scanbox源码中并没有找到监听键盘敲击的记录,但网上报道的重点多在于此,无奈笔者根据Scanbox中插件调用的模式自行补充了键盘记录模块。其实用Javascript实现键盘记录网上已有成形的代码,而且实现方法都是一致的,就是利用document.onkeydown和document.onkeypress两个事件,如下:

【图15】键盘记录插件

这里只介绍了目前能发现的Scanbox源码中的插件,不过从插件的编号来看,还有不少插件并没有出现在这份源码中,因此笔者只能分析至此。

脚本实测

如果网站页面存在存储式XSS漏洞,或者通过其它渗透手段将Scanbox植入含有登陆框的页面进而被用户访问加载执行就会造成很严重的后果。用户登录时输入的密码都会随着键盘监听模块的记录而回传给攻击者后台,而且是明文的。

笔者在后端写了几个简单的PHP脚本作为Scanbox回传数据的目标,解码Base64后将键盘记录保存在本地txt文件中。

【图16】后台接收脚本并写入文件

下面来对特定网站后台登录页面植入Scanbox恶意脚本,观察页面被加载后的行为。

【图17】植入Scanbox的登录页面通信行为

如下图所示,键盘记录回传数据会写入本地文件

【图18】键盘记录文件

结束语

总的来看,Scanbox作为一款客户端解析的恶意脚本,其攻击效果受浏览器安全配置的制约,但这并不影响其强大的功能和导致的严重后果。如果被攻击者利用得当,配合存储式XSS漏洞实施水坑式(Watering Hole)攻击,监听用户登录时输入的用户名和密码,将会对用户隐私及财产造成不可估量的风险。

[本文作者/ArkTeam Leo(团队账号),转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]

原文阅读

"文章为作者独立观点, 不代表老订阅立场"

本站作者

每日荐书

在不完美的世界力求正常——读《公司的坏话》

书名:《公司的坏话》

作者:李天田(脱不花妹妹)

出版社:北京大学出版社

赞助商

广告