接之前的文章,说一说objection的rpc调用
0x01 背景
在使用objection的rpc调用之前,尝试了frida-rpc的调用,但是发现不稳定,会失败,如下:成功的截图
失败的截图
python报错如下:
具体原因未知,这样虽然我们可以进行测试,但是无法做到实时加解密,所以这里更换了方向,更换到了objection来进行实时加解密
0x02 objection的rpc使用
使用objection
的时候,在搜索引擎上都没有找到rpc的文章,有也仅仅是提了一笔
后面直接找到了官方文档(https://github.com/sensepost/objection),好在配合翻译还是能看懂的
使用 objection --api-port 8000 -g xxx.xxx.xxxx explore --enable-api
即可开启objection的rpc接口,默认是无法远程调用的
访问http://127.0.0.1:8888/rpc/invoke/androidHookingListActivities
就可以看到hook到的所有Activities
后面根据安卓方法的源码一个个尝试
找所有的类
GET /rpc/invoke/androidHookingGetClasses HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
找到关键字类
POST /rpc/invoke/androidHookingGetClassMethods HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Content-Length: 38
{"className":"com.xxxx.lib.encrypt.c"}
获得实例
POST /rpc/invoke/androidHeapGetLiveClassInstances HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Content-Length: 34
{"clazz":"com.xxxx.lib.encrypt.c"}
调用实例的方法
POST /rpc/invoke/androidHeapEvaluateHandleMethod HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Content-Length: 489
{"handle":"0x202d76","js":"console.log(clazz.d("{\"app_type\":\"local\",\"mod\":\"system\",\"code\":\"getNoticeAll\",\"app_status\":\"3AFE4B90B27DE878237A64DCE3862FA69B47716F:1\",\"build_id\":\"a1000\",\"oauth_type\":\"android\",\"oauth_id\":\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\"version\":\"5.3.1\",\"apiV2\":\"v2\",\"token\":\"\"}","xxxxxxxxxxxxxxxxxxxxxxx=="))"}
打开启动objection的终端,能看到调用函数的返回值
0x03 遇到阻碍
但是,也可以发现,另一个问题出来了 通过远程调用api,无法在响应包里得到结果,只能在objection的终端得到相应的结果,对于我们自动加解密来说,又遇到了一个阻碍,看官方文档也可以发现这个问题(https://github.com/sensepost/objection/blob/master/agent/src/rpc/android.ts)
函数androidHeapEvaluateHandleMethod
没有返回值
顺带一提,在65行,也可以看到execute
这个函数的rpc调用,但是和objection的终端使用方式相同,无法通过execute
来调用有参数的函数,只能调用没有参数的函数
基本上没有什么思路了,objection的终端输出可以打印到响应包里吗,感觉是有点困难的,而后我的第一反应就是提个issue,想让作者去写一个有函数返回的方法
(忽略我蹩脚的英语……)
0x04 尝试解决
后面转念一想,难道必须要作者去写吗,我能不能自己去改一下呢,找到rpc调用的目录介绍
放在了objection项目的agent.js
代码里,直接按照关键字找heap.evaluate
这个执行js代码的函数
js代码我不是很熟,但是依葫芦画瓢还是比较简单的,直接去找androidHeapExecuteHandleMethod
的实现方法(原因是这个函数有返回值)
修改如下:(其实也蛮简单的,查阅了下资料,eval函数可以直接返回值的)
保存一下,然后再次启动objectionobjection --api-port 8000 -g xxx.xxx.xxx explore --enable-api
按照之前的流程,获取实例,得到handle
,再通过handle
去调用实例的方法
有了返回值了,但是这里还是有点不舒服,有双引号包裹,再修改一下:
if (clazz != null){
var res = eval(js);
console.log(res);
return res && (res = res.toString()), {
value: res
};
}
解密也是可以的
吐槽一句,这里使用yakit主要原因就是burp加载大字节的响应包的性能太差了,会崩…… 那么就可以进行愉快的自动加解密了,可以配合笔者写的autoDecoder进行组合利用了
PS:顺便提一个小知识点,我们都知道,在json里,转义双引号用"
即可,如果在转义双引号中引用双引号呢,答案是\"
,在前面再加两个斜杠即可
0x05 参考
https://github.com/sensepost/objection/blob/master/agent/src/rpc/android.ts [objection的rpc文档]
https://www.cnblogs.com/tjp40922/p/15171898.html
原文始发于微信公众号(only security):objection的rpc调用