白帽故事 · 2024年7月23日 0

国外车企安全渗透案例【2】– 发现法拉利、宝马、劳斯莱斯、保时捷等车企关键漏洞

法拉利完全帐户接管和任意帐户创建

当白帽团队开始瞄准法拉利时,在“ferrari.com”等公开域名下绘制了所有子域,并浏览了可以访问的内容。

其中发现的一个目标是“api.ferrari.com”,该域为法拉利系统提供面向客户的 API 和内部 API,他们目标是获得此 API 的最高级别的访问权限。

首先白帽团队分析了几个法拉利子域上存在的 JavaScript,这些子域看起来像是供法拉利经销商使用的。
这些子域包括“cms-dealer.ferrari.com”、“cms-new.ferrari.com”和“cms-dealer.test.ferrari.com”。

在测试网络应用程序时白帽团队注意到单点登录功能不完善,无法限制对底层应用程序的访问,上述几个子域就存在此类情况。

通过提取这些应用程序的 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/\
,并且泄露了apiKey。

进一步深入研究 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) 
}));

所需的所有元素都隐藏在这个 JavaScript 文件中。在 JavaScript 中,白帽团队还注意到对“/cms/dws/back-office/auth/bo-users” API 的调用。

当通过 Burp Suite 请求此 API 时,它泄露了 Ferrari Dealers 应用程序已注册的所有用户。

另外,还可以通过向此端点发送 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

发送以下请求后,法拉利的应用程序接口证书的‘宝库’就被完全地展露无疑了:

GET /cms/dws/back-office/rest-connector-models HTTP/1.1

当访问该 API 端点时,它返回 API 端点、主机和授权标头的列表。

利用这些信息能够查询法拉利的生产 API,从而访问任何法拉利客户的个人信息。

除了能够查看这些 API 端点之外,白帽团队还可以注册新的 Rest 连接器或修改现有的连接器。

HTTP请求:

GET /core/api/v1/Users?email=ian@ian.sh HTTP/1.1
Host: fcd.services.ferrari.com

HTTP响应:

 HTTP/1.1 200 OK Content-type: application/json

…"guid":"2d32922a-28c4-483e-8486-7c2222b7b59c","email":"ian@ian.sh","nickName":"ian@ian.sh","firstName":"Ian","lastName":"Carroll","birthdate":"1963-12-11T00:00:00"…

使用之前的 API 密钥和生产端点允许攻击者访问、创建、修改和删除任意生产用户帐户。甚至还允许攻击者通过电子邮件地址或昵称查询用户。

另外,攻击者还可以通过 POST 到“/core/api/v1/Users/:id/Roles”端点来编辑其用户角色,将攻击者设置为拥有超级用户权限或成为法拉利车主。

Spireon 系统上的 SQL 注入和正则表达式授权绕过

在确定要攻击的汽车相关目标时,白帽团队找到了 Spireon 公司。在上世纪 90 年代和 2000 年代,有一些公司,如 OnStar、Goldstar 和 FleetLocate,它们是安装在车辆中的独立设备,用于跟踪和管理车辆。

这些设备具有被跟踪和接收任意命令的能力,例如锁定启动器,使车辆无法启动。

过去一段时间后,Spireon 收购了多家 GPS 车辆跟踪和管理公司,并将其纳入 Spireon 母公司旗下。

白帽团队仔细阅读了 Spireon 的营销信息,发现Spireon 声称拥有超过 1500 万辆联网车辆。他们直接向客户提供服务,此外还通过安吉星等子公司提供许多服务。

白帽团队决定对其进行研究,因为如果攻击者能够破坏这些设备和车队的管理功能,他们将能够对超过 1500 万辆车辆执行非常有趣的操作,例如向警察发送调度位置、禁用车辆启动器,以及获取经销商的金融贷款信息。

白帽团队的第一个目标:admin.spiron.com

该网站似乎是一个非常过时的全球管理门户,供 Spireon 员工进行身份验证和执行某种操作。

白帽团队尝试识别未经授权即可访问的端点,但不断地被重定向回登录。

file

由于该网站太过老旧,当尝试了手动 SQL 注入后,很快就被系统上安装的 WAF 给踢了…

于是他们改用更简单的Payloads:发送一个撇号,看看是否有报错,然后发送两个撇号,看看是否报错。

居然有效!系统似乎对发送奇数与偶数撇号做出反应。

这表明在用户名和密码字段中输入的内容会被传递到系统后端,而该系统很可能会受到某种 SQL 注入攻击。

对于用户名字段,白帽团队想出了一个非常简单的Payloads:

victim' #

使用通用用户名列表将 HTTP 请求发送给 Burp Suite 的 intruder,观察到用户名“administrator”和“admin”被 301 重定向到了“/dashboard”。

于是通过管理员用户名手动发送 HTTP 请求后,发现可以作为管理员用户顺利通过身份验证进入 Spireon 管理员门户。

此时,可以在该应用程序中看到了许多有趣的端点。

file

该功能主要为远程管理 Spireon 设备,管理员用户有权访问所有 Spireon 设备,包括 OnStar、GoldStar 和 FleetLocate 的设备。

同时可以查询这些设备并检索安装了这些设备的实时位置,还可以向这些设备发送任意命令。

还有额外的功能可以覆盖设备配置,包括它联系哪些服务器来下载更新的固件。

file

使用此门户,攻击者可以创建恶意 Spireon 软件包,更新车辆配置以调用修改后的软件包,然后下载并安装修改后的 Spireon 软件。

攻击者可以对 Spireon 设备进行后门并针对该设备运行任意命令。

由于这些设备非常普遍,并且安装在拖拉机、高尔夫球车、警车和救护车等车辆上,因此每种设备的漏洞影响各不相同。

对于某些人来说,可能只是访问设备的实时 GPS 位置,但对于攻击者来说,却可以禁用启动器并发送警察和救护车调度位置。

白帽团队立即报告了该漏洞,但在测试过程中,他们观察到 HTTP 500 错误,该错误泄露了“admin.spiron.com”服务所访问的后端 API 端点的 API URL。

一开始白帽团队并没有在意这一点,他们认为这可能是内部的,但回过头审查时发现可以到达该端点,并且会触发 HTTP 403 错误。

file

现在的目标是看看是否可以在主机上找到某种授权绕过以及可以访问哪些端点。

通过绕过管理员 UI,白帽团队可以直接联系每个设备,并通过后端 API 调用直接查询车辆和用户帐户。

通过对主机的模糊测试,观察到一些奇怪的行为:

通过发送带有“admin”或“dashboard”的任何字符串,系统将触发 HTTP 403 禁止响应,但如果不包含这些字符串,则会返回 404。

举个例子:假设尝试加载“/anything-admin-anything”,会收到 403 错误,而如果尝试加载“/anything-anything”,将会收到 404 错误。

于是白帽团队将列入黑名单的字符串放入列表中,然后尝试枚举第一个和最后一个字符后面带有模糊字符(%00 到 %FF)的特定端点。

GET /%0dadmin GET /%0ddashboard

通过 Burp Suite 观察响应:这是核心 Spireon 应用程序的管理门户。

通过快速设置匹配和替换(match and replace)规则,将 GET /admin 和 GET /dashboard 修改为带有 %0d 前缀的端点后,便可浏览“/admin”或“/dashboard” 站点。

通过这数十个端点,可以用于查询所有联网车辆、向联网车辆发送任意命令以及查看所有客户租户帐户、车队帐户和客户帐户。几乎可以畅通无阻的访问这一切。

file

file

file

file

作为恶意的攻击者可以对 1500 万台设备进行后门植入,查询与特定 VIN 相关的所有权信息,检索所有客户帐户的完整用户信息,并邀请自己管理连接到该应用程序的任何设备。

为了证明这些,白帽团队邀请自己进入一个随机的车队帐户,并收到了管理美国警察局的邀请,于是可以在其中跟踪整个警察车队。

file

未完待续…