本文翻译自samwcyo的博客
2022 年秋天,我和几个朋友从伊利诺伊州芝加哥到华盛顿特区进行公路旅行,参加网络安全会议并(尝试)从我们平时的计算机工作中休息一下。
在参观马里兰大学时,我们遇到了散落在校园各处的电动滑板车车队,忍不住戳了一下滑板车的移动应用程序。令我们惊讶的是,我们的行为导致所有踏板车上的喇叭和前灯都打开并连续亮了 15 分钟。
当一切最终安定下来后,我们向踏板车制造商发送了一份报告,并对尝试更多方法让更多东西发出喇叭变得非常感兴趣。我们集思广益了一会儿,然后意识到过去 5 年制造的几乎所有汽车都具有几乎相同的功能。如果攻击者能够在车辆远程信息处理系统使用的 API 端点中找到漏洞,他们就可以完全远程地按喇叭、闪光灯、远程跟踪、锁定/解锁和启动/停止车辆。
此时,我们开始了群聊,所有人都开始以寻找影响汽车行业的漏洞为目标开展工作。在接下来的几个月里,我们尽可能多地发现了与汽车相关的漏洞。以下文章详细介绍了我们探索远程信息处理系统、汽车 API 和支持它的基础设施的安全性的工作。
研究结果总结
在我们的参与过程中,我们发现以下公司存在下列漏洞:
-
起亚、本田、英菲尼迪、日产、讴歌
-
完全远程锁定、解锁、发动机启动、发动机停止、精确定位、闪光灯和仅使用 VIN 号的车辆鸣喇叭
-
通过 VIN 号码(姓名、电话号码、电子邮件地址、实际地址)进行完全远程帐户接管和 PII 披露
-
能够将用户锁定在远程管理他们的车辆之外,改变所有权
-
特别是对于起亚,我们可以远程访问 360 度摄像头并查看汽车的实时图像
-
梅赛德斯-奔驰
-
现代,创世纪
-
完全远程锁定、解锁、发动机启动、发动机停止、精确定位、闪光灯和仅使用受害者电子邮件地址的喇叭车辆
-
通过受害者电子邮件地址(姓名、电话号码、电子邮件地址、实际地址)进行完全远程帐户接管和 PII 披露
-
能够将用户锁定在远程管理他们的车辆之外,改变所有权
-
宝马、劳斯莱斯
-
法拉利
-
Spireon
-
多个漏洞,包括:
-
拥有对全公司管理面板的完全管理员访问权限,能够向大约 1550 万辆汽车发送任意命令(解锁、启动引擎、禁用启动器等)、读取任何设备位置以及刷新/更新设备固件
-
在用于管理用户帐户、设备和车队的核心系统上执行远程代码。能够访问和管理整个 Spireon 的所有数据
-
完全接管任何车队的能力(这将使我们能够跟踪和关闭许多不同大城市的警察、救护车和执法车辆的启动器,并向这些车辆发送命令,例如“导航到此位置”)
-
对所有 Spireon 产品的完全管理权限,包括以下……
-
金星 – https://www.spireon.com/products/goldstar/
-
LoJack – https://www.spireon.com/products/goldstar/lojackgo/
-
FleetLocate – https://www.spireon.com/products/fleetlocate-for-fleet-managers/
-
NSpire – https://www.spireon.com/spireon-nspire-platform/
-
预告片和资产 – https://www.spireon.com/solutions/trailer-asset-managers/
-
总共有……
-
1550 万台设备(主要是车辆)
-
120 万个用户帐户(最终用户帐户、车队经理等)
-
福特
-
Reviver
-
保时捷
-
丰田
-
捷豹、路虎
-
SiriusXM
漏洞报告
(1) 通过错误配置的 SSO 全面接管宝马和劳斯莱斯的帐户
在测试 BMW 资产时,我们为 BMW 的员工和承包商确定了一个自定义 SSO 门户。这对我们来说非常有趣,因为这里发现的任何漏洞都可能允许攻击者破坏与所有 BMW 资产相关的任何帐户。
例如,如果经销商想要访问 BMW 实体经销商的经销商门户,他们必须通过该门户进行身份验证。此外,此 SSO 门户还用于访问内部工具和相关的 devops 基础设施。
我们做的第一件事是使用 gau 和 ffuf 等 OSINT 工具对主机进行指纹识别。经过几个小时的模糊测试,我们确定了一个 WADL 文件,它通过发送以下 HTTP 请求在主机上暴露 API 端点:
GET /rest/api/application.wadl HTTP/1.1
Host: xpita.bmwgroup.com
HTTP 响应包含 xpita 主机上所有可用的 REST 端点。我们开始枚举端点并发送模拟 HTTP 请求以查看可用的功能。
一个直接的发现是,我们能够通过在用户字段 API 端点中发送星号来查询所有 BMW 用户帐户。这允许我们输入类似“sam*”的内容并检索名为“sam.curry”的用户的用户信息,而无需猜测实际的用户名。
HTTP请求
GET /reset/api/users/example* HTTP/1.1
Host: xpita.bmwgroup.com
HTTP响应
HTTP/1.1 200 OK
Content-type: application/json
{“id”:”redacted”,”firstName”:”Example”,”lastName”:”User”,”userName”:”example.user”}
发现此漏洞后,我们继续测试其他可访问的 API。一个特别有趣的API是“/rest/api/chains/accounts/:user_id/totp”。我们注意到“totp”这个词通常代表一次性密码生成。
当我们使用从与 TOTP 端点配对的通配符查询中获得的 SSO 用户 ID 向该API发送 HTTP 请求时,它会返回一个随机的 7 位数字。以下 HTTP 请求和响应演示了此行为:
HTTP请求
GET /rest/api/chains/accounts/unique_account_id/totp HTTP/1.1
Host: xpita.bmwgroup.com
HTTP响应
HTTP/1.1 200 OK
Content-type: text/plain
9373958
不管出于什么原因,这个HTTP请求似乎会为用户的帐户生成一个TOTP。我们猜测这种交互与“忘记密码”功能一起工作,因此我们通过使用原始通配符查找和检索受害用户ID来查询“example*”,从而找到一个示例用户帐户。在检索该ID后,我们对用户帐户发起重置密码尝试,直到系统从用户的2FA设备(例如电子邮件或电话)请求TOTP代码。
此时,我们检索了从 API 生成的 TOTP 代码,并将其输入到重置密码确认字段中。
有效!我们重置了一个用户帐户,获得了对所有 BMW 员工和承包商用户的完全帐户接管。
此时,可以完全接管任何宝马或劳斯莱斯员工帐户以及这些员工使用的访问工具。
为了证明该漏洞的影响,我们只需在 Google 上搜索“BMW 经销商门户”,并使用我们的帐户访问在 BMW 和劳斯莱斯实体经销商处工作的销售人员使用的经销商门户。
登录后,我们发现我们接管的模拟账户与实际经销商绑定,我们可以访问经销商自己可以访问的所有功能。这包括查询特定 VIN 号码和检索车辆销售文件的能力。
根据我们的访问级别,我们可以针对宝马和劳斯莱斯的客户账户和客户车辆执行大量的功能。此时,我们停止测试并报告了该漏洞。目前向宝马和劳斯莱斯报告的漏洞已被修复。
(2)通过错误配置的SSO远程代码执行和访问梅赛德斯-奔驰和劳斯莱斯的数百个内部工具
在我们测试的早期,我们小组中有人购买了梅赛德斯-奔驰汽车,因此我们开始审核梅赛德斯-奔驰基础设施。我们采用与宝马相同的方法,开始测试梅赛德斯-奔驰员工 SSO。
我们无法找到影响 SSO 门户本身的任何漏洞,但通过浏览 SSO 网站,我们发现他们正在为员工帐户运行某种形式的 LDAP。基于我们对其基础设施的高层次理解,我们猜测各个员工应用程序使用集中式 LDAP 系统来验证用户。我们开始探索这些网站中的每一个,试图找到一个公共注册,这样我们就可以获得 SSO 凭据来访问员工应用程序,即使是在有限的级别。
在对随机站点进行了一段时间的模糊测试后,我们最终找到了“umas.mercedes-benz.com”网站,该网站专为汽车维修店而建,用于请求梅赛德斯-奔驰的特定工具访问权限。该网站已启用公共注册,因为它是为维修店构建的,并且似乎使用与核心员工 LDAP 系统相同的数据库。
我们填写了注册所需的所有字段,创建了一个用户帐户,然后使用我们的侦察数据来识别重定向到梅赛德斯-奔驰SSO的站点。我们尝试的第一个网站是“git.mercedes benz.com”,Github的缩写。我们试图使用我们的用户凭证登录梅赛德斯-奔驰Github,并看到我们能够登录。成功!
梅赛德斯-奔驰 Github 在验证后要求我们在我们的帐户上设置 2FA,以便我们可以访问该应用程序。我们安装了 2FA 应用程序并将其添加到我们的帐户,输入我们的代码,然后看到我们进入了。我们可以访问“git.mercedes-benz.com”并开始四处寻找。
几分钟后,我们看到 Github 实例有各种梅赛德斯-奔驰项目的内部文档和源代码,包括 Mercedes Me Connect 应用程序,客户使用该应用程序远程连接到他们的车辆。如果员工想为梅赛德斯-奔驰自己构建一个与客户车辆对话的应用程序,以及与客户车辆对话必须采取的具体步骤,内部文档为员工提供了详细说明。
此时,我们报告了该漏洞,但在等待电子邮件回复几天后收到了一些阻力。该团队似乎误解了这种影响,因此他们要求我们展示进一步的影响。
我们使用员工账户登录了众多包含敏感信息的应用程序,并通过暴露的actuators、spring boot 控制台以及梅赛德斯-奔驰员工使用的数十个敏感内部应用程序实现了远程代码执行。这些应用程序之一是梅赛德斯-奔驰 Mattermost(基本上是 Slack)。我们有权加入任何通道,包括安全通道,并且可以伪装成梅赛德斯-奔驰员工,可以提出任何必要的问题,让真正的攻击者提升他们在奔驰基础设施中的特权。
总的来说,我们可以访问以下服务:
-
多个仅供员工使用的github,其中包含跨梅赛德斯-奔驰基础设施的多个应用程序的文档和配置文件的敏感信息
-
Spring启动执行器,用于在敏感的员工和客户应用程序Jenkins实例上执行远程代码执行、信息披露
-
AWS和云计算控制面板,我们可以请求、管理和访问各种内部系统
-
XENTRY系统用于与客户车辆通信
-
内部OAuth和应用程序管理相关功能,用于配置和管理内部应用程序
-
数百个杂项内部服务
(3)通过已弃用的经销商门户网站对起亚进行整车接管
当我们关注起亚汽车时,我们注意到它的车辆注册过程与其母公司现代汽车有何不同。我们绘制了所有的域名,我们遇到了“kdelaer.com”域名,经销商可以在这里注册一个账户,为购买车辆的客户激活起亚连接。此时,我们找到了域名“kiaconnect.kdealer.com”,它允许我们注册任意VIN,但需要有效会话才能工作。
在查看网站的main.js代码时,我们观察到以下授权功能,用于生成访问网站功能所需的令牌:
validateSSOToken() { const e = this.geturlParam("token"), i = this.geturlParam("vin"); return this.postOffice({ token: e, vin: i }, "/prof/gbl/vsso", "POST", "preLogin").pipe(ye(this.processSuccessData), Nn(this.handleError)) } validateSSOToken() {const e = this.geturlParam("token"), i = this.geturlParam("vin");返回。postOffice({token: e, vin: i}, "/prof/gbl/vsso", "POST", "preLogin").pipe(ye(this.processSuccessData), Nn(this.handleError))}
因为我们没有有效的授权凭证,所以我们继续在JavaScript文件中搜索,直到找到“prelogin”头。当发送这个报头时,允许我们为任意的VIN号发起注册。虽然我们能够绕过VIN所有权的授权检查,但网站继续抛出无效会话的错误。
为了绕过这个问题,我们从“owners.kia.com”(用于客户远程连接车辆的网站)获取了一个会话令牌,并将其附加到我们的请求中,将VIN号与客户帐户配对:
值得注意的是:对于我们查询的每个Kia帐户,服务器都会返回一个带有电子邮件“[email protected]”的相关配置文件。我们不确定这个电子邮件地址是否可以访问用户帐户,但根据我们对起亚网站的了解,该电子邮件地址似乎与我们搜索过的每个帐户都有联系。我们已经要求Kia团队澄清,但还没有得到确切的答复。
现在我们有了一个有效的车辆初始化会话,我们可以使用配对客户帐户返回的HTTP响应中返回的JSON来继续车辆接管。我们将再次使用“预登录”报头来生成一个经销商令牌(旨在由起亚经销商自己访问),以将任何车辆与攻击者的客户帐户配对。
最后,我们可以去链接完成激活和注册,你可以在下面看到。
在上述经销商配对过程完成后,攻击者将通过电子邮件在他们的起亚客户帐户上收到一个链接。下面的激活门户是将起亚汽车与攻击者的客户帐户配对的最后一步。
最后,在我们填写完上面的表格后,Kia Connect需要大约1-2分钟才能完全激活并获得发送锁、解锁、远程启动、远程停止、定位和(最有趣的是)远程访问车辆摄像头的完全访问权限!
(4)法拉利的完全帐户接管和任意帐户创建允许攻击者访问,修改和删除所有客户信息,并访问管理CMS功能来管理法拉利网站
当我们开始瞄准法拉利时,我们绘制了“ferrari.com”等公开可用域下的所有域,并四处浏览以查看可访问的内容。我们发现的一个目标是“api.ferrari.com”,该域为法拉利系统提供面向客户的 API 和内部 API。我们的目标是为该 API 获得最高级别的访问权限。
我们分析了几个法拉利子域中的 JavaScript,这些子域看起来像是供法拉利经销商使用的。这些子域包括“cms-dealer.ferrari.com”、“cms-new.ferrari.com”和“cms-dealer.test.ferrari.com”。
我们在测试 Web 应用程序时注意到的一种模式是单点登录功能实现不佳,该功能不限制对底层应用程序的访问。上述子域就是这种情况。可以提取这些应用程序的 JavaScript,让我们了解正在使用的后端 API 路由。
当对 JavaScript 包进行逆向工程时,检查为应用程序定义了哪些常量很重要。通常这些常量包含敏感凭据,或者至少告诉您应用程序与之对话的后端 API 在哪里。
const i = {
production: !0,
envName: "production",
version: "0.0.0",
build: "20221223T162641363Z",
name: "ferrari.dws-preowned.backoffice",
formattedName: "CMS SPINDOX",
feBaseUrl: "https://{{domain}}.ferraridealers.com/",
fePreownedBaseUrl: "https://{{domain}}.ferrari.com/",
apiUrl: "https://api.ferrari.com/cms/dws/back-office/",
apiKey: "REDACTED",
s3Bucket: "ferrari-dws-preowned-pro",
cdnBaseUrl: "https://cdn.ferrari.com/cms/dws/media/",
thronAdvUrl: "https://ferrari-app-gestioneautousate.thron.com/?fromSAML#/ad/"
}
从上面的常量我们可以了解到基本 API URL 是“https://api.ferrari.com/cms/dws/back-office/”,这个 API 的潜在 API 密钥是“REDACTED”。
进一步深入研究 JavaScript,我们可以查找对 apiUrl 的引用,它会告知我们如何调用此 API 以及如何使用 API 密钥。例如,如果调用 API URL,以下 JavaScript 会设置某些标头:
})).url.startsWith(x.a.apiUrl) && !["/back-office/dealers", "/back-office/dealer-settings", "/back-office/locales", "/back-office/currencies", "/back-office/dealer-groups"].some(t => !!e.url.match(t)) && (e = (e = e.clone({
headers: e.headers.set("Authorization", "" + (s || void 0))
})).clone({
headers: e.headers.set("x-api-key", "" + a)
}));
我们知道要与哪个后端API对话,以及它的路由,以及我们需要对API进行身份验证的API密钥。
在JavaScript中,我们注意到一个对“/cms/dws/back-office/auth/bo-users”的API调用。当通过Burp Suite请求这个API时,它泄露了法拉利经销商应用程序注册的所有用户。此外,可以向该端点发送POST请求,将我们自己添加为超级管理用户。
虽然影响很大,但我们仍然在寻找一个影响更广泛的法拉利生态系统和每个终端用户的漏洞。花了更多的时间解构JavaScript,我们发现一些API调用被用于“rest-connectors”:
return t.prototype.getConnectors = function() {
return this.httpClient.get("rest-connectors")
}, t.prototype.getConnectorById = function(t) {
return this.httpClient.get("rest-connectors/" + t)
}, t.prototype.createConnector = function(t) {
return this.httpClient.post("rest-connectors", t)
}, t.prototype.updateConnector = function(t, e) {
return this.httpClient.put("rest-connectors/" + t, e)
}, t.prototype.deleteConnector = function(t) {
return this.httpClient.delete("rest-connectors/" + t)
}, t.prototype.getItems = function() {
return this.httpClient.get("rest-connector-models")
}, t.prototype.getItemById = function(t) {
return this.httpClient.get("rest-connector-models/" + t)
}, t.prototype.createItem = function(t) {
return this.httpClient.post("rest-connector-models", t)
}, t.prototype.updateItem = function(t, e) {
return this.httpClient.put("rest-connector-models/" + t, e)
}, t.prototype.deleteItem = function(t) {
return this.httpClient.delete("rest-connector-models/" + t)
}, t
下面的请求解开了谜题的最后一块。发送以下请求揭示了法拉利API凭证的宝库:
GET /cms/dws/back-office/rest-connector-models HTTP/1.1
法拉利配置了一些后端 API,可以通过访问特定路径进行通信。当访问这个 API 时,它返回了这个 API 主机和授权标头的列表(以纯文本形式)。
此信息披露使我们能够查询法拉利的生产 API 以访问任何法拉利客户的个人信息。除了能够查看这些 API之外,我们还可以注册新的 rest 连接器或修改现有连接器。
HTTP请求
HTTP 响应
HTTP/1.1 200 OK
Content-type: application/json
…"guid":"2d32922a-28c4-483e-8486-7c2222b7b59c","email":"[email protected]","nickName":"[email protected]","firstName":"Ian","lastName":"Carroll","birthdate":"1963-12-11T00:00:00"…
使用之前的暂存 API 密钥公开的 API 密钥和生产端点允许攻击者访问、创建、修改和删除任何生产用户帐户。它还允许攻击者通过电子邮件地址或昵称查询用户。
此外,攻击者可以 POST 到“/core/api/v1/Users/:id/Roles”端点来编辑他们的用户角色,将自己设置为拥有超级用户权限或成为法拉利车主。
此漏洞将允许攻击者访问、修改和删除任何有权管理其车辆配置文件的法拉利客户帐户。
(5) Spireon系统上的SQL注入和Regex授权旁路允许攻击者访问、跟踪和发送任意命令到1500万个远程信息处理系统,并完全接管警察部门、救护车服务、卡车司机和许多商业车队系统的车队管理系统
在确定要攻击的汽车相关目标时,我们发现了Spireon公司。在20世纪90年代初和21世纪初,有一些公司,如OnStar, Goldstar和FleetLocate,它们是独立的设备,被安装在车辆中跟踪和管理。该设备具有跟踪和接收任意命令的能力,例如锁定启动器,使车辆无法启动。
在过去的某个时候,Spireon收购了许多GPS车辆跟踪和管理公司,并将它们置于Spireon母公司之下。
我们阅读了Spireon的营销,看到他们声称拥有超过1500万辆联网汽车。他们直接向客户提供服务,并通过安吉星等子公司提供许多服务。
我们决定对它们进行研究,因为如果攻击者能够破坏这些设备和车队的管理功能,他们将能够对超过1500万辆汽车执行非常有趣的功能,如向城市警察发送调度位置,禁用车辆启动器,并访问经销商的金融贷款信息。
我们的第一个目标非常明显:admin.spireon.com
该网站似乎是一个非常过时的全球管理门户,供Spireon员工进行身份验证并执行某种操作。我们试图识别未经授权就可以访问的站点,但一直被重定向回登录。
由于该网站太旧了,我们尝试了受信任的手动 SQL 注入有效负载,但被安装在系统上的 WAF 踢出
我们切换到一个更简单的有效负载:发送一个单引号,看看是否有错误,然后发送两个单引号,看看是否没有错误。这奏效了!系统似乎对发送奇数和偶数个单引号做出反应。这表明我们在用户名和密码字段中的输入被传递到一个可能容易受到某种 SQL 注入攻击的系统。
对于用户名字段,我们提出了一个非常简单的有效载荷:
上面的有效负载旨在简单地从 SQL 查询中切断密码检查。我们将此 HTTP 请求发送给带有通用用户名列表的 Burp Suite 入侵者,并观察到我们收到了用户名“administrator”和“admin”的各种 301 重定向到“/dashboard”。
使用 admin 用户名手动发送 HTTP 请求后,我们观察到我们以管理员用户身份通过了 Spireon 管理员门户的身份验证。此时,我们浏览了应用程序并看到了许多有趣的站点。
该功能旨在远程管理 Spireon 设备。管理员用户可以访问所有 Spireon 设备,包括 OnStar、GoldStar 和 FleetLocate 的设备。我们可以查询这些设备并检索安装设备的实时位置,还可以向这些设备发送任意命令。还有其他功能可以覆盖设备配置,包括它连接到哪些服务器以下载更新的固件。
使用此门户,攻击者可以创建恶意 Spireon 程序包,更新车辆配置以调用修改后的程序包,然后下载并安装修改后的 Spireon 软件。
此时,攻击者可以为 Spireon 设备设置后门,并对设备运行任意命令。
由于这些设备无处不在,安装在拖拉机、高尔夫球车、警车和救护车等设备上,因此每种设备的影响各不相同。对于一些人,我们只能访问设备的实时 GPS 位置,但对于其他人,我们可以禁用启动器并发送警察和救护车调度位置。
我们立即报告了该漏洞,但在测试期间,我们观察到一个 HTTP 500 错误,该错误披露了“admin.spireon.com”服务所访问的后端 API 的 API URL。最初,我们忽略了它,因为我们认为它是内部的,但在盘旋回来后,我们观察到我们可以访问站点并且它会触发 HTTP 403 禁止错误。
我们现在的目标是看看我们是否可以在主机上找到某种授权绕过方式,以及可以访问哪些端点。通过绕过管理员 UI,我们可以直接接触到每台设备,并通过后端 API 调用直接查询车辆和用户帐户。
我们对主机进行了模糊测试,最终观察到一些奇怪的行为:
通过发送带有“admin”或“dashboard”的任何字符串,系统将触发 HTTP 403 禁止响应,但如果我们不包含此字符串,则会返回 404。例如,如果我们尝试加载“/anything-admin-anything”,我们将收到 403 forbidden,而如果我们尝试加载“/anything-anything”,它将返回 404。
我们获取了列入黑名单的字符串,将它们放入列表中,然后尝试枚举第一个和最后一个字符后面带有模糊字符(%00 到 %FF)的特定路径。
在扫描过程中,我们看到以下 HTTP 请求将返回 200 OK 响应:
GET /%0dadmin
GET /%0ddashboard
通过 Burp Suite,我们将 HTTP 响应发送到我们的浏览器并观察响应:它是核心 Spireon 应用程序的完整管理门户。我们快速设置匹配和替换规则,以将 GET /admin 和 GET /dashboard 修改为具有 %0d 前缀的端点。
设置此规则后,我们可以浏览到“/admin”或“/dashboard”并浏览网站,而无需执行任何其他步骤。我们观察到有数十个端点用于查询所有联网车辆、向联网车辆发送任意命令以及查看所有客户租户账户、车队账户和客户账户。我们可以接触到一切。
此时,黑客可以为 1500 万台设备设置后门,查询与特定 VIN 关联的所有权信息,检索所有客户帐户的完整用户信息,并邀请他们自己管理连接到该应用程序的任何车队。
为了我们的概念验证,我们邀请自己进入一个随机的车队帐户,并看到我们收到了管理美国警察局的邀请,我们可以在其中跟踪整个警察车队。
(6)通过大规模分配,攻击者可以远程跟踪和覆盖所有Reviver客户的虚拟车牌,跟踪和管理复兴车队,访问、修改和删除所有用户信息
2022年10月,加州宣布将数字车牌合法化。我们研究了一段时间,发现大部分(如果不是全部的话)数字车牌都是通过一家名为“Reviver”(Reviver)的公司完成的。
如果有人想要数字车牌,他们会购买虚拟 Reviver 车牌,其中包含用于远程跟踪和更新车牌的 SIM 卡。使用 Reviver 的客户可以远程更新他们的车牌标语、背景,还可以通过将车牌标签设置为“STOLEN”来报告汽车是否被盗。
由于车牌可用于跟踪车辆,我们对 Reviver 非常感兴趣并开始审核移动应用程序。我们代理了 HTTP 流量,发现所有 API 功能都是在“pr-api.rplate.com”网站上完成的。创建用户帐户后,我们的用户帐户被分配给一个唯一的“公司”JSON 对象,允许我们将其他子用户添加到我们的帐户。
公司 JSON 对象非常有趣,因为我们可以更新对象中的许多 JSON 字段。其中一个字段称为“type”,默认设置为“CONSUMER”。注意到这一点后,我们深入研究了应用程序源代码,希望能找到另一个值来设置它,但没有成功。
在这一点上,我们退后一步,想知道是否有一个我们可以与之交谈的实际网站,而不是通过移动应用程序代理流量。我们在网上看了一会儿,然后才想到对我们的帐户执行重置密码,这给了我们一个导航到的 URL。
打开密码重置 URL 后,我们发现该网站具有大量功能,包括管理车辆、车队和用户帐户的能力。这非常有趣,因为我们现在可以访问更多的 API 端点和功能。此外,网站上的 JavaScript 似乎具有我们的用户帐户可能具有的其他角色的名称(例如,用户、版主、管理员等的专门名称)
我们查询了 JavaScript 中的“CONSUMER”字符串,发现 JavaScript 中定义了其他角色。在尝试将我们的“角色”参数更新为公开的“公司”角色后,我们刷新了配置文件元数据,然后看到它成功了!我们能够将我们的角色更改为默认用户帐户以外的角色,从而为潜在的特权升级漏洞打开了大门。
看起来,即使我们已经将我们的帐户更新为“公司”角色,我们在登录网站时仍然会收到授权漏洞。我们考虑了一段时间,直到意识到我们可以邀请用户加入我们修改后的具有提升角色的帐户,然后可以授予受邀用户所需的权限,因为他们是通过预期方式邀请的,而不是将帐户批量分配给提升角色。
在邀请新账户、接受邀请并登录账户后,我们观察到我们不再收到授权错误并且可以访问车队管理功能。这意味着我们可能 (1) 将我们的帐户批量分配给更高级别的角色(例如管理员),然后 (2) 邀请用户加入我们的帐户,该用户将被分配适当的权限。
这让我们感到困惑,因为系统中可能存在一些管理组,但我们尚未确定。我们使用单词列表强制使用“type”参数,直到我们注意到将我们的组设置为数字“4”已将我们的角色更新为“REVIVER_ROLE”。似乎角色被索引到数字,我们可以简单地遍历数字 0-100 并找到网站上的所有角色。
“0”角色是字符串“REVIVER”,在我们的帐户上设置它并重新邀请新用户后,我们正常登录网站并观察到 UI 完全损坏,我们无法单击任何按钮。据我们猜测,我们拥有管理员角色,但使用面向客户的前端网站而不是适当的管理员前端网站访问帐户。我们必须自己找到管理员使用的端点。
由于我们的管理员帐户理论上具有提升的权限,因此我们的第一个测试只是查询用户帐户并查看我们是否可以访问其他人的数据:这有效!
我们可以进行任何正常的 API 调用(查看车辆位置、更新车牌、向帐户添加新用户)并使用我们的超级管理员帐户在完全授权的情况下执行操作。
此时,我们报告了该漏洞并观察到它在 24 小时内得到了修补。真正的攻击者可以远程更新、跟踪或删除任何人的 REVIVER 车牌。我们还可以访问任何经销商(例如,梅赛德斯-奔驰经销商通常会打包 REVIVER 车牌),并在新购买的车辆仍然带有 DEALER 标签时更新经销商使用的默认图像。
Reviver 网站还提供我们可以完全访问的车队管理功能。
(7)影响现代和捷恩斯的完全远程车辆访问和完全帐户接管
https://www.bleepingcomputer.com/news/security/hyundai-app-bugs-allowed-hackers-to-remotely-unlock-start-cars/
Twitter:https://twitter.com/samwcyo/status/1597695281881296897?s=20&t=Ul7dThm6dUPPEd67y7HwOA
(8)完全远程车辆访问和完全帐户接管影响本田,日产,英菲尼迪,讴歌
Twitter:https://twitter.com/samwcyo/status/1597792097175674880?s=20&t=QBkZnooPsYWqilnKY-EpMw
(9)通过批量分配对日产进行整车接管
原文始发于微信公众号(Hack All Sec):网络黑客vs.汽车行业:法拉利,宝马,劳斯莱斯,保时捷和更多的关键漏洞