图片: Sascha Kohlmann , CC BY-SA 2.0有些系统默认情况下,凡人无法访问。 这样的系统的开发者天真地认为,它们不受研究人员的渗透和敏锐的眼睛的保护。
至少使用自动柜员机(ATM)。 在很多情况下,陌生人来ATM机,连接笔记本电脑,取钱然后离开而没有在系统中留下任何日志。 最近有关“
炸肉排 ”(恶意软件称为
Cutlet Maker )的故事证实,没有无懈可击的系统-尚未开发的系统。
学习开始
有一种观点认为,从ATM上窃取金钱的唯一方法是驾驶自卸车,钩上ATM的钩子并将其撕下,然后使用研磨机,撬棍和气焊机。 但是还有另一种方法。
在
Ebay上进行短暂搜索后,我在桌上安装了带有固件的
NCR USB S1分配器 。 目标如下:
- 找到一个旁路,用于加密计算机通过USB发送到自动售货机本身的命令,特别是用于发行钞票的旁路;
- 了解如何解决对保险柜进行物理访问的需求(盒带抽搐),以生成上一段中用于命令的加密密钥。

韧体
固件是在
VxWorks v5.5.1上运行的
NXP ColdFire 处理器 (我最喜欢的处理器
Motorola 68040 )的
ELF文件。
在
ELF文件中,有两个主要部分值得关注
-.text和
.data :
- 其中之一包含一个代码,当分配器连接到ATM上部的系统单元时,该代码始终旋转(称为主固件)。
- 第二个是zlib随附的引导程序代码(其本地名称为USB Secure Bootloader ),它负责上载固件并启动主代码。
最好的部分是,符号在文件中保持未切割状态-拿走并寻找一些有趣的东西。
主固件的内部设备
如果将代码分为几个主要部分,则会得到以下方案(按提交顺序):
- 处理接收USB数据包并在服务之间分配它们的流。
- 服务是主要的执行单元,每个服务都有自己的角色,每个都有自己的任务(类)。
- 类 -这些是特定服务可以在控制器的帮助下执行的任务。
- 控制器实际上是“ 工人 ”( workers ),他们参与验证发送给他们的任务,其实现以及响应数据包的形成。

由于固件中包含很多代码,因此决定从搜索所有可能的服务开始,然后查看将任务转移到哪里。
结果,发现以下服务应该可以满足我的需求:
1)
DispTranService(点钞机交易服务) :使用加密命令,形成钞票捆,进行认证。 您可以说最有趣的是这里。

2)
securityService :验证后,在分配器的一侧生成一个会话密钥,该会话密钥应计算机的请求以加密形式发送给它。 该密钥将加密所有重要命令-发行,形成一捆钞票。

随后,另一个服务引起了我的注意:
UsbDownloadService 。 它的任务是在将点胶机连接到计算机并且点胶机的固件版本与ATM计算机上存储的版本不匹配时,请切换至
引导加载程序 ,以上传操作系统应使用的固件(该固件位于计算机上与供应商的软件相同的文件夹中)。 该服务还知道如何提供有关固件版本的信息。

物理认证
物理身份验证是在最高级别实施的,可保护ATM避免简单地通过USB发送命令以未经授权就发出。 在这种情况下,它包含以下事实:只有使用有钱的开放式保险箱,您才需要执行以下任一操作:
- 卸下并插入下部纸盒,
- 用点胶机切换机架背面的拨动开关。

但是,只有将访问级别设置为最大(即物理级别)时,才需要所有这些。 它们共有三种:
USB (0),
逻辑 (1)和
物理 (2)。 其余两个由服务提供商和开发人员用于调试和测试固件。 好吧,厂商强烈建议您使用默认的物理设备。
脆弱性
以下描述了严重漏洞(在文章发布时已由供应商修复),该漏洞使得可以执行任何分配器命令,包括提现(如果可以进入服务区域但无法访问保险柜)(例如,通过ATM前面板上的孔)。
事实证明,
UsbDownloadService接受不需要加密的命令。 听起来很诱人。 但是突然所有的东西都得到了进一步的保护,
安全启动加载程序这个名字
会得到回报吗?
(剧透:没有道理!)我们需要更深入
如前所述,
.data部分中有一个打包的加载程序代码,很长时间以来,这些代码并没有引起我的兴趣,我的同事在检查固件时也没有注意它。

自举程序是一个谜,但问题仍然悬而未决:计算机上的软件如何淹没固件? 确实,在主固件中,没有发现任何此类固件。
因此,
引导加载程序已解压缩,并以偏移量
0x100000加载到
IDA中-现在您可以进行调查了……只有字符了!
没关系:将主要固件与引导加载程序代码进行比较,读取控制器的数据表-并开始出现某些图片。

事实证明,上传固件虽然看起来受保护,但实际上并非如此。 您只需要知道如何正确填写即可。
为了完全了解此过程,我们花费了很多精力和时间(有关更多详细信息,请参阅在拉斯维加斯举行的Black Hat 2018会议上的报告“
Blackbox死了-Blackbox万岁! ”)。 为什么值得焊接NVRAM存储器,然后上传备份以“刮擦”整个控制器为目标……
感谢同事Alexei的耐心配合!
结果,我们得到了以下用于将固件上传到分配器的算法:
1)生成一对RSA密钥,并将公共密钥填充到控制器中。

2)从
ELF顺序将
.data和
.text节写入节标题中的物理地址。
3)根据记录的数据计算SHA-1,使用私钥加密哈希,然后发送给控制器。

4)计算并发送固件中所有已记录字的总和。

之后,如果成功计数并记录了所有内容,则将加载主固件。
事实证明,编写固件时只有一个限制:固件版本不得低于当前版本。 但是没有人阻止我们更改其数据本身的固件版本。
结果,我的具有
抗安全性修复程序的特殊固件已上传并成功启动!
至此,对主要的固件代码进行了深入的研究,找到了发行纸币的命令。 现在可以不加密地发送它们,分发器将很高兴地执行它们。

发行
在研究过程中经历了所有事情之后(例如,一个“
积木式 ”真正的ATM),结果是如此令人愉悦并且补偿了我想与另一家大型供应商重复该算法的努力。

最真实的自动取款机开始嗡嗡作响,并热切地与我们分享新鲜的香脆钞票(在这种情况下,是卖方“糖果包装纸”)。 没有施加魔法:只有笔记本电脑,大脑和USB线。
结论
我们再次确信,在
默默无闻的
安全原则指导下,不可能提供足够的保护。 代码或固件的适当性完全不意味着攻击者在某一时刻将无法访问它,也不会利用所发现的漏洞。 实施一定的自私目标所需的一切都可以在存在一定金额的金钱的情况下获得。
开发人员必须处理该代码,而安全保护人员也应对其进行保护。 因此,最有效的方法似乎是与具有丰富经验的信息安全公司合作,以确保各种系统的安全性,这将有助于在每种情况下建立足够的保护。
PS Vendor确认了该漏洞(在另一型号
S2中也发现了一个漏洞),该漏洞在2018年2月的修复中被声明为已修复。
CVE清单:
致谢
在我之前,我的同事
Dima Sklyarov和
Misha Tsvetkov已经从事固件工作(尽管没有分配板)。 他们的成就对我的学习很有帮助,为此,我要多谢他们! 关于硬件,
Aleksei Stennikov帮助了我很多。