介绍
最近,在一个内部物联网研究项目中,我们对云麦智能秤的安卓和iOS应用进行了渗透测试。以下是我们发现的 5 个漏洞,我们将其中的 3 个(#2、#3 和 #4)链接起来以实现大规模帐户接管。所有漏洞均已负责任地向云麦披露。
-
绕过每个主账户 16 个家庭成员的限制
-
用户 ID 枚举
-
无效的授权检查
-
信息泄露
-
通过“密码重置”功能接管帐户
首先,简单介绍一下云麦移动应用。Android 的安装量超过 500.000 次。iOS AppStore 不显示下载次数为 Google Playstore。移动应用程序可让您查看体重、随时间推移的进度图表,以及其他 12 个指标,如 BMI、体脂百分比、内脏脂肪等。此外,您可以在帐户中添加和删除家庭成员,每个用户都可以添加性别、姓名、年龄、身高、关系、头像等信息。
TLDR:我们通过链接 3 个漏洞实现了大规模帐户接管。首先,我们暴力破解用户 ID,以便泄露 puId(主 uid)帐户值。然后我们在权限提升攻击中使用泄露的 puId 值将“家庭成员”帐户添加到其他注册帐户;作为回应,我们获得了包含新创建的“家庭成员”账户的相应“accessToken”和“refreshToken”的信息泄漏。因此,我们现在可以使用这些token来模拟“家庭成员”帐户,在家庭成员的帐户之间切换并查询他们的所有数据。
账户类型和账户结构
有两种类型的帐户:父母/主要帐户和家庭成员/儿童帐户。主账户是通过注册过程创建的所有账户。子账户是主账户登录后创建的所有账户。“子”账户的目的是如果超过1人使用相同的智能秤,则将每个家庭成员的数据分开。
当用户在应用程序中注册时,每个用户帐户将包含以下信息:一个 userId 键,每个用户具有唯一的 9 位值。(例如:’userId’:xxxxxx252,如下所示)一个值为 0 的 puId(或主 userId)键。如果 puId 为 0,则意味着在这种情况下 userId 也是一个 puId。
图 1:每个创建的帐户都会收到一个唯一的 9 位数字作为 userId
使用上述注册帐户登录应用程序后,您可以为那些将与您一起使用秤的朋友或亲戚创建“儿童”帐户。这将有助于将您的测量数据分开。因此,当您创建“子”帐户时,每个“子”帐户,就像主帐户一样,获取一个 puId 值和一个唯一的 9 位用户 ID(例如:’userId’: xxxxxx253,如下所示),但是puId 值将等于创建 ‘child’ 帐户的用户的 userId(例如:’puId’: xxxxxx252)
图 2:创建的子账号,puId 以 252 结尾,userId 以 253 结尾
现在让我们一一看看漏洞。
1.绕过每个主账号16个家庭成员的限制
描述:一个主账户最多可以有 16 个“家庭成员”账户注册使用相同的智能秤。但是,此限制仅在客户端而非服务器端强制执行。如果您尝试从应用程序创建第 17 个家庭成员帐户,您将收到以下消息。
图3:使用客户端验证达到 16 个用户限制后显示的消息。
但是,您可以拦截先前创建此类帐户的请求,更新新帐户的“真实姓名”值,并在达到 16 个帐户限制后将其发送到服务器。因此,您绕过客户端验证,服务器将愉快地满足请求,如下所示。
图 4:用于绕过客户端验证的标准创建“子”帐户请求
2.用户ID枚举
说明:当您在您的帐户下添加用户时,您可以添加的最大成员数为 16。
有一次,当您达到 16 个注册家庭成员的限制时,将仅在 Android 上发出请求,如下所示,其中包含您的 16 个 userIds 值。
图 5:用于暴力破解 ‘userIds’ 值的 ‘ids’ 参数的易受攻击的端点
让我们从上面的请求中只保留 1 个 userId 而不是所有 16 个 userId 值。我们将暴力破解 userIds 的最后 5 位数字(来自“ids”参数)并从响应中提取用户名,如下所示。
图 6:暴力破解用户 ID 的最后 5 位
图 7:从每个暴力破解 userId 的响应中提取 realName 参数
这是从枚举用户中提取的好方法:
-
用户 ID
-
他们的名字
-
生日
-
个人资料照片
-
他们的性别
-
puIds 值
回顾一下:userIds – 代表每个帐户对应的唯一 9 位值。puIds – 表示主要“家庭成员”帐户的用户 ID。一个帐户的所有家庭成员的用户 ID 位于一个 puId(主用户 ID)下。
3. 无效的授权检查
描述:发现 Android 和 iOS API 在向其他帐户添加或删除“家庭成员”帐户时未执行任何授权检查。影响: 您可以在其他人的帐户中添加和删除家庭成员。
易受攻击的实例:
-
从其他人的帐户中删除家庭成员
-
https://intaccount.iyunmai.com/api/android//user/del-user.d
-
http://intaccount.iyunmai.com/api/ios/user/del-user.d
-
将家庭成员添加到其他人的帐户
-
http://intaccount.iyunmai.com/api/ios/user/register-child.d
-
https://intaccount.iyunmai.com/api/android//user/register-child.d
Instance1 : 从其他人的账户中删除家庭成员该账户支持添加多个家庭成员,以便在他们之间切换并保持他们的数据,如体重、BMI、体脂率等分开。
现在您已经从先前的查找“用户名枚举”中获得了所需的用户 ID,您可以定位属于不同帐户的一个用户 ID 并将其删除。您所要做的就是在以下请求中使用您要删除的 userId更新“ delUserId ”参数。结果,该 userId 将被删除,因为在“delUserId”参数上缺少 API 的“授权检查”,以查看此 userId 是否是我使用云麦智能秤的“家庭成员”帐户之一。
图 8:在 Android 上,通过使用受害者的 userId 修改 delUserId 参数来删除属于不同帐户的 userId
修改了 delUserId 的 iOS 应用上的请求及其成功响应如下所示:
图 9:在 iOS 上,通过使用受害者的 userId 修改 delUserId 参数来删除属于不同帐户的 userId
实例2 :将家庭成员添加到其他人的帐户我们需要执行此攻击的是受害者的puId值,我们可以从上面的“用户名枚举”漏洞中获取。一旦我们有了它,我们就可以将家庭成员添加到该帐户,如下所示。我们只需要用受害者的puId更新puId值。
图 10:在 Android 上,通过用受害者的 puId 修改 puId 在受害者的 puId(主 id 帐户)下创建一个名为“TestAccount”的“家庭成员”帐户
图 11:在 iOS 上,受害者的帐户与新创建的“TestAccount”家庭成员创建
在受害者的 puId 下的 iOS 应用程序中添加家庭成员:
图 12:在 iOS 上,通过使用受害者的 puId 修改 puId 在受害者的 puId(主 id 帐户)下创建一个“家庭成员”帐户
从上面的响应中,我们必须注意对下一个发现有用的 2 个重要参数:“accessToken”和“refreshToken”。
图 13:使用泄露的 ‘refreshToken’ 获取新创建的 ‘family member’ 账户的 ‘accessToken’,该账户与我们的目标账户共享云麦规模。
现在我们可以使用上述响应中的新“accessToken”来执行经过身份验证的请求,如下所示。这里我们查询新创建的“MaliciousAccount”账户。此帐户是使用默认值设置的,例如:‘basisWeight’: 0 ; “生日”:19970524;
图 14:使用生成的 ‘accessToken’ 进行认证请求并查询新创建的 userId
根据上述请求,我们在家庭帐户中“横向”移动以查询主帐户及其所有家庭成员。因此,我们需要上面的 ‘puId’:602619692 值。下面我们可以看到这个puId账号下总共有16个userId(家庭成员)。
图 15:我们使用 /swatchLogin.json 端点将帐户从我们新创建的 ‘family member’ userId 切换到我们受害者的 puId(作为 ‘targetUserId’ 请求参数)并泄露受害者的 ‘accessToken’
我们注意到属于主帐户的上述“accessToken”,现在我们查询 puId 用户以获取更多详细信息。
图 16:查询受害者数据
最后,获取有关此受害者用户信息的所有录音。在下面的响应中,“总共”有 2 条录音,这意味着受害者称重了 2 次。
图 17:获取包含受害者信息的所有录音
5 通过“忘记密码”功能接管帐户
描述:更改密码的 iOS 功能根本不起作用。但是,Android 应用程序实现了较弱的“忘记密码”功能。
一旦用户请求新的“忘记密码”令牌,应用程序不会使先前生成的“忘记密码”令牌无效。因此,攻击者可以请求将多个令牌发送到受害者的电子邮件,以增加他猜测该代码和更改受害者密码的机会。所以这个发现的影响是有人可以接管任何云麦的用户帐户。
端点:https://intapi.iyunmai.com/api/android/verify/code.d – 用于生成通过电子邮件发送给受害者的“忘记密码”令牌
步骤:
-
转到 Android 应用程序中的登录页面,然后选择“忘记密码?”。
-
写下目标受害者的电子邮件,然后单击“发送验证码”。之后,受害者将收到一封电子邮件,其中包含一个唯一的 6 位数代码,允许重置密码。
拦截上述请求并多次发送,以增加您猜到代码的机会。我们检索到以下代码列表:172067、167686、167921、164708、171353、171316、163569、169577、163965、168449 等,如下所示。
图 18:受害者收到多个“重置密码”代码
分析代码,我们意识到我们可以进行如下所示的蛮力攻击,以便将受害者的密码重置为我们想要的密码。因此,我们选择了从 166000 到 169999 的蛮力范围。第一个也是唯一一个成功的代码是 166309。
图 19:暴力破解验证码,设置新密码为 ‘123qwer’ 并按长度排序找到成功响应
以及对上述请求的回应:
图 20:对我们重置受害者密码的暴力请求的成功响应
负责任的披露时间表:
2021 年 9 月至 10 月:我们负责任地向支持团队披露了所有漏洞。因此,支持团队感谢我们的帮助,并将我们的电子邮件转发给了开发团队。但是,我们没有收到开发人员的回复。团队。
我们进行了多次重新测试。
关于发现#5,在我们报告它之后,我们进行了静默修复,所有以前“忘记密码”的令牌现在都失效了。因此,我们对这一发现进行了重新测试,但是,代码在 165k-175k 的相同范围内。因此,您可以通过暴力破解重置密码令牌轻松绕过这种部分保护并通过忘记密码功能实现帐户接管。
发现 #2 仍处于打开状态。Android 上用于“UserId 枚举”的端点 /device-users.d 的请求在达到 16 个用户限制时/之后仍会被触发。
发现 #3 仍然开放。因此,您仍然可以在其他帐户中添加/删除家庭成员。
2022 年 5 月 5 日:我们再次通过电子邮件发送给支持和开发人员。团队。我们没有得到回应。
2022 年 5 月 30 日,即第一次向云麦发送电子邮件报告调查结果的 7 个月后:博客文章已发布。
参考
具体 CMS 中的特权升级攻击:https://www.fortbridge.co.uk/research/multiple-vulnerabilities-in-concrete-cms-part2/
通过 Drupal CMS 中的密码重置中毒帐户接管:https://www.fortbridge.co.uk/research/drupal-insecure-default-leads-to-password-reset-poisoning/
https://www.ddosi.org/yunmai-app/
原文始发于微信公众号(实战安全研究):云麦智能秤app账户接管漏洞 | 干货
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论