Nokelock漏洞
我曾在以前的一次信息安全会议上谈论一个名为Nokelock的挂锁。而我今天要讨论的是一款同样名为Nokelock的挂锁,它来自中国的Nokelock公司。这和我以前在会议上讨论过的挂锁并不是同一个,虽然它们的名字一样。
在亚马逊商城中有很多廉价的蓝牙挂锁都来自Nokelocks;这些锁的外观均不相同,而且锁的功能部件也有差异,例如有些带有指纹传感器,有些带有数字键盘。此外,有些还会被其他品牌重新包装再售卖,如Micalock。
我花了很多时间尝试对BEL(蓝牙)协议进行逆向工程,同时对API进行测试,最终发现不少有趣的漏洞。然后,在近6个月内,我们试图通过多种不同的渠道向厂商反映情况,但并没有得到任何回复。
在我们了解漏洞详情之前,让我们先说明如果你拥有Nokelock(或是它的重新包装版),我可以对它做些什么:
只要在10米范围内,我可以通过BLE打开你的锁。我不需要知道关于锁的帐户的任何信息,任何锁我都可以拿下。
我可以从Nokelock数据库中提取所有信息,包括你的电子邮件地址和密码哈希。
我可以获得锁的GPS坐标。
我可以取消锁的注册,并将其分配给另一个帐户,这样你就无法打开它。
还有人坚持使用Nokelock吗?
现在,让我们进入利用的细节……
蓝牙协议(Bluetooth Protocol)
所有Nokelock锁都遵循相同的BLE协议。该协议是在一个被混淆的Android应用中实现的。
与大多数BLE设备一样,它使用了某种通信特性:一个被写入时通知消息传递RX数据的TX特性。该特征的UUID为000036f5-0000-1000-8000-00805f9b34fb; 并且在我研究过的每个锁上都一直位于句柄0x03处。
通过TX或RX传递的每个数据包是16个八位字节,并遵循如下模式:
上面的数据包是一个名为GET_BATTERY的命令,它会返回电池的当前状态。其中:
02010101是静态命令,表示获取电池的状态
6e6eaebe是一个可以从设备获得的令牌
6c01231876670b42是随机填充以防止重复
然后使用AES加密算法和设备中的密钥对整个数据包进行加密,防止数据嗅探。
有许多不同的数据包可在与设备通信过程中获取电池状态,更改设置和解锁设备。如需解锁设备,程序需要从设备获取令牌,然后使用令牌调用unlock。
get token命令是06010101,然后锁会返回060207以及一个四位八字节的令牌。接着就可以发送解锁命令(050106303030303030),模拟流程如下:
客户段 to 锁:GET_TOKEN
锁 to 客户端:TOKEN_RESPONSE
锁 to 客户端:UNLOCK
不过,实际情况下比上面所示的要复杂很多,因为整个数据包都被AES加密算法加密过。但幸运的是,我们可以通过两种方法从API获取密钥。而发送所有地API请求都需要一个有效的API令牌,不过我们只需通过废弃的电子邮件创建一个用户即可获得令牌。
每个挂锁都带有一个QR码,就放在路径/newNokeLock/lock/getDeviceInfo下,可以通过post请求获取:
从响应中我们可以看到有关该锁的大量敏感数据,包括加密密钥:
请注意,这其中不仅包含加密密钥,还包含BLE的广播名称,在本例中为O-W *,可以通过wigle.net进行搜索。
如果你没有QR码,则可以使用设备的MAC地址进行搜索。由于MAC地址用于和设备进行蓝牙通信,因此只要BLE模块通电(例如,按设备上的某个按钮),你就可以进行嗅探。然后调用端点/newNokelock/lock/queryDevice:
它将返回与getDeviceInfo端点类似的信息:
请注意,以上所述的对两个端点的请求都会返回一个名为lockPwd的数据,数值为000000,它由6个值为0x30的八位字节,即ASCII中的“0”。这个参数可能代表着一种为锁分配密码的方法,尽管应用从未使用它,一直都是6个“0”,我暂时也无法找到更改密码的方法。
因此,将以上所述的一切综合在一起,你就可以利用一个简单的脚本通过蓝牙快速解锁这个品牌旗下的任何锁产品。你也可以在我的Github上找到相关脚本。当然我的这个脚本还不是很完善,你可以自己加以修改。
API
现在,让我们来看看API。我们在API中发现了许多漏洞,从2019年1月至今,我们试图通过电子邮件,电话和微信等多种机制向制造商通报这些漏洞。我们甚至试图用普通话与他们进行交谈。
但我们没有得到回应。
未加密的API调用
首先,我们可以直接看到所有的明文流量,如下图:
是的,所有流量,包括用户发出的流量都是通过未加密的HTTP协议进行传输。要知道,现在使用一个TLS证书是多么方便,这是不可接受的缺陷。
所有API方法中的IDOR
我还注意到Nokelock的所有API端点都存在严重的授权缺陷。这可能导致任意访问者读取有关用户或锁的信息,包括电子邮件地址,密码哈希和锁的GPS位置。
它还允许未经身份验证的访问者修改这些数据,非法控制锁,进行解锁以及重新绑定。
当然,执行这些操作需要提供令牌,但服务端仅会检查令牌是否有效,即仅检查帐户是否经过身份验证,而不是帐户是否已获得授权。任何人都可以创建帐户以获取一个令牌。
针对密码的不含salt的MD5算法
某个API会返回用户的密码哈希值。注意,这是未加salt的MD5哈希。
这是一种加密性较弱的哈希类型,哈希计算速度较快,但同时解密难度也低。一旦攻击者获取到了用户的密码哈希,很可能在短时间内就破解出明文密码。
结论
归根结底,这也许不是一个安全问题。便宜的产品往往不安全,因为成本限制,厂商往往要在产品的很多“次要”方面做出取舍,更不太可能对其进行安全测试。
虽然蓝牙挂锁的产品看起来很棒,但我不建议任何人使用Nokelock的产品。我很难相信它们产品的安全性。
如果Nokelock试图修复它们的产品,我任意提供帮助,但我认为这将是一个异常艰巨的任务。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/2685.html
来源:https://www.pentestpartners.com/security-blog/pwning-the-nokelock-api/
文章原文链接:https://www.anquanke.com/post/id/179614