首页
社区
课程
招聘
[翻译]破解Nokelock API
2019-7-14 20:31 6829

[翻译]破解Nokelock API

2019-7-14 20:31
6829

破解Nokelock API

Nokelock漏洞

我过去一直在一些信息安全会议上讨论Nokelock锁。我现在需要区分这个名词,因为有一款产品叫做nokē,我所讨论的并不是它。我们所讨论的是一系列中国制造的锁,叫做Nokelock,来自叫做Nokelock的公司。

 

亚马逊上的大多数廉价蓝牙挂锁都是Nokelocks;它们根据一系列不同类型主体制作了一系列不同样式的锁,有时还有其他解锁设备,例如指纹传感器。还有被品牌商挂名重新包装的,如Micalock。

 

我花费了许多时间尝试逆向了那些锁的BLE协议,以及API调用的意义,并发现了一些有趣的漏洞。近六个月我们一直在尝试报告这些漏洞,通过多种途径,但没有得到回应。

 

在我们了解实际漏洞前,让我们先说说如果您拥有并使用Nokelock(或一个克隆版),我可以做什么:

  1. 我可以在10m范围内通过BLE打开你的锁。我不需要拥有账户;我只需知道锁就可以做到这一点。
  2. 我可以从Nokelock数据库中获取你所有的信息,这包括你的email地址和密码hash。
  3. 我可以从你的锁中获取GPS坐标。
  4. 我可以取消注册你的锁并将其分配给另一个账户,这样你就无法打开它。

有人还在使用Nokelock吗?

 

Right,到了进入黑暗的细节的时间...

蓝牙协议

所有的Nokelock锁遵循同样的BLE协议。该协议在一个经过混淆的Android应用中实现。

 

像大多数BLE设备一样,它也使用了一种通信特征:一个TX特征用来写入,通过通知消息传递RX数据。该特征具有UUID:000036f5-0000-1000-8000-00805f9b34fb ;并在我看过的每个锁上都是句柄0x03 。

 

通过TX或RX传递的每个数据包是16个八位字节,并遵循相同的基本模式:

Command Token Random Padding
02 01 01 01 6e 6e ae be 6c 01 23 18 76 67 0b 42
 

上边的数据包是GET_BATTERY命令,该命令返回当前电池的状态。这样:

  • 02010101 是表示获取电池状态的静态命令。
  • 6e6eaebe 是可以从设备中获得的token。
  • 6c01231876670b42 是防止重放的随机填充

整个数据包使用AES和每个设备唯一的静态密钥进行加密,来防止各种数据嗅探。

 

有许多不同的数据包被用来和设备通信用来获取电池状态,改变设置和解锁设备。要解锁设备,只需要获取设备的token,随后使用token调用解锁功能。

 

获取token的命令是06010101,锁随即回复060207和四个八位字节的设备token。随后解锁命令(050106303030303030)可以被发送,看起来像这样:

 

客户端到锁:GET_TOKEN

Command Random Padding
06 01 01 01 79 57 12 78 6c 01 23 18 76 67 0b 42
 

锁到客户端:TOKEN_RESPONSE

Command Token Random Padding
06 02 07 6e 6e 6e ae be b8 6c 01 23 18 76 67 0b 42
 

客户端到锁:UNLOCK

Command Token Random Padding
05 01 06 30 30 30 30 30 6e 6e ae be 76 67 0b 42
 

它比我上面展示的要复杂的多,因为整个数据包都是用AES加密方式加密的。幸运的是(对于漏洞利用,如果你使用了其中一个,就少了很多),加密的Key可以使用两种方式从API获取。所有的API请求需要一个合法的API token,这可以通过简单通过利用一个废弃的电子邮件地址创建用户来获得。

 

每个锁附带二维码,这可以放在到/newNokeLock/lock/getDeviceInfo的post请求中:

 

图片描述

 

请求的响应是转储的锁的所有数据,包括加密使用的key:

 

图片描述

 

注意这不仅仅包含加密的key,还包含BLE广播名称,在本例中O-W*,这可以使用wigle.net搜索到。

 

如果你没有二维码,你可以搜索设备的MAC地址,因为MAC地址被用来与设备通过BLE通信,当设备有电时,就可以被嗅探(例如:按下了设备上的按钮)。这需要调用/newNokelock/lock/queryDevice端点:

 

图片描述

 

和getDeviceInfo返回同样的信息:

 

图片描述
注意二者都返回了称为lockPwd的项,设置为000000,如果你看了上面的UNLOCK数据包,你会注意到6个八位字节具有值0x30,ASCII“0”.这暗示可能存在为锁分配密码的途径,尽管APP代码没用使用它,仅仅发送6个0,并且我无法找到改变它的办法。

 

所以,如果你将这些联系到一起,你可以加密数据包并使用一个API调用和快速BLE会话解锁任何设备。我们的github page上有一个脚本可以扫描这些锁并解锁这些锁。这有些不受控,这不是锁,这只是我在脚本中的编程方式。

API

所以,让我们来看看有趣的一点:API。我们在API中发现许多漏洞,我们从2019年2月开始尝试将漏洞提交给厂商,通过多种渠道,包括email,电话和微信。我们甚至尝试通过发言人和他们沟通。

 

我们没收到任何回应。

未加密的API调用

所以...首先,我们使用一个终端监控所有流量,屏幕截图展示如下图:

 

图片描述

 

就是这样,所有流量,包括用户的流量通过未加密的HTTP协议发送。记住,现在设置TLS证书是多么容易和便宜,这是不可接受的。

所有API方法中的IDOR

值得注意的是,Nokelock API客户端没有在其API中使用授权措施。这可能允许攻击者读取用户或锁的信息,包括email地址,密码 hash,所得GPS位置。

 

它也可能允许攻击者修改那些细节,允许攻击者获取锁的控制权来解锁它或阻止其拥有者使用锁。

 

执行这些操作需要一个token,但是token仅仅被执行了有效性检查。例如,它仅检查账户是否是被授权的账户,而不是是否进行了授权。可以简单地通过创建一个用户来获取权限。

 

为防止违反"计算机滥用行为法",仅针对售后拥有的账户执行了必要的操作。

密码采用未加盐的MD5哈希值

有一个API调用会返回用户密码的hash。我们注意到这是未加盐的MD5哈希。

 

这从算法上来说是一种弱的hash类型,可以快速进行计算。由于hash是未加盐的,如果如上所述数据库被IDOR攻击破坏或提取,破解密码非常容易。

总结

这是一个旧的即兴演奏,但“买家小心”;带有危险APP的便宜产品通常便宜是由于在设计和制造方面已经削减了一些东西。这也可能意味着尚未对产品进行适当的测试,并且可能存在安全漏洞。

 

尽管蓝牙锁是个非常好的想法,我不建议任何人使用Nokelock(或克隆版)并期望他们是安全的。

 

如果Nokelock尝试修复锁,我已经准备好足够的震惊了。但我找不到任何容易的方式来在APP中进行固件升级。

07/06/2019更新

我们需要提一下White Hat Defenses的Kerry Enfinger博士 ,他已经针对Nokelock的一个克隆版完成了一个相似的逆向工程工作,称为Klic Lock。在我们研究Nokelock的同一时刻,他也获得了一个CVE编号(CVE-2019-11334).

 

他的代码在这里:

 

https://github.com/whitehatdefenses/KlicUnLock.

原文地址:https://www.pentestpartners.com/security-blog/pwning-the-nokelock-api/

翻译:看雪翻译小组 sudozhange
校对:看雪翻译小组 玉林小学生


[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2019-7-14 20:33 被sudozhange编辑 ,原因: 图片
收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回