扫码领资料
获网安教程
来Track安全社区投稿~
赢千元稿费!还有保底奖励~(https://bbs.zkaq.cn)
介绍
2024年11月20日,我和我的朋友发现了斯巴鲁 STARLINK 车联网服务中的一个安全漏洞,该漏洞允许我们对美国、加拿大和日本的所有车辆及客户账户进行不受限制的定向访问。
利用该漏洞提供的访问权限,攻击者仅需知道受害者的姓氏和邮政编码、电子邮件地址、电话号码或车牌号,即可执行以下操作:
-
• 远程启动、停止、锁定、解锁任何车辆,并获取其当前位置。 -
• 检索过去一年的完整车辆行驶轨迹,精确度可达5米,并在每次发动机启动时更新。 -
• 查询并获取任何客户的个人身份信息(PII),包括紧急联系人、授权用户、住址、账单信息(例如信用卡后四位,但不包括完整卡号)以及车辆PIN码。 -
• 访问各种用户数据,如客服通话记录、前车主信息、里程表读数、销售记录等。
在我们报告该漏洞后,受影响的系统在24小时内得到修复,且从未被恶意利用。
演示
YouTube 视频链接:https://www.youtube.com/embed/0i8juy6RPBI?si=ZsJUYd6fKj36FthV
仅使用车牌号,在约10秒内成功控制一辆斯巴鲁汽车,并检索到超过一年的车辆位置信息。
谷歌地图演示:https://www.google.com/maps/d/embed?mid=1CjfrOC8whM3NDnSrcyXXZE_CGp-XhVA&ehbc=2E312F
地图显示了一辆 2023 款斯巴鲁 Impreza 泄露的 1,600 组坐标数据,类似的数据可用于任何联网的斯巴鲁车辆。
漏洞分析
大约一年前,我给我妈妈买了一辆 2023 款斯巴鲁 Impreza,并承诺她会让我借用这辆车来尝试破解它。过去几年,我一直在寻找其他汽车制造商的漏洞,但还没有机会研究斯巴鲁。
今年感恩节回家时,我抓住机会,向她要了账户登录信息,看看是否能发现什么安全问题。
审计 MySubaru 移动应用
我首先想测试的是 MySubaru 应用程序。该应用允许用户发送车辆控制指令,因此我使用 Burp Suite 代理该应用,并拦截远程信息处理(telematic)命令的 HTTP 请求,希望找到一个可以未经授权解锁汽车的漏洞。
当用户通过应用解锁汽车时,会发送如下请求:
POST /g2v30/service/g2/unlock/execute.json;jsessionid=AE6E4482F5C4493A79C8F3BD656F8BBA HTTP/1.1Host: mobileapi.prod.subarucs.comContent-Type: application/jsonConnection: keep-aliveAccept: */*User-Agent: MySubaru-PROD-SOA/2024110100 CFNetwork/1568.300.101 Darwin/24.2.0Content-Length: 83Accept-Language: en-US,en;q=0.9Accept-Encoding: gzip, deflate, br{ "delay": 0, "unlockDoorType": "ALL_DOORS_CMD", "vin": "4S3GTAV64P3701234", "pin": "1234"}
在无法绕过应用内车辆控制命令的授权后,我继续在应用中查找其他可测试的内容,但没有发现任何有趣的漏洞点。一切似乎都得到了妥善保护,端点数量不多,授权机制也运行良好。
也许测试 MySubaru 应用并不是正确的方向。
根据我以往对汽车公司的研究经验,我知道可能存在一些面向员工的公开访问应用,这些应用通常比面向客户的应用拥有更广泛的权限。想到这一点,我决定转变思路,开始寻找其他与斯巴鲁相关的网站进行测试。
发现斯巴鲁管理面板
我在 Discord 上给我的朋友 Shubs 发了一条消息,问他是否愿意帮我寻找可能存在的斯巴鲁员工应用。他表示愿意——然后立刻给我发来了这条消息:
shubs — 11/19/2024have you seen this host before?subarucs.com
他注意到 my.subaru.com(MySubaru 应用正在使用的域名)是 mys.prod.subarucs.com 的 CNAME,而这个域名是我之前从未见过的。
nslookup my.subaru.comServer: 127.0.0.53Address: 127.0.0.53#53Non-authoritative answer:my.subaru.com canonical name = www.mysubaru.com.www.mysubaru.com canonical name = mys.prod.subarucs.com.Name: mys.prod.subarucs.com
我们进行了子域名扫描,并检查了扫描结果:
…STARLINK® Admin Portal - https://portal.prod.subarucs.com/login.html…
嗯,这看起来确实像是员工使用的功能。通过快速搜索 Google,我们发现 STARLINK 是斯巴鲁车载信息娱乐系统的名称,它为车辆提供所有远程控制功能。而这个看起来像是与其相关的管理面板。
斯巴鲁 STARLINK 管理面板。
斯巴鲁 STARLINK 管理门户的任意账户接管漏洞
乍一看,这个面板似乎没什么特别的。它只是一个登录界面,而我们并没有任何凭据。我查看了网站的源代码,希望能发现更多信息,结果下面的代码片段引起了我的注意:
<script type="text/javascript" src="/assets/_js/starlinkEnroll.js"></script>
在 /assets/_js/ 目录下,有一些有趣的 JavaScript 文件被加载到了登录页面中。因此,我对该目录进行了暴力枚举,希望找到其他 JavaScript 文件。
运行 FFuF 进行扫描几分钟后,我们找到了一个名为 login.js 的文件,其中包含了以下非常有趣的代码片段:
$('#new_password_submit').on('click', function(e) { e.preventDefault(); if($('#forgot-password-step4-form').valid()) { disableBtns(); $.ajax({ url: "/forgotPassword/resetPassword.json", type: "POST", contentType: "application/json", data: JSON.stringify({ email: email, password: $('#new_password').val(), passwordConfirmation: $('#confirm_new_password').val() }), async: false }).done(function (response) {
看起来 resetPassword.json 端点可以在没有确认令牌的情况下重置员工账户!
如果这个功能确实按照 JavaScript 代码的逻辑工作,那么攻击者只需输入任意有效的员工邮箱地址,就能接管该账户。为了验证该功能是否可访问,我发送了以下 POST 请求:
HTTP Request
POST /forgotPassword/resetPassword.json HTTP/1.1Host: portal.prod.subarucs.com{ "email": "[email protected]", "password": "Example123!", "passwordConfirmation": "Example123!"}
HTTP Response
HTTP/1.1 200Content-type: application/jsonContent-length: 7“error”
这个功能似乎有效,我们只需要找到一个员工的电子邮件地址来进行测试。由于这是一个相当大的应用,可能有很多不同的用户,我们只需要找到某种方式来枚举它们。我继续浏览其余的 JavaScript,寻找可能让我们枚举电子邮件地址的端点,直到我看到以下内容:
HTTP Request
GET /adminProfile/[email protected] HTTP/1.1Host: portal.prod.subarucs.com
HTTP Response
HTTP/1.1 200Content-type: application/jsonContent-length: 7{ "error": "Invalid email"}
上述端点会返回用户的安全问题,如果他们的电子邮件有效的话。我们可以利用这个来枚举用户账户,直到找到一个在该平台上活跃的用户。
枚举员工电子邮件
通过 LinkedIn,我们快速搜索了“Subaru STARLINK”,找到了几位看起来是软件工程师的员工。在获取到他们的名字后,我们通过 Google 搜索发现,斯巴鲁的电子邮件格式是:
[first_initial][last]@subaru.com
我们将拼凑起来的几个电子邮件地址输入到 getSecurityQuestion.json 端点,并点击发送。在第四次尝试时,我们收到了回复!
<label for="securityQuestionId"> <span class="securityQuestionText">What city were you born in?</span></label>
[email protected](已脱敏)的电子邮件有效!我们回到了重置密码端点并点击了发送。
HTTP Request
POST /forgotPassword/resetPassword.json HTTP/1.1Host: portal.prod.subarucs.com{ "email": "[email protected]", "password": "Example123!", "passwordConfirmation": "Example123!"}
HTTP Response
HTTP/1.1 200Date: Wed, 20 Nov 2024 03:02:31 GMTContent-Type: application/jsonConnection: closeX-Frame-Options: SAMEORIGINContent-Length: 9"success"
成功了!我们尝试登录。
我们成功接管了一个员工的账户,但现在有一个 2FA(双因素认证)提示,要求我们实际使用该网站。这个 2FA 是自定义的,所以我们尝试查看是否有办法绕过它。
绕过 2FA
我们尝试了我们能想到的最简单方法:移除 UI 中的客户端覆盖层。
Match
$('#securityQuestionModal').modal('show');
Replace
//$('#securityQuestionModal').modal('show');
移除客户端覆盖层后,我们在应用中点击了一些按钮,整个应用似乎正常运行。所有按钮都有效,并且返回了服务器端的数据。
2FA bypassed.
追踪我妈妈一年的行程
左侧导航栏有很多不同的功能,但听起来最有趣的功能是“最近已知位置”。我输入了我妈妈的姓氏和邮政编码,她的车出现在搜索结果中。我点击了它,看到我妈妈过去一年所有的行程:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
“最近已知位置”端点不仅提供了最后一个位置,它还给出了我妈妈在过去一年内每次启动车辆或使用远程信息处理命令时的精确坐标。我没有意识到这些数据正在被收集,但似乎我们在购买时同意了 STARLINK 的注册。
为了更好地理解这些数据,我导出了我妈妈的 2023 款 Impreza 一年的位置历史,并将其导入到下面的 Google Maps iframe 中。以下地图是经过稍微修改的导出文件(删除了一些敏感信息),展示了她访问的所有位置。
可视化斯巴鲁一年位置历史
谷歌地图演示:https://www.google.com/maps/d/embed?mid=1CjfrOC8whM3NDnSrcyXXZE_CGp-XhVA&ehbc=2E312F
这张地图展示了 2023 款斯巴鲁 Impreza 泄露的 1,600 个坐标,类似的数据可以用于任何联网的斯巴鲁车辆。
从管理面板访问的我们的 STARLINK 购买协议历史。
还有很多其他端点。其中一个是车辆搜索功能,允许你查询客户的姓氏和邮政编码、电话号码、电子邮件地址或 VIN 号码(通过车牌号可以获取),并授予/修改对他们车辆的访问权限。
获取任何斯巴鲁 STARLINK 客户的街道地址、电话号码、电子邮件、紧急联系人、授权用户和账单信息。
通过邮政编码和姓氏、VIN、电子邮件地址、电话号码进行搜索的 STARLINK 搜索功能。
解锁朋友的车
在仪表板中搜索并找到我自己的车辆后,我确认了 STARLINK 管理仪表板几乎可以访问美国、加拿大和日本的任何斯巴鲁车辆。为了确认我们没有遗漏任何东西,我们联系了一位朋友,询问她是否可以让我们黑掉她的车,以证明没有任何先决条件或功能能够真正阻止完全接管车辆。
她把车牌号发给了我们,我们在管理面板中找到了她的车辆,然后最终将我们自己添加到了她的车上。
将我们自己添加为授权用户到朋友的斯巴鲁车上,以演示我们可以对她的车辆执行命令。
我们等了几分钟,然后看到我们的账户已成功创建。
既然我们已经获得了访问权限,我问他们能否到外面看看他们的车是否有任何变化。我发送了“解锁”命令。然后他们发给我们这个视频。
成功!
之后,她确认在我们将自己添加为授权用户并解锁她的车后,她没有收到任何通知、短信或电子邮件。
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。
原文始发于微信公众号(白帽子左一):车联网安全 | 通过STARLINK管理面板追踪和控制汽车
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论