服务热线:010-65014696

安全研究

椒图关注 FOCUS ON JOWTO

安全输入控件分析

[2014-11-12]

随着B/S技术的发展当浏览器(如IE)中需要输入用户名和密码,而这个密码又和经济挂钩的时就产生了安全输入控件,安全输入控件通过软件技术实现了对用户密码的保护,使得攻击者无法通过键盘记录、输入框内容查看等技术得到用户输入的密码,保证用户的密码不被攻击者非法获得,目前安全输入控件技术被网上银行等广泛使用。

那么安全控件是否真的可以完全阻止黑客的攻击呢?应该是不行的。

在IE下,安全输入控件是一个ActiveX控件,而ActiveX使用了COM接口技术, COM接口是Windows的一项重要技术,Microsoft的许多技术都用到了COM接口,如ActiveX、DirectX等。

现在想通过传统的办法获取安全输入控件的内容是不行的,那么是不是可以通过COM接口做一些工作呢?当用户在安全输入控件中输入内容时是明文,控件内部会对用户输入的明文进行加密然后发送到服务器,如果能知道控件在那个函数处理的这部分工作应该可以获取明文内容的,下面就尝试通过COM接口的Hook技术找到这个函数。

与传统的API HOOK不同,所有的COM接口都是由一个虚函数表组成(vTable),虚函数表的内容为成员或函数地址,是纯地址列表。当调用IDispatchEx类的成员函数时也包括其派生类函数,程序会通过该函数地址列表找到函数的真正地址并进行调用。那么我们可以通过修改该地址列表,来达到拦截指定函数的目标。而Windows系统通过函数DispCallFunc来实现所有COM接口成员函数的分发,我们可以通过Windbg来挂钩OLEAUT32! DispCallFunc函数来观察COM接口的分发调用过程。

那么如何获得一个具体COM接口的虚函数表呢?我们可以通过CoCreateInstance函数获取虚函数表,但在IE中,其调用ActiveX控件时通过CoGetClassObject函数来获得虚函数表,所以,我们只要在不同的情况下Hook这2个函数,就可以获得指定COM接口的虚函数表。了解了COM接口的原理后,现在开始找一个目标,在很随机的情况下,我选择了一个银行的安全输入控件做测试。

首先,对IE里面加载的模块进行观察,找到安全输入控件的文件,如下图:

从这个图里面就可以发现xxxEdit.dll不是IE默认的DLL,应该就是银行的安全输入控件,首先获取此DLL的CLSID。然后注入代码到IE进程,对CoGetClassObject函数进行Hook,通过比较CLSID,确认获取安全控件的虚函数表地址(vTable)。

获取到接口的vTable后,现在就可以Hook接口的具体函数了,接着Hook成员函数CoGetClassObject:: CreateInstance,获得安全输入控件的方法vTable地址为0x10045220。

对比xxxEdit.dll的反汇编代码,可以看到这个COM接口提供的所有方法和属性,如下图:

查看银行的网页源代码可以发现JavaScript从安全控件获得卡号和密码的方法是:

loginInfo.AccountNo = document.getElementById(“DebitCardNo_Ctrl”).IValue;

loginInfo.Password = document.getElementById(“DebitCardQueryPwd_Ctrl”).IValue;

于是,开始分析10011521这个函数,发现执行到1001160F前ECX的值正好是卡号和密码的明文,这样攻击者可以要获得安全输入控件的内容只需要远程注入代码到IE中并inline Hook这个地址,获取ECX的值,就可以获得明文的卡号和密码。

可见,安全输入控件并不是绝对的安全,所以,为了尽可能的避免这样的情况发生,我们应该养成良好的上网习惯,包括:

尽量使用正版软件,免费的软件到官网去下载;

尽量不使用汉化插件、游戏外挂、作弊器等来历不明的软件;

尽量不浏览来历不明的网站;

不运行陌生人给你的程序;

不访问陌生人给你的网址;

不要相信任何人任何形式的中奖信息;

访问重要网站时对比URL是否为官网;

使用沙箱技术保护浏览器;


本文为云锁开发商-椒图科技原创,转载请注明出处。