iOS 3.x新版Steam抓包导出令牌方法 - 免越狱免降级免备份
yyuueexxiinngg opened this issue · 25 comments
#299 中有降级应用并备份手机全部数据导出的方法,这里分享一下免降级免备份的导出方法,由于步骤较长,故另开一面。
如违反Issue
规则,请谅解并帮忙删除Issue
,感谢!
0x0 背景
手机为iOS系统,最近听说Steam Mobile
大优化,今天喜滋滋的更新3.x试试,结果更新完就发现原来的Steam
令牌掉了。需要跟着步骤转移。而转移后就和目前Steam++
里正在使用的令牌对不上了,逛了一圈GitHub
和keylol
发现伙计们还是降级用旧版应用导出令牌,有些难受。故而想尝试另寻他法进行导出。注意此方法导出也会有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)。
以下多图预警:
-
从
AppStore
安装App Store 上的“Stream” -
安装完成后打开可能是英文界面,可以点击
Languages
修改语言至简体中文
-
点击开始抓包,并允许添加VPN配置
-
在弹出界面中点击**
去安装证书
**
- 点击**
步骤一:安装CA证书
,并点击允许
**下载配置描述文件。
- 打开系统**
设置
** - 点击**已下载描述文件
**
-
在弹出的窗口中点击右上角
安装
并输入密码,在新界面中再次点击安装
-安装
-
到系统**
设置
** -通用
-关于本机
拉到最下面找到并点击证书信任设置
-
打开名为**
Stream Generated CA XXXXX
**的开关 -
此刻回到
Stream
应用,可以看到**设置成功:CA证书已经安装且信任
**。
至此,抓包软件配置完毕。
0x2 抓包Steam
令牌设置
-
请确认抓包软件已经安装并配置完毕,可以抓取
HTTPS
请求。并且在软件中开始抓包 -
首先解绑令牌
- 解绑令牌后再次绑定
-
看到恢复代码后就可以关闭
Steam
了 -
回到抓包软件点击**
停止抓包
,点击抓包历史
**扎到并打开刚在抓包的时间段 -
点击右上角的搜索图标,按照以下图中条件搜索
- 关键词
/AddAuthenticator
- 方法
POST
- 关键词
-
在搜索结果中查找正确的抓包记录
-
可以点击右上角**
切换详细模式
**查看更详细的信息(截图中点过啦) -
在下面的记录中找**返回类型为
Octet-Stream
**的记录,如果有多个就都看看
-
- 点进去后再点击
响应
-查看响应
-
按照下图复制密钥出来备用
- 需要找到并从 **
optauth
开始一直复制到issuer=Steam
**结尾
- 需要找到并从 **
- 在电脑上新建
txt
文本文件,并将复制的密钥粘贴进去保存
- 在
Steam++
中选择**新增
** -其它软件导入
-WinAuth导入
- 找到保存的txt
文件打开即可导入
至此就导入完成啦~
首发于博客 & 其乐 & 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
,虽然没有去尝试dump
出proto
,但也可以用工具扫一下返回值。使用dannyhann/protobuf_decoder 可以扫出几个内容:
这一点我有了解,最近已经完成了使用steam新版登录接口实现确认登录和扫码登录,新版接口都是使用的Protobuf进行序列化
教程V2 - 使用电脑加速抓包避免网络环境限制
0x0 背景
昨天发表了一篇iOS
在手机上抓包Steam
获取令牌请求并导出至Steam++
的教程。
链接:iOS新版Steam导出令牌/验证器到Steam++教程 - 免越狱免降级免备份
收到反馈手机上的抓包软件与加速器冲突。由于抓包软件和加速器都是VPN,无法同时开启,而又因为网络限制导致开启抓包后无法正常绑定令牌。那这次就写一下如何通过电脑iOS进行抓包。电脑上使用Steam++
加速,抓包时手机流量都通过电脑转发,所以可以正常进行解绑与绑定操作。
0x1 安装并配置抓包软件
首先需要在电脑上安装抓包软件,我的电脑是Windows
系统,选用知名抓包软件Fiddler
进行抓包。macOS
用户请自行寻找抓包软件。
-
从官网链接下载
Fiddler Classic
,链接为:https://telerik-fiddler.s3.amazonaws.com/fiddler/FiddlerSetup.exe。注意:如果自行从官网点击,请确认下载的是Fiddler Classic
而不是Fiddler Everywhere
,后者是付费软件 -
安装完成首次运行会弹窗提示运行在
Windows AppContainer
里的软件无法被抓取,这里不用管,直接点击Cancel
。
-
取消抓包电脑流量及打开设置:
- 软件启动后先点击左下角
Capturing
关闭对电脑流量的抓包,确认点击后Capturing
消失即可 - 然后可以点击工具栏里的
X
按钮选Remove all
清空已经抓包到的请求,我们不需要这些 - 之后点击菜单栏里的
Tools
>Options
- 软件启动后先点击左下角
-
在弹出的设置窗口中开启
HTTPS
抓包解密- 切换至
HTTPS
选项卡 - 点击
Capture HTTPS CONNECTs
开启HTTPS
抓取 - 打勾
Decrypt HTTPS traffic
后会自动弹出窗口需要信任证书,请根据提示进行信任操作 - 打勾
Ignore server certificate errors(unsafe)
忽略服务器证书错误
- 切换至
-
设置允许远程设备抓包
- 转至
Connections
选项卡 - 打勾
Allow remote computers connect
来允许其它设备连接抓包软件 - 监听端口默认就是
8888
,确认下即可,点击OK
按钮保存设置
- 转至
-
手机连至同一局域网并安装证书
-
需要确认手机和电脑在同一局域网下,说人话就是连着同一个
Wi-Fi
。电脑接网线的确定在同一个路由器下就行。 -
获取自己电脑的
IP地址
,这点假设大家都知道如何获取,不知道的请自行搜索,举例中我的IP
地址是192.168.2.207
。
-
-
手机通过**
Safari
**打开电脑IP地址:8888
端口,举例就是192.168.2.207:8888
注意一定使用Safari浏览器 -
点击
FiddlerRoot Certificate
,并点击**允许
**下载配置描述文件。 -
打开系统**
设置
** - 点击**已下载描述文件
** -
在弹出的窗口中点击右上角
安装
并输入密码,在新界面中再次点击安装
-安装
-
到系统**
设置
** -通用
-关于本机
拉到最下面找到并点击证书信任设置
-
打开名为**
DO_NOT_TRUST_FiddlerRoot
**的开关
至此,抓包软件配置完毕。
0x2 配置手机使用电脑代理
-
打开手机系统
Wi-Fi
设置,点击连接到的Wi-Fi
-
拉到最下面点击
配置代理
-
选择
手动
,并输入电脑的IP
以及抓包软件端口,这里的例子就是192.168.2.207
和8888
- 点击存储
0x3 抓包Steam
令牌设置
-
请确认抓包软件已经安装并配置完毕,并且关闭了电脑请求抓取(上面安装抓包软件后点掉左下角的Capturing)。并且手机设置好代理
-
打开Steam++启用加速,请选择Hosts代理模式
-
请关闭任何手机上的加速器、代理软件
-
打开
Steam
应用,观察电脑的抓包软件中是否有抓取到请求,如果哗啦啦刷出来许多请求,则说明配置成功 -
首先解绑令牌,解绑令牌后再次绑定,看到恢复代码后就可以关闭
Steam
了
0x4 配置手机取消使用电脑代理
参考第0x3步,将配置代理
重新改回自动并存储即可。
0x5 查看抓包结果并导出令牌
-
回到电脑的抓包软件查找抓取的请求记录
- 点击工具栏中的
Find
- 输入框中填写
/AddAuthenticator
- 点击
Find Sessions
进行查找
- 点击工具栏中的
-
查看高亮标黄的请求,复制出返回值
-
定位到
200 HTTPS /ITwoFactorService/AddAuthenticator XXXXX
-
点击右侧上方工具栏中的
Inspectors
-
点击下方工具栏中的
TextView
-
需要找到并从 **
optauth
开始一直复制到issuer=Steam
**结尾
-
- 在电脑上新建
txt
文本文件,并将复制的密钥粘贴进去保存
- 在
Steam++
中选择**新增
** -其它软件导入
-WinAuth导入
- 找到保存的txt
文件打开即可导入
至此就导入完成啦~
只使用 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 的话即使没有返回数据也应该返回状态之类的)
我尝试想要把新版本令牌的存储方式 / 地址逆向出来,但是根据 APK 来看它大概是下载了 bundle
后 bundle
内部调用这些方法(方便热更新?)。关于这里,因为我好久没碰 RE 了,所以也没有动调相关的工具来进行进一步的测试,希望有人帮忙以进一步简化新版本下令牌获取的难度。
我逆向后在
com.valvesoftware.android.steam.community.ValveHelpersModule
下找到一个方法ReadOldSteamGuardStates
,然而没有其他方法调用它,根据@ReactMethod
猜测大概是从其他bundle
中调用的这个方法。我的安卓手机遭遇了SSL pinning
的限制,JustTrustMe
等插件无法绕过,也是通过手工修改 apk 的方式 bypass 了大部分,然而没有去除完全,所以推测在 IOS 上可能会更方便操作更清晰?
我今天又弄了弄。可以确定的是令牌存在于 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 的方法,那么令牌的导出 / 导入就十分方便了。
但是,由于自身技术不足,我并不能通过修改 APK / 动调的方法拿到 AES 加密的 SecretKey。这里似乎和 Python 的 AES 实现是差不多的,SecretKey 大概并不存在于内存当中,所以无法给它 dump 下来,这里我尝试了动调 / Patch APK 的方法(Patch 没有成功, 这是我第一次尝试 patch APK,它对于寄存器调用太严苛了),都无法获取明文,当然也是我预料之中的(虽然花费了不少时间)。
最后,我也不懂 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;
},
},
有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 的方法,那么令牌的导出 / 导入就十分方便了。但是,由于自身技术不足,我并不能通过修改 APK / 动调的方法拿到 AES 加密的 SecretKey。这里似乎和 Python 的 AES 实现是差不多的,SecretKey 大概并不存在于内存当中,所以无法给它 dump 下来,这里我尝试了动调 / Patch APK 的方法(Patch 没有成功, 这是我第一次尝试 patch APK,它对于寄存器调用太严苛了),都无法获取明文,当然也是我预料之中的(虽然花费了不少时间)。
最后,我也不懂 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导入验证码终于跟手机一致了
ios3.9.1 提取完整令牌有没有简易一点的教程,拜托了各位大佬 WinAuth已经导入成功想要完整令牌给asf用
ios3.9.1 提取完整令牌有没有简易一点的教程,拜托了各位大佬 WinAuth已经导入成功想要完整令牌给asf用
你抓包出来的请求,有个protobuf的加密数据,在我上面回复的网页里面解密就行了啊
ios3.9.1 提取完整令牌没有简单一点的教程,拜托了各位大佬WinAuth已经导入成功想要完整令牌给asf用
你抓包出来的请求,有个protobuf的加密数据,在我上面回复的网页里面解密就行了啊
抓出来只是个steam64数据 input_protobuf_encoded这个数据解码出来就是steam64位!大佬而且我不知道怎么做成mafile shared_secret server_time token_gid identity_secret secret_1 device_id:“是用哪个 刚刚Protobuf生成出来的吗?
这些信息我都不知道 就差这几个 帮帮弟弟吧
ios3.9.1 提取完整令牌没有简单一点的教程,拜托了各位大佬WinAuth已经导入想要成功完整令牌给asf用
你抓包出来的请求,有个protobuf的加密数据,在我上面回复的网页里面解密就行了啊
抓只是个steam64数据input_protobuf_encoded这个数据解码出来就是steam64位!大佬而且我不知道怎么出来外面mafile shared_secret server_time token_gid Identity_secret Secret_1 device_id:“是哪个用刚刚Protobuf生成的?
这些信息我都不知道就差这几个大帮弟弟吧
谢谢你 已经成功提取并制作导入到了steam++ asf sda