objection的rpc调用

渗透技巧 2年前 (2022) admin
434 0 0

接之前的文章,说一说objection的rpc调用

0x01 背景

在使用objection的rpc调用之前,尝试了frida-rpc的调用,但是发现不稳定,会失败,如下:成功的截图objection的rpc调用

失败的截图

objection的rpc调用

python报错如下:

objection的rpc调用

具体原因未知,这样虽然我们可以进行测试,但是无法做到实时加解密,所以这里更换了方向,更换到了objection来进行实时加解密

0x02 objection的rpc使用

使用objection的时候,在搜索引擎上都没有找到rpc的文章,有也仅仅是提了一笔

objection的rpc调用

后面直接找到了官方文档(https://github.com/sensepost/objection),好在配合翻译还是能看懂的

objection的rpc调用

使用  objection --api-port 8000 -g xxx.xxx.xxxx explore --enable-api 即可开启objection的rpc接口,默认是无法远程调用的

objection的rpc调用

访问http://127.0.0.1:8888/rpc/invoke/androidHookingListActivities就可以看到hook到的所有Activities

objection的rpc调用

后面根据安卓方法的源码一个个尝试

找所有的类

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


objection的rpc调用

找到关键字类

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"}

objection的rpc调用

获得实例

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"}
objection的rpc调用

调用实例的方法

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的rpc调用

打开启动objection的终端,能看到调用函数的返回值

objection的rpc调用

0x03 遇到阻碍

但是,也可以发现,另一个问题出来了 通过远程调用api,无法在响应包里得到结果,只能在objection的终端得到相应的结果,对于我们自动加解密来说,又遇到了一个阻碍,看官方文档也可以发现这个问题(https://github.com/sensepost/objection/blob/master/agent/src/rpc/android.ts)

objection的rpc调用

函数androidHeapEvaluateHandleMethod没有返回值

顺带一提,在65行,也可以看到execute这个函数的rpc调用,但是和objection的终端使用方式相同,无法通过execute来调用有参数的函数,只能调用没有参数的函数

基本上没有什么思路了,objection的终端输出可以打印到响应包里吗,感觉是有点困难的,而后我的第一反应就是提个issue,想让作者去写一个有函数返回的方法

objection的rpc调用

(忽略我蹩脚的英语……)

0x04 尝试解决

后面转念一想,难道必须要作者去写吗,我能不能自己去改一下呢,找到rpc调用的目录介绍

objection的rpc调用

放在了objection项目的agent.js代码里,直接按照关键字找heap.evaluate这个执行js代码的函数

objection的rpc调用

js代码我不是很熟,但是依葫芦画瓢还是比较简单的,直接去找androidHeapExecuteHandleMethod的实现方法(原因是这个函数有返回值)

objection的rpc调用

修改如下:(其实也蛮简单的,查阅了下资料,eval函数可以直接返回值的)

objection的rpc调用

保存一下,然后再次启动objectionobjection --api-port 8000 -g xxx.xxx.xxx explore --enable-api按照之前的流程,获取实例,得到handle,再通过handle去调用实例的方法

objection的rpc调用

有了返回值了,但是这里还是有点不舒服,有双引号包裹,再修改一下:

objection的rpc调用
if (clazz != null){
 var res = eval(js);
 console.log(res);
 return res && (res = res.toString()), {
 value: res
 };
}
objection的rpc调用

解密也是可以的

objection的rpc调用

吐槽一句,这里使用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调用

版权声明:admin 发表于 2022年11月3日 下午10:21。
转载请注明:objection的rpc调用 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...