走进科学:酒店保险箱真的保险么?
本文是FreeBuf《走进科学》系列最新力作,翻译自国外安全组织G DATA SecurityLabs一篇针对酒店保险箱的分析报告。他们的研究对象是一款产自中国并且以很多不同的品牌出售的保险柜(made in China and is sold under many different brands)。相信读完本文之后大家会对酒店保险箱的安全性有一些新的认识。
保险箱介绍
下图中是一个标准的酒店保险箱。外壳是钢制的,自带电池,即使断电依然可以工作。通常打开保险箱的方式有两种,使用PIN码(4到10位的数字)或者刷信用卡。此外使用应急钥匙也可以打开保险箱。只是顾客是拿不到的,只有酒店的管理者才有这把钥匙。主要是当顾客忘记PIN码,电池没电又停电或者顾客离开酒店但是没有打开保险箱的情况下使用。
图中金色的铁片遮盖了钥匙孔。解开这两个螺丝,就可以看到插应急钥匙的地方。视频演示1(Youtube):正常情况下打开和锁定保险柜。
https://www.youtube.com/watch?v=0d5hArd-88Y
保险箱工作原理
保险箱由3个部分组成。钢制的箱体本身,前输入面板–包括PIN码输入和信用卡读卡器,位于门后的控制系统。
为了更好的理解内部结构,我们把门拆开看一下。
仔细看一下控制系统就会发现插应急钥匙的钥匙孔。还有用于开门的小马达和一块电路板。当用户输入PIN码的时候,电路板会检查PIN码是否正确。如果正确,则会启动马达。演示视频2(Youtube)。
https://www.youtube.com/watch?v=k03YB6pwV-g
Hacking 1:打开保险箱
超级管理密码:
最简单的方法是使用超级管理密码。使用超级管理密码可以配置保险箱,查看保险箱使用记录,当然也能打开保险箱。默认的超级密码是一串简单的数字序列。启动超级密码输入的方式是快速按两次#号键。当然,超级密码是可以被修改的。但是在我们的测试过程中发现大量的保险箱都是默认的超级密码。
开锁器
应急钥匙是一种机械的开门方式。开起来钥匙还是挺复杂的。
图中可以看到钥匙有4个部分。对于我们这种初学者,这种程度的钥匙还是挺复杂的。不过幸运的是制造商帮了我们一个忙。钥匙的四个面中,真正起作用的只有一个面。(这是吐槽中国特色的节奏么。。)
演示视频3:不用钥匙,手动开锁。
https://www.youtube.com/watch?v=6Ix6JhsAfms
人工短路,破坏保险箱逻辑
第三种hack的方式是通过人工短路来模拟保险箱打开的信号。为了理解这种技术的原理,我们先看一下保险箱如何检测门是否打开的。
通过上图可以看到,门开的时候会按压一个绿色的连接器,在电路板上形成一个短路信号。我们测试的攻击场景是这样的:
1.关闭保险箱。
2.在保险箱的控制系统上引起一个短路,让保险箱认为自己的门打开了。(事实上门依然关闭的)
3.这时候,保险箱显示的不是等待打开保险箱的PIN码,而是变成等待输入一个新的PIN码用来关闭保险箱。
4.我们输入一个新的PIN码。
5.然后保险箱会尝试关闭门。(事实上门已经是关闭的了)
6.新输入的PIN码可以用来打开保险箱。
这种方式的难点在于如何从外部引起保险箱的短路。我们从固定保险箱logo的螺丝孔插入了一根铁丝。在我们的测试中,使用如此简单的工具,大概30分钟左右,可以成功引起保险箱短路。专业的窃贼的话,可以利用更加合适的工具,应该缩短这个时间。
Hacking 2:使用信用卡的风险
前面介绍过,保险箱也可以使用信用卡来锁定和打开。经过我们测试发现,这个场景中只能使用信用卡,其他的磁卡是不行的。系统会检查所用的磁卡是否是信用卡。
信用卡信息可以被窃取么
我们经常看到有犯罪分子在ATM机上加装设备,获取银行卡信息。如下图所示就是常用来窃取银行卡信息的设备。
在我们的例子中,实现窃取信用卡信息也不困难。我们使用Arduino Uno board来完成了这个任务。
如图所示,并不需要多少空间就可以装下这个自制的设备。通过这个装置,可以读取到信用卡的号码,所有人的名字以及卡片的过期时间。下面是读取到的一张信用卡的截图。
结论:
经过以上的分析可以看出,我们分析的这一款保险箱安全级别并不是特别高。我们可以轻易的使用几种不同的方式来打开它。对于酒店的管理者,建议修改保险柜的默认超级密码。对于用户,我们建议不要过分依赖酒店的保险箱。而且尽量不要使用信用卡来开关保险箱,这样存在信用卡信息别盗的风险。
- 什么是区块链:块的结构
- Spring读书笔记——bean创建(下)
- 当区块链遇上传统行业 我们的生活和工作会改变吗?
- 如何设计开发好一个 HTTP API?
- [WCF权限控制]基于Windows用户组的授权方式[下篇]
- Spring读书笔记——bean解析
- 10个大数据误区,看看你中了几个?
- 从数据到代码——通过代码生成机制实现强类型编程[上篇]
- Spring读书笔记——bean加载
- Java8-初识Lambda
- 我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- 谈谈WCF中的Data Contract(3):WCF Data Contract对Collection & Dictionary的支持
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 快速学习-ElasticJob运维平台
- 第34期:最后一个单词的长度(高频)
- 原创 | 学会这三个命令,你就不再是git只会用三板斧的菜鸟了
- 构建Flink第一个应用程序
- 第35期:从 DFS 学习二叉树!(适合小白)
- ROS自平衡车案例学习(机器人操作系统+现代控制理论融合)
- Git 不能提交空目录?我也是醉了!
- 相关矩阵、特征、预测、股市!(附代码)
- CentOS7下编译安装libmodbus库
- 你还以为使用 StringBuffer 就万事大吉了?
- Windows10中VS2017环境下使用libmodbus库Modbus TCP读取设备的数据
- 记一次生产服务器进程突然消失问题排查!
- 0812-7.1.3-如何使用Ranger给HBase授权
- Redis集群方案对比:Codis、Twemproxy、Redis Cluster
- 这就是你日日夜夜想要的docker!!!---------Docker镜像制作与私有仓库建立