-
-
[原创]用frida扫描安卓应用的fastjson gadget
-
发表于:
2024-2-28 16:51
2921
-
[原创]用frida扫描安卓应用的fastjson gadget
问题描述
fastjson有过一些严重的RCE漏洞。虽然官方表示对安卓没有影响,但是也不完全是。分析过程请见这篇文章。
https://zhuanlan.zhihu.com/p/682797594
目前没有安卓环境上通用的fastjson RCE方法,但是由于每个应用的代码不同,仍然可能存在fastjson反序列化的漏洞。可能存在的漏洞类别有很多,从RCE到敏感信息泄露都有可能。
想要实际挖掘fastjson的漏洞的话,需要有两个条件:
存在fastjson任意类反序列化功能(低版本默认开启)
存在可利用的fastjson gadget,在反序列化代码执行后能造成较大的影响。例如非安卓平台的com.sun.rowset.JdbcRowSetImpl就是利用了jndi,达到了RCE的效果
事实上难点在于第二点。原因如下
能被fastjson反序列化的类有一些限制条件
符合条件的类一般都无法造成实际安全影响
符合条件的类非常多
分析思路
首先找到fastjson反序列化的条件。找到具体哪些类可以被fastjson反序列化,哪些函数可以被执行,以及哪些数据可以被更改。
然后构造一个工具,可以用来找到可利用的类和方法。
由于找到的类会很多,需要自动化排除无实际影响的frida gadget(这个问题暂时遗留)
研究步骤
fastjson反序列化参考文章:https://paper.seebug.org/994/
首先我们自己构造一个安卓应用,使用低版本的fastjson,然后构造一些类,并实验哪些类的哪些代码是可以被执行的。
具体过程不在本文详细描述,直接说结果吧。假如我们有这么一个类
public class Gadget {
// 类本身不需要被任何地方调用,只要存在、classloader能找到,就可以
public boolean b = true; // 可更改。类型不限,public,非static
public static int i = 0; // 不可更改
public Gadget() {
// 可执行
}
private Gadget() {
// 可执行。private也可以。
}
public void setI(int var) {
// 可执行:public,非static,只有一个参数,方法名为setXXX
// 返回类型无限制,如果参数不是基本类型也可以(比如Bundle也是可以调用的)。
}
public static void setJ(int var) {
// static 不可执行
}
private void setK(int var) {
// 不可执行
}
public int getI() {
// 可执行。public,非static,无参数,方法名为getXXX
}
}
为了能更好地挖掘漏洞,我们用frida进行自动化扫描。当然,如果能通过反编译等方式得到源码,也可以使用静态分析,来对java的ast进行分析和扫描。
我认为动态分析和静态分析无法互相代替。除非能拿到源码,否则一定会有反编译失败的情况。就算有源码,也存在kotlin、groovy和java三种语言需要扫描。
那么以下是我的frida工具。
https://github.com/harryfyx/fastjson-gadget-android-scanner
使用方法如下:
准备一个frida+python的环境,安装adb
在frida_script.py中填入相应的device和process,可以通过adb获得
得到所有的已加载的类(frida无法得到全部的类。由于这一步会扫出来很多的类,我们先将其保存)
根据类的列表(上个步骤扫描出来的,也可以手动添加),判断哪些是符合fastjson gadget条件的,然后将结果存入文件
将得到的类和方法,进行人工筛选
此工具可以用来扫描大量的frida gadget,但仍然会有遗漏。扫描出来的gadget具体能产生的影响也需要人为判断。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)