前言
在近几年之中,银行恶意软件(英文称为Banking Malware或Banker)持续流行。由于反恶意软件产品和网络浏览器不断增强其防范银行木马攻击的保护机制,导致传统的银行恶意软件越来越难以实现欺诈。因此,恶意软件作者为了实现收益的最大化,开始逐步将其精力和资源投入到更易于开发和更有利可图的恶意软件,例如勒索软件、加密货币挖矿软件和加密货币窃取软件。
近期,我们发现了一个新的银行恶意软件家族,该恶意软件使用新型技术来对浏览器进行操控——恶意软件并没有采用复杂的进程注入方式来监控浏览器活动,而是对关键窗口的消息循环事件进行挂钩(Hook),从而发现与银行相关窗口对象的相应值。
一旦检测到银行相关的业务活动,恶意软件就会将恶意JavaScript注入到网页之中,这一过程是通过浏览器的JavaScript控制台或者直接修改地址栏来实现的,所有这些操作都在用户不知情的情况下完成。这是一个看似简单的技巧,但实际上却击败了所有针对复杂攻击而设置的高级浏览器保护机制。
简介
早在今年1月,我们就注意到这个银行恶意软件背后的组织正在传播他们早期开发的项目,其中之一就是恶意软件,该恶意软件通过替换剪贴板中的钱包地址来实现加密货币的窃取。该组织长达几个月都在专注于剪贴板恶意软件,最终于3月13日发布了第一版银行恶意软件,该恶意软件被ESET检测为Win32 / BackSwap.A。
从时间轴上来看,与以前的项目相比,后续发布项目的检测率直线上升。该组织一直专注于银行恶意软件的开发工作,几乎每天都会推出新版本,只在周末休息。
分发和执行
该系列银行恶意软件通过电子邮件的方式进行分发,在邮件中包含一个称为Nemucod家族的JavaScript下载程序,该程序经过了复杂的混淆。这一系列恶意邮件活动只针对波兰地区的特定用户。
很多情况下,被感染主机也会被检出存在Win32/TrojanDownloader.Nymaim下载程序,该下载程序似乎是采用了类似方法进行传播的。在撰写本文时,我们还暂不清楚这究竟只是一个巧合,还是这两个恶意软件家族存在直接的关联。
该恶意软件的Payload,是通过对一个合法应用程序进行部分覆盖,产生一个修改版本的合法应用程序,从而实现交付的。被选择作为合法应用程序的目标会定期发生变化,此前曾经使用过TPVCGateway、SQLMon、DbgView、WinRAR Uninstaller、7Zip、OllyDbg和FileZilla Server。该应用程序被修改为在其初始化期间跳转到恶意代码。具体而言,恶意软件通过将指向恶意Payload的指针添加到_initterm()函数表中来实现跳转,该函数表是C运行时库(C Run-Time Library)内部的一部分,用于在main()函数被调用前,对所有需要的全局变量和程序的其他部分进行初始化。
指向银行恶意软件Shellcode指针的合法应用程序中_initterm指针数组:
恶意软件所使用的这种方法,可能会让我们想起来“Trojanization(木马化)”方法。但其不同之处在于,原来的应用程序将不再有效,一旦控制流转移到恶意软件,就不会再返回到原始代码。因此,他们的目的不是在于让用户认为他们运行了合法的应用程序,而是为了隐藏恶意软件,防止恶意软件被分析或检测到。事实证明这一点是有效的,由于许多逆向工程工具(例如IDA Pro)都会将原始main()函数显示为应用程序代码的合法开始部分,因此分析人员可能第一眼不会发现任何可疑内容,所以也就难以发现该恶意软件。
Payload是一个处于独立位置的代码块,其所有数据都嵌入到Payload之中。字符串是以明文方式存储,因为所有需要的Windows API在运行时都会以哈希的方式进行查找,也在一定程度上破坏了其非常小的特点。恶意软件首先会将自身复制到启动文件夹中(Startup),以确保其持久性,然后再继续执行其银行相关的恶意功能。
常规注入方法
为了从被感染用户的网上银行账户中窃取资金,典型的银行恶意软件会将其自身或特定的银行恶意软件模块注入到浏览器进程地址空间中。由于多方面的原因,这一过程并不容易。首先,如前所述,注入过程可能会被第三方安全解决方案拦截。此外,注入模块还需要匹配浏览器的架构,32位模块不能注入到64位浏览器进程中,反之也同样。这也就导致了银行木马必须要同时带有两个版本的模块,从而同时支持32位和64位的浏览器。
当成功注入后,银行恶意软件模块需要查找浏览器中特定的函数,并对其进行挂钩。恶意软件会分别查找负责在加密前和解密后以明文形式发送和接收HTTP请求的函数。查找这些函数的难度因浏览器而异。对于Mozilla Firefox来说,这些函数由nss3.dll导出,并且相应的名称已经公开,从而可以通过广为人知的名称来轻松查找出它们的地址。对于Google Chrome和其他基于Chromium的浏览器来说,就显得尤为困难,因为浏览器隐藏了这些函数,并且在二进制代码中深入实现相应功能,这就使其很难被找到。上述差异迫使恶意软件的作者要针对不同的浏览器版本,考虑不同的方法和模式。一旦浏览器出现新版本,通常也要采取新的方法和模式。
在找到正确的函数并且成功进行挂钩(Hook)之后,银行木马就可以开始修改HTTP流量,或者将被感染用户重定向到另一个伪造的银行网站,同时也会伪造一个合法的证书。但在这里,还存在一个风险,安全解决方案同样可以检测到挂钩的行为。目前活跃在网络上的多个银行木马都采取了与之类似的技术,例如Dridex( https://www.welivesecurity.com/2018/01/26/friedex-bitpaymer-ransomware-work-dridex-authors/ )、Ursnif、Zbot、Trickbot、Qbot( https://www.virusbulletin.com/uploads/pdf/conference_slides/2017/Kalnai-VB2017-browser-attack-points-trojans.pdf )等。
新型浏览器操控技术
我们本次分析的Win32/BackSwap.A银行恶意软件则采用了一个完全不同的方法。它通过使用Windows GUI元素和模拟用户输入的方式来处理所有任务。这一方法可能看上去微不足道,但实际上是一个非常强大的技术,可以解决使用传统浏览器注入技术遇到的很多“困境”。首先,恶意软件根本不会在进程级别与浏览器进行交互,这意味着它不需要任何特殊权限,也不需要绕过浏览器已有的任何第三方强化,上述两点通常是传统注入方式所要重点关注的部分。此外,这种新型技术对攻击者来说还存在另外一个优势,代码不依赖于浏览器的体系结构或者具体版本,并且一个代码路径可以适用于所有的浏览器。
恶意软件借助Windows消息循环(Windows Message Loop),安装针对特定范围的事件钩子(Event Hook),从而监控当前正在访问的URL。相关的事件例如EVENT_OBJECT_FOCUS、EVENT_OBJECT_SELECTION、EVENT_OBJECT_NAMECHANGE和其他的一些。钩子将会从事件的IAccessible接口调用get_accValue方法以检索“https”开头的字符串,从而查找到固定模式的URL。
用于从浏览器中检索出当前访问URL的技术,通过检查“https”子字符串(红色标记部分)来实现检索:
然后,恶意软件将在浏览器中找出与银行相关的URL和窗口标题,从而诱导被感染用户进行网络转账。
恶意软件查找与银行相关的特定字符串,其中第一个字符串是窗口标题,第二个字符串是URL中的一部分:
一旦识别出来特定字符串,银行恶意软件就会从其资源中加载相应银行的恶意JavaScript,并将其注入到浏览器中。脚本注入的过程也以简单而有效的方式来完成。
在较旧的样本中,恶意软件会将恶意脚本注入到剪贴板中,并模拟按下打开开发人员控制台的组合键(Google Chrome中为CTRL + SHIFT + J,Mozilla Firefox中为CTRL + SHIFT + K),然后按下CTRL + V粘贴剪贴板的内容,随后按下ENTER执行控制台的内容,最后再次发送控制台组合键以关闭控制台。在上述整个过程中,浏览器窗口会变为不可见。对于普通用户来说,他们看起来好像是浏览器暂时卡住了。
在新的浏览器变种中,这种方法得到了升级。新变种中,恶意软件不再与开发者控制台进行交互,而是通过JavaScript协议URL( https://msdn.microsoft.com/en-us/library/aa767736(v=vs.85).aspx )直接从地址栏执行恶意脚本——这是一个大多数浏览器都支持,但很少被使用的功能。在这里,恶意软件只会模拟按下CTRL + L键来选择地址栏,然后按DELETE键清除该字段,之后通过在循环中调用SendMessageA的方式输入“javascript:”,随后使用CTRL + V粘贴恶意脚本,并发送ENTER键以执行该脚本。在完成上述步骤后,恶意软件会清空地址栏,以消除任何被感染的迹象。
在下图中,我们可以看到一部分控制台注入代码。首先,恶意软件通过检查前置窗口的类名(蓝色标记部分)来确定浏览器。随后,恶意JavaScript将被复制到剪贴板(红色标记部分)。之后,将浏览器窗口的不透明度更改为3,从而将其隐藏(紫色标记部分)。最后,ToggleBrowserConsole函数负责打开和关闭浏览器的控制台(绿色标记部分)。
Win32/BackSwap.A能够针对Google Chrome和Mozilla Firefox实现上述攻击,并且在最近的版本中,其作者还加入了对Internet Explorer的支持。不过,只要是具有JavaScript控制台或者支持从地址栏执行JavaScript的浏览器,理论上就都可以实现上述攻击。目前,这两种对JavaScript的支持都作为了浏览器的标准功能之一,因此现在的大多数浏览器都能够借助这种新型方法实现攻击。
该恶意软件所支持的三种浏览器,都具有一个有趣的保护功能( https://blogs.msdn.microsoft.com/ieinternals/2011/05/19/socially-engineered-xss-attacks/ ),这最初是为了避免受到Self-XSS攻击( https://en.wikipedia.org/wiki/Self-XSS )而设计的:当用户尝试以“javascript:”开头的文本粘贴到地址栏时,协议签注将会被删除,用户需要手动将该协议前缀输入到地址栏中,才能够实际执行脚本。针对这种保护功能,Win32/BackSwap.A采取了模拟在地址栏中逐字符键入前缀的方式,从而成功绕过。
Mozilla Firefox还采用了另外一个防护策略,该浏览器默认情况下不允许将脚本粘贴到控制台中,而会显示一条信息,警告用户相关风险,并强制用户先输入“Allow Pasting”(允许粘贴)。通过执行如下图所示的Shell命令,恶意软件绕过了该防护策略,在命令中修改了prefs.js配置文件,并删除了这一策略。
恶意JavaScript
由于各个银行网站都不相同,并且有不同的源代码和变量,因此银行恶意软件会针对每个目标银行,执行为其“量身定制”的脚本。这些脚本被注入到特定页面中,这些页面通常是发起汇款请求的页面(例如缴纳公共事业费用),相应的页面会被恶意软件自动识别出来。当被感染用户决定支付款项时,该付款将被发送给攻击者。在这种情况下,任何防止未经授权付款的安全措施(例如双因素认证)都将无济于事,因为此时用户主观上是需要支付这笔款项的。
Win32/BackSwap.A共针对五家波兰的银行设计了恶意脚本,分别是:PKO Bank Polski、Bank Zachodni WBK S.A.、mBank、ING和Pekao。恶意软件作者有时会从目标列表中删除一些银行,例如在最新版本中就只剩下了PKO Bank Pilski、mBank和ING这三家银行。在旧版本恶意软件中,攻击者会从C&C服务器上检索收款银行的账号,这些C&C服务器被托管在黑客入侵后的WordPress网站上。但在最近的版本中,恶意软件开发者将这些账号直接储存在恶意脚本之中。相关银行账号的变化非常频繁,几乎每一次恶意活动都具有一个新的银行账号。
如下图所示,银行恶意软件只会对一定范围内的转账金额进行窃取,这一范围通常在10000-20000波兰兹罗提(约合人民币17300-34600元)之间。该脚本会对原始的收款银行账号进行替换,并且还以原始银行账号覆盖输入字段,用户看到的是一个正确的账号,所以不会产生任何怀疑。
下图为部分恶意JavaScript代码,红色标记的是检查转账金额并替换收款人银行账号的部分:
总结
Win32/BackSwap.A向我们生动地说明了,在安全领域与银行恶意软件开发者的持续对抗中,新的恶意技术往往不需要具有极高的复杂程度。我们认为,随着浏览器不断增加对传统代码注入的保护,恶意软件作者会逐步以不同的方式来实现对浏览器的攻击,而Win32/BackSwap.A只是向我们展现了其中的一种可能性。
ESET系列产品将该威胁检测为Win32/BackSwap.A木马病毒。我们已经通知受影响的浏览器厂商关注本文所涉及的脚本注入技术。
最后,特别感谢Paweł Śmierciak对于发现这一恶意软件家族及分析过程中提供的帮助。
IoC
JS/Nemucod.EAN trojan:
9BC4C1D5403DDD90712CE87225490A21D1EDC516
Win32/BackSwap.A trojan:
CF5A74C268661501156663F74CD5E20603B0F261
Win32/BackSwap.A trojan:
6251F9AD0E5F551AC4A6B918EF366E86C4CCFDC4
Win32/BackSwap.A trojan:
2DC9760A7C6E9D261C73EFB7B2604840734BC058
Win32/BackSwap.A trojan (JavaScript):
A68901D0D8C1247FF280F9453E3AE45687C57566
发表评论
您还未登录,请先登录。
登录