某羊游戏通信安全分析
发表于:2022-09-15 |

Disclaimer

  1. 本文仅供技术分析,未提供游戏破解思路。

  2. 通过外挂破解游戏是违法行为,请各位遵守相关法律,谨慎对待。

Sheep

最近某个名字里带羊的游戏很火,虽然 玩法和某个三消游戏一模一样且地图随机导致不是所有地图都可以通关,图片素材是各种烂梗,背景音乐(可能)无版权,但他就是很火,淘宝甚至出现了“代过关”服务。

本着安全测试的目的,对此游戏客户端与服务端通信的数据进行分析。

Analysis

HTTPS MITM

如何使用magisk在安卓安装https ca证书 | Chara’s Blog iOS直接安装证书并勾选完全信任证书即可。

微信小程序配置代理,在Android/iOS的wifi设置中配置代理即可。

Authentication Token

HTTP请求头中的t字段为token,token类型为JWT Token,HS256签名。有签名的JWT在不知道签名密钥时无法伪造。

Token可能是第一次打开小程序时获取的,第二次打开没有看到登录请求。

Level Map

点击开始一局新游戏时会请求此接口。

1
2
3
4
5
6
7
8
9
10
GET https://<DOMAIN>/sheep/v1/game/map_info?map_id=<MAP_ID> HTTP/1.1
Host: <DOMAIN>
Connection: keep-alive
charset: utf-8
t: <TOKEN>
User-Agent: Mozilla/5.0 (Linux; Android 12; 22041211AC Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/4313 MMWEBSDK/20220505 Mobile Safari/537.36 MMWEBID/4218 MicroMessenger/8.0.23.2160(0x28001757) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android
content-type: application/json
Accept-Encoding: gzip,compress,br,deflate
Referer: https://servicewechat.com/wx141bfb9b73c970a9/15/page-frame.html

map_id为关卡在数据库中的id,其中80001固定为第一关的id,第二关id浮动,如2022年9月15号为90015。

如果拦截请求,修改第二关的id为第一关的id,会让第二关加载第一关的地图。

Winning

游戏通关(胜利)会请求此接口。

1
2
3
4
5
6
7
8
9
10
GET https://<DOMAIN>/sheep/v1/game/game_over?rank_score=1&rank_state=1&rank_time=3&rank_role=1&skin=1 HTTP/1.1
Host: <DOMAIN>
Connection: keep-alive
charset: utf-8
t: <TOKEN>
User-Agent: Mozilla/5.0 (Linux; Android 12; 22041211AC Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.99 XWEB/4313 MMWEBSDK/20220505 Mobile Safari/537.36 MMWEBID/4218 MicroMessenger/8.0.23.2160(0x28001757) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android
content-type: application/json
Accept-Encoding: gzip,compress,br,deflate
Referer: https://servicewechat.com/wx141bfb9b73c970a9/15/page-frame.html

鉴权后请求此接口即可标记今日关卡已经通关。rank_time为通关时间(单位:秒),skin为通关时皮肤,其他字段用途不明。

Danmaku

游戏主界面右下角有个“发送弹幕”的按钮,但是不能用,你猜为啥?

答:客户端传参中的uid为字符串类型,而后端服务器接收的uid为整数类型,类型不匹配导致后端报错,并且异常详细信息(e.Error())未隐藏,泄露了后端服务器是golang语言编写。

此处可以修改uid,但即使uid改为正确的整数类型也没有发送弹幕的效果,无法确定此处是否存在越权问题。

很难相信这个五分钟写出来的品质不如页游传奇的小游戏竟然广告收入过千万。

Suggestion

安全加固上的建议:

  1. 建议对所有通信参数和通信结果使用对称加密(如AES)。加密通信使得攻击者需要进一步分析客户端(在这里是微信小程序的源码)才能解密通信数据。

  2. 建议使用SSL Pinning技术,防止通过本机信任证书的方式进行https中间人抓包。(微信小程序无法做到SSL Pinning。)

  3. 建议对通关接口加入验证码验证、通关时间验证、通关步骤验证等验证条件,只有满足条件的通关才记录。

  4. 通关接口加入nonce防止重放。

  5. 覆盖默认的异常处理逻辑,不要将异常细节向用户展示。

Reference

其他师傅写的分析文章:

技术解析|朋友圈为何突然出现了那么多只“羊” (qq.com)

上一篇:
如何使用magisk在安卓安装https ca证书
下一篇:
关于PHP上传过程包含、上传进度包含、upload_progress的文档记录

由于Valine存在安全问题,我们不会记录您的IP地址。您所填入的内容,和您的User-Agent信息将明文公开存储。