解析ATMii:一款小巧但足以洗劫ATM上所有现金的恶意软件

目前,已经很少有人使用通过物理破坏ATM(如炸毁自动柜员机)的方式窃取现金了,越来越多的犯罪分子倾向于使用恶意软件感染ATM,进而窃取钱财。

ATMii首次被发现于2017年4月份,卡巴斯基实验室的安全研究人员分析了金融行业的合作伙伴分享的一些恶意软件的样品,发现这一类恶意软件程序的功能相当简单,只包括两个模块:一个是注入(injector)模块(exe.exe,3fddbf20b41e335b6b1615536b8e1292),另一个是感染/被注入(be injected)模块(dll.dll,dc42ed8e1de55185c9240f33863a6aa4)

若要使用这类恶意软件,罪犯需要能够直接访问目标ATM机, 络或物理途径(例如,通过USB接口)均可。

ATMii 一旦成功感染了ATM,犯罪分子就可以从ATM上盗取所有现金。

exe.exe:注入和控制模块

Injector模块是一个无保护的命令行程序,用Visual C编写,编译的时间戳是:2013年11月01日(星期五)14:33:23 UTC。

虽然恶意程序样本的编译时间戳显示是4年前,但研究人员推测这一威胁不太可能隐藏4年之久,很可能是攻击者伪造了一个时间戳。

另一个有趣的发现是恶意软件支持的操作系统:新于Windows XP版本,如Windows Vista、Windows7。这一点可以从以下两幅图片中展示出来。下图所示的代码中,请注意OpenProcess()函数的第一个参数是0x1ffffu:

调用OpenProcess函数(包含一个PROCESS_ALL_ACCESS参数)

PROCESS_ALL_ACCESS是一个恒定的值,从上图中可知这个值为0x1FFFFFu,它与诸如windows XP之类的老旧的Windows版本对应的值不同。

从下图中可以看到,ATMii支持的是较新的windows系统。这一点很有趣,因为大多数ATMs仍然运行在WindowsXP上,而ATMii恶意软件并不支持这类ATMs。

多种windows版本对应的PROCESS_ALL_ACCESS 值

Injector模块的注入目标是atmapp.exe(一个ATM机专有的软件)进程,该模块的编写的相当不好,想要正常运行还依赖于几个参数,如果这些参数不完整,应用程序会捕获一个异常。这些参数的用途也很直观,从它们的命名就可以明了:

/load参数

<exe.exe> /load

应用程序搜索一个名为atmapp.exe的进程,并将dll.dll 注入其中(必须和exe.exe文件在同一文件夹中),通过调用DllMain函数进行加载。

/unload参数

<exe.exe> /unload

该参数的命名已经表明,它的作用于/load参数相反,负责卸载注入模块并恢复进程到原始状态。

/cmd参数

<exe.exe> /cmd [cmd] [params]

应用程序创建/更新C:ATMc.ini 文件,用于注入的DLL模块来读取命令。每运行一次.exe的 /cmd参数,就会更新一次。

执行“exe.exe /cmd info”命令后,C:ATMc.ini文件的内容

可执行文件可以解释如下命令集:

dll.dll:注入的模块

当dll.dll被注入并执行完DllMain函数后,dll.dll库会加载msxfs.dll,并使用一个特殊wrap函数替代WFSGetInfo函数,命名为mWFSGetInfo函数。

第一次调用这个虚假的WFSGetInfo函数时,C:ATMc.ini被忽略,程序会试图寻找ATM的CASH_UNIT服务的ID并将结果存储下来,这个过程与扫描命令的执行方式相同。如果没有找到CASH_UNIT服务的话,dll.dll函数将无法执行。

一旦成功搜索到CASH_UNIT服务,会进一步的调用mWFSGetInfo,该函数负责执行一个额外的逻辑,如读取、分析并执行C:ATMc.ini文件中的命名。

执行“exe.exe /cmd disp RUB 6000”命令后,C:ATMc.ini文件的内容

下图中是strings dll.dll的输出,从中可以发现一些有趣的日志消息和导入的函数名。ATMii专有的MSXFS.DLL库及其函数用红色线框标注出来了,详情如下:

“scan”:扫描命令

基于XFS标准对所有的服务进行分组,注入库首先需要找到分发服务。这一命令必须成功地被调用,因为disp和info命令取决于扫描命令检索到的service id。Dll程序被注入atmapp.exe进程后,会自动调用扫描命令。

成功收集到WFS_INF_CDM_STATUS的数据后,额外的数据被添加到tlogs.log日志文件中。示例如下图所示:

成功执行“scan”命令后,tlogs.log文件的部分内容(示例)

“info”命令

在罪犯开始分发现金之前,他们首先需要知道ATMs 内所存储的现金的准确金额,此时使用info命令来获取有关ATMs的详细信息。

用到的XFS API函数列表与“scan”命令相同,但在调用WFSGetInfo的过程中携带了一个名为WFS_INF_CDM_CASH_UNIT_INFO (303)的参数。

下图展示了执行一个info命令后,日志文件中记录的返回数据的示例:

成功执行“info”命令后,tlogs.log文件的部分内容(示例)

“disp”:分发命令

执行disp命令时,需要附加两个参数:currency 和 amount(即货币和金额)。

参数Currency包含一个三个字母的字母代码(用于代表货币),所有货币代码在CASH_UNIT_INFO中被列明,遵从ISO_4217规范,如RUB代表俄罗斯卢布、EUR代表欧元等。

Amount参数代表可分发现金的数量,这个值必须是十的倍数。

“die”:移除命令

仅用于删除C:ATMc.ini文件的命令。

结论

ATMii是一个比较典型的例子,揭示例如犯罪分子可以利用合法的专有库和一小块代码组成的程序,实现从ATM上获取现金的非法活动。

为了应对此类攻击,可以采取默认拒绝策略和设备控制措施,其中默认拒绝策略旨在防止罪犯在ATM的内部PC上运行自己的恶意代码,设备控制措施是指禁止ATM通过USB接口连接新的设备。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年9月11日
下一篇 2017年9月11日

相关推荐