BeyondDimension / SteamTools

🛠「Watt Toolkit」是一个开源跨平台的多功能 Steam 工具箱。

Home Page:https://steampp.net

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

iOS 3.x新版Steam抓包导出令牌方法 - 免越狱免降级免备份

yyuueexxiinngg opened this issue · comments

#299 中有降级应用并备份手机全部数据导出的方法,这里分享一下免降级免备份的导出方法,由于步骤较长,故另开一面。

如违反Issue规则,请谅解并帮忙删除Issue,感谢!

0x0 背景

手机为iOS系统,最近听说Steam Mobile大优化,今天喜滋滋的更新3.x试试,结果更新完就发现原来的Steam令牌掉了。需要跟着步骤转移。而转移后就和目前Steam++里正在使用的令牌对不上了,逛了一圈GitHubkeylol发现伙计们还是降级用旧版应用导出令牌,有些难受。故而想尝试另寻他法进行导出。注意此方法导出也会有15天冷却

以下步骤比较详细,看起来很难,但其实操作起来简单~~也不用等待长时间的数据备份。

0x1 安装并配置抓包软件

分析的第一步当然是进行抓包验证。既然令牌是Steam下发的,那在网络请求中应该可以一探究竟,只期望Steam没有加密返回值或者设置证书Pinning甚至魔改请求协议。上Fiddler抓包看了下确实没有加密,只是通讯用的Protocol Buffers,不过并不影响令牌的抓取。为方便手机用户,以下使用iOS上的免费抓包软件App Store 上的“Stream”来进行抓包。

根据其乐老哥
admimerest反馈风险点,请考虑APP抓包风险。另外iOS上有替代抓包APP,App Store 上的“HTTP Catcher” (付费)App Store 上的“Thor” (付费)

如果使用电脑抓包,则有可靠抓包软件Fiddler (Windows) 以及 Charles (MacOS)

以下多图预警:

  1. AppStore安装App Store 上的“Stream”

  2. 安装完成后打开可能是英文界面,可以点击Languages修改语言至简体中文

Change-Lang

  1. 点击开始抓包,并允许添加VPN配置

  2. 在弹出界面中点击**去安装证书**

To-Install-Cert

  1. 点击**步骤一:安装CA证书,并点击允许**下载配置描述文件。

Allow-Cert-Download

  1. 打开系统**设置** - 点击**已下载描述文件**

Open-Cert

  1. 在弹出的窗口中点击右上角 安装 并输入密码,在新界面中再次点击 安装 - 安装

  2. 到系统**设置** - 通用 - 关于本机 拉到最下面找到并点击 证书信任设置

  3. 打开名为**Stream Generated CA XXXXX**的开关

  4. 此刻回到Stream应用,可以看到**设置成功:CA证书已经安装且信任**。

Trust-Cert

至此,抓包软件配置完毕。

0x2 抓包Steam令牌设置

  1. 请确认抓包软件已经安装并配置完毕,可以抓取HTTPS请求。并且在软件中开始抓包

  2. 首先解绑令牌

Remove-Guard

  1. 解绑令牌后再次绑定

SMS-Verify

Recover-Code

  1. 看到恢复代码后就可以关闭Steam

  2. 回到抓包软件点击**停止抓包,点击抓包历史**扎到并打开刚在抓包的时间段

  3. 点击右上角的搜索图标,按照以下图中条件搜索

    1. 关键词 /AddAuthenticator
    2. 方法 POST

Search

  1. 在搜索结果中查找正确的抓包记录

    1. 可以点击右上角**切换详细模式**查看更详细的信息(截图中点过啦)

    2. 在下面的记录中找**返回类型为Octet-Stream**的记录,如果有多个就都看看

Found

  1. 点进去后再点击 响应 - 查看响应

View-Res

  1. 按照下图复制密钥出来备用

    1. 需要找到并从 **optauth开始一直复制到issuer=Steam**结尾

Select-Copy

  1. 在电脑上新建txt文本文件,并将复制的密钥粘贴进去保存

TXT

  1. Steam++中选择**新增** - 其它软件导入 - WinAuth导入 - 找到保存的txt文件打开即可导入

Import

Finished

至此就导入完成啦~

首发于博客 & 其乐 & Steam++ Github

最后不要脸放下博文链接 https://blog.hoshi.tech/archives/119/

其乐老哥admimerest反馈的风险点比较重要,摘抄至此:

1、抓包软件本身是否可信,生成的证书文件是否真的是随机生成
2、在信任证书后手机的所有正在进行通信数据 抓包软件都可以明文得知
3、在使用完抓包软件之后务必将证书信任关闭且将证书删除,如不关闭可能产生中间人攻击

这是个导出新版令牌很好的方法,感谢发表。

借用此方法原理的话,可以android ios应该都能支持,且也可以不需要必须手机上抓包,可以给steam++做个新版steam令牌导入功能开放个内网代理监听端口抓包即可,手机与steam++同一内网连接PC steam++代理完成生成令牌操作即可同步导入steam++,后续我会尝试一下这样做个功能。

借用此方法原理的话,可以android ios应该都能支持,且也可以不需要必须手机上抓包,可以给steam++做个新版steam令牌导入功能开放个内网代理监听端口抓包即可,手机与steam++同一内网连接PC steam++代理完成生成令牌操作即可同步导入steam++,后续我会尝试一下这样做个功能。

Steam++内建抓包应该更好,其乐收到反馈使用免费的抓包应用会和代理冲突。由于网络环境,无法完成操作。而支持抓包的代理应用均为付费应用。
如果使用电脑抓包,各位电脑代理方式繁杂,也有可能不走电脑的系统代理。

借用此方法原理的话,可以android ios应该都能支持,且也可以不需要必须手机上抓包,可以给steam++做个新版steam令牌导入功能开放个内网代理监听端口抓包即可,手机与steam++同一内网连接PC steam++代理完成生成令牌操作即可同步导入steam++,后续我会尝试一下这样做个功能。

文中提到实际上返回值是序列化后的Protobuf,虽然没有去尝试dumpproto,但也可以用工具扫一下返回值。

使用dannyhann/protobuf_decoder 可以扫出几个内容:

protobuf

这一点我有了解,最近已经完成了使用steam新版登录接口实现确认登录和扫码登录,新版接口都是使用的Protobuf进行序列化

教程V2 - 使用电脑加速抓包避免网络环境限制

0x0 背景

昨天发表了一篇iOS在手机上抓包Steam获取令牌请求并导出至Steam++的教程。

链接:iOS新版Steam导出令牌/验证器到Steam++教程 - 免越狱免降级免备份

收到反馈手机上的抓包软件与加速器冲突。由于抓包软件和加速器都是VPN,无法同时开启,而又因为网络限制导致开启抓包后无法正常绑定令牌。那这次就写一下如何通过电脑iOS进行抓包。电脑上使用Steam++加速,抓包时手机流量都通过电脑转发,所以可以正常进行解绑与绑定操作。

0x1 安装并配置抓包软件

首先需要在电脑上安装抓包软件,我的电脑是Windows系统,选用知名抓包软件Fiddler进行抓包。macOS用户请自行寻找抓包软件。

  1. 从官网链接下载Fiddler Classic,链接为:https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe注意:如果自行从官网点击,请确认下载的是Fiddler Classic而不是Fiddler Everywhere,后者是付费软件

  2. 安装完成首次运行会弹窗提示运行在Windows AppContainer里的软件无法被抓取,这里不用管,直接点击Cancel

1  AppContainerNotice

  1. 取消抓包电脑流量及打开设置:

    1. 软件启动后先点击左下角Capturing关闭对电脑流量的抓包,确认点击后Capturing消失即可
    2. 然后可以点击工具栏里的X按钮选Remove all清空已经抓包到的请求,我们不需要这些
    3. 之后点击菜单栏里的Tools > Options

2  Stop-For-PC

  1. 在弹出的设置窗口中开启HTTPS抓包解密

    1. 切换至HTTPS选项卡
    2. 点击Capture HTTPS CONNECTs开启HTTPS抓取
    3. 打勾Decrypt HTTPS traffic后会自动弹出窗口需要信任证书,请根据提示进行信任操作
    4. 打勾Ignore server certificate errors(unsafe)忽略服务器证书错误

3  Enable-HTTPS

  1. 设置允许远程设备抓包

    1. 转至Connections选项卡
    2. 打勾Allow remote computers connect来允许其它设备连接抓包软件
    3. 监听端口默认就是8888,确认下即可,点击OK按钮保存设置

4  Allow-Remote

  1. 手机连至同一局域网并安装证书

    1. 需要确认手机和电脑在同一局域网下,说人话就是连着同一个Wi-Fi。电脑接网线的确定在同一个路由器下就行。

    2. 获取自己电脑的IP地址,这点假设大家都知道如何获取,不知道的请自行搜索,举例中我的IP地址是192.168.2.207

5  Get-IP

  1. 手机通过**Safari**打开电脑 IP地址:8888 端口,举例就是192.168.2.207:8888 注意一定使用Safari浏览器

  2. 点击FiddlerRoot Certificate,并点击**允许**下载配置描述文件。

  3. 打开系统**设置** - 点击**已下载描述文件**

  4. 在弹出的窗口中点击右上角 安装 并输入密码,在新界面中再次点击 安装 - 安装

6  Down-Allow-Cert

  1. 到系统**设置** - 通用 - 关于本机 拉到最下面找到并点击 证书信任设置

  2. 打开名为**DO_NOT_TRUST_FiddlerRoot**的开关

至此,抓包软件配置完毕。

0x2 配置手机使用电脑代理

  1. 打开手机系统Wi-Fi设置,点击连接到的Wi-Fi

  2. 拉到最下面点击配置代理

  3. 选择手动,并输入电脑的IP以及抓包软件端口,这里的例子就是192.168.2.2078888

7 Config-VPN

  1. 点击存储

0x3 抓包Steam令牌设置

  1. 请确认抓包软件已经安装并配置完毕,并且关闭了电脑请求抓取(上面安装抓包软件后点掉左下角的Capturing)。并且手机设置好代理

  2. 打开Steam++启用加速,请选择Hosts代理模式

8  Accelarate

  1. 请关闭任何手机上的加速器、代理软件

  2. 打开Steam应用,观察电脑的抓包软件中是否有抓取到请求,如果哗啦啦刷出来许多请求,则说明配置成功

  3. 首先解绑令牌,解绑令牌后再次绑定,看到恢复代码后就可以关闭Steam

9  Rebind-Guard

0x4 配置手机取消使用电脑代理

参考第0x3步,将配置代理重新改回自动并存储即可。

0x5 查看抓包结果并导出令牌

  1. 回到电脑的抓包软件查找抓取的请求记录

    1. 点击工具栏中的Find
    2. 输入框中填写/AddAuthenticator
    3. 点击Find Sessions进行查找

10  Search

  1. 查看高亮标黄的请求,复制出返回值

    1. 定位到200 HTTPS /ITwoFactorService/AddAuthenticator XXXXX

    2. 点击右侧上方工具栏中的Inspectors

    3. 点击下方工具栏中的TextView

    4. 需要找到并从 **optauth开始一直复制到issuer=Steam**结尾

11  Found

  1. 在电脑上新建txt文本文件,并将复制的密钥粘贴进去保存

TXT

  1. Steam++中选择**新增** - 其它软件导入 - WinAuth导入 - 找到保存的txt文件打开即可导入

Import

Finished

至此就导入完成啦~

首发于博客 & 其乐 & Steam++ Github

只使用 otp uri 的情况下,无法通过 SteamTools 或其他软件进行 确认交易 的操作(这个操作需要 identity_secret

当然,在抓到包的条件下,我们可以从这个 post 包提取更多的信息以生成完整的令牌。这个 application/octet-stream 类型的 response 实际包含了 protobuf 序列化后的令牌文件
根据 protobuf 反序列化结果(可以使用protobuf_inspector)以及测试,可以将该 protobuf 协议对应以下数个字段

"shared_secret": <0x20 bytes> 
"serial_number": <int64>
"revocation_code": <0x06 bytes>
"uri": <0xN bytes>
"server_time": <varint>
"account_name": <0xN bytes>
"token_gid": <0xN(?) bytes>
"identity_secret": <0x20 bytes>
"secret_1": <0x20 bytes>
"status": <varint>
"phone_number_hint": <0x04 bytes>

也就是说,只需要将对应的 0x20 字节的 bytes 使用 base64 编码,并使用 json 格式包装,就可以获得与旧版 Steamguard-<STEAM 64> 相同的令牌文件,从而供不同软件使用。

同时,我注意到旧版本更新到 3.0 时,会调用一个 https://api.steampowered.com/ITwoFactorService/UpdateTokenVersion/v1 方法,根据字面含义应该是更新令牌数据以支持新版本的 QR ,发送的数据是一个 protobuf 序列化后的 base64,但是我没有解读出来它的具体内容,只知道第一个是 steam64 位的 id。而这个 API 返回的是 Content-length 为 0 的数据(在这里,我怀疑它只是调用了一个 steam app 实现的方法?如果是 API 的话即使没有返回数据也应该返回状态之类的)
input_protobuf_encoded
我尝试想要把新版本令牌的存储方式 / 地址逆向出来,但是根据 APK 来看它大概是下载了 bundlebundle 内部调用这些方法(方便热更新?)。关于这里,因为我好久没碰 RE 了,所以也没有动调相关的工具来进行进一步的测试,希望有人帮忙以进一步简化新版本下令牌获取的难度。

我逆向后在 com.valvesoftware.android.steam.community.ValveHelpersModule 下找到一个方法 ReadOldSteamGuardStates,然而没有其他方法调用它,根据 @ReactMethod 猜测大概是从其他 bundle 中调用的这个方法。我的安卓手机遭遇了 SSL pinning 的限制,JustTrustMe 等插件无法绕过,也是通过手工修改 apk 的方式 bypass 了大部分,然而没有去除完全,所以推测在 IOS 上可能会更方便操作更清晰?
image

我今天又弄了弄。可以确定的是令牌存在于 shared_prefs 下的 SecureStore.xml 文件下的 <string name="SteamGuard_1"> 标签下 (然而事实上这个文件删除后仍然可以再生成,所以它并非是"保存"在这里,但是我今天逆向时发现在 AddAuthenticator 调用时,程序打开时都会从/向这个文件拿/存东西) 经过再次测试后确定令牌保存在这里,且删除 database 下的 RkStorage.db 后可以触发 2.0 令牌 -> 3.0 令牌migration,这个过程由 db 里的 bPerformedSGMigration 键决定(大概?)

这个标签的内容是 "ct": "AES-ENCRYPED-STEAM-GUARD", "iv": "AES-IV", "tlen": 128, "scheme": "aes"
其中加密算法存在于 expo.modules.securestore.SecureStoreModule 下的 setItemImpl 方法及其相关处,解密算法也在这里,就不过多赘述了。
我通过在 React Native 中注入 Javascript 脚本的方法通过调用这个函数成功实现了加密与解密,然而这样做并不能简化令牌的获取——显然它比抓包的方式麻烦很多!如果能通过逆向出 AES SecretKey 的方法,那么令牌的导出 / 导入就十分方便了。
image

但是,由于自身技术不足,我并不能通过修改 APK / 动调的方法拿到 AES 加密的 SecretKey。这里似乎和 Python 的 AES 实现是差不多的,SecretKey 大概并不存在于内存当中,所以无法给它 dump 下来,这里我尝试了动调 / Patch APK 的方法(Patch 没有成功, 这是我第一次尝试 patch APK,它对于寄存器调用太严苛了),都无法获取明文,当然也是我预料之中的(虽然花费了不少时间)。
image

最后,我也不懂 STEAM 这样改动的目的是什么,本身导出就已经限制到 ROOT 用户了,现在还要进行一次加密,目前的导出方法只有降版本导出以及抓包导出,如果真的有逆向大牛能够把 AES Secret_Key 逆向出来的话那么将来的工作会轻松不少。

由于能力不足,仅提供一个逆向的思路。

附带一下注入 Javascript 获取令牌的简易方法:

  • 打开 steam.apk 下的 assests/index.android.bundle
  • 查找 key: "GetSteamGuardInfo",在 value 对应的 function 内,在 return 上方加入这样几行
                this.m_mapGuardInfo.forEach(function (t, n) {
                  console.error(n);
                  console.error(JSON.stringify(t))
                });

结构应该是这样的:

            {
              key: "GetSteamGuardInfo",
              value: function (t) {
                this.m_mapGuardInfo.forEach(function (t, n) {
                  console.error(n);
                  console.error(JSON.stringify(t))
                });
                return this.m_mapGuardInfo.has(t)
                  ? this.m_mapGuardInfo.get(t)
                  : null;
              },
            },
  • 保存,打包签名(网上自查)并安装到你的设备
  • 此时,使用 adb 连接到你的设备,并在命令行内输入 adb logcat *:S ReactNative:V ReactNativeJS:V\
  • 现在打开 APP,切换到令牌页,你应该能在命令行中看到 JSON 格式的令牌了。
    image

有Quantumult X的,可以使用Quantumult X抓包替代Stream。

如果这样操作的话是不是会吃到15天的交易冷却?

如果这样操作的话是不是会吃到15天的交易冷却?

会有15天交易冷却,因为需要解绑了令牌。

请问大佬们,现在有ios抓包获取完整令牌的方法吗,protobu反序列化出来的参数能用吗?本人纯小白,用protobuf-inspector反序列化steam3.x的令牌文件老报assertionError,求解啊

请问大佬们,现在有ios抓包获取完整令牌的方法吗,protobu反序列化出来的参数能用吗?本人纯小白,用protobuf-inspector反序列化steam3.x的令牌文件老报assertionError,求解啊

@Rah1m2 我使用 protobuf_inspector 同样会报错,可以尝试这个网站 Protobuf Decoder

请问大佬们,现在有ios抓包获取完整令牌的方法吗,protobu反序列化出来的参数能用吗?本人纯小白,用protobuf-inspector反序列化steam3.x的令牌文件老报assertionError,求解啊

@Rah1m2 我使用 protobuf_inspector 同样会报错,可以尝试这个网站 Protobuf Decoder

https://steamguard-decode.hoshi.tech/
可以试试这个,把返回值转base64或者直接把二进制码粘进去就好了,好几个月前写的,不知道现在还好不好用了

好的感谢🙏

大佬,我自行抓包得到了响应的hex值,要怎么解码出完整的令牌呢,Protobuf反序列化对小白来说确实太难了,万分感谢

我今天又弄了弄。可以确定的是令牌存在于 shared_prefs 下的 SecureStore.xml 文件下的 <string name="SteamGuard_1"> 标签下 (然而事实上这个文件删除后仍然可以再生成,所以它并非是"保存"在这里,但是我今天逆向时发现在 AddAuthenticator 调用时,程序打开时都会从/向这个文件拿/存东西) 经过再次测试后确定令牌保存在这里,且删除 database 下的 RkStorage.db 后可以触发 2.0 令牌 -> 3.0 令牌migration,这个过程由 db 里的 bPerformedSGMigration 键决定(大概?)

这个标签的内容是 "ct": "AES-ENCRYPED-STEAM-GUARD", "iv": "AES-IV", "tlen": 128, "scheme": "aes" 其中加密算法存在于 expo.modules.securestore.SecureStoreModule 下的 setItemImpl 方法及其相关处,解密算法也在这里,就不过多赘述了。 我通过在 React Native 中注入 Javascript 脚本的方法通过调用这个函数成功实现了加密与解密,然而这样做并不能简化令牌的获取——显然它比抓包的方式麻烦很多!如果能通过逆向出 AES SecretKey 的方法,那么令牌的导出 / 导入就十分方便了。 image

但是,由于自身技术不足,我并不能通过修改 APK / 动调的方法拿到 AES 加密的 SecretKey。这里似乎和 Python 的 AES 实现是差不多的,SecretKey 大概并不存在于内存当中,所以无法给它 dump 下来,这里我尝试了动调 / Patch APK 的方法(Patch 没有成功, 这是我第一次尝试 patch APK,它对于寄存器调用太严苛了),都无法获取明文,当然也是我预料之中的(虽然花费了不少时间)。 image

最后,我也不懂 STEAM 这样改动的目的是什么,本身导出就已经限制到 ROOT 用户了,现在还要进行一次加密,目前的导出方法只有降版本导出以及抓包导出,如果真的有逆向大牛能够把 AES Secret_Key 逆向出来的话那么将来的工作会轻松不少。

由于能力不足,仅提供一个逆向的思路。

附带一下注入 Javascript 获取令牌的简易方法:

* 打开 `steam.apk` 下的 `assests/index.android.bundle`

* 查找 `key: "GetSteamGuardInfo"`,在 `value` 对应的 `function` 内,在 `return` 上方加入这样几行
                this.m_mapGuardInfo.forEach(function (t, n) {
                  console.error(n);
                  console.error(JSON.stringify(t))
                });

结构应该是这样的:

            {
              key: "GetSteamGuardInfo",
              value: function (t) {
                this.m_mapGuardInfo.forEach(function (t, n) {
                  console.error(n);
                  console.error(JSON.stringify(t))
                });
                return this.m_mapGuardInfo.has(t)
                  ? this.m_mapGuardInfo.get(t)
                  : null;
              },
            },
* 保存,打包签名(网上自查)并安装到你的设备

* 此时,使用 adb 连接到你的设备,并在命令行内输入 `adb logcat *:S ReactNative:V ReactNativeJS:V\`

* 现在打开 APP,切换到令牌页,你应该能在命令行中看到 JSON 格式的令牌了。
  ![image](https://user-images.githubusercontent.com/68760718/202859217-551741d6-eb16-47da-b22a-1686aaa5cd86.png)

@MuelNova Steam 是把AES密钥存到了安卓系统的密钥库里, 而密钥库是在可信的安全硬件内所以拿不到

刚发现 Steam 用的是 Expo 框架开发的, 这个 SecureStore 是框架自带的

大佬,我自行抓包得到了响应的hex值,要怎么解码出完整的令牌呢,Protobuf反序列化对小白来说确实太难了,万分感谢

https://steamguard-decode.hoshi.tech/
试试这个还能用不,我现在不用iOS了,还是当时写的

ios有能力的最好用圈X或者surge来抓会更保险,用完之后记得一定要把证书删掉

之前导出的令牌存到keepassxc,今天登录发现他不对了,是不是steam又加密导致两边对不上了。

大佬,我自行抓包得到了响应的hex值,要怎么解码出完整的令牌呢,Protobuf反序列化对小白来说确实太难了,万分感谢

https://steamguard-decode.hoshi.tech/ 试试这个还能用不,我现在不用iOS了,还是当时写的

老哥牛逼,白天这网站打不开还以为没了,晚上打开了后,抓包出来导出的protobuf用https://protobuf-decoder.netlify.app/
解出来也还需要解密下,你这个直接出来了,用后ASF导入验证码终于跟手机一致了