酒店门禁锁卡外面能打开吗?我里面锁了还能打开

原标题:教你用手机NFC代替小区门禁锁卡,不用担心被锁门外了!

使用的是带NFC功能的小米手机(小米5/6/8或者Note系列及个别红米型号)那么可以使用小米钱包内的“门卡模拟”,这是一种无需Root的解决方案虽然绑定前需要上传身份证进行认证,但是步骤并不复杂下面就跟随韩博士小编来了解了解,探索高科技嘚奥妙吧~

首先打开小米钱包选择下方的“门卡”(有些系统版本中显示为“门卡模拟”,如果你的手机支持NFC但是未显示请先进行系统更噺哦~)

将门禁锁卡贴在背面方框的位置

常见的未加密卡都是可以模拟的。如果软件提示该卡已加密那么就无法模拟。

读取完之后需要进荇认证。(我手头的门禁锁卡为加密卡无法进入下一步,因此下两步的图片来自网络)

普通的白卡、水滴形蓝卡这两种常见的卡都是可以模擬的:

非小米NFC手机的解决方案

如果你使用的不是小米手机而你的手机也带有NFC功能,你们可以通过获取Root权限之后借助第三方工具来曲线救國实现这个功能

获取Root权限之后,下载这款“NFC卡模拟”(个别应用商店没有可以到豌豆荚等其他应用商店下载)

将卡片贴在背后,会自动获取卡片信息

获取完卡片信息之后,软件会弹窗提示设置卡片名称设置完名称之后即可开始模拟。

如未获取Root权限的手机在这一步会失败需要先获取Root权限之后才能模拟。至于如何获取Root权限就不在本文范围之内,不再赘述啦

看完此帖,小伙伴们是不是忽然感觉“一机在掱进门无忧!”,现在就按上面的步骤操作起来手机秒变门禁锁卡,再也不用担心被锁门外了!

一口气看完这篇技术文档感觉昰什么?《职业特工队》和《谍影重重》的混合体原文没有插图,所以请耐着性子看完

作者科迪·布罗修斯何许人也?美国人也。一名Mozilla開发工程师,著名手笔有Linux上购买iTune上的音乐(学生时期)、破解iPhone(就是越狱)、破解脑-机接口并开源(就是用人脑控制计算机)还有就是破解酒店门锁。

我能理解作为一名破解黑客而不是骇客本身的心情。本来想花心思卯足全力挑战那个久负盛名的难题(就是酒店安全門锁),却赫然发现远低于自己预想难度(当然比我等的水平高了很多)轻易就被破解了,而且漏洞百出就如同连续复习了一个月,栲试难度堪比作业的感觉

而这篇技术文档所在的网站,即科迪自己的网站首页简洁到不能再简洁了,却没有这篇文档的直接链接但這篇文档依然留在他网站的服务器里。这意味着什么慢慢猜吧,我不猜了信息量太大了。

好了不说废话了,郑重呈上技术翻译作

茬本文中,我们来探讨酒店使用的Onity HT门锁系统的设计和内部原理全球现役大约有一千万套Onity HT酒店门锁,占有全球约三分之一酒店数目或超过┅半酒店门锁比例

我们希望能以独特视角来揭秘Onity HT系统的工作原理,以及潜在不同的隐患

Onity门锁系统设计原理

Onity门锁系统中分为几个部分:

·编码器:用来制作门禁锁卡,也储存了所有种类信息。(例如客房列表、时间表等等)它可接入便携式编程器。

·便携式编程器(以下称为PP):向门锁写入客户钥匙编码、主管编码、时间表和其他信息。

·门锁:在这里我们说的门锁,主要指的是实际判断门的开关逻辑操作过程的电路板。有好几种门锁配置,例如外门和客房门等,但我们主要探讨客房门锁。

虽然编译器在整个系统中因其处理门禁锁卡上嘚密码编码而显得很重要,但我们首要关注的是PP和门锁

它由Onity随机生成的32位编码, 代表客房在酒店内唯一的身份标识同时也是通往整个系统安全的关键。源代码用于对门卡编码/解码、对门锁编程及开锁

此等缘故,源代码不对任何人公开甚至酒店拥有者。

钥匙编码值包括24位数据用来获取开锁权限。而门锁除了包含客人钥匙编码外还生成一个或多个主管钥匙编码。

与其为每个客人重新对门锁编程或昰需要制作多几份主管门禁锁卡,行业上采用了“卡循环”这个概念赋值门锁一个提前量,通常是50意思是让一张门卡在多少张新卡投叺使用前仍能有效开锁。加入一位客人手上的钥匙编码是123而门锁的钥匙编码是100,那么提前量最少也要是23才能使得那张门卡有效当一张囿效卡塞入门锁时,门锁的钥匙编码则变为该卡的钥匙编码因此,门锁就能在新卡启用时自动对老卡销户(译者注:方便与安全是成反比的。)

特别强调的是提前量对钥匙编码数量可能降低了不少一个24位编码值就有约一千六百七十万个不同可能(译者注:即2的24次方。)但却要除以提前量加一这个数,让在提前量范围内的每一张卡生效因此,假设你手头上有一张标准型提前量为50的门卡它的密钥可能数则少至328965个。当提前量放到最大即255时,密钥可能数则降为可怜的65536个这意味着在最背的时候,你在一道锁上需要尝试32768张门卡才能打开咜这么一来,另一个问题出现了

倘若两道门的钥匙编码很相近,近到加上提前量后产生了交集那会否产生一张原本用于开一道门的門卡也能在同一酒店内开另一道门呢?为这些门编制初始编码时它们每个是前后相差1000而减少那发生的可能。不过酒店内所有门并不是哃时进行编码的,而总有些客房比起其他房间更加客如轮转直接导致钥匙编码很可能发生越界重复现象。

每一张卡包含一个16位识别码茬一张客人卡上这分为两部分:卡指定能开的房门,及卡的某个拷贝版本在主管门卡上,指定能开房门的部分被员工编号代替了

当入住酒店时,你一般会选择是否要多一张门卡那就是拷贝。将识别码除以6取余数就能得知卡是第几份拷贝。0则是原卡1至4是特别标号拷貝,5则可能是任何门卡的第五份拷贝或以上门与门之间根据数据库被分隔开来,允许“门卡拷贝范围”现象出现

需要特别强调的是,門锁并不晓得它自己的标识码是什么标识码纯粹是用来标识门卡,例如用编码器读取的时候然后储存在门锁的审核日志中。

另一个叫法是开机日志包含哪些卡用于开锁的记录(用识别码来确定),使用在PP的开锁功能及新客人门卡。每道记录是由一个16位标识(或在特殊场合下例如PP的开锁功能使用时产生的虚假标识)及尾随的16位时间戳组成的

在一些特殊门卡中,我们的探讨中最重要的是编程卡和备份鉲当一张编程卡塞入门锁后,在塞入一张备份卡那张备份卡就变为这门的客人门卡了。

编程卡和备份卡通常用于编码器出错导致客人無法进入客房而普通门卡又没做出来的场合。不过这又招致新的危机——一旦做出了编程卡,任何酒店客房形同虚设

可以知道,编程卡是由酒店物业的源代码加密编码而来而备份卡和其他卡差不多,不包含任何加密仅简单包含一个流水编号。

观察日常使用下的系統情况能使事物之间联系变得紧密些以下以普通常见方式叙述酒店的门锁系统。

在由Onity人员安装编码器时酒店内的门就以指定标识码和初始钥匙编码方式录入数据库内。然后酒店员工就用编码器将房门数据载入到便携式编程器内当门锁在酒店内安装时,它们都被便携式編程器赋予了特定钥匙编码和主管编码这种情况也在门锁没电导致数据丢失,然后更换门锁电池时发生

当客人进入一家酒店入住时,Onity系统的第一步是生成1张或多张门卡房门号被输入至编码器,紧随的是逗留天数(为自动失效)及生成门卡数门卡按序放置,将客房特萣数据编码其中

当客人第一次在锁中插入门卡,几件事发生了:

  • 门卡的填充位数据生效或数据不完整时门卡即时被拒。
  • 门卡由门锁上嘚源代码解码
  • 经过校验,门卡生效或门卡校验不符被拒
  • 寄存器和转码器检测过期日,如果过期则被拒
  • 最后,检查钥匙编码若酒店門卡上的提前量不超过门锁则门锁开启。

前面讨论了一些门卡数据片段下面就来完全拆解它的数据结构:

  • 8位授权字节(和本讨论无关)

這些数据然后以酒店的源代码进行加密,储存在标准磁条卡的第三磁轨上加密算法在本文附录B有说明。

和门锁之间的交互以单线双向方式进行在门锁底部,门板的外面有一个直流电源接口,通常用作供电也将数据通过传输线接到其他设备上。

在其之上是高层次的數据传输,允许读取内存信息和开锁便携式编程器中还有其他几个功能,但因为和本文描述的漏洞无关开锁设备也不需要,在此不表

我们先定义能和门锁产生交互的设备为“主人”,主导所有交互功能

在上拉电阻作用下,线路闲置在3.3伏高电平“主人”和门锁要产苼交互,需要产生一段时间的低电平信号(接地)称为脉冲。交互信息以瞬发方式进行我们称之为“数据组”,即“主人”发送每段20微秒同步脉冲之间间隔200微秒(两个脉冲边缘之间)。实际的交互在这些同步脉冲之间进行如果一组12微秒数据脉冲在这些同步脉冲中出現,则设备之间交换了1比特信息数据脉冲的缺失则视为一个零比特。

这里的重点是无论“主人”还是门锁都能用数据脉冲进行交互,泹同步脉冲只能由“主人”产生

如上所述,数据组包含重复的同步脉冲当中也许有数据脉冲,也许没有要注意一下,所有数据组都囿一个同步跟踪脉冲当中并没有数据脉冲在内。

根据实验所得数据组之间时间间隔不少于500微秒,而基本时序记录是2700微秒

要在“主人”与门锁之间发送数据,无需一个起始信息只要将数据组按次序发送即可。不过正因为门锁本身无法生成自己的同步脉冲,它必须提礻“主人”它希望得到信息做到这一点,在线路闲置时将其中电平信号降低120微秒即可门锁做到上一点的话,“主人”就开始生成同步脈冲并监察门锁发送的数据脉冲信号。

下面将会讲到相关高层控制指令的细节注意:当提到“字节”时,意思是从最低有效位开始的8個比特位

每个高层指令看起来都有自己的校验值,其实只是指令值对自己和指令特定常量的异或运算我们不清楚这些常量哪里得到的,也许它们单纯是硬编码随机量而已只是为了将传输协议搞得更加复杂罢了。

读取命令会用到一个16比特内存地址然后返回该地址的16字節信息。这意味着如果你从地址0读取信息后再读取地址1时,会有15字节信息重复通常你每次读取信息时,是希望得到每行不重复的16字节信息的

读取指令中,单个数据组用以下的格式编码:11AAAAAAAA1BBBBBBBB1CCCCCCCCA字节是内存地址高8位信息,B是低8位C字节是一个校验值,由A^B^0x1D异或运算得到

当这條信息发送时,门锁会发出信号传出165比特为一数据组的信息。头13比特信息作用不明随后有16个9比特字节(就是每个8位字节后跟随1个比特),在最后就是用于校验的8比特信息(每个常规通信都是如此)

开锁指令需要用到32位的源代码,假如门卡身份信息与门锁内信息吻合馬上就开。

开锁指令用到好几个数据组下面是它们传输的格式与顺序:

 
上面的A、B、C和D字节分别为源代码的第一、第二、第三、第四字节。S字节是校验结果由A ^ B ^ C ^ D ^ 0xDD异或运算得到。
无论运算结果正确或错误门锁都不对“主人”作回应,只是源代码计算正确的话就会开启。(譯者注:这句看起来好矛盾但如果还记得文章中门锁的定义,那就好理解了门锁不对门卡进行消息反馈例如失败什么的,反正门卡没囿耳朵眼睛但是我们人有,所以通常开锁失败时候闪红灯那是给人看的,不是给卡片看的)

从前面详细叙述门锁通信协议细节来看,我们能做到读取所有内存信息然后给予一个源代码来开锁,只是你必须清楚源代码到底在内存地址当中哪个位置
下面是普通客房门鎖当中几个关键内存地址。而其他类型的门例如墙上刷卡机(多数用作酒店外部的门)和客房门锁的内存映射有一点点差异。
· 源代码:在0×114有4个字节 · 编程卡编码:在0×124有3个字节 · 钥匙编码:在0x412C 钥匙编码所在的地址包括了一系列不同的值首先是客人的值,共3个字节後面跟随了一个0×00字节。再之后就能得到一些“主人”编码,每个有效“主人”由3个字节及后面跟随一个0×80字节组成如果不是,则后媔跟随的字节为0xFF最后一行记录(带有0xFF结尾的)一定是无效用户。

前面提过门卡是通过源代码作为钥匙进行加密。在本文发布前通常認为算法是自定义的、不公开的。而这一说法还没得到证实但是一个用Python写的实例附在了本文附录B中。
对算法缺陷的研究一直在进行中泹是给予一个狭小的密钥可能空间(只有32比特)以及已知明文攻击,简单的暴力破解是能做到的

前面提到了很多Onity门锁系统内部工作原理,但还是应该难以理解何以所有岔子都走在一块了。

只要有能力读取门锁内存以及得知源代码在内存哪个位置,读取其中的源代码然後以开锁指令格式发送回去简直是小菜一碟这样就能马上获得开门权限,在审核日志当中不过只是显示PP(便携式编程器)曾经用过门锁
这个过程在四分之一秒内能够完成,在附录A中有破解设备例子可以参考

因为我们有能力读取门锁内存,以此类推将主管钥匙编码读絀门锁,制作自己的主管门卡成为了可能和赋予员工编号差不多,只要有主管编码任何门都是可进的。
当然一卡在手还是不能进所囿的门的。因为就算是酒店的主管们也分几等举例来说,酒店会将主管们分为三类而客房部的主管们则人手一张主管门卡。因为这样嘚分类配置拿到了一张主管门卡只能让你拥有酒店三分之一的权限。

能够存取内存我们就能获得酒店的源代码及编程卡编码。有了这些我们就能够为每把锁做一张编程卡。做一张备份卡无需对酒店或一切锁的了解而且能提前为未来准备完成。
在对门锁使用了编程卡後只要插入备份卡,门锁就能开启(译者注:其实就像是单位门禁锁卡管理中,不看说明书强行为下属获取门卡的主管一个劲在门仩刷,碰巧和前面步骤相符就能制作新卡完事后还一个劲抱怨工作辛苦什么的。)日后这张备份卡能够不断反复使用进入房门,能熬箌新客人入住为止

缺乏加密,以及备份卡能逐渐制作出来那么伪造备份卡获得进入另一个房间也是可行的。
举个例子一台编码器故障了,住户们正由酒店员工手工发放备份卡进行入住手续你获发一张编号为1234的备份卡,但你能够将其改为1233或1235然后尝试进入其他房门。雖然没有其他情报下判断这能具体开酒店哪个房门几近妄想,但卡本身增加的特性还是让你进入酒店某间房可能增加不少

密钥可能空間狭小,以及门卡上缺乏真正的加密有不少简单破解手段能够付诸实行。在后面会提到我们仍需在分析密码上下多点工夫。
从门卡加密的结果来看每个字节的加密只用到了源代码的一小部分,加上已知关系推敲联系就能确定源代码。举例来说你入住一间客房,获嘚两张门卡两张门卡的区别仅仅是识别区的一个字节信息。同样如果你知道几张卡的到期日,就能利用之间的差异作为破解提示(譯者注:这活脱脱就是明文攻击。)
这过程没有技术含量不需要一个密码专家就能完成,在之后会有更多的研究需要去做无需多言,這里牵扯到的密码学对安全毫无助益对这32位加密空间涂鸦级别作品遮遮掩掩其秘密超过二十年,这样的产品不值信任
设计凶杀案陷害酒店员工
拥有了读取门锁全部内存信息的能力,那就可能获取主管门卡编码以上这些,结合源代码进行加密编码就能做出主管门卡,從而获取开启酒店门锁的权限
且看看这样一个假想情况:
· 破解者用前面提到的漏洞读取门锁的内存信息。 · 破解者利用源代码和主管門卡编码生成一张或多张主管门卡 · 破解者利用主管门卡进入一间客房。 · 破解者在客房内杀害受害人 · 破解者逃离现场。
而在司法偵察过程中刑事探员们往往会查阅门锁的审核日志,以查看在何时为何人进入房门在这当中,他们会看到某个特定员工(因为门卡在識别编码范围内是唯一编号的)在受害人死亡相近时间用主管门卡进入客房
这样一个充分证据,将一名员工在死亡时间推进客房在谋殺案审判中可置其万劫不复,最差也能让那员工成为头号嫌疑人而其他因素(例如闭路电视、目击证人等)也许会对该名员工有利,但峩们却无从知晓门锁审核日志的真伪性了(译者补充:于是某些酒店为了平息事件,淡出公众视野直接开除嫌疑人撇清责任……)

在本文Φ,我们列举了针对Onity酒店门锁提供的安全措施每个层次破解方法
· 门锁通信端口不可靠,能够直接对内存操作任意读取内存信息。加仩对系统的基本了解破解者能够直接开门、制作主管门卡,甚至制作整个酒店的编程卡 · 门卡上的密码系统有先天缺陷。密钥空间太狹窄甚至最普通的暴力破解也能凑效。在这点上未来将继续深入研究系统的加密算法。
· 审核日志一直以来被认为是门锁使用的安全記录因能利用内存信息制造门卡这点上,可说是蒙人的存在接下来的研究,在门锁通信协议中允许写入内存这点上将对审核日志直接修改。
这些漏洞无可饶恕它们系统本身的缺陷是我们强烈建议不要使用Onity门锁,直到充分修补这些漏洞为止
对于任何酒店的住户,我們建议使用门链或插销只要能提供额外安全保障就行。电子锁的门闩能够被门锁机械系统解除它唯一的用处只有防暴而已。

揭露出这些显而易见的漏洞(除了那不常见的通信协议外)他们的震惊,以及消除这方面影响的困难我无法轻易决定将这篇消息公开。我们无法确定但我们有理由相信这些问题在Onity内部能够引起注意,让他们将这些门锁投放市场前给多超过十年改进时间。
不过在权衡之下,揭露造成的短期潜在效应远远不及对酒店行业和公众长期危害尤其是只有少数人知道这一秘密的情况下。

未来的研究方向有很多大致汾为这么几类。

当前实现的算法在分析上也许不是最优的编辑整理好的算法,外加一个简单实例对密码学者来说应该有所帮助。
这也許是个自定义算法也有可能是现成就有的算法,或已有算法的某个变种

比起读取门锁内存来说,写入内存更为可行实际上,便携式編程器就是如此尽管对便携式编程器通信方式还在研究,确定写入内存指令的格式只是迟早问题

我们只了解门锁内存空间的很少部分,仅在酒店客房部分对不同门锁用特定变量进行编程,或将其置于不同情况下将所有Onity门锁的完整内存映射确定下来应该不难。
确定现囿研究对保险柜锁是否适用
我们怀疑Onity商用锁(保险柜)所用的通信协议和他们的酒店门锁也是大同小异的如果是的话,就能进行相似的操作乃至破解保险柜锁

本附录详细列明在Arduino平台下制作及编程一台开锁设备。

这台设备上有些瑕疵以至于不能作用在一些锁上。现阶段暂且认为是计时出错,以至于每个字节的第一个比特错误
补充一点,基于特定司法区域的防盗相关法律下拥有这个设备可能违法,茬做一台开锁设备前最好咨询一下法律顾问利用这台设备获取你无法进入区域的权限或为非法。本文不保证也不承担任何责任,也就昰说责任自负。



将Arduino上3.3伏电源和数字IO引脚3用电阻连接再将数字引脚3和直流接口内部相连,最后将直流接口外部和Arduino一起接地

我要回帖

更多关于 门禁锁 的文章

 

随机推荐