GPS 跟踪器旨在让您更加安心,帮助您定位孩子、宠物,甚至是汽车。它们可以通过提供一个简单的 SOS按钮来帮助老年人或残疾人保持安全,方便他们在需要时呼叫紧急帮助。许多设备在像亚马逊和 eBay 这样常见的网站上进行营销,价格通常在 25 至 50美元之间,相对于某些相同功能的智能手机,经济上更具吸引力。
但是,我们对这些总是知道我们位置的设备了解多少呢?这些设备中的大部分还有麦克风,甚至能听到我们的声音。事实证明,如今一些 GPS跟踪器,尤其是市场上低端的产品,可能会让人感到不安,而不是带来安心。它们不仅缺乏安全性,而且更可能使您的亲人变得更加脆弱。
我们决定查看几款在亚马逊、eBay 和阿里巴巴上可用的儿童跟踪器,以评估它们的安全性。
GPS 跟踪器基础知识
现在可用的 GPS 跟踪器使用多种通信渠道和技术。图 1 显示了典型的架构。
图 1: GPS 跟踪器的典型配置和架构
涉及多种传输协议和层,我们同时在多个方面进行安全评估。
通常,跟踪器本身是一个简单且廉价的设备,主要组件是一个 SOC(片上系统)模块;通过串行总线将 SOC 连接到 GPS 模块以提供定位信息,以及连接到
SIM 卡的 GPRS 调制解调器,后者为设备提供数据和短信功能。通常您还会发现一个麦克风和一个用于通话功能的扬声器,这在按下“SOS”按钮时被使用。
图 2: GPS 跟踪器内部工作原理
我们将研究分为四个类别:
- 分析特定设备的入门流程
- 分析网页和管理门户(如果有的话)
- 分析移动应用与云之间的流量
- 分析跟踪器与云之间的 GPRS 流量
真实设备及初步接触
我们决定选择一个跟踪器并进行更深入的研究。我们选择了一款被称为 “T8 Mini GPS Tracker” 的跟踪器,它可以挂在钥匙链上,配备 SOS按钮,并具备双向通讯功能(扬声器和麦克风)。
图 3: 关注的跟踪器
最先吸引我们注意的是入门流程。随附的说明书中提到:
如指导所述,可以使用一个网络门户和一个移动应用来管理跟踪器。我们选择了最简单的路径,首先打开了一个可以通过http://en.i365gps.com
访问的网页应用。这个网站在许多方面都不安全:
图 4: 网页应用登录界面
如您所见,第一个 红旗
是登录表单通过 HTTP
协议提供,而不是更安全的
HTTPS
。此外,您有两个选项可以连接到云:使用用户名和密码的账户,或者使用 ID 和密码。该选择哪个呢?我们查看了说明书以获取答案。它是这样说的:
图 5: 默认密码
这适用于 Android 应用和网页应用。令人担忧的是最后一句:“…用户需要联系经销商以注册用户名,如果需要通过用户名登录。
”由于您必须拨打经销商的电话才能请求用户名,显而易见您需要使用 ID,而其密码是“123456”。这不是一个好的开始。
为了演示,我们的 ID 是:17032491112 ,密码是123456 。当您登录网站时,将会看到如下界面。
图 6: 网页应用界面
这里的一切仍然通过不安全的 HTTP 协议传输,您可以更改密码,但仍然无法创建账户。让我们更多关注 ID。
将 ID 用作用户名
用于登录应用的 ID 是 11 位
长。请看设备信息特写(图 7 ),它有时被称为“IMEI(国际移动设备身份)”。
图 7: 特写
您可以看到,该设备被识别为 T8S-49112
,因此最后五位数字取自于“IMEI”,开头部分可能是型号。奇怪的是,被称为 IMEI 的号码并不符合标准的
。根据规范,IMEI应为 15 位 ,最后一位为所谓的控制位。当我们进一步搜索时,我们在跟踪器的内部(图 8 )以及后来的一个小标签上找到了完整的
IMEI。因此在我们的案例中,完整的 IMEI 是:
图 8: 跟踪器内部及 IMEI 和 ID
图 9: IMEI 简化拆解
因此,通过将我们的“IMEI”和 ID 号码与规格匹配,我们能够得到
图 10: 匹配的 ID 和 IMEI
所谓的 TAC 的第一部分包括各种子部分,但为简化起见,可以说它是分配给供应商的,和
地址的前缀方式类似。这也意味着所有其他跟踪器的号码都是可预测的,您可以轻松地列举它们。结合固定密码,这意味着我们可以登录约 25% 的设备,这个 IMEI数字序列中的设备。
了解协议
好的,那么现在暂时把 IMEI 可枚举性放一边,来看看设备、移动应用和网页应用是如何与云进行通话的。
网页应用到云
我们已经知道网页应用中的所有通信都是通过 HTTP 进行的,因此让我们看看我们使用一些标准工具从网页应用发出的请求:
图 11: 网页应用 AJAX 请求(Chrome 开发者工具)
通过简单的工具,我们可以看到所有请求都是经过明文传输的标准 JSON AJAX请求。我们无需深入分析这一部分,因为命令或多或少与移动应用向云发出的命令相同。虽然值得注意的是,所有 JSON请求再次是未加密的明文,然而更令人担忧的是设备能够发出的命令。除了期望的命令,如获取 GPS 坐标和设置地理围栏外,还有一些特别引人注目的命令:
- 您可以让跟踪器拨打任意电话号码 ,一旦连接,您可以通过跟踪器监听另一方,而对方并不知情。
- 您可以让跟踪器向任意号码发送短信 ,这可能使您获取设备的电话号码,并利用短信作为攻击向量。
- 您可以向跟踪器发送一个URL ,跟踪器可以通过该 URL 更新固件 ,这允许攻击者在设备上放置新固件。
移动应用到云
图 12: 伴随应用
现在让我们看看名为
的 Android 应用是如何与云进行通信的。捕获流量后,我们立刻发现它使用明文 HTTP 协议通过非标准端口与云进行通信,在这种情况下是
TCP:8018
。
图 13: Android 应用在登录时捕获的流量
您可以再次看到,整个通信均以未加密的明文方式发送到端点 http://(redacted):8018/openapiv3.asmx
。这是实际请求的内容:
图 14: 登录数据包细节
有趣的是,登录请求使用内置的 Key
和 LoginAPP
值,这给了我们一个提示,说明这个“框架”正在被不同的应用使用,因为 Key
也嵌入在
APK 文件中。
这里的 LoginType 字段区分通过用户名和密码(LoginType=0
)或通过 IMEI和密码(LoginType=1
)的方法。这一参数控制您正在使用的凭证的集合。
当登录成功时,响应以 HTTP 形式返回,并以 XML 字符串包装,实际上是 JSON。典型的成功响应如下所示:
图 15: 登录请求的 JSON 响应
我们看到很多自解释的字段,但这里最重要的两个字段是 key2018
,它是一个 Base64 编码的 64 字节 长会话密钥,以及
deviceID
,这两个字段都需要用于进一步的请求和命令。
其中一个命令可以是 GetTracking
。您可以看到该命令在登录后被发出(图 13 )。如预期的那样,唯一的输入参数是:
图 16: 请求跟踪器的当前位置或最后一次见到的位置
我们不太确定 Model
字段的用途,但其他字段是自解释的。接下来是响应:
图 17: 对 GetTracking
调用的响应
现在我们知道应用和云的通信完全是明文传输,没有加密。
跟踪器到云
现在让我们深入了解设备本身是如何与云进行交流的,数据是如何通过移动运营商在实际跟踪器和服务器之间交换的。
解码或反向工程使用 LTE 或 GPRS 移动协议之上的 IP 传输的协议并不简单。通常没有简单的方法可以插入流量,因为它在设备与电信提供商之间通过
GPRS 封装发送,然后直接发送到云服务器,在通往云的路上没有明显的方式可以嗅探数据。
如果您想分析此类流量,基本上有两个选项:
- 构建自己的“假” BTS 站并运行自己的 GSM 网络,这样您就可以观察所有通过的数据流。
- 在数据被编码并通过 GPRS 调制解调器发送到设备之前检查数据。
第一个选项很复杂,并且要合法地执行,您需要一个
,因为在没有所需许可证的情况下运营自己的 GSM网络在大多数国家都是非法的(更不用说相当困难)。此外,虽然有许多开源解决方案(https://osmocom.org/projects/osmobts),构建设备并不是那么简单,仍然与以太网或
WiFi 嗅探相比相当麻烦和不方便。
第二个选项需要一些硬件技能和愿意放弃设备保修的意愿。我们对此十分乐意。正如我们在开头所指出的,大多数 GPS 跟踪器都有 GPRS调制解调器作为内部独立组件,尽管通常内部非常小,但仍然有很大机会能接触到主 CPU 和 GPRS 调制解调器之间的串行线路。
因此,我们这样做了。打开 GPS 跟踪器后,我们识别出几个看起来正是我们需要的连接点。我们找到了两组串行连接焊盘(TXD/RXD/GND),显然一组用于
GPS 与 CPU 的通信,另一组用于 CPU 与 GPRS 调制解调器的通信,因此通过尝试和错误确定了正确的那一组:
图 19: 接入跟踪器以获取 GPRS 通信
完成此操作后,我们能够确认所有数据均未加密地从 GSM 网络传输至云服务器。通信采用基于文本的协议,最令人担忧的是缺乏授权。整个过程仅仅通过 IMEI身份识别跟踪器。
短信到跟踪器
最后,还有一个通道可以用来控制跟踪器。由于它基本上是一个轻量级的手机,您可以使用简单的短信设置和获取一些信息。要获取 GPS 位置,您可以从手机向插入跟踪器
SIM 卡的号码发送短信。要做到这一点,您需要知道密码,但除非用户更改了它,默认密码对所有设备都是相同的。
图 20: 手册中列出的短信指令
我们通过硬件逆向工程了解到了一切,但我们真的有必要这么做吗?事实是,在研究通过短信直接对跟踪器发出的命令时,我们发现了一条指令:
图 21: 设置跟踪器的短信指令
尽管以神秘的“设置 IP 和端口”名称隐藏,但实际上该命令意味着您可以设置设备联系的云服务器的 IP 地址和 TCP端口。对于攻击者(或安全研究人员)来说,这就是圣杯;结合用于数据双向传输的未加密协议,您可以轻松地进行
(MITM),并使用标准的
IP 工具捕获所有数据。因此我们确实这样做了:
图 22: 通过恶意服务器转发流量
图 23: Wireshark 捕获的位置数据包流量 (您可以轻松找到 IMEI/ID 和坐标)
已识别的指令格式似乎是文本格式,遵循这一格式:
跟踪器 -> 服务器的心跳命令:
[3G*1703249112*000C*LK,0,1226,85]
服务器 -> 跟踪器的心跳响应:
[3G*1703249112*0002*LK]
激活监控模式(回拨该号码)服务器 -> 客户端:
[3G*1703249112*0015*MONITOR,+420612661749]
向提供的号码 (+420602661749) 发送 SMS “测试” 服务器 -> 客户端:
[3G*1703249112*0016*SMS,+420602661749,测试]
位置和状态(客户端 -> 服务器):
[3G*1703249112*0090*UD,210619,053538,V,37.481010,N,-122.2315369,W,0.00,0.0,0.0,0,86,86,0,15,00000000,4,255,202,1,2082,5673,140,2082,12,128,2082,5671,118,2082,11,115]
在各地寻找 API
在研究各种 API 端点时,我们发现我们所调查的平台似乎被许多其他供应商广泛使用。经过一些 Googling,我们找到了一个似乎是移动应用与云接口的文档:
图 24: 在其他实例中找到的自文档 API(部分列表)
本次研究并不打算去挨个查看该 API 提供的每一条命令,但我们来看看几个例子,以进一步说明安全性有多糟糕,以及对普通用户可能带来的后果。
命令 GetDevicePhoto
。尽管我们所研究的跟踪器没有摄像头,但其他使用相同云框架的设备(例如图像中的 A19-3G 网络 GPS智能手表
)是有的。这条指令无疑引起了我们的兴趣。
图 25: 带有内置相机的儿童 GPS 跟踪器
当我们查看命令的参数时,看到这些:
图 26: 获取跟踪器拍摄照片列表所需的输入参数
如您所见,所需的参数其实不多:DeviceID
是您登录账户时获得的 6 位 数字。TimeZones
其实无关紧要,因为它仅用于调整照片的输出时间戳。Key
是分配给使用此 API 的 Android 应用的固定密钥(如图 14 所示)。
当我们将其应用于具有内置相机的跟踪器时,发现获取该设备的照片列表是多么简单。
图 27: 获取照片列表的小代码片段
结果是一个漂亮的 JSON 格式的文档,内容如下:
您所需要做的就是将 imgUrl
附加到 photoName
上,即可获得该照片的 URL,无需进一步授权。如果您关注的话,会注意到
photoName
的模式似乎是熟悉的。
结果表明,ID 实际上是用于登录到账户的跟踪器的 IMEI/ID。理论上,您可以通过时间戳扫描所有图片。然而,老实说,最简单的方法是扫描所有
DeviceID
(图 27 ),因为它只是一个 6 位 的数字,您实际上不需要其他任何东西。
规模与白标
好的,让我们回到 IMEI/ID,这两个与默认密码结合在一起,作为您账户的凭证。还记得我们是多么简单地扫描 100 万个可能的 IMEI编号,因为它们具有相同的前缀吗?所以我们自行扫描了 400 万 个连续的序列号,以便了解设备的规模,并发现至少有 六十万个
设备在使用默认密码。我们对其中 一百万 个设备进行了更深的扫描,以确定品牌、型号和位置;在这百万台中,我们发现超过 167,000
台是可以定位的。
图 29: 对 100 万个序列号进行详细扫描的结果
图 30: 跟踪器的最后 GPS 位置
现在显然,这个供应商的所有或大多数跟踪器使用同一基础设施,因为我们在对 100 万 个 IMEIs 的扫描中识别出了 29
种不同型号的跟踪器。所有型号均由批发商 Shenzen i365销售,我们能确定的是,在这次扫描中某些型号以不同的产品名称出售,这使我们得出结论,该基础设施和设备被白标,并以不同品牌的名称出售。然而,在许多情况下,我们只能确定一个通用型号。
| 跟踪器数量 | 跟踪器型号 | |—————-|——————| | 60601 | T58 | | 36658 | A9 | | 26654 | T8S | | 20778 | T28 | | 20640 | TQ | | 11480 | A16 | | 10263 | A6 | | 9121 | 3G | | 7452 | A18 | | 5092 | A21 | | 4083 | T28A | | 3626 | A12 | | 2921 | A19 | | 2839 | A20 | | 2638 | A20S | | 2610 | S1 | | 1664 | P1 | | 749 | FA23 | | 607 | A107 | | 280 | RomboGPS | | 79 | PM01 | | 55 | A21P | | 26 | PM02 | | 16 | A16X | | 15 | PM03 | | 4 | WA3 | | 4 | P1-S | | 3 | S6 | | 1 | S9 |
图 31: 跟踪器型号及其在 100 万详细样本扫描中的计数
图 32: 受影响的型号
您可能已经感到,这个故事远不止表面看起来那样,因为我们在这次扫描中发现了其他未必由该公司生产的设备。事实证明,这个问题远比看起来的要严重。问题有多严重?我们将在后续文章中深入探讨各种产品和公司之间的关系以及云基础设施的许多惊人事实。我们还发现了更多令人担忧的漏洞和此云及其跟踪器的众多实例。
但截至目前,我们认为可能涉及大约 50 种共享同一平台(并可能也存在相同漏洞)的应用,具体情况如图所示:
图 33: 研究仍在继续,期待您在第二部分再次相见,我们将揭示更多关于平台/云的信息
可能的攻击向量
考虑到每一个与这些产品云的通信渠道都存在安全问题,因此存在无尽的利用可能性。但让我们关注一些有趣的方向:
现成的锁定设备
每个设备的账户似乎从设备制造之时就已激活,因此攻击者可以在用户购买跟踪器之前就基于 IMEI 号码将用户锁定出账户,因为您可以更改未使用设备的账户密码。
获取电话号码
可以通过短信(如允许设置数据流向的云服务器的命令)对跟踪器发出某些指令。但是,如果用户未将跟踪器 SIM卡的号码写入账户,则攻击者(仅看到账户)将无法知道它。但获取这个信息很简单。通过账户,攻击者可以让跟踪器向他拥有的手机号码发送短信,这样可以将跟踪器的 ID与其电话号码相关联。一旦确认了,可以发送 SMS 以设置新的 IP地址和云服务器的端口,并将所有流量从跟踪器重定向到您选择的服务器。这一切都可以远程完成,允许攻击者查看任何拥有该设备的人的完整行踪。
窃听
由于云允许您向任何跟踪器发送命令,使其拨打任意电话号码,您可以轻松窃听跟踪器用户,而他们并不知道该跟踪器已拨打了某个电话。
伪造位置
向云撒谎,告诉它跟踪器在别处或执行其他操作,出奇地简单,因为云中的服务开放,只需在数据包中查看 ID/IMEI,其他所有信息都由您自己决定。
结论及未来工作
如您所见,这个问题明显超出了单一供应商的范围。我们发现其他不同的应用也使用类似的
API,同时也发现有一些不是由该供应商制造的型号,这些型号与这云基础设施相关联。我们已着手撰写下一部分研究,将主要集中于使用的云基础设施以及白标如何将这一问题扩大到巨大的规模。
期待在下一部分的博客中与您再次相见,我和我的同事 Nikolaos Chrysaidos 将深入探讨白标、平台共享,以及导致我们今天看到的 IoT和智能设备安全状况不佳的所有糟糕决策和设计缺陷。
为了负责任地披露此信息,我们在 2019 年 6 月 24 日通知了这一特定供应商,至今未收到对重复信息的任何回应。
编辑:
该系列的第二部分已经发布:
标记为
、、、、、、、
分享:XFacebook