一、前因:
在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。
于是直接解压后everything搜索了一下,发现域名关键词在global-metadata.dat文件中
二、global-metadata.dat是什么?
global-metadata.dat是Unity游戏开发引擎在构建过程中生成的文件之一。它包含了游戏项目的元数据信息,如类和方法的名称、类型信息等。这个文件对于Unity引擎在运行时正确加载和解析游戏项目非常重要。通常情况下,开发者不需要直接处理或操作global-metadata.dat文件。
global-metadata.dat是Il2cpp翻译C++代码之后存放类型和符号信息的文件,libil2cpp.so文件就是应用业务逻辑所在的文件。将global-metadata.dat中的类型和符号信息解析出来定位到libil2cpp.so中才能更方便的去做逆向分析。
简单的说,global-metadata.dat是为了将代码安全存储所存在的中转的unity开发中的解析符号文件。
这也说明了该app采用了unity游戏引擎开发。
三、怎么来的?
首先Unity可以使用Mono和IL2CPP两种方式来打包出APK
1、Unity使用Mono方式打出来的apk,我们可以直接从包内拿到Assembly-CSharp.dll,如果开发者没有对Assembly-CSharp.dll进行加密处理,那么我们可以很方便地使用ILSpy.exe对其进行反编译。
2、如果使用IL2CPP方式出包,则没有Assembly-CSharp.dll,不过,有一个IL2CppDumper工具,通过它,我们可以逆向得到Assembly-CSharp.dll,然后再进行分析
简单的来说呢,我们需要利用IL2CppDumper这个工具来逆向global-metadata.dat,这个工具还需要libil2cpp.so文件
四、判断加密
global-metadata.dat头部信息,正常是AF 1B B1 FA 18。可以看该APP出来并未进行加密,因此就无需额外的对抗了
五、解密
https://github.com/Perfare/Il2CppDumper
https://github.com/AndnixSH/Il2CppDumper-GUI
Il2CppDumper.exe input\libil2cpp.so input\global-metadata.dat output
1、dump.cs
里面放的是方法和类名,以及字段
Assembly-CSharp.dll 和 dump.cs 的内容是一致的
2、script.json
以json格式显示方法,类名,也存在路由信息等
3、stringliteral.json
以json格式显示所有的字符串详情,这里是我们要的关键
4、Assembly-CSharp.dll文件
这个文件反编译出的c#代码,
只找到了接口但是不知道字段怎么办?在上面我们获取到了大量的web路由,以common-activity为例 ,我们可以通过关键词在dump.cs里找到GetCommonActivity以此获得它的参数可能为id
六、发现的漏洞
1)之后通过上述的信息发现了大量接口,部分接口已经是以前的老活动残留下来的,对于游戏来说,会经常上线一些活动,这些活动可以免费领取金币或者奖励,但是活动下架了接口却没有下架
例如发现了可能为历史福袋的接口,针对该接口进行了并发,成功实现了大量金币的获取
xxx/share/share-fudai-award
2)接口通用问题
通过上述发现了存在的大量接口后,由于是mj类游戏,因此公司存在大量的马甲包(发行体和玩法不一样,界面也不一样,但是后端接口基本是一样的套壳),例如福建mj和四川mj就可以拥有一样的后端API,但是长期运营的部门和人员可能不是一个。
因此也就产生了接口通用问题,拿A APP的接口去碰撞B APP的接口,从而达到某些隐藏接口的获取,例如金币可以大量获取。
利用隐藏接口无限触发可导致获取无限的金币
七、xxtea算法和信息泄露漏洞
很多小游戏都采用了Cocos2d-x进行开发,Cocos2d-x 衍生了很多版本,例如Cocos2d-lua ,Cocos2d-js,其中最流行的就是cocos2d-lua
例如某个APK程序解压后如下
assets目录下存放大量Luac,这些是编译后的lua文件,能直接被lua虚拟机直接解析
luac后缀是被编译过的lua脚本,也有可能是被编译然后再加密的(否则一下就被反编译了),而后缀也有可能不是luac,而是luax,luaxxxx等等,可以自定义
Cocos-2dx对于lua脚本加密提供了一种轻量级解决方案, 算法是xxtea,一般来说未经过二次处理的xxtea加密可以通过一下方式解密
xxtea官方加解密需要三个参数:
1、文件路径 2、加密sgin 3、加密key
解密脚本:https://github.com/lyzz0612/cocos_decrypt
1、获取sign
hexdump -C xxxxxx.luac | head -n 5
2、获取加密key
strings libcocos2dcpp.so | grep -i sign值xxxx -A 3 -B 3
八、解密后的作用
1)在lua文件中获取硬编码Key,例如以下lua直接获取了wx的secret
2)算法解密
在httpxxx.lua文件中一般存放和发送http请求相关的信息,如下所所示
在解密后即可通过关键字获取到信息
接着回溯方法,找到了相关的算法
算法值具象化为如下所示
md5Encode("request_key=" .. funtable.apihubKey .. "&request_time=" .. time .. "&request_secret=" .. funtable.apihubSecret .. "||" .. laterurl)
md5(request_key=50023.okevxyosgu&request_time=1678347337&request_secret=f2cf7xf11x689ed7bx397x7c0533fxd||{"phone":"","account":"iphone","weixin":"1","system":"29","phone_version":"29","phone_type":"020000000000","network":"","type":"1","package_id":"3010","game_version":"70406","content":"\"><111>\n","regtime":"1970-01-01 08:00:00","qq":"1","sdk_id":"xxxxx","numid":0,"ext":"{\"usertype\":7,\"device\":\"xxxxx\",\"lobbyver\":\"2.0.0.949\",\"logintype\":6}","areatypeid":3,"gameid":9,"areaid":5016,"images":"1"})
通过解密xxteam还原代码,再到获取签名解密,最后才能实现正常接口的抓包改包,发现更多的漏洞。