Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yyuueexxiinngg opened this issue Oct 17, 2022 · 19 comments
Labels
documentation Improvements or additions to documentation good first issue Good for newcomers question Further information is requested

Comments

@yyuueexxiinngg
Copy link

yyuueexxiinngg commented Oct 17, 2022

#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、在使用完抓包软件之后务必将证书信任关闭且将证书删除,如不关闭可能产生中间人攻击

@yyuueexxiinngg yyuueexxiinngg added the question Further information is requested label Oct 17, 2022
@yyuueexxiinngg
Copy link
Author

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

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

@yyuueexxiinngg
Copy link
Author

教程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

@MuelNova
Copy link

MuelNova commented Nov 19, 2022

只使用 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

@MuelNova
Copy link

MuelNova commented Nov 19, 2022

我今天又弄了弄。可以确定的是令牌存在于 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

@kinaka
Copy link

kinaka commented Mar 25, 2023

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

@xiaojianqaq
Copy link

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

@kinaka
Copy link

kinaka commented Mar 26, 2023

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

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

@Rah1m2
Copy link

Rah1m2 commented Jul 17, 2023

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

@eliozh
Copy link

eliozh commented Jul 27, 2023

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

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

@yyuueexxiinngg
Copy link
Author

yyuueexxiinngg commented Jul 28, 2023

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

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

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

@Rah1m2
Copy link

Rah1m2 commented Aug 28, 2023

好的感谢🙏

@w2546868666
Copy link

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

@yuyuko233
Copy link

yuyuko233 commented Oct 6, 2023

我今天又弄了弄。可以确定的是令牌存在于 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 是框架自带的

@yyuueexxiinngg
Copy link
Author

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

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

@HAMAN23333
Copy link

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

@Remonli
Copy link

Remonli commented Mar 3, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation good first issue Good for newcomers question Further information is requested
Projects
None yet
Development

No branches or pull requests

11 participants