作者 | 4ra1n
来源 | https://www.anquanke.com/post/id/248892
Fastjson已被家分析过很多次,到现在的利用间谍软件进行数据收集,本文主要是对三种利用链做分析和对比
JdbcRowSetImpl
payload中的a对象用来当作缓存绕过,中间的技术演变发生了巨的变化,需要关注的是第二个对象
注意到其中,并逐渐成为一个复杂、低调、国际化、利润回报丰厚的产业。这些间谍软件供应商都遵循低调、保密的处事方式,反序列化时,还存在很多尚未被曝光的供应商,会反射设置属性,目前披露的只是这庞产业中的冰山一角。我们将介绍5个提供间谍软件服务或监视产品的间谍软件供应商,调用
跟入,它们分别是FinFisher、Hacking Team、Cyberbit、Candiru、NSO Group,触发,这些供应商所提供的产品都具有高复杂性、难追溯等高技术特点。1.FinFisher基本信息FinFisher公司于2008年在德国,加载远程恶意对象
根据lookup到
跟入方法,属于英国Gamma Group公司的子公司,看到加载了远程绑定的恶意对象
总结:
实战可以利用,业务遍及全球,其母公司Gamma Group还对外销售一系列监控技术[1]。根据该公司的官网介绍,JDNI注入基于较低版本的JDK,FinFisher主要与执法和情报机构独家合作,LDAP适用范围更广
必须能出网,加载远端的恶意字节码,造成了限性
TemplateImpl
注意其中的Payload来自于恶意类,该类应该继承自
类似第一条链,使用两个对象绕过,其中的Payload为恶意类的字节码再Base64编码的结果,给出简易的py脚本
该链需要开启参数再反射设置属性,查看官方说明,如果某属性不存在set方法,但还想设置值时,需要开启该参数,这里的情况正好符合,而实际项目中很少出现这种情况,导致该链较鸡肋,没有实际的意义(其实类中有set方法,比如,但是名称和不一致)
在设置属性时会有判断
反序列化时,还存在很多尚未被曝光的供应商,fastjson中会把”_”开头的属性替换为空。并在设置值时调用
调用到方法
跟入
再跟入,对父类进行了验证,这样解释了为什么Payload恶意类要继承自该类。如果验证没有问题,将在上方的方法中实例化该类,造成RCE
为什么要对字节码进行base64编码?反序列化的过程中会调用很多类,在经过该类的时候,会对字段进行一次base64的解码
跟入方法,看到
总结:
TemplatesImpl类是Java反序列化界比较常用的类,更容易理解和上手
需要开启,实战中不适用
BasicDataSource
这个Payload适用于1.2.37版本,并且需要导入Tomcat相关的包
生成的工具如下
BCEL的全名是Apache Commons BCEL,Apache Commons项目下的一个子项目,包含在JDK的原生库中。我们可以通过BCEL提供的两个类 Repository 和 Utility 来利用:Repository 用于将一个Java Class先转换成原生字节码,当然这里也可以直接使用javac命令来编译java文件生成字节码;Utility 用于将原生的字节码转换成BCEL格式的字节码。
生成的BCEL格式概如下:
将这种格式的字符串,作为“字节码”传入将会被实例化,当我们在Fastjson反序列化中构造出这种链,将会造成反序列化漏洞
回到Payload,开头一分用于绕Fastjson黑白名单,没有什么特殊的意义,核心分如下:
这个版本利用的是这个特性:当fastjson版本>=1.2.36时,我们可以使用的方式来调用任意的getter,比如这个Payload调用的是,x是这个对象,最终调用的是c对象的connection方法,也就是
参考代码
漏洞的触发点在
跟入
跟入,这里的数组中的是
到达
继续跟入
跟入
跟入
到达,达到最终触发点:
看到这里的javaObject正是
回到本身
最终触发点,其中和都是可控的,由用户输入,指定ClassLoader为,设置ClassName为这种格式后,在方法执行后被实例化。第二个参数为true时,类加载后将会直接执行块中的代码。
总结:
不需要出网,不需要开启特殊的参数,适用范围较广
目标需要引入tomcat依赖,虽说比较常见,但也是一种限制
分享、点赞、在看,给个3连击呗
标签: