[第 1 部分, web 客户端和帐户创建
在这个漏洞利用中, 我将展示我如何能够制作与 textfree 的 API 一起使用的 OAuth 签名, 以及我如何能够以编程方式创建帐户. 在阅读本页的其余部分之前, 我建议您阅读有关 OAuth 的内容. 首先, 让我们看看 Textfree 的所有界面. Textfree 提供了一个 Web 客户端和一个 Android/iOS 应用程序. 我开始查看网络客户端, 但很快发现创建帐户需要您填写验证码, 并提供电子邮件 / 电话号码. 不会通过 Web 客户端以编程方式创建帐户.
通常这会阻止任何类型的欺骗数据包, 重复数据包或通过机器人生成的数据包, 但出于某种原因, 我能够重新发送相同的数据包, 并创建一个帐户. 后来我发现 oauth_signatures 在登录前没有用令牌散列. 消费者秘密和基本字符串是唯一用于在登录前创建 oauth_signatures 的东西.
尽管如此, 通常这并不重要, 因为 OAuth 使用随机数和时间戳来防止人们一遍又一遍地重新发送相同的数据包, 但由于某种原因 textfree 不检查时间戳或随机数, 他们唯一检查的是 oauth_signature. 这意味着我们可以复制并粘贴 Authentication 标头值并使用它, 直到消费者密钥更改. 所以, 要清楚的是, 尽管我们不知道消费者密钥, 但我们有能力发送尽可能多的登录数据包.
但是等等, 我说过我能够创建 oauth_signatures, 而不仅仅是复制和粘贴标题值. 还记得 textfree 有一个网络客户端吗? 好吧, webclient 也使用 OAuth, 这意味着为了让 webclient 拥有经过身份验证的数据包, 它必须拥有消费者秘密. 所以让我们寻找它.
短短 5-10 分钟后, 我找到了一个名为 "consumerSecret" 的变量名. Textfree 甚至没有费心去混淆他们的 JavaScript. 我设置了一个断点并重新加载了页面. 盯着我的眼睛是 webclient 消费者的秘密. 经过一些测试, 我发现 Web 客户端使用者机密仅适用于 Web 客户端交互, 因此尝试使用我发现的使用者机密从 Android 应用程序制作 oauth_signatures 将不起作用...... 总之, 我可以创建无文本帐户并签署 Web 客户端数据包. 由于时间限制, 这就是我的项目结束的地方. 这是用于使用 textfree 创建帐户的完整 API. 由于创建帐户需要多个 HTTP 请求并且所有这些请求都是通过 TOR 发出的, 因此它非常慢.
第 2 部分, 反编译及更多 OAuth
OAuth 是一种用于访问授权的开放标准, 通常用作 Internet 用户授予网站或应用程序访问他们在其他网站上的信息但不提供密码的方式. 您可以在此处阅读有关 OAuth 的更多信息: OAuth V1.0a.Textfree 将 OAuth 用于其 Android,iOS 和 Web 客户端. 尽管 OAuth 通常用于保护登录而不需要提供实际密码, Pinger 正在使用它来保护他们的 API 端点. 几个月前我第一次开始这个项目时, 我只使用 HTTP(s) 代理对应用程序进行逆向工程. 考虑到我不知道 OAuth 消费者秘密, 这只是让我到目前为止. 这意味着我只能在创建帐户之前与 Pinger 的 API 进行交互. 这是因为在您创建帐户后, 您将获得一个令牌, 该令牌与消费者机密一起使用以创建唯一的 OAuth 签名. 我做的第一件事是下载并解压 Textfree APK, 总共花了大约 15 分钟. 我在这里下载了 apk, 然后我使用 apktool 解压了它.
我们留下了与 APK 拥有的三个 DEX 文件对应的三个 smali 代码文件夹. 如果您不了解 multiDEX, 您可以在此处阅读, 如果您不了解 smali 代码, 您可以在此处阅读. 应用程序完全解压后, 是时候启用可调试性了. 这允许我们运行带有调试器的应用程序. 我们可以稍后设置断点并检查寄存器 / 本地变量.
现在我们只需要打包应用程序备份并签名. 我使用了超级 apk 签名者. 将应用程序安装到 VM 并确保它仍然有效后, 我在 Android studio 中打开了解压后的应用程序并设置了断点. 经过几个小时的逆向工程混淆代码, 我能够找到用于构建 HTTP(s) 数据包的代码的位置.
当我开始看到寄存器中弹出 HTTP 标头时, 我知道我已经接近了. 多走几分钟后, 我找到了我要找的东西......OAuth 消费者秘密.
有趣的是, textfree 没有像您应该的那样对他们的 OAuth 基本字符串进行 url 编码.
基本字符串应该如下所示: POST&https://api.pinger.com/1.0/batch&oauth_consumer_key=textfree-Android&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1563332403&oauth_nonce=iwqupeokgoeqrmbt
不是这个: POST&https://api.pinger.com/1.0/batch&oauth_consumer_key=textfree-android&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1563332403&oauth_nonce=iwqupeokgoeqrmbt
使用新的 OAuth 密钥, 我发现我可以像应用程序一样签署请求. 下面是一个例子:
正如您在上面的照片中看到的, 我能够使用 OAuth 签署请求, 就好像我是应用程序一样. 这意味着应用程序所做的任何事情我都可以做. IE 可以创建帐户, 发送文本, 接收文本, 甚至可能拨打电话.
来源: https://www.qcloud.com/developer/article/1903038