查看原文
其他

使用frida-net脱离pc在手机上直接暴漏app的算法供三方调用

Avacci 看雪学苑 2022-07-01
看雪论坛作者ID:Avacci



目标:fulao算法接口在手机上用http暴露下(提示:使用frida-net库和frida-inject)

 

下载安装frida-net,把frida-inject和_agent.js push到手机上。


开启监听:

测试脚本:

环境部署完毕,接下来是找到算法接口,写入agent.js中,重编译再放入手机运行。

 

要找算法接口,肯定先看看请求中什么东西被加密了。

先抓个包:

https://api-al.vipmxmx.cn/v1/videos/long/keyword_cover/t?payload=e4FeAkyuziEcFilBjcx7qA%3D%3D.7DkvRGCe%2FDdHD6Tg0g8oM5B74pqq4vTTFmMMmrT0YHaC80BJiXYu27LxNBFzpaCQBoYiArYEmES5R68jJTc%2F1T1QnjfLTtAunn1BbCiFPVYRc0HkMbQTU1yj7PtFzYWPA1V0p0NxBUIIFTdrNxbS9mUmETeNcgnD08Sxb74knTqDjILo3aFS427jj7HEG%2BtEjywgK7LWf59pnmdXhWoFwUFzTmPuVhLw2%2FeZph9tJil8fZTdggwSbchwtqN8BtuvcLn4tinaIe7aLSPUTt55pkd%2BkphoJUhZV2yqfYXZPKX09yh0wsrR%2BrPMoCOm0QBp

Host: api-al.vipmxmx.cn
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.12.1

 

返回结果被加密:



打算先从url中payload的加密去定位,直接在jadx反编译的结果中搜索payload,定位到看着比较可疑的地方。
用objection hook一下这个方法:
点了下搜索,确实有被调用到:


那就继续分析d()方法的细节。
存储Payload值的变量str有两次被赋值的地方,通过this.l的值来确定如何生成。但是这里似乎jadx反编译的结果有问题,导致看起来始终用的是第二段的生成算法。
 
所以用GDA再反编译看下:

生成payload的地方用了条件运算符,看起来更合理些。

分别查看两个生成方式:

ba 为随机生成的16字节数组。

再将ba进行Base64编码。

str初始值为”.”:

Sc的初始值略微复杂:
最外层的b.c方法的实现是AES算法:

第一个入参为key,第二个为IV,第三个为待加密的明文。
再回去看三个参数的由来。
第一个参数,也就是AES加密的key,是对一个native方法返回的值进行Base64解码后的结果,应该是个固定值。

这里的CipherClient类里包含了不少类似的方法,用来获取各种key。

第二个参数就是前面生成的16字节随机数ba。

 
第三个参数,也就是AES算法的原始数据,是this.mapj变量的json格式字符串。
this.mapj是一个Map对象,其中的内容为:
直接hook一下前面的AES加密函数,发现不同的请求下mapj的内容有些许不同。 

将上面的部分串联起来就是payload。
 
接下来就要定位请求返回的内容在哪里接收并处理,没想到什么好的路子,还是通过objection hook了前面生成payload的类c.c.a.j.c.j中的所有方法,发现有个方法的参数中带了response对象的信息。


调用的方法为c.c.a.j.c.j.a,传入参数类型为k.r。
 
然后用WallBreaker查看了下一个k.r类型的对象包含的内容,发现其中_b包含了response的body。


直接定位到反编译后k.r的实现:

可以判断出f13822b为response body,而a()方法直接返回这个变量值。

 
全局搜索一下k.r.a()方法的调用,有好几处。不过感觉高亮的这处应该是一处body的解密操作。
转到该调用处:
先根据response对象rVar的内容获取一个值a2,会判断a2的值是否为空来决定是否需要解密response的body内容。

获取a2值的具体实现为判断response header中是否带有X-App-Name字段,且X-App-Name字段值是否为app。如果是的话对header中的X-VTag字段值进行md5哈希,再从第九个字符开始取到第24个字符(16个)。

这里直接假设a2不为空,进行body解密:

最外层的super.a方法是揭秘完后对不同结构类型的返回字符串进行后续处理。
所以解密函数就只有内部的b.a方法,其实现仍为AES。第一个参数为key(需要先md5),第二个为IV,第三个参数为需要解密的密文。
对应传入的实参,第一个为CipherClient.decodeKey(),hook一下得到值为fe34dd6bbd3020c2fb69abe73b5b973c。第二个就是前面生成的a2。第三个就是请求返回的内容。
 
直接hook该函数:

这里直接打印解密后的返回值也可以,但这里用CyberChef确认了下解密流程没有问题。
 
跟请求参数加密和响应内容解密相关的流程大致是这样,那么用到的跟加解密算法有关的类主要有两个:

一个是包含AES、MD5等算法调用的EncodeUtility类,混淆后的类名为com.ilulutv.fulao2.other.i.b。还有一个是获取加解密时用到的key和IV等参数的CipherClient类。前面那个感觉暴露出来不太好调用,先就尝试下暴露CipherClient类的各个调用接口。


修改frida-net项目下的agent.js,然后重新编译,推到手机中。

用frida-inject执行脚本,然后尝试让他输出几个加密参数。



 


看雪ID:Avacci

https://bbs.pediy.com/user-home-879855.htm

  *本文由看雪论坛 Avacci 原创,转载请注明来自看雪社区


















# 往期推荐





公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



球分享

球点赞

球在看



点击“阅读原文”,了解更多!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存